는 컴파일러가 -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
AVX1에서만 의미가 있습니까? AVX2를 사용할 수 있다면 더 효율적입니다 :'b = _mm256_permute4x64_pd (a, _MM_SHUFFLE (0,1,0,0));'. –