diff options
Diffstat (limited to 'clang')
-rw-r--r-- | clang/lib/Headers/avx2intrin.h | 4 | ||||
-rw-r--r-- | clang/lib/Headers/avxintrin.h | 4 | ||||
-rw-r--r-- | clang/lib/Headers/emmintrin.h | 7 | ||||
-rw-r--r-- | clang/lib/Headers/smmintrin.h | 28 | ||||
-rw-r--r-- | clang/test/CodeGen/avx2-builtins.c | 2 | ||||
-rw-r--r-- | clang/test/CodeGen/avx512bw-builtins.c | 1 | ||||
-rw-r--r-- | clang/test/CodeGen/avx512vlbw-builtins.c | 1 | ||||
-rw-r--r-- | clang/test/CodeGen/mmx-builtins.c | 1 | ||||
-rw-r--r-- | clang/test/CodeGen/sse42-builtins.c | 23 |
9 files changed, 50 insertions, 21 deletions
diff --git a/clang/lib/Headers/avx2intrin.h b/clang/lib/Headers/avx2intrin.h index a5c376cca62..90b8530126d 100644 --- a/clang/lib/Headers/avx2intrin.h +++ b/clang/lib/Headers/avx2intrin.h @@ -208,7 +208,9 @@ _mm256_cmpeq_epi64(__m256i __a, __m256i __b) static __inline__ __m256i __DEFAULT_FN_ATTRS _mm256_cmpgt_epi8(__m256i __a, __m256i __b) { - return (__m256i)((__v32qi)__a > (__v32qi)__b); + /* This function always performs a signed comparison, but __v32qi is a char + which may be signed or unsigned, so use __v32qs. */ + return (__m256i)((__v32qs)__a > (__v32qs)__b); } static __inline__ __m256i __DEFAULT_FN_ATTRS diff --git a/clang/lib/Headers/avxintrin.h b/clang/lib/Headers/avxintrin.h index a8418ad0ed6..7e4de9d443c 100644 --- a/clang/lib/Headers/avxintrin.h +++ b/clang/lib/Headers/avxintrin.h @@ -35,6 +35,10 @@ typedef int __v8si __attribute__ ((__vector_size__ (32))); typedef short __v16hi __attribute__ ((__vector_size__ (32))); typedef char __v32qi __attribute__ ((__vector_size__ (32))); +/* We need an explicitly signed variant for char. Note that this shouldn't + * appear in the interface though. */ +typedef signed char __v32qs __attribute__((__vector_size__(32))); + typedef float __m256 __attribute__ ((__vector_size__ (32))); typedef double __m256d __attribute__((__vector_size__(32))); typedef long long __m256i __attribute__((__vector_size__(32))); diff --git a/clang/lib/Headers/emmintrin.h b/clang/lib/Headers/emmintrin.h index 761aefafa18..47eaf091e1e 100644 --- a/clang/lib/Headers/emmintrin.h +++ b/clang/lib/Headers/emmintrin.h @@ -35,6 +35,10 @@ typedef long long __v2di __attribute__ ((__vector_size__ (16))); typedef short __v8hi __attribute__((__vector_size__(16))); typedef char __v16qi __attribute__((__vector_size__(16))); +/* We need an explicitly signed variant for char. Note that this shouldn't + * appear in the interface though. */ +typedef signed char __v16qs __attribute__((__vector_size__(16))); + #include <f16cintrin.h> /* Define the default attributes for the functions in this file. */ @@ -996,8 +1000,7 @@ static __inline__ __m128i __DEFAULT_FN_ATTRS _mm_cmpgt_epi8(__m128i __a, __m128i __b) { /* This function always performs a signed comparison, but __v16qi is a char - which may be signed or unsigned. */ - typedef signed char __v16qs __attribute__((__vector_size__(16))); + which may be signed or unsigned, so use __v16qs. */ return (__m128i)((__v16qs)__a > (__v16qs)__b); } diff --git a/clang/lib/Headers/smmintrin.h b/clang/lib/Headers/smmintrin.h index 7a18201eced..90ba9970cdb 100644 --- a/clang/lib/Headers/smmintrin.h +++ b/clang/lib/Headers/smmintrin.h @@ -286,34 +286,26 @@ _mm_cmpeq_epi64(__m128i __V1, __m128i __V2) static __inline__ __m128i __DEFAULT_FN_ATTRS _mm_cvtepi8_epi16(__m128i __V) { - /* We need a local definitively signed typedef similar to __v16qi even in the - * presence of __UNSIGNED_CHAR__. - * FIXME: __v16qi should almost certainly be definitively signed. - */ - typedef signed char __signed_v16qi __attribute__((__vector_size__(16))); - return (__m128i)__builtin_convertvector(__builtin_shufflevector((__signed_v16qi)__V, (__signed_v16qi)__V, 0, 1, 2, 3, 4, 5, 6, 7), __v8hi); + /* This function always performs a signed extension, but __v16qi is a char + which may be signed or unsigned, so use __v16qs. */ + return (__m128i)__builtin_convertvector(__builtin_shufflevector((__v16qs)__V, (__v16qs)__V, 0, 1, 2, 3, 4, 5, 6, 7), __v8hi); } static __inline__ __m128i __DEFAULT_FN_ATTRS _mm_cvtepi8_epi32(__m128i __V) { - /* We need a local definitively signed typedef similar to __v16qi even in the - * presence of __UNSIGNED_CHAR__. - * FIXME: __v16qi should almost certainly be definitively signed. - */ - typedef signed char __signed_v16qi __attribute__((__vector_size__(16))); - return (__m128i)__builtin_convertvector(__builtin_shufflevector((__signed_v16qi)__V, (__signed_v16qi)__V, 0, 1, 2, 3), __v4si); + /* This function always performs a signed extension, but __v16qi is a char + which may be signed or unsigned, so use __v16qs. */ + return (__m128i)__builtin_convertvector(__builtin_shufflevector((__v16qs)__V, (__v16qs)__V, 0, 1, 2, 3), __v4si); } static __inline__ __m128i __DEFAULT_FN_ATTRS _mm_cvtepi8_epi64(__m128i __V) { - /* We need a local definitively signed typedef similar to __v16qi even in the - * presence of __UNSIGNED_CHAR__. - * FIXME: __v16qi should almost certainly be definitively signed. - */ - typedef signed char __signed_v16qi __attribute__((__vector_size__(16))); - return (__m128i)__builtin_convertvector(__builtin_shufflevector((__signed_v16qi)__V, (__signed_v16qi)__V, 0, 1), __v2di); + /* This function always performs a signed extension, but __v16qi is a char + which may be signed or unsigned, so use __v16qs. */ + typedef signed char __v16qs __attribute__((__vector_size__(16))); + return (__m128i)__builtin_convertvector(__builtin_shufflevector((__v16qs)__V, (__v16qs)__V, 0, 1), __v2di); } static __inline__ __m128i __DEFAULT_FN_ATTRS diff --git a/clang/test/CodeGen/avx2-builtins.c b/clang/test/CodeGen/avx2-builtins.c index fa74adc3796..905728879c4 100644 --- a/clang/test/CodeGen/avx2-builtins.c +++ b/clang/test/CodeGen/avx2-builtins.c @@ -1,5 +1,7 @@ // RUN: %clang_cc1 %s -O0 -triple=x86_64-apple-darwin -target-feature +avx2 -emit-llvm -o - -Werror | FileCheck %s +// RUN: %clang_cc1 %s -O0 -triple=x86_64-apple-darwin -target-feature +avx2 -fno-signed-char -emit-llvm -o - -Werror | FileCheck %s // RUN: %clang_cc1 %s -O0 -triple=x86_64-apple-darwin -target-feature +avx2 -S -o - -Werror | FileCheck %s --check-prefix=CHECK-ASM +// RUN: %clang_cc1 %s -O0 -triple=x86_64-apple-darwin -target-feature +avx2 -fno-signed-char -S -o - -Werror | FileCheck %s --check-prefix=CHECK-ASM // REQUIRES: x86-registered-target diff --git a/clang/test/CodeGen/avx512bw-builtins.c b/clang/test/CodeGen/avx512bw-builtins.c index a0f25beb3bb..2878b765417 100644 --- a/clang/test/CodeGen/avx512bw-builtins.c +++ b/clang/test/CodeGen/avx512bw-builtins.c @@ -1,4 +1,5 @@ // RUN: %clang_cc1 %s -O0 -triple=x86_64-apple-darwin -ffreestanding -target-feature +avx512bw -emit-llvm -o - -Werror | FileCheck %s +// RUN: %clang_cc1 %s -O0 -triple=x86_64-apple-darwin -ffreestanding -target-feature +avx512bw -fno-signed-char -emit-llvm -o - -Werror | FileCheck %s #include <immintrin.h> diff --git a/clang/test/CodeGen/avx512vlbw-builtins.c b/clang/test/CodeGen/avx512vlbw-builtins.c index eb12d504a3c..b78f0d773e6 100644 --- a/clang/test/CodeGen/avx512vlbw-builtins.c +++ b/clang/test/CodeGen/avx512vlbw-builtins.c @@ -1,4 +1,5 @@ // RUN: %clang_cc1 %s -O0 -triple=x86_64-apple-darwin -ffreestanding -target-feature +avx512bw -target-feature +avx512vl -emit-llvm -o - -Werror | FileCheck %s +// RUN: %clang_cc1 %s -O0 -triple=x86_64-apple-darwin -ffreestanding -target-feature +avx512bw -target-feature +avx512vl -fno-signed-char -emit-llvm -o - -Werror | FileCheck %s #include <immintrin.h> diff --git a/clang/test/CodeGen/mmx-builtins.c b/clang/test/CodeGen/mmx-builtins.c index e9f8d8696f9..f17d6eadff0 100644 --- a/clang/test/CodeGen/mmx-builtins.c +++ b/clang/test/CodeGen/mmx-builtins.c @@ -1,5 +1,6 @@ // REQUIRES: x86-registered-target // RUN: %clang_cc1 %s -O3 -triple=x86_64-apple-darwin -target-feature +ssse3 -S -o - | FileCheck %s +// RUN: %clang_cc1 %s -O3 -triple=x86_64-apple-darwin -target-feature +ssse3 -fno-signed-char -S -o - | FileCheck %s // FIXME: Disable inclusion of mm_malloc.h, our current implementation is broken // on win32 since we don't generally know how to find errno.h. diff --git a/clang/test/CodeGen/sse42-builtins.c b/clang/test/CodeGen/sse42-builtins.c index 6a56df798a1..4b56f12f8d7 100644 --- a/clang/test/CodeGen/sse42-builtins.c +++ b/clang/test/CodeGen/sse42-builtins.c @@ -1,12 +1,35 @@ // REQUIRES: x86-registered-target // RUN: %clang_cc1 %s -O0 -triple=x86_64-apple-darwin -target-feature +sse4.2 -emit-llvm -o - -Werror | FileCheck %s +// RUN: %clang_cc1 %s -O0 -triple=x86_64-apple-darwin -target-feature +sse4.2 -fno-signed-char -emit-llvm -o - -Werror | FileCheck %s // RUN: %clang_cc1 %s -O0 -triple=x86_64-apple-darwin -target-feature +sse4.2 -S -o - -Werror | FileCheck %s --check-prefix=CHECK-ASM +// RUN: %clang_cc1 %s -O0 -triple=x86_64-apple-darwin -target-feature +sse4.2 -fno-signed-char -S -o - -Werror | FileCheck %s --check-prefix=CHECK-ASM // Don't include mm_malloc.h, it's system specific. #define __MM_MALLOC_H #include <x86intrin.h> +__m128i test_mm_cmpgt_epi8(__m128i A, __m128i B) { + // CHECK-LABEL: test_mm_cmpgt_epi8 + // CHECK: icmp sgt <16 x i8> + // CHECK-ASM: pcmpgtb %xmm{{.*}}, %xmm{{.*}} + return _mm_cmpgt_epi8(A, B); +} + +__m128i test_mm_cmpgt_epi16(__m128i A, __m128i B) { + // CHECK-LABEL: test_mm_cmpgt_epi16 + // CHECK: icmp sgt <8 x i16> + // CHECK-ASM: pcmpgtw %xmm{{.*}}, %xmm{{.*}} + return _mm_cmpgt_epi16(A, B); +} + +__m128i test_mm_cmpgt_epi32(__m128i A, __m128i B) { + // CHECK-LABEL: test_mm_cmpgt_epi32 + // CHECK: icmp sgt <4 x i32> + // CHECK-ASM: pcmpgtd %xmm{{.*}}, %xmm{{.*}} + return _mm_cmpgt_epi32(A, B); +} + __m128i test_mm_cmpgt_epi64(__m128i A, __m128i B) { // CHECK-LABEL: test_mm_cmpgt_epi64 // CHECK: icmp sgt <2 x i64> |