brintos

brintos / llvm-project-archived public Read only

0
0
Text · 13.7 KiB · d0ae0c7 Raw
330 lines · c
1// RUN: %clang_cc1 -x c -ffreestanding %s -triple=x86_64-apple-darwin -target-feature +bmi -emit-llvm -o - -Wall -Werror | FileCheck %s --check-prefixes=CHECK,X64,TZCNT,TZCNT642// RUN: %clang_cc1 -x c -ffreestanding %s -triple=i386-apple-darwin -target-feature +bmi -emit-llvm -o - -Wall -Werror | FileCheck %s --check-prefixes=CHECK,TZCNT3// RUN: %clang_cc1 -x c -fms-extensions -fms-compatibility -fms-compatibility-version=17.00 -ffreestanding %s -triple=x86_64-windows-msvc -emit-llvm -o - -Wall -Werror -DTEST_TZCNT | FileCheck %s --check-prefixes=TZCNT,TZCNT644// RUN: %clang_cc1 -x c++ -ffreestanding %s -triple=x86_64-apple-darwin -target-feature +bmi -emit-llvm -o - -Wall -Werror | FileCheck %s --check-prefixes=CHECK,X64,TZCNT,TZCNT645// RUN: %clang_cc1 -x c++ -ffreestanding %s -triple=i386-apple-darwin -target-feature +bmi -emit-llvm -o - -Wall -Werror | FileCheck %s --check-prefixes=CHECK,TZCNT6// RUN: %clang_cc1 -x c++ -fms-extensions -fms-compatibility -fms-compatibility-version=17.00 -ffreestanding %s -triple=x86_64-windows-msvc -emit-llvm -o - -Wall -Werror -DTEST_TZCNT | FileCheck %s --check-prefixes=TZCNT,TZCNT647 8// RUN: %clang_cc1 -x c -ffreestanding %s -triple=x86_64-apple-darwin -target-feature +bmi -emit-llvm -o - -Wall -Werror -fexperimental-new-constant-interpreter | FileCheck %s --check-prefixes=CHECK,X64,TZCNT,TZCNT649// RUN: %clang_cc1 -x c -ffreestanding %s -triple=i386-apple-darwin -target-feature +bmi -emit-llvm -o - -Wall -Werror -fexperimental-new-constant-interpreter | FileCheck %s --check-prefixes=CHECK,TZCNT10// RUN: %clang_cc1 -x c -fms-extensions -fms-compatibility -fms-compatibility-version=17.00 -ffreestanding %s -triple=x86_64-windows-msvc -emit-llvm -o - -Wall -Werror -DTEST_TZCNT -fexperimental-new-constant-interpreter | FileCheck %s --check-prefixes=TZCNT,TZCNT6411// RUN: %clang_cc1 -x c++ -ffreestanding %s -triple=x86_64-apple-darwin -target-feature +bmi -emit-llvm -o - -Wall -Werror -fexperimental-new-constant-interpreter | FileCheck %s --check-prefixes=CHECK,X64,TZCNT,TZCNT6412// RUN: %clang_cc1 -x c++ -ffreestanding %s -triple=i386-apple-darwin -target-feature +bmi -emit-llvm -o - -Wall -Werror -fexperimental-new-constant-interpreter | FileCheck %s --check-prefixes=CHECK,TZCNT13// RUN: %clang_cc1 -x c++ -fms-extensions -fms-compatibility -fms-compatibility-version=17.00 -ffreestanding %s -triple=x86_64-windows-msvc -emit-llvm -o - -Wall -Werror -DTEST_TZCNT -fexperimental-new-constant-interpreter | FileCheck %s --check-prefixes=TZCNT,TZCNT6414 15 16#include <immintrin.h>17 18// NOTE: This should match the tests in llvm/test/CodeGen/X86/bmi-intrinsics-fast-isel.ll19 20// The double underscore intrinsics are for compatibility with21// AMD's BMI interface. The single underscore intrinsics22// are for compatibility with Intel's BMI interface.23// Apart from the underscores, the interfaces are identical24// except in one case: although the 'bextr' register-form25// instruction is identical in hardware, the AMD and Intel26// intrinsics are different!27 28unsigned short test_tzcnt_u16(unsigned short __X) {29// TZCNT-LABEL: test_tzcnt_u1630// TZCNT: i16 @llvm.cttz.i16(i16 %{{.*}}, i1 false)31  return _tzcnt_u16(__X);32}33 34unsigned short test__tzcnt_u16(unsigned short __X) {35// TZCNT-LABEL: test__tzcnt_u1636// TZCNT: i16 @llvm.cttz.i16(i16 %{{.*}}, i1 false)37  return __tzcnt_u16(__X);38}39 40unsigned int test__tzcnt_u32(unsigned int __X) {41// TZCNT-LABEL: test__tzcnt_u3242// TZCNT: i32 @llvm.cttz.i32(i32 %{{.*}}, i1 false)43  return __tzcnt_u32(__X);44}45 46int test_mm_tzcnt_32(unsigned int __X) {47// TZCNT-LABEL: test_mm_tzcnt_3248// TZCNT: i32 @llvm.cttz.i32(i32 %{{.*}}, i1 false)49  return _mm_tzcnt_32(__X);50}51 52unsigned int test_tzcnt_u32(unsigned int __X) {53// TZCNT-LABEL: test_tzcnt_u3254// TZCNT: i32 @llvm.cttz.i32(i32 %{{.*}}, i1 false)55  return _tzcnt_u32(__X);56}57 58#ifdef __x86_64__59unsigned long long test__tzcnt_u64(unsigned long long __X) {60// TZCNT64-LABEL: test__tzcnt_u6461// TZCNT64: i64 @llvm.cttz.i64(i64 %{{.*}}, i1 false)62  return __tzcnt_u64(__X);63}64 65long long test_mm_tzcnt_64(unsigned long long __X) {66// TZCNT64-LABEL: test_mm_tzcnt_6467// TZCNT64: i64 @llvm.cttz.i64(i64 %{{.*}}, i1 false)68  return _mm_tzcnt_64(__X);69}70 71unsigned long long test_tzcnt_u64(unsigned long long __X) {72// TZCNT64-LABEL: test_tzcnt_u6473// TZCNT64: i64 @llvm.cttz.i64(i64 %{{.*}}, i1 false)74  return _tzcnt_u64(__X);75}76#endif77 78#if !defined(TEST_TZCNT)79unsigned int test__andn_u32(unsigned int __X, unsigned int __Y) {80// CHECK-LABEL: test__andn_u3281// CHECK: xor i32 %{{.*}}, -182// CHECK: and i32 %{{.*}}, %{{.*}}83  return __andn_u32(__X, __Y);84}85 86unsigned int test__bextr_u32(unsigned int __X, unsigned int __Y) {87// CHECK-LABEL: test__bextr_u3288// CHECK: i32 @llvm.x86.bmi.bextr.32(i32 %{{.*}}, i32 %{{.*}})89  return __bextr_u32(__X, __Y);90}91 92unsigned int test__blsi_u32(unsigned int __X) {93// CHECK-LABEL: test__blsi_u3294// CHECK: sub i32 0, %{{.*}}95// CHECK: and i32 %{{.*}}, %{{.*}}96  return __blsi_u32(__X);97}98 99unsigned int test__blsmsk_u32(unsigned int __X) {100// CHECK-LABEL: test__blsmsk_u32101// CHECK: sub i32 %{{.*}}, 1102// CHECK: xor i32 %{{.*}}, %{{.*}}103  return __blsmsk_u32(__X);104}105 106unsigned int test__blsr_u32(unsigned int __X) {107// CHECK-LABEL: test__blsr_u32108// CHECK: sub i32 %{{.*}}, 1109// CHECK: and i32 %{{.*}}, %{{.*}}110  return __blsr_u32(__X);111}112 113#ifdef __x86_64__114unsigned long long test__andn_u64(unsigned long __X, unsigned long __Y) {115// X64-LABEL: test__andn_u64116// X64: xor i64 %{{.*}}, -1117// X64: and i64 %{{.*}}, %{{.*}}118  return __andn_u64(__X, __Y);119}120 121unsigned long long test__bextr_u64(unsigned long __X, unsigned long __Y) {122// X64-LABEL: test__bextr_u64123// X64: i64 @llvm.x86.bmi.bextr.64(i64 %{{.*}}, i64 %{{.*}})124  return __bextr_u64(__X, __Y);125}126 127unsigned long long test__blsi_u64(unsigned long long __X) {128// X64-LABEL: test__blsi_u64129// X64: sub i64 0, %{{.*}}130// X64: and i64 %{{.*}}, %{{.*}}131  return __blsi_u64(__X);132}133 134unsigned long long test__blsmsk_u64(unsigned long long __X) {135// X64-LABEL: test__blsmsk_u64136// X64: sub i64 %{{.*}}, 1137// X64: xor i64 %{{.*}}, %{{.*}}138  return __blsmsk_u64(__X);139}140 141unsigned long long test__blsr_u64(unsigned long long __X) {142// X64-LABEL: test__blsr_u64143// X64: sub i64 %{{.*}}, 1144// X64: and i64 %{{.*}}, %{{.*}}145  return __blsr_u64(__X);146}147#endif148 149// Intel intrinsics150 151unsigned int test_andn_u32(unsigned int __X, unsigned int __Y) {152// CHECK-LABEL: test_andn_u32153// CHECK: xor i32 %{{.*}}, -1154// CHECK: and i32 %{{.*}}, %{{.*}}155  return _andn_u32(__X, __Y);156}157 158unsigned int test_bextr_u32(unsigned int __X, unsigned int __Y,159                            unsigned int __Z) {160// CHECK-LABEL: test_bextr_u32161// CHECK: and i32 %{{.*}}, 255162// CHECK: and i32 %{{.*}}, 255163// CHECK: shl i32 %{{.*}}, 8164// CHECK: or i32 %{{.*}}, %{{.*}}165// CHECK: i32 @llvm.x86.bmi.bextr.32(i32 %{{.*}}, i32 %{{.*}})166  return _bextr_u32(__X, __Y, __Z);167}168 169unsigned int test_bextr2_u32(unsigned int __X, unsigned int __Y) {170// CHECK-LABEL: test_bextr2_u32171// CHECK: i32 @llvm.x86.bmi.bextr.32(i32 %{{.*}}, i32 %{{.*}})172  return _bextr2_u32(__X, __Y);173}174 175unsigned int test_blsi_u32(unsigned int __X) {176// CHECK-LABEL: test_blsi_u32177// CHECK: sub i32 0, %{{.*}}178// CHECK: and i32 %{{.*}}, %{{.*}}179  return _blsi_u32(__X);180}181 182unsigned int test_blsmsk_u32(unsigned int __X) {183// CHECK-LABEL: test_blsmsk_u32184// CHECK: sub i32 %{{.*}}, 1185// CHECK: xor i32 %{{.*}}, %{{.*}}186  return _blsmsk_u32(__X);187}188 189unsigned int test_blsr_u32(unsigned int __X) {190// CHECK-LABEL: test_blsr_u32191// CHECK: sub i32 %{{.*}}, 1192// CHECK: and i32 %{{.*}}, %{{.*}}193  return _blsr_u32(__X);194}195 196#ifdef __x86_64__197unsigned long long test_andn_u64(unsigned long __X, unsigned long __Y) {198// X64-LABEL: test_andn_u64199// X64: xor i64 %{{.*}}, -1200// X64: and i64 %{{.*}}, %{{.*}}201  return _andn_u64(__X, __Y);202}203 204unsigned long long test_bextr_u64(unsigned long __X, unsigned int __Y,205                                  unsigned int __Z) {206// X64-LABEL: test_bextr_u64207// X64: and i32 %{{.*}}, 255208// X64: and i32 %{{.*}}, 255209// X64: shl i32 %{{.*}}, 8210// X64: or i32 %{{.*}}, %{{.*}}211// X64: zext i32 %{{.*}} to i64212// X64: i64 @llvm.x86.bmi.bextr.64(i64 %{{.*}}, i64 %{{.*}})213  return _bextr_u64(__X, __Y, __Z);214}215 216unsigned long long test_bextr2_u64(unsigned long long __X,217                                   unsigned long long __Y) {218// X64-LABEL: test_bextr2_u64219// X64: i64 @llvm.x86.bmi.bextr.64(i64 %{{.*}}, i64 %{{.*}})220  return _bextr2_u64(__X, __Y);221}222 223unsigned long long test_blsi_u64(unsigned long long __X) {224// X64-LABEL: test_blsi_u64225// X64: sub i64 0, %{{.*}}226// X64: and i64 %{{.*}}, %{{.*}}227  return _blsi_u64(__X);228}229 230unsigned long long test_blsmsk_u64(unsigned long long __X) {231// X64-LABEL: test_blsmsk_u64232// X64: sub i64 %{{.*}}, 1233// X64: xor i64 %{{.*}}, %{{.*}}234  return _blsmsk_u64(__X);235}236 237unsigned long long test_blsr_u64(unsigned long long __X) {238// X64-LABEL: test_blsr_u64239// X64: sub i64 %{{.*}}, 1240// X64: and i64 %{{.*}}, %{{.*}}241  return _blsr_u64(__X);242}243#endif244 245#endif // !defined(TEST_TZCNT)246 247// Test constexpr handling.248#if defined(__cplusplus) && (__cplusplus >= 201103L)249char andnu32[__andn_u32(0x01234567, 0xFECDBA98) == (~0x01234567 & 0xFECDBA98) ? 1 : -1];250char andn2u32[_andn_u32(0x01234567, 0xFECDBA98) == (~0x01234567 & 0xFECDBA98) ? 1 : -1];251 252char bextr32_0[__bextr_u32(0x00000000, 0x00000000) == 0x00000000 ? 1 : -1];253char bextr32_1[__bextr_u32(0x000003F0, 0xFFFF1004) == 0x0000003F ? 1 : -1];254char bextr32_2[__bextr_u32(0x000003F0, 0xFFFF3008) == 0x00000003 ? 1 : -1];255 256char bextr32_3[_bextr2_u32(0x00000000, 0x00000000) == 0x00000000 ? 1 : -1];257char bextr32_4[_bextr2_u32(0x000003F0, 0xFFFF1004) == 0x0000003F ? 1 : -1];258char bextr32_5[_bextr2_u32(0x000003F0, 0xFFFF3008) == 0x00000003 ? 1 : -1];259 260char bextr32_6[_bextr_u32(0x00000000, 0x00000000, 0x00000000) == 0x00000000 ? 1 : -1];261char bextr32_7[_bextr_u32(0x000003F0, 0xFFFFFF04, 0xFFFFFF10) == 0x0000003F ? 1 : -1];262char bextr32_8[_bextr_u32(0x000003F0, 0xFFFFFF08, 0xFFFFFF30) == 0x00000003 ? 1 : -1];263 264char blsiu32[__blsi_u32(0x89ABCDEF) == (0x89ABCDEF & -0x89ABCDEF) ? 1 : -1];265char blsi2u32[_blsi_u32(0x89ABCDEF) == (0x89ABCDEF & -0x89ABCDEF) ? 1 : -1];266 267char blsmasku32[__blsmsk_u32(0x89ABCDEF) == (0x89ABCDEF ^ (0x89ABCDEF - 1)) ? 1 : -1];268char blsmask2u32[_blsmsk_u32(0x89ABCDEF) == (0x89ABCDEF ^ (0x89ABCDEF - 1)) ? 1 : -1];269 270char blsru32[__blsr_u32(0x89ABCDEF) == (0x89ABCDEF & (0x89ABCDEF - 1)) ? 1 : -1];271char blsr2u32[_blsr_u32(0x89ABCDEF) == (0x89ABCDEF & (0x89ABCDEF - 1)) ? 1 : -1];272 273char tzcntu16_0[__tzcnt_u16(0x0000) == 16 ? 1 : -1];274char tzcntu16_1[__tzcnt_u16(0x0001) ==  0 ? 1 : -1];275char tzcntu16_2[__tzcnt_u16(0x0010) ==  4 ? 1 : -1];276 277char tzcnt2u16_0[_tzcnt_u16(0x0000) == 16 ? 1 : -1];278char tzcnt2u16_1[_tzcnt_u16(0x0001) ==  0 ? 1 : -1];279char tzcnt2u16_2[_tzcnt_u16(0x0010) ==  4 ? 1 : -1];280 281char tzcntu32_0[__tzcnt_u32(0x00000000) == 32 ? 1 : -1];282char tzcntu32_1[__tzcnt_u32(0x00000001) ==  0 ? 1 : -1];283char tzcntu32_2[__tzcnt_u32(0x00000080) ==  7 ? 1 : -1];284 285char tzcnt2u32_0[_tzcnt_u32(0x00000000) == 32 ? 1 : -1];286char tzcnt2u32_1[_tzcnt_u32(0x00000001) ==  0 ? 1 : -1];287char tzcnt2u32_2[_tzcnt_u32(0x00000080) ==  7 ? 1 : -1];288 289char tzcnt3u32_0[_mm_tzcnt_32(0x00000000) == 32 ? 1 : -1];290char tzcnt3u32_1[_mm_tzcnt_32(0x00000001) ==  0 ? 1 : -1];291char tzcnt3u32_2[_mm_tzcnt_32(0x00000080) ==  7 ? 1 : -1];292 293#ifdef __x86_64__294char andnu64[__andn_u64(0x0123456789ABCDEFULL, 0xFECDBA9876543210ULL) == (~0x0123456789ABCDEFULL & 0xFECDBA9876543210ULL) ? 1 : -1];295char andn2u64[_andn_u64(0x0123456789ABCDEFULL, 0xFECDBA9876543210ULL) == (~0x0123456789ABCDEFULL & 0xFECDBA9876543210ULL) ? 1 : -1];296 297char bextr64_0[__bextr_u64(0x0000000000000000ULL, 0x0000000000000000ULL) == 0x0000000000000000ULL ? 1 : -1];298char bextr64_1[__bextr_u64(0xF000000000000001ULL, 0x0000000000004001ULL) == 0x7800000000000000ULL ? 1 : -1];299char bextr64_2[__bextr_u64(0xF000000000000001ULL, 0xFFFFFFFFFFFF1001ULL) == 0x0000000000000000ULL ? 1 : -1];300 301char bextr64_3[_bextr2_u64(0x0000000000000000ULL, 0x0000000000000000ULL) == 0x0000000000000000ULL ? 1 : -1];302char bextr64_4[_bextr2_u64(0xF000000000000001ULL, 0x0000000000004001ULL) == 0x7800000000000000ULL ? 1 : -1];303char bextr64_5[_bextr2_u64(0xF000000000000001ULL, 0xFFFFFFFFFFFF1001ULL) == 0x0000000000000000ULL ? 1 : -1];304 305char bextr64_6[_bextr_u64(0x0000000000000000ULL, 0x0000000000000000ULL, 0x0000000000000000ULL) == 0x0000000000000000ULL ? 1 : -1];306char bextr64_7[_bextr_u64(0xF000000000000001ULL, 0x0000000000000001ULL, 0x0000000000000040ULL) == 0x7800000000000000ULL ? 1 : -1];307char bextr64_8[_bextr_u64(0xF000000000000001ULL, 0xFFFFFFFFFFFFFF01ULL, 0xFFFFFFFFFFFFFF10ULL) == 0x0000000000000000ULL ? 1 : -1];308 309char blsiu64[__blsi_u64(0x0123456789ABCDEFULL) == (0x0123456789ABCDEFULL & -0x0123456789ABCDEFULL) ? 1 : -1];310char blsi2u64[_blsi_u64(0x0123456789ABCDEFULL) == (0x0123456789ABCDEFULL & -0x0123456789ABCDEFULL) ? 1 : -1];311 312char blsmasku64[__blsmsk_u64(0x0123456789ABCDEFULL) == (0x0123456789ABCDEFULL ^ (0x0123456789ABCDEFULL - 1)) ? 1 : -1];313char blsmask2u64[_blsmsk_u64(0x0123456789ABCDEFULL) == (0x0123456789ABCDEFULL ^ (0x0123456789ABCDEFULL - 1)) ? 1 : -1];314 315char blsru64[__blsr_u64(0x0123456789ABCDEFULL) == (0x0123456789ABCDEFULL & (0x0123456789ABCDEFULL - 1)) ? 1 : -1];316char blsr2u64[_blsr_u64(0x0123456789ABCDEFULL) == (0x0123456789ABCDEFULL & (0x0123456789ABCDEFULL - 1)) ? 1 : -1];317 318char tzcntu64_0[__tzcnt_u64(0x0000000000000000ULL) == 64 ? 1 : -1];319char tzcntu64_1[__tzcnt_u64(0x0000000000000001ULL) ==  0 ? 1 : -1];320char tzcntu64_2[__tzcnt_u64(0x0000000800000000ULL) == 35 ? 1 : -1];321 322char tzcnt2u64_0[_tzcnt_u64(0x0000000000000000ULL) == 64 ? 1 : -1];323char tzcnt2u64_1[_tzcnt_u64(0x0000000000000001ULL) ==  0 ? 1 : -1];324char tzcnt2u64_2[_tzcnt_u64(0x0000000800000000ULL) == 35 ? 1 : -1];325 326char tzcnt3u64_0[_mm_tzcnt_64(0x0000000000000000ULL) == 64 ? 1 : -1];327char tzcnt3u64_1[_mm_tzcnt_64(0x0000000000000001ULL) ==  0 ? 1 : -1];328char tzcnt3u64_2[_mm_tzcnt_64(0x0000000800000000ULL) == 35 ? 1 : -1];329#endif330#endif