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