]> granicus.if.org Git - clang/commitdiff
Make the byte-shift SSE intrinsics emit vector shuffles which we know the backend...
authorFilipe Cabecinhas <me@filcab.net>
Sat, 7 Feb 2015 01:37:09 +0000 (01:37 +0000)
committerFilipe Cabecinhas <me@filcab.net>
Sat, 7 Feb 2015 01:37:09 +0000 (01:37 +0000)
Also removed unused builtins.

Original patch by Andrea Di Biagio!

Reviewers: craig.topper, nadav

Subscribers: cfe-commits

Differential Revision: http://reviews.llvm.org/D7199

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@228481 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Basic/BuiltinsX86.def
lib/Headers/emmintrin.h
test/CodeGen/sse.c [new file with mode: 0644]
test/Sema/x86-builtin-palignr.c

index a246c2516910654c734fc3c4f1008fbdea1e15b6..8cf9204f42738c7e367e9b86fd001bfe5adc0d0c 100644 (file)
@@ -316,8 +316,6 @@ BUILTIN(__builtin_ia32_psraw128, "V8sV8sV8s", "")
 BUILTIN(__builtin_ia32_psrad128, "V4iV4iV4i", "")
 BUILTIN(__builtin_ia32_psrlw128, "V8sV8sV8s", "")
 BUILTIN(__builtin_ia32_psrld128, "V4iV4iV4i", "")
-BUILTIN(__builtin_ia32_pslldqi128, "V2LLiV2LLiIi", "")
-BUILTIN(__builtin_ia32_psrldqi128, "V2LLiV2LLiIi", "")
 BUILTIN(__builtin_ia32_psrlq128, "V2LLiV2LLiV2LLi", "")
 BUILTIN(__builtin_ia32_psllw128, "V8sV8sV8s", "")
 BUILTIN(__builtin_ia32_pslld128, "V4iV4iV4i", "")
index af90f9d9e1c94c4504a1fa616972aad80d33c60e..91bb038ef4f76e7b6e5bf0c0ad88e41d6bfbd03c 100644 (file)
@@ -825,11 +825,30 @@ _mm_xor_si128(__m128i __a, __m128i __b)
   return __a ^ __b;
 }
 
-#define _mm_slli_si128(a, count) __extension__ ({ \
-  _Pragma("clang diagnostic push") _Pragma("clang diagnostic ignored \"-Wshadow\""); \
-  __m128i __a = (a); \
-   _Pragma("clang diagnostic pop"); \
-  (__m128i)__builtin_ia32_pslldqi128(__a, (count)*8); })
+#define _mm_slli_si128(a, imm) __extension__({                                 \
+    _Pragma("clang diagnostic push")                                           \
+        _Pragma("clang diagnostic ignored \"-Wshadow\"");                      \
+    __m128i __a = (a);                                                         \
+    _Pragma("clang diagnostic pop");                                           \
+    (__m128i)                                                                  \
+        __builtin_shufflevector((__v16qi)_mm_setzero_si128(), (__v16qi)__a,    \
+                                ((imm)&0xF0) ? 0 : 16 - ((imm)&0xF),           \
+                                ((imm)&0xF0) ? 0 : 17 - ((imm)&0xF),           \
+                                ((imm)&0xF0) ? 0 : 18 - ((imm)&0xF),           \
+                                ((imm)&0xF0) ? 0 : 19 - ((imm)&0xF),           \
+                                ((imm)&0xF0) ? 0 : 20 - ((imm)&0xF),           \
+                                ((imm)&0xF0) ? 0 : 21 - ((imm)&0xF),           \
+                                ((imm)&0xF0) ? 0 : 22 - ((imm)&0xF),           \
+                                ((imm)&0xF0) ? 0 : 23 - ((imm)&0xF),           \
+                                ((imm)&0xF0) ? 0 : 24 - ((imm)&0xF),           \
+                                ((imm)&0xF0) ? 0 : 25 - ((imm)&0xF),           \
+                                ((imm)&0xF0) ? 0 : 26 - ((imm)&0xF),           \
+                                ((imm)&0xF0) ? 0 : 27 - ((imm)&0xF),           \
+                                ((imm)&0xF0) ? 0 : 28 - ((imm)&0xF),           \
+                                ((imm)&0xF0) ? 0 : 29 - ((imm)&0xF),           \
+                                ((imm)&0xF0) ? 0 : 30 - ((imm)&0xF),           \
+                                ((imm)&0xF0) ? 0 : 31 - ((imm)&0xF));          \
+  })
 
 static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
 _mm_slli_epi16(__m128i __a, int __count)
@@ -891,12 +910,30 @@ _mm_sra_epi32(__m128i __a, __m128i __count)
   return (__m128i)__builtin_ia32_psrad128((__v4si)__a, (__v4si)__count);
 }
 
