【问题标题】:GCC Extended ASM syntax: load 128-bit memory location as sourceGCC 扩展 ASM 语法:加载 128 位内存位置作为源
【发布时间】:2010-02-02 03:14:55
【问题描述】:

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

movaps xmm0,XMMWORD PTR [rip+0x125]
pshufb xmm4,xmm0

理想情况下应该是:

pshufb xmm4,XMMWORD PTR [rip+0x125]

生成这条指令的扩展 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() {
}

$ gcc -Os -std=gnu99 -msse4.1 -flax-vector-conversions pshufb_128bit_constant.c && objdump -d -m i386:x86-64:intel a.out |less

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   

【问题讨论】:

    标签: gcc assembly x86 sse


    【解决方案1】:

    将输入操作数的约束更改为"xm",以便除了 SSE 寄存器之外还允许内存位置。

    但是,当我对其进行测试时,编译器生成的代码与英特尔语法不符。所以,最后,这就是我使用的:

    __asm__("pshufb %1, %0" : "+x" (xmm) : "xm" (xmm_shuf));
    

    【讨论】:

    • 非常感谢克里斯!我被英特尔语法难住了。您的帮助给我留下了深刻的印象。
    猜你喜欢
    • 2013-10-25
    • 1970-01-01
    • 1970-01-01
    • 2010-12-31
    • 1970-01-01
    • 1970-01-01
    • 2021-11-26
    • 2021-05-06
    • 2013-04-11
    相关资源
    最近更新 更多