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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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