2010-02-02 2 views
4

GCC 이하) 셔플 (이 코드를 생성 소스로서 :GCC 특별 ASM 구문 : 부하 128 비트 메모리 위치

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

이상적이 같아야

pshufb xmm4,XMMWORD PTR [rip+0x125] 

가 연장이란 이 단일 명령어를 생성하는 ASM 구문은 무엇입니까?

많은 감사, 아담

추신 : 주석 내장 함수는이 예를 들어, 최적의 코드를 생성합니다. 이것은 일반적으로 작동하지 않습니다 (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 : - 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 

답변

5

입력 오퍼랜드의 제약 조건을 "xm"으로 변경하여 SSE 레지스터 외에도 메모리 위치가 허용됩니다.

그러나 테스트했을 때 컴파일러는 인텔 구문과 잘 어울리지 않는 코드를 생성했습니다. 그래서 결국, 이것은 제가 사용했던 것입니다 :

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

많은 감사 크리스! 나는 인텔 구문에 난처했다. 당신의 도움에 매우 감동했습니다. –

관련 문제