我试图了解以下代码的工作方式:
#define M32toX128(x128,m32) __asm__ \
("movddup %1, %0\n\t" \
"movsldup %0, %0" \
: "=&x"(x128) : "m"(m32) )
我只有基本的组装知识。在使用它的程序的上下文中进行搜索,我了解到它正在复制32位变量并将结果存储在128位变量中。
我的问题是:
%0
和%1
指的是什么?:
)在做什么?%n
s之后,"=&x"(x128)
...gcc内联汇编是一个复杂的野兽,过于复杂,无法在此处进行详细描述。快速概览,asm块的一般形式为:"template" : outputs : inputs : clobbers
。您可以通过使用%
后跟基于零的索引来引用模板中的输出和输入(统称为操作数)。因此%0
指x128
和%1
指m32
。对于每个操作数,您可以指定一个约束,该约束告诉编译器如何分配所述操作数。该=&x
方法x128
在任意可用的xmm寄存器中将其分配为早期消息输出,并且该m
方法将存储地址用作操作数。有关令人难以置信的详细信息,请参见手册。
生成的实际程序集将取决于编译器使用的操作数选择。您可以看到是否要求使用该-S
选项列出程序集。假设m32
是一个局部变量,代码可能如下所示:
movddup x(%esp), %xmmN
movsldup %xmmN, %xmmN
请注意,gcc内联汇编程序当然是gcc和体系结构特定的,这意味着使用等效的编译器内在函数更为简单。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句