xref: /aosp_15_r20/external/clang/test/CodeGen/bmi-builtins.c (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 %s -triple=x86_64-apple-darwin -target-feature +bmi -emit-llvm -o - -Werror | FileCheck %s
2*67e74705SXin Li 
3*67e74705SXin Li // Don't include mm_malloc.h, it's system specific.
4*67e74705SXin Li #define __MM_MALLOC_H
5*67e74705SXin Li 
6*67e74705SXin Li #include <x86intrin.h>
7*67e74705SXin Li 
8*67e74705SXin Li // NOTE: This should match the tests in llvm/test/CodeGen/X86/bmi-intrinsics-fast-isel.ll
9*67e74705SXin Li 
10*67e74705SXin Li // The double underscore intrinsics are for compatibility with
11*67e74705SXin Li // AMD's BMI interface. The single underscore intrinsics
12*67e74705SXin Li // are for compatibility with Intel's BMI interface.
13*67e74705SXin Li // Apart from the underscores, the interfaces are identical
14*67e74705SXin Li // except in one case: although the 'bextr' register-form
15*67e74705SXin Li // instruction is identical in hardware, the AMD and Intel
16*67e74705SXin Li // intrinsics are different!
17*67e74705SXin Li 
test__tzcnt_u16(unsigned short __X)18*67e74705SXin Li unsigned short test__tzcnt_u16(unsigned short __X) {
19*67e74705SXin Li   // CHECK-LABEL: test__tzcnt_u16
20*67e74705SXin Li   // CHECK: zext i16 %{{.*}} to i32
21*67e74705SXin Li   // CHECK: icmp ne i32 %{{.*}}, 0
22*67e74705SXin Li   // CHECK: i16 @llvm.cttz.i16(i16 %{{.*}}, i1 true)
23*67e74705SXin Li   return __tzcnt_u16(__X);
24*67e74705SXin Li }
25*67e74705SXin Li 
test__andn_u32(unsigned int __X,unsigned int __Y)26*67e74705SXin Li unsigned int test__andn_u32(unsigned int __X, unsigned int __Y) {
27*67e74705SXin Li   // CHECK-LABEL: test__andn_u32
28*67e74705SXin Li   // CHECK: xor i32 %{{.*}}, -1
29*67e74705SXin Li   // CHECK: and i32 %{{.*}}, %{{.*}}
30*67e74705SXin Li   return __andn_u32(__X, __Y);
31*67e74705SXin Li }
32*67e74705SXin Li 
test__bextr_u32(unsigned int __X,unsigned int __Y)33*67e74705SXin Li unsigned int test__bextr_u32(unsigned int __X, unsigned int __Y) {
34*67e74705SXin Li   // CHECK-LABEL: test__bextr_u32
35*67e74705SXin Li   // CHECK: i32 @llvm.x86.bmi.bextr.32(i32 %{{.*}}, i32 %{{.*}})
36*67e74705SXin Li   return __bextr_u32(__X, __Y);
37*67e74705SXin Li }
38*67e74705SXin Li 
test__blsi_u32(unsigned int __X)39*67e74705SXin Li unsigned int test__blsi_u32(unsigned int __X) {
40*67e74705SXin Li   // CHECK-LABEL: test__blsi_u32
41*67e74705SXin Li   // CHECK: sub i32 0, %{{.*}}
42*67e74705SXin Li   // CHECK: and i32 %{{.*}}, %{{.*}}
43*67e74705SXin Li   return __blsi_u32(__X);
44*67e74705SXin Li }
45*67e74705SXin Li 
test__blsmsk_u32(unsigned int __X)46*67e74705SXin Li unsigned int test__blsmsk_u32(unsigned int __X) {
47*67e74705SXin Li   // CHECK-LABEL: test__blsmsk_u32
48*67e74705SXin Li   // CHECK: sub i32 %{{.*}}, 1
49*67e74705SXin Li   // CHECK: xor i32 %{{.*}}, %{{.*}}
50*67e74705SXin Li   return __blsmsk_u32(__X);
51*67e74705SXin Li }
52*67e74705SXin Li 
test__blsr_u32(unsigned int __X)53*67e74705SXin Li unsigned int test__blsr_u32(unsigned int __X) {
54*67e74705SXin Li   // CHECK-LABEL: test__blsr_u32
55*67e74705SXin Li   // CHECK: sub i32 %{{.*}}, 1
56*67e74705SXin Li   // CHECK: and i32 %{{.*}}, %{{.*}}
57*67e74705SXin Li   return __blsr_u32(__X);
58*67e74705SXin Li }
59*67e74705SXin Li 
test__tzcnt_u32(unsigned int __X)60*67e74705SXin Li unsigned int test__tzcnt_u32(unsigned int __X) {
61*67e74705SXin Li   // CHECK-LABEL: test__tzcnt_u32
62*67e74705SXin Li   // CHECK: icmp ne i32 %{{.*}}, 0
63*67e74705SXin Li   // CHECK: i32 @llvm.cttz.i32(i32 %{{.*}}, i1 true)
64*67e74705SXin Li   return __tzcnt_u32(__X);
65*67e74705SXin Li }
66*67e74705SXin Li 
test_mm_tzcnt_32(unsigned int __X)67*67e74705SXin Li int test_mm_tzcnt_32(unsigned int __X) {
68*67e74705SXin Li   // CHECK-LABEL: test_mm_tzcnt_32
69*67e74705SXin Li   // CHECK: icmp ne i32 %{{.*}}, 0
70*67e74705SXin Li   // CHECK: i32 @llvm.cttz.i32(i32 %{{.*}}, i1 true)
71*67e74705SXin Li   return _mm_tzcnt_32(__X);
72*67e74705SXin Li }
73*67e74705SXin Li 
test__andn_u64(unsigned long __X,unsigned long __Y)74*67e74705SXin Li unsigned long long test__andn_u64(unsigned long __X, unsigned long __Y) {
75*67e74705SXin Li   // CHECK-LABEL: test__andn_u64
76*67e74705SXin Li   // CHECK: xor i64 %{{.*}}, -1
77*67e74705SXin Li   // CHECK: and i64 %{{.*}}, %{{.*}}
78*67e74705SXin Li   return __andn_u64(__X, __Y);
79*67e74705SXin Li }
80*67e74705SXin Li 
test__bextr_u64(unsigned long __X,unsigned long __Y)81*67e74705SXin Li unsigned long long test__bextr_u64(unsigned long __X, unsigned long __Y) {
82*67e74705SXin Li   // CHECK-LABEL: test__bextr_u64
83*67e74705SXin Li   // CHECK: i64 @llvm.x86.bmi.bextr.64(i64 %{{.*}}, i64 %{{.*}})
84*67e74705SXin Li   return __bextr_u64(__X, __Y);
85*67e74705SXin Li }
86*67e74705SXin Li 
test__blsi_u64(unsigned long long __X)87*67e74705SXin Li unsigned long long test__blsi_u64(unsigned long long __X) {
88*67e74705SXin Li   // CHECK-LABEL: test__blsi_u64
89*67e74705SXin Li   // CHECK: sub i64 0, %{{.*}}
90*67e74705SXin Li   // CHECK: and i64 %{{.*}}, %{{.*}}
91*67e74705SXin Li   return __blsi_u64(__X);
92*67e74705SXin Li }
93*67e74705SXin Li 
test__blsmsk_u64(unsigned long long __X)94*67e74705SXin Li unsigned long long test__blsmsk_u64(unsigned long long __X) {
95*67e74705SXin Li   // CHECK-LABEL: test__blsmsk_u64
96*67e74705SXin Li   // CHECK: sub i64 %{{.*}}, 1
97*67e74705SXin Li   // CHECK: xor i64 %{{.*}}, %{{.*}}
98*67e74705SXin Li   return __blsmsk_u64(__X);
99*67e74705SXin Li }
100*67e74705SXin Li 
test__blsr_u64(unsigned long long __X)101*67e74705SXin Li unsigned long long test__blsr_u64(unsigned long long __X) {
102*67e74705SXin Li   // CHECK-LABEL: test__blsr_u64
103*67e74705SXin Li   // CHECK: sub i64 %{{.*}}, 1
104*67e74705SXin Li   // CHECK: and i64 %{{.*}}, %{{.*}}
105*67e74705SXin Li   return __blsr_u64(__X);
106*67e74705SXin Li }
107*67e74705SXin Li 
test__tzcnt_u64(unsigned long long __X)108*67e74705SXin Li unsigned long long test__tzcnt_u64(unsigned long long __X) {
109*67e74705SXin Li   // CHECK-LABEL: test__tzcnt_u64
110*67e74705SXin Li   // CHECK: icmp ne i64 %{{.*}}, 0
111*67e74705SXin Li   // CHECK: i64 @llvm.cttz.i64(i64 %{{.*}}, i1 true)
112*67e74705SXin Li   return __tzcnt_u64(__X);
113*67e74705SXin Li }
114*67e74705SXin Li 
test_mm_tzcnt_64(unsigned long long __X)115*67e74705SXin Li long long test_mm_tzcnt_64(unsigned long long __X) {
116*67e74705SXin Li   // CHECK-LABEL: test_mm_tzcnt_64
117*67e74705SXin Li   // CHECK: icmp ne i64 %{{.*}}, 0
118*67e74705SXin Li   // CHECK: i64 @llvm.cttz.i64(i64 %{{.*}}, i1 true)
119*67e74705SXin Li   return _mm_tzcnt_64(__X);
120*67e74705SXin Li }
121*67e74705SXin Li 
122*67e74705SXin Li // Intel intrinsics
123*67e74705SXin Li 
test_tzcnt_u16(unsigned short __X)124*67e74705SXin Li unsigned short test_tzcnt_u16(unsigned short __X) {
125*67e74705SXin Li   // CHECK-LABEL: test_tzcnt_u16
126*67e74705SXin Li   // CHECK: zext i16 %{{.*}} to i32
127*67e74705SXin Li   // CHECK: icmp ne i32 %{{.*}}, 0
128*67e74705SXin Li   // CHECK: i16 @llvm.cttz.i16(i16 %{{.*}}, i1 true)
129*67e74705SXin Li   return _tzcnt_u16(__X);
130*67e74705SXin Li }
131*67e74705SXin Li 
test_andn_u32(unsigned int __X,unsigned int __Y)132*67e74705SXin Li unsigned int test_andn_u32(unsigned int __X, unsigned int __Y) {
133*67e74705SXin Li   // CHECK-LABEL: test_andn_u32
134*67e74705SXin Li   // CHECK: xor i32 %{{.*}}, -1
135*67e74705SXin Li   // CHECK: and i32 %{{.*}}, %{{.*}}
136*67e74705SXin Li   return _andn_u32(__X, __Y);
137*67e74705SXin Li }
138*67e74705SXin Li 
test_bextr_u32(unsigned int __X,unsigned int __Y,unsigned int __Z)139*67e74705SXin Li unsigned int test_bextr_u32(unsigned int __X, unsigned int __Y,
140*67e74705SXin Li                             unsigned int __Z) {
141*67e74705SXin Li   // CHECK-LABEL: test_bextr_u32
142*67e74705SXin Li   // CHECK: and i32 %{{.*}}, 255
143*67e74705SXin Li   // CHECK: and i32 %{{.*}}, 255
144*67e74705SXin Li   // CHECK: shl i32 %{{.*}}, 8
145*67e74705SXin Li   // CHECK: or i32 %{{.*}}, %{{.*}}
146*67e74705SXin Li   // CHECK: i32 @llvm.x86.bmi.bextr.32(i32 %{{.*}}, i32 %{{.*}})
147*67e74705SXin Li   return _bextr_u32(__X, __Y, __Z);
148*67e74705SXin Li }
149*67e74705SXin Li 
test_blsi_u32(unsigned int __X)150*67e74705SXin Li unsigned int test_blsi_u32(unsigned int __X) {
151*67e74705SXin Li   // CHECK-LABEL: test_blsi_u32
152*67e74705SXin Li   // CHECK: sub i32 0, %{{.*}}
153*67e74705SXin Li   // CHECK: and i32 %{{.*}}, %{{.*}}
154*67e74705SXin Li   return _blsi_u32(__X);
155*67e74705SXin Li }
156*67e74705SXin Li 
test_blsmsk_u32(unsigned int __X)157*67e74705SXin Li unsigned int test_blsmsk_u32(unsigned int __X) {
158*67e74705SXin Li   // CHECK-LABEL: test_blsmsk_u32
159*67e74705SXin Li   // CHECK: sub i32 %{{.*}}, 1
160*67e74705SXin Li   // CHECK: xor i32 %{{.*}}, %{{.*}}
161*67e74705SXin Li   return _blsmsk_u32(__X);
162*67e74705SXin Li }
163*67e74705SXin Li 
test_blsr_u32(unsigned int __X)164*67e74705SXin Li unsigned int test_blsr_u32(unsigned int __X) {
165*67e74705SXin Li   // CHECK-LABEL: test_blsr_u32
166*67e74705SXin Li   // CHECK: sub i32 %{{.*}}, 1
167*67e74705SXin Li   // CHECK: and i32 %{{.*}}, %{{.*}}
168*67e74705SXin Li   return _blsr_u32(__X);
169*67e74705SXin Li }
170*67e74705SXin Li 
test_tzcnt_u32(unsigned int __X)171*67e74705SXin Li unsigned int test_tzcnt_u32(unsigned int __X) {
172*67e74705SXin Li   // CHECK-LABEL: test_tzcnt_u32
173*67e74705SXin Li   // CHECK: icmp ne i32 %{{.*}}, 0
174*67e74705SXin Li   // CHECK: i32 @llvm.cttz.i32(i32 %{{.*}}, i1 true)
175*67e74705SXin Li   return _tzcnt_u32(__X);
176*67e74705SXin Li }
177*67e74705SXin Li 
test_andn_u64(unsigned long __X,unsigned long __Y)178*67e74705SXin Li unsigned long long test_andn_u64(unsigned long __X, unsigned long __Y) {
179*67e74705SXin Li   // CHECK-LABEL: test_andn_u64
180*67e74705SXin Li   // CHECK: xor i64 %{{.*}}, -1
181*67e74705SXin Li   // CHECK: and i64 %{{.*}}, %{{.*}}
182*67e74705SXin Li   return _andn_u64(__X, __Y);
183*67e74705SXin Li }
184*67e74705SXin Li 
test_bextr_u64(unsigned long __X,unsigned int __Y,unsigned int __Z)185*67e74705SXin Li unsigned long long test_bextr_u64(unsigned long __X, unsigned int __Y,
186*67e74705SXin Li                                   unsigned int __Z) {
187*67e74705SXin Li   // CHECK-LABEL: test_bextr_u64
188*67e74705SXin Li   // CHECK: and i32 %{{.*}}, 255
189*67e74705SXin Li   // CHECK: and i32 %{{.*}}, 255
190*67e74705SXin Li   // CHECK: shl i32 %{{.*}}, 8
191*67e74705SXin Li   // CHECK: or i32 %{{.*}}, %{{.*}}
192*67e74705SXin Li   // CHECK: zext i32 %{{.*}} to i64
193*67e74705SXin Li   // CHECK: i64 @llvm.x86.bmi.bextr.64(i64 %{{.*}}, i64 %{{.*}})
194*67e74705SXin Li   return _bextr_u64(__X, __Y, __Z);
195*67e74705SXin Li }
196*67e74705SXin Li 
test_blsi_u64(unsigned long long __X)197*67e74705SXin Li unsigned long long test_blsi_u64(unsigned long long __X) {
198*67e74705SXin Li   // CHECK-LABEL: test_blsi_u64
199*67e74705SXin Li   // CHECK: sub i64 0, %{{.*}}
200*67e74705SXin Li   // CHECK: and i64 %{{.*}}, %{{.*}}
201*67e74705SXin Li   return _blsi_u64(__X);
202*67e74705SXin Li }
203*67e74705SXin Li 
test_blsmsk_u64(unsigned long long __X)204*67e74705SXin Li unsigned long long test_blsmsk_u64(unsigned long long __X) {
205*67e74705SXin Li   // CHECK-LABEL: test_blsmsk_u64
206*67e74705SXin Li   // CHECK: sub i64 %{{.*}}, 1
207*67e74705SXin Li   // CHECK: xor i64 %{{.*}}, %{{.*}}
208*67e74705SXin Li   return _blsmsk_u64(__X);
209*67e74705SXin Li }
210*67e74705SXin Li 
test_blsr_u64(unsigned long long __X)211*67e74705SXin Li unsigned long long test_blsr_u64(unsigned long long __X) {
212*67e74705SXin Li   // CHECK-LABEL: test_blsr_u64
213*67e74705SXin Li   // CHECK: sub i64 %{{.*}}, 1
214*67e74705SXin Li   // CHECK: and i64 %{{.*}}, %{{.*}}
215*67e74705SXin Li   return _blsr_u64(__X);
216*67e74705SXin Li }
217*67e74705SXin Li 
test_tzcnt_u64(unsigned long long __X)218*67e74705SXin Li unsigned long long test_tzcnt_u64(unsigned long long __X) {
219*67e74705SXin Li   // CHECK-LABEL: test_tzcnt_u64
220*67e74705SXin Li   // CHECK: icmp ne i64 %{{.*}}, 0
221*67e74705SXin Li   // CHECK: i64 @llvm.cttz.i64(i64 %{{.*}}, i1 true)
222*67e74705SXin Li   return _tzcnt_u64(__X);
223*67e74705SXin Li }
224