diff options
author | Chad Rosier <mcrosier@apple.com> | 2012-05-01 18:11:51 +0000 |
---|---|---|
committer | Chad Rosier <mcrosier@apple.com> | 2012-05-01 18:11:51 +0000 |
commit | c5713cfd87b028d3fcf2e11d8baa67fbc4e18916 (patch) | |
tree | 83d698d60499eb639e0d3e9c446462025bcba3e1 | |
parent | 1b9a688fbaae610398676186dcd1f3a596a46571 (diff) |
Get rid of storelv4si builtin as it can be expressed directly. This is general
goodness because it provides opportunites to cleanup things. For example,
uint64_t t1(__m128i vA)
{
uint64_t Alo;
_mm_storel_epi64((__m128i*)&Alo, vA);
return Alo;
}
was generating
movq %xmm0, -8(%rbp)
movq -8(%rbp), %rax
and now generates
movd %xmm0, %rax
rdar://11282581
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@155924 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | include/clang/Basic/BuiltinsX86.def | 2 | ||||
-rw-r--r-- | lib/Headers/emmintrin.h | 5 | ||||
-rw-r--r-- | test/CodeGen/builtins-x86.c | 1 | ||||
-rw-r--r-- | test/CodeGen/sse-builtins.c | 6 |
4 files changed, 10 insertions, 4 deletions
diff --git a/include/clang/Basic/BuiltinsX86.def b/include/clang/Basic/BuiltinsX86.def index 4aea980a9d..e487e487ca 100644 --- a/include/clang/Basic/BuiltinsX86.def +++ b/include/clang/Basic/BuiltinsX86.def @@ -303,8 +303,6 @@ BUILTIN(__builtin_ia32_lddqu, "V16ccC*", "") BUILTIN(__builtin_ia32_palignr128, "V16cV16cV16cIc", "") BUILTIN(__builtin_ia32_insertps128, "V4fV4fV4fi", "") -BUILTIN(__builtin_ia32_storelv4si, "vV2i*V2LLi", "") - BUILTIN(__builtin_ia32_pblendvb128, "V16cV16cV16cV16c", "") BUILTIN(__builtin_ia32_pblendw128, "V8sV8sV8sIi", "") BUILTIN(__builtin_ia32_blendpd, "V2dV2dV2dIi", "") diff --git a/lib/Headers/emmintrin.h b/lib/Headers/emmintrin.h index e10b77d1b2..91395ed16f 100644 --- a/lib/Headers/emmintrin.h +++ b/lib/Headers/emmintrin.h @@ -1186,7 +1186,10 @@ _mm_maskmoveu_si128(__m128i d, __m128i n, char *p) static __inline__ void __attribute__((__always_inline__, __nodebug__)) _mm_storel_epi64(__m128i *p, __m128i a) { - __builtin_ia32_storelv4si((__v2si *)p, a); + struct __mm_storel_epi64_struct { + long long u; + } __attribute__((__packed__, __may_alias__)); + ((struct __mm_storel_epi64_struct*)p)->u = a[0]; } static __inline__ void __attribute__((__always_inline__, __nodebug__)) diff --git a/test/CodeGen/builtins-x86.c b/test/CodeGen/builtins-x86.c index acb5554db4..fcf1512ca1 100644 --- a/test/CodeGen/builtins-x86.c +++ b/test/CodeGen/builtins-x86.c @@ -344,7 +344,6 @@ void f0() { tmp_V16c = __builtin_ia32_lddqu(tmp_cCp); tmp_V2LLi = __builtin_ia32_palignr128(tmp_V2LLi, tmp_V2LLi, imm_i); tmp_V1LLi = __builtin_ia32_palignr(tmp_V1LLi, tmp_V1LLi, imm_i); - (void) __builtin_ia32_storelv4si(tmp_V2ip, tmp_V2LLi); #ifdef USE_SSE4 tmp_V16c = __builtin_ia32_pblendvb128(tmp_V16c, tmp_V16c, tmp_V16c); tmp_V8s = __builtin_ia32_pblendw128(tmp_V8s, tmp_V8s, imm_i_0_256); diff --git a/test/CodeGen/sse-builtins.c b/test/CodeGen/sse-builtins.c index 2d57425155..0e48560b08 100644 --- a/test/CodeGen/sse-builtins.c +++ b/test/CodeGen/sse-builtins.c @@ -151,3 +151,9 @@ __m128d test_mm_round_sd(__m128d x, __m128d y) { // CHECK: @llvm.x86.sse41.round.sd return _mm_round_sd(x, y, 2); } + +void test_storel_epi64(__m128i x, void* y) { + // CHECK: define void @test_storel_epi64 + // CHECK: store {{.*}} i64* {{.*}}, align 1{{$}} + _mm_storel_epi64(y, x); +} |