2017-03-05 12 views
1

AVX 레지스터에 저장되어있는 double 형 벡터가 요소 {a0,a1,a2,a3}입니다. 나는이 사용 AVX를 할 수있는 방법AVX 레지스터의 요소 섞기

b = {a0,a1,a0,a0} 
c = {a1,a2,a2,a1} 
d = {a2,a3,a3,a2} 

: 지금, 나는 세 가지 새로운 벡터를 (이 또한 __m256d 변수로 저장해야합니다), 다음과 같은 요소를 포함, B, C 및 D를 말할 수 만들고 싶어?

+0

AVX1에서만 의미가 있습니까? AVX2를 사용할 수 있다면 더 효율적입니다 :'b = _mm256_permute4x64_pd (a, _MM_SHUFFLE (0,1,0,0));'. –

답변

5

는 컴파일러가 -march=core-avx2

#include <stdint.h> 

typedef double v4df __attribute__((vector_size(32))); 
typedef uint64_t v4u64 __attribute__((vector_size(32))); 

void foo(v4df a, v4df *b, v4df *c, v4df *d) 
{ 
    *b = __builtin_shuffle(a, (v4u64){0, 1, 0, 0}); 
    *c = __builtin_shuffle(a, (v4u64){1, 2, 2, 1}); 
    *d = __builtin_shuffle(a, (v4u64){2, 3, 3, 2}); 
} 

GCC-4.8.4 -march = 코어 AVX2의 -03가 생산을위한 gcc 벡터 확장을 사용하여, 그것을 수행하는 방법을 참조하십시오

vpermpd $4, %ymm0, %ymm1 
vmovapd %ymm1, (%rdi) 
vpermpd $105, %ymm0, %ymm1 
vpermpd $190, %ymm0, %ymm0 
vmovapd %ymm1, (%rsi) 
vmovapd %ymm0, (%rdx) 
vzeroupper 
ret 

GCC-4.8. 4 -march = corei7-avx -O3 생성 :

vinsertf128 $1, %xmm0, %ymm0, %ymm1 
vpermilpd $2, %ymm1, %ymm1 
vmovapd %ymm1, (%rdi) 
vperm2f128 $33, %ymm0, %ymm0, %ymm1 
vshufpd $9, %ymm1, %ymm0, %ymm1 
vmovapd %ymm1, (%rsi) 
vperm2f128 $49, %ymm0, %ymm0, %ymm0 
vpermilpd $6, %ymm0, %ymm0 
vmovapd %ymm0, (%rdx) 
vzeroupper 
ret