1 // RUN: %clang_cc1 %s -O3 -triple=x86_64-apple-darwin -target-feature +avx -emit-llvm -o - | FileCheck %s
2 
3 // Don't include mm_malloc.h, it's system specific.
4 #define __MM_MALLOC_H
5 
6 #include <immintrin.h>
7 
8 //
9 // Test LLVM IR codegen of cmpXY instructions
10 //
11 
12 __m128d test_cmp_pd(__m128d a, __m128d b) {
13   // Expects that the third argument in LLVM IR is immediate expression
14   // CHECK: @llvm.x86.sse2.cmp.pd({{.*}}, i8 13)
15   return _mm_cmp_pd(a, b, _CMP_GE_OS);
16 }
17 
18 __m128d test_cmp_ps(__m128 a, __m128 b) {
19   // Expects that the third argument in LLVM IR is immediate expression
20   // CHECK: @llvm.x86.sse.cmp.ps({{.*}}, i8 13)
21   return _mm_cmp_ps(a, b, _CMP_GE_OS);
22 }
23 
24 __m256d test_cmp_pd256(__m256d a, __m256d b) {
25   // Expects that the third argument in LLVM IR is immediate expression
26   // CHECK: @llvm.x86.avx.cmp.pd.256({{.*}}, i8 13)
27   return _mm256_cmp_pd(a, b, _CMP_GE_OS);
28 }
29 
30 __m256d test_cmp_ps256(__m256 a, __m256 b) {
31   // Expects that the third argument in LLVM IR is immediate expression
32   // CHECK: @llvm.x86.avx.cmp.ps.256({{.*}}, i8 13)
33   return _mm256_cmp_ps(a, b, _CMP_GE_OS);
34 }
35 
36 __m128d test_cmp_sd(__m128d a, __m128d b) {
37   // Expects that the third argument in LLVM IR is immediate expression
38   // CHECK: @llvm.x86.sse2.cmp.sd({{.*}}, i8 13)
39   return _mm_cmp_sd(a, b, _CMP_GE_OS);
40 }
41 
42 __m128d test_cmp_ss(__m128 a, __m128 b) {
43   // Expects that the third argument in LLVM IR is immediate expression
44   // CHECK: @llvm.x86.sse.cmp.ss({{.*}}, i8 13)
45   return _mm_cmp_ss(a, b, _CMP_GE_OS);
46 }
47 
48 __m128 test_cmpgt_ss(__m128 a, __m128 b) {
49   // CHECK: @llvm.x86.sse.cmp.ss({{.*}}, i8 1)
50   // CHECK: shufflevector <{{.*}}, <4 x i32> <i32 4, i32 1, i32 2, i32 3>
51   return _mm_cmpgt_ss(a, b);
52 }
53 
54 __m128 test_cmpge_ss(__m128 a, __m128 b) {
55   // CHECK: @llvm.x86.sse.cmp.ss({{.*}}, i8 2)
56   // CHECK: shufflevector <{{.*}}, <4 x i32> <i32 4, i32 1, i32 2, i32 3>
57   return _mm_cmpge_ss(a, b);
58 }
59 
60 __m128 test_cmpngt_ss(__m128 a, __m128 b) {
61   // CHECK: @llvm.x86.sse.cmp.ss({{.*}}, i8 5)
62   // CHECK: shufflevector <{{.*}}, <4 x i32> <i32 4, i32 1, i32 2, i32 3>
63   return _mm_cmpngt_ss(a, b);
64 }
65 
66 __m128 test_cmpnge_ss(__m128 a, __m128 b) {
67   // CHECK: @llvm.x86.sse.cmp.ss({{.*}}, i8 6)
68   // CHECK: shufflevector <{{.*}}, <4 x i32> <i32 4, i32 1, i32 2, i32 3>
69   return _mm_cmpnge_ss(a, b);
70 }
71 
72 __m128d test_cmpgt_sd(__m128d a, __m128d b) {
73   // CHECK: @llvm.x86.sse2.cmp.sd({{.*}}, i8 1)
74   // CHECK: shufflevector <{{.*}}, <2 x i32> <i32 0, i32 3>
75   return _mm_cmpgt_sd(a, b);
76 }
77 
78 __m128d test_cmpge_sd(__m128d a, __m128d b) {
79   // CHECK: @llvm.x86.sse2.cmp.sd({{.*}}, i8 2)
80   // CHECK: shufflevector <{{.*}}, <2 x i32> <i32 0, i32 3>
81   return _mm_cmpge_sd(a, b);
82 }
83 
84 __m128d test_cmpngt_sd(__m128d a, __m128d b) {
85   // CHECK: @llvm.x86.sse2.cmp.sd({{.*}}, i8 5)
86   // CHECK: shufflevector <{{.*}}, <2 x i32> <i32 0, i32 3>
87   return _mm_cmpngt_sd(a, b);
88 }
89 
90 __m128d test_cmpnge_sd(__m128d a, __m128d b) {
91   // CHECK: @llvm.x86.sse2.cmp.sd({{.*}}, i8 6)
92   // CHECK: shufflevector <{{.*}}, <2 x i32> <i32 0, i32 3>
93   return _mm_cmpnge_sd(a, b);
94 }
95