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