Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
GCC扩展ASM语法:加载128位内存位置作为源_Gcc_Assembly_X86_Sse - Fatal编程技术网

GCC扩展ASM语法:加载128位内存位置作为源

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

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,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 &lt;xmm_shuf+0x10&gt;
  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 &lt;xmm_shuf+0x10&gt;
  40049b:       66 0f 38 00 e0          pshufb xmm4,xmm0
  4004a0:       c3                      ret   
__asm__("pshufb %1, %0" : "+x" (xmm) : "xm" (xmm_shuf));