【发布时间】:2014-03-26 14:18:38
【问题描述】:
我正在尝试汇编,以便使用我以前从未真正使用过的向量运算,而且我承认在掌握一些语法方面有些困难。
相关代码如下。
unit16_t asdf[4];
asdf[0] = 1;
asdf[1] = 2;
asdf[2] = 3;
asdf[3] = 4;
uint16_t other = 3;
__asm__("movq %0, %%mm0"
:
: "m" (asdf));
__asm__("pcmpeqw %0, %%mm0"
:
: "r" (other));
__asm__("movq %%mm0, %0" : "=m" (asdf));
printf("%u %u %u %u\n", asdf[0], asdf[1], asdf[2], asdf[3]);
在这个简单的示例中,我尝试对数组中的每个元素进行 16 位“3”比较。我希望输出是“0 0 65535 0”。但它甚至不会组装。
第一条汇编指令给了我以下错误:
错误:内存输入 0 不可直接寻址
第二条指令给了我一个不同的错误:
错误:`pcmpeqw' 的后缀或操作数无效
任何帮助将不胜感激。
【问题讨论】:
-
你在标题中说
C,但标记C++? -
已修复,尽管我认为此示例中的区别并不重要。
-
为什么不直接使用内在函数?
-
哪个内在函数可以做到这一点?
-
它有很多名称,例如
_m_pcmpeqw、_mm_cmpeq_pi16或__builtin_ia32_pcmpeqw。此外,在使用矢量扩展时,您可以简单地使用==运算符。请参阅 gcc 文档。
标签: c assembly gcc inline-assembly mmx