小编Ada*_*ner的帖子

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

GCC为下面的shuffle()生成此代码:

movaps xmm0,XMMWORD PTR [rip+0x125]
pshufb xmm4,xmm0
Run Code Online (Sandbox Code Playgroud)

理想情况下,这应该是:

pshufb xmm4,XMMWORD PTR [rip+0x125]
Run Code Online (Sandbox Code Playgroud)

生成此单指令的扩展ASM语法是什么?

非常感谢,亚当

PS:注释掉的内在函数为此示例生成最佳代码.这通常不起作用(GCC很可能在存在全局寄存器变量时生成不必要的寄存器副本).

#include <stdint.h>

typedef int8_t xmm_t __attribute__ ((vector_size (16)));
const xmm_t xmm_shuf={128, 0, 1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15};
register xmm_t xmm __asm__("xmm4");

#define NTL ".intel_syntax noprefix\n"
#define ATT ".att_syntax\n"

void shuffle() {
  //xmm=__builtin_ia32_pshufb128(xmm, xmm_shuf);
  __asm__(NTL"pshufb %0, %1\n"ATT : "=x" (xmm) : "x" (xmm_shuf));
}

int main() {
}
Run Code Online (Sandbox Code Playgroud)

$ gcc -Os -std = gnu99 -msse4.1 -flax-vector-conversions pshufb_128bit_constant.c …

x86 assembly gcc sse

4
推荐指数
1
解决办法
2662
查看次数

标签 统计

assembly ×1

gcc ×1

sse ×1

x86 ×1