【问题标题】:GNU Inline assembler — Syntax of assembly instructions?GNU 内联汇编器——汇编指令的语法?
【发布时间】:2014-06-19 19:10:27
【问题描述】:

在下面的代码中,我可以通过 PSUBSW 指令得到 mm0 中 mm0 - mm1 的结果。当我通过 gcc 在 Mac book air 上编译时。

但是,PSUBSW 指令解释说,我们可以得到 mm1 - mm0 in mm1 in Intel developer's manual: PSUBSW mm, mm/m64, 从 mm 中的有符号压缩字中减去 mm/m64 中的有符号压缩字并饱和结果。

#include <stdio.h>

int
main()
{
  short int a[4] = {1111,1112,1113,1114};
  short int b[4] = {1111,2112,3113,4114};
  short int c[4];

  asm volatile (
  "movq (%1),%%mm0\n\t"
  "movq (%2),%%mm1\n\t"
  "psubsw %%mm1,%%mm0\n\t"
  "movq %%mm0,%0\n\t"
  "emms"
  : "=g"(c): "r"(&a),"r"(&b));

  printf("%d %d %d %d\n", c[0], c[1], c[2], c[3]);

  return 0;
}

这有什么区别? src、mm0 还是 mm1 是哪个?如果这种差异是 Intel 语法和 AT&T 语法。

【问题讨论】:

  • 请注意,您不必编写 SIMD 程序集来矢量化您的代码。如果你写了一个循环for (int i=0; i&lt;4; ++i) { c[i] = a[i] - b[i]; },那么 GCC 可以为你向量化它。在this 线程和this GNU 手册中查看更多详细信息。

标签: c gcc assembly simd


【解决方案1】:

GNU manual 中声明 gcc 不是基于 Intel 汇编语言,而是基于一种源自 AT&T Unix 汇编程序的语言。汇编语法有两个主要阵营:

  • 英特尔:opcode dest, src
  • 美国电话电报公司:opcode src, dest

在您的示例中,您使用的是默认的 AT&T 语法。但是,如果您更喜欢切换到 Intel 语法,您可以使用 -masm=intel 编译或使用以下代码:

__asm__(".intel_syntax;" ...);

您可以在 thisthis Stackoverflow 线程中找到有关该主题的更多讨论,或阅读更多 here

【讨论】:

  • 感谢您的回答。我知道在有两个操作数的指令中,AT&T 语法和 Intel 语法之间的操作数顺序是相反的。
  • 有时可能会令人困惑 :) 为了找出哪种语法有效,我尝试将立即数存储到寄存器中:__asm__("mov $0, %eax"); 并且会抱怨立即数的位置或寄存器命名。有关详细信息,请参阅here
猜你喜欢
  • 2010-10-18
  • 2023-03-10
  • 2012-09-18
  • 1970-01-01
  • 1970-01-01
  • 2012-08-03
  • 2020-09-22
  • 2011-11-09
  • 1970-01-01
相关资源
最近更新 更多