GCC拡張ASM構文:ソースとして負荷128ビットのメモリ・ロケーション

StackOverflow https://stackoverflow.com/questions/2181675

  •  24-09-2019
  •  | 
  •  

質問

GCCを以下)(シャッフルするためのコードを生成します

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-ベクトル変換pshufb_128bit_constant.c && objdumpの-d -mはi386:x86-64の:インテルの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   
役に立ちましたか?

解決

変更"xm"への入力オペランドの制約、そのメモリ位置は、SSEレジスタに加えて、許可されるようにします。

しかし、私はそれをテストしたときに、インテルの構文とよく座っていませんコンパイラ生成されたコード。だから、最後に、これは私が使用したものです。

__asm__("pshufb %1, %0" : "+x" (xmm) : "xm" (xmm_shuf));
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top