GCC扩展ASM语法:加载128位内存位置作为源
GCC为下面的shuffle()生成以下代码: 理想情况下,这应该是:GCC扩展ASM语法:加载128位内存位置作为源,gcc,assembly,x86,sse,Gcc,Assembly,X86,Sse,GCC为下面的shuffle()生成以下代码: 理想情况下,这应该是: pshufb xmm4,XMMWORD PTR [rip+0x125] 生成这条指令的扩展ASM语法是什么 非常感谢,, 亚当 PS:注释掉的内在函数为这个例子生成了最佳代码。这通常不起作用(在存在全局寄存器变量的情况下,GCC可能会生成不必要的寄存器副本) #包括 typedef int8_t xmm_t___属性(向量大小(16)); 常量xmm_t xmm_shuf={128,0,1,2,3,4,5,6,8,9,10
pshufb xmm4,XMMWORD PTR [rip+0x125]
生成这条指令的扩展ASM语法是什么
非常感谢,,
亚当
PS:注释掉的内在函数为这个例子生成了最佳代码。这通常不起作用(在存在全局寄存器变量的情况下,GCC可能会生成不必要的寄存器副本)
#包括
typedef int8_t xmm_t___属性(向量大小(16));
常量xmm_t xmm_shuf={128,0,1,2,3,4,5,6,8,9,10,11,12,13,14,15};
寄存器xmm_t xmm__asm_uuu(“xmm4”);
#定义NTL“.intel\u语法noprefix\n”
#定义ATT“.ATT\u语法\n”
无效洗牌(){
//xmm=uuu内置ia32_pshufb128(xmm,xmm_shuf);
__asm(NTL“pshufb%0,%1\n”附件:=x(xmm):“x”(xmm_-shuf));
}
int main(){
}
$gcc-Os-std=gnu99-msse4.1-flax向量转换pshufb_128位_常量.c和&objdump-d-m i386:x86-64:intel a.out小于
0000000000400494 <shuffle>:
400494: 0f 28 05 25 01 00 00 movaps xmm0,XMMWORD PTR [rip+0x125] # 4005c0 <xmm_shuf+0x10>
40049b: 66 0f 38 00 e0 pshufb xmm4,xmm0
4004a0: c3 ret
0000000000 400494:
400494:0f 28 05 25 01 00 movaps xmm0,XMMWORD PTR[rip+0x125]#4005c0 xmm_shuf+0x10
40049b:66 0f 38 00 e0 pshufb xmm4,xmm0
4004a0:c3 ret
将输入操作数的约束更改为“xm”
,以便除了SSE寄存器之外,还允许使用内存位置
但是,当我测试它时,编译器生成的代码与Intel语法不符。所以,最后,我用的是:
__asm__("pshufb %1, %0" : "+x" (xmm) : "xm" (xmm_shuf));
非常感谢克里斯!我被英特尔的语法难住了。你的帮助给我留下了深刻的印象。
0000000000400494 <shuffle>:
400494: 0f 28 05 25 01 00 00 movaps xmm0,XMMWORD PTR [rip+0x125] # 4005c0 <xmm_shuf+0x10>
40049b: 66 0f 38 00 e0 pshufb xmm4,xmm0
4004a0: c3 ret
__asm__("pshufb %1, %0" : "+x" (xmm) : "xm" (xmm_shuf));