-
-#define _mm_srli_si128(a, count) __extension__ ({ \
-  _Pragma("clang diagnostic push") _Pragma("clang diagnostic ignored \"-Wshadow\""); \
-  __m128i __a = (a); \
-  _Pragma("clang diagnostic pop"); \
-  (__m128i)__builtin_ia32_psrldqi128(__a, (count)*8); })
+#define _mm_srli_si128(a, imm) __extension__({                                 \
+    _Pragma("clang diagnostic push")                                           \
+        _Pragma("clang diagnostic ignored \"-Wshadow\"");                      \
+    __m128i __a = (a);                                                         \
+    _Pragma("clang diagnostic pop");                                           \
+    (__m128i)                                                                  \
+        __builtin_shufflevector((__v16qi)__a, (__v16qi)_mm_setzero_si128(),    \
+                                ((imm)&0xF0) ? 16 : ((imm)&0xF) + 0,           \
+                                ((imm)&0xF0) ? 16 : ((imm)&0xF) + 1,           \
+                                ((imm)&0xF0) ? 16 : ((imm)&0xF) + 2,           \
+                                ((imm)&0xF0) ? 16 : ((imm)&0xF) + 3,           \
+                                ((imm)&0xF0) ? 16 : ((imm)&0xF) + 4,           \
+                                ((imm)&0xF0) ? 16 : ((imm)&0xF) + 5,           \
+                                ((imm)&0xF0) ? 16 : ((imm)&0xF) + 6,           \
+                                ((imm)&0xF0) ? 16 : ((imm)&0xF) + 7,           \
+                                ((imm)&0xF0) ? 16 : ((imm)&0xF) + 8,           \
+                                ((imm)&0xF0) ? 16 : ((imm)&0xF) + 9,           \
+                                ((imm)&0xF0) ? 16 : ((imm)&0xF) + 10,          \
+                                ((imm)&0xF0) ? 16 : ((imm)&0xF) + 11,          \
+                                ((imm)&0xF0) ? 16 : ((imm)&0xF) + 12,          \
+                                ((imm)&0xF0) ? 16 : ((imm)&0xF) + 13,          \
+                                ((imm)&0xF0) ? 16 : ((imm)&0xF) + 14,          \
+                                ((imm)&0xF0) ? 16 : ((imm)&0xF) + 15);         \
+  })
 
 static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
 _mm_srli_epi16(__m128i __a, int __count)
diff --git a/test/CodeGen/sse.c b/test/CodeGen/sse.c
new file mode 100644 (file)
index 0000000..17cce69
--- /dev/null
@@ -0,0 +1,40 @@
+// RUN: %clang_cc1 -O3 -ffreestanding -triple x86_64-apple-macosx10.8.0 -target-feature +sse4.1 -emit-llvm %s -o - | FileCheck %s
+
+#include <emmintrin.h>
+
+// Byte-shifts look reversed due to xmm register layout
+__m128 test_mm_slli_si128(__m128 a) {
+  // CHECK-LABEL: @test_mm_slli_si128
+  // CHECK: shufflevector <16 x i8> <{{.*}}, i8 0, i8 0, i8 0, i8 0, i8 0>, <16 x i8> {{.*}}, <16 x i32> <i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26>
+  return _mm_slli_si128(a, 5);
+}
+
+__m128 test_mm_slli_si128_0(__m128 a) {
+  // CHECK-LABEL: @test_mm_slli_si128_0
+  // CHECK-NOT: shufflevector
+  return _mm_slli_si128(a, 0);
+}
+
+__m128 test_mm_slli_si128_16(__m128 a) {
+  // CHECK-LABEL: @test_mm_slli_si128_16
+  // CHECK-NOT: shufflevector
+  return _mm_slli_si128(a, 16);
+}
+
+__m128 test_mm_srli_si128(__m128 a) {
+  // CHECK-LABEL: @test_mm_srli_si128
+  // CHECK: shufflevector <16 x i8> {{.*}}, <16 x i8> <i8 0, i8 0, i8 0, i8 0, i8 0, {{.*}}>, <16 x i32> <i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18, i32 19, i32 20>
+  return _mm_srli_si128(a, 5);
+}
+
+__m128 test_mm_srli_si128_0(__m128 a) {
+  // CHECK-LABEL: @test_mm_srli_si128_0
+  // CHECK-NOT: shufflevector
+  return _mm_srli_si128(a, 0);
+}
+
+__m128 test_mm_srli_si128_16(__m128 a) {
+  // CHECK-LABEL: @test_mm_srli_si128_16
+  // CHECK-NOT: shufflevector
+  return _mm_srli_si128(a, 16);
+}
index 6f4b90dafa1cc26d2fe13a8621d35a0d564b16d3..f7e70b9c3c45b04a43aa3bcbd1ce83670cc78ac9 100644 (file)
@@ -8,10 +8,3 @@ __m64 test1(__m64 a, __m64 b, int c) {
    // be removed when that is fixed.
    return _mm_alignr_pi8(a, b, c); // expected-error {{argument to '__builtin_ia32_palignr' must be a constant integer}} expected-error {{incompatible result type}}
 }
-
-int test2(int N) {
- __m128i white2;
- white2 = __builtin_ia32_pslldqi128(white2, N); // expected-error {{argument to '__builtin_ia32_pslldqi128' must be a constant integer}}
- return 0;
-} 
-