| // RUN: %clang_cc1 -ffreestanding -std=c23 %s -emit-llvm -o - | FileCheck %s |
| // RUN: %if clang-target-64-bits %{ %clang_cc1 -ffreestanding -std=c23 %s -emit-llvm -o - | FileCheck %s --check-prefix=INT128 %} |
| // RUN: %clang_cc1 -std=c23 -isystem %S/Inputs -DTEST_LIB_SPELLINGS %s -emit-llvm -o - | FileCheck %s --check-prefix=LIB |
| |
| // CHECK-LABEL: test_leading_zeros |
| // CHECK: call i8 @llvm.ctlz.i8(i8 %{{.*}}, i1 false) |
| // CHECK: call i16 @llvm.ctlz.i16(i16 %{{.*}}, i1 false) |
| // CHECK: call i32 @llvm.ctlz.i32(i32 %{{.*}}, i1 false) |
| // CHECK: call i64 @llvm.ctlz.i64(i64 %{{.*}}, i1 false) |
| void test_leading_zeros(unsigned char uc, unsigned short us, unsigned int ui, unsigned long long ull) { |
| volatile int r; |
| r = __builtin_stdc_leading_zeros(uc); |
| r = __builtin_stdc_leading_zeros(us); |
| r = __builtin_stdc_leading_zeros(ui); |
| r = __builtin_stdc_leading_zeros(ull); |
| } |
| |
| // CHECK-LABEL: test_leading_ones |
| // CHECK: xor i8 %{{.*}}, -1 |
| // CHECK: call i8 @llvm.ctlz.i8(i8 %{{.*}}, i1 false) |
| // CHECK: xor i16 %{{.*}}, -1 |
| // CHECK: call i16 @llvm.ctlz.i16(i16 %{{.*}}, i1 false) |
| // CHECK: xor i32 %{{.*}}, -1 |
| // CHECK: call i32 @llvm.ctlz.i32(i32 %{{.*}}, i1 false) |
| // CHECK: xor i64 %{{.*}}, -1 |
| // CHECK: call i64 @llvm.ctlz.i64(i64 %{{.*}}, i1 false) |
| void test_leading_ones(unsigned char uc, unsigned short us, unsigned int ui, unsigned long long ull) { |
| volatile int r; |
| r = __builtin_stdc_leading_ones(uc); |
| r = __builtin_stdc_leading_ones(us); |
| r = __builtin_stdc_leading_ones(ui); |
| r = __builtin_stdc_leading_ones(ull); |
| } |
| |
| // CHECK-LABEL: test_trailing_zeros |
| // CHECK: call i8 @llvm.cttz.i8(i8 %{{.*}}, i1 false) |
| // CHECK: call i16 @llvm.cttz.i16(i16 %{{.*}}, i1 false) |
| // CHECK: call i32 @llvm.cttz.i32(i32 %{{.*}}, i1 false) |
| // CHECK: call i64 @llvm.cttz.i64(i64 %{{.*}}, i1 false) |
| void test_trailing_zeros(unsigned char uc, unsigned short us, unsigned int ui, unsigned long long ull) { |
| volatile int r; |
| r = __builtin_stdc_trailing_zeros(uc); |
| r = __builtin_stdc_trailing_zeros(us); |
| r = __builtin_stdc_trailing_zeros(ui); |
| r = __builtin_stdc_trailing_zeros(ull); |
| } |
| |
| // CHECK-LABEL: test_trailing_ones |
| // CHECK: xor i8 %{{.*}}, -1 |
| // CHECK: call i8 @llvm.cttz.i8(i8 %{{.*}}, i1 false) |
| // CHECK: xor i16 %{{.*}}, -1 |
| // CHECK: call i16 @llvm.cttz.i16(i16 %{{.*}}, i1 false) |
| // CHECK: xor i32 %{{.*}}, -1 |
| // CHECK: call i32 @llvm.cttz.i32(i32 %{{.*}}, i1 false) |
| // CHECK: xor i64 %{{.*}}, -1 |
| // CHECK: call i64 @llvm.cttz.i64(i64 %{{.*}}, i1 false) |
| void test_trailing_ones(unsigned char uc, unsigned short us, unsigned int ui, unsigned long long ull) { |
| volatile int r; |
| r = __builtin_stdc_trailing_ones(uc); |
| r = __builtin_stdc_trailing_ones(us); |
| r = __builtin_stdc_trailing_ones(ui); |
| r = __builtin_stdc_trailing_ones(ull); |
| } |
| |
| // CHECK-LABEL: test_first_leading_zero |
| // CHECK: xor i8 %{{.*}}, -1 |
| // CHECK: call i8 @llvm.ctlz.i8(i8 %{{.*}}, i1 false) |
| // CHECK: xor i16 %{{.*}}, -1 |
| // CHECK: call i16 @llvm.ctlz.i16(i16 %{{.*}}, i1 false) |
| // CHECK: xor i32 %{{.*}}, -1 |
| // CHECK: call i32 @llvm.ctlz.i32(i32 %{{.*}}, i1 false) |
| // CHECK: xor i64 %{{.*}}, -1 |
| // CHECK: call i64 @llvm.ctlz.i64(i64 %{{.*}}, i1 false) |
| void test_first_leading_zero(unsigned char uc, unsigned short us, unsigned int ui, unsigned long long ull) { |
| volatile int r; |
| r = __builtin_stdc_first_leading_zero(uc); |
| r = __builtin_stdc_first_leading_zero(us); |
| r = __builtin_stdc_first_leading_zero(ui); |
| r = __builtin_stdc_first_leading_zero(ull); |
| } |
| |
| // CHECK-LABEL: test_first_leading_one |
| // CHECK: call i8 @llvm.ctlz.i8(i8 %{{.*}}, i1 false) |
| // CHECK: call i16 @llvm.ctlz.i16(i16 %{{.*}}, i1 false) |
| // CHECK: call i32 @llvm.ctlz.i32(i32 %{{.*}}, i1 false) |
| // CHECK: call i64 @llvm.ctlz.i64(i64 %{{.*}}, i1 false) |
| void test_first_leading_one(unsigned char uc, unsigned short us, unsigned int ui, unsigned long long ull) { |
| volatile int r; |
| r = __builtin_stdc_first_leading_one(uc); |
| r = __builtin_stdc_first_leading_one(us); |
| r = __builtin_stdc_first_leading_one(ui); |
| r = __builtin_stdc_first_leading_one(ull); |
| } |
| |
| // CHECK-LABEL: test_first_trailing_zero |
| // CHECK: xor i8 %{{.*}}, -1 |
| // CHECK: call i8 @llvm.cttz.i8(i8 %{{.*}}, i1 false) |
| // CHECK: xor i16 %{{.*}}, -1 |
| // CHECK: call i16 @llvm.cttz.i16(i16 %{{.*}}, i1 false) |
| // CHECK: xor i32 %{{.*}}, -1 |
| // CHECK: call i32 @llvm.cttz.i32(i32 %{{.*}}, i1 false) |
| // CHECK: xor i64 %{{.*}}, -1 |
| // CHECK: call i64 @llvm.cttz.i64(i64 %{{.*}}, i1 false) |
| void test_first_trailing_zero(unsigned char uc, unsigned short us, unsigned int ui, unsigned long long ull) { |
| volatile int r; |
| r = __builtin_stdc_first_trailing_zero(uc); |
| r = __builtin_stdc_first_trailing_zero(us); |
| r = __builtin_stdc_first_trailing_zero(ui); |
| r = __builtin_stdc_first_trailing_zero(ull); |
| } |
| |
| // CHECK-LABEL: test_first_trailing_one |
| // CHECK: call i8 @llvm.cttz.i8(i8 %{{.*}}, i1 false) |
| // CHECK: call i16 @llvm.cttz.i16(i16 %{{.*}}, i1 false) |
| // CHECK: call i32 @llvm.cttz.i32(i32 %{{.*}}, i1 false) |
| // CHECK: call i64 @llvm.cttz.i64(i64 %{{.*}}, i1 false) |
| void test_first_trailing_one(unsigned char uc, unsigned short us, unsigned int ui, unsigned long long ull) { |
| volatile int r; |
| r = __builtin_stdc_first_trailing_one(uc); |
| r = __builtin_stdc_first_trailing_one(us); |
| r = __builtin_stdc_first_trailing_one(ui); |
| r = __builtin_stdc_first_trailing_one(ull); |
| } |
| |
| // CHECK-LABEL: test_count_zeros |
| // CHECK: call i8 @llvm.ctpop.i8(i8 %{{.*}}) |
| // CHECK: call i16 @llvm.ctpop.i16(i16 %{{.*}}) |
| // CHECK: call i32 @llvm.ctpop.i32(i32 %{{.*}}) |
| // CHECK: call i64 @llvm.ctpop.i64(i64 %{{.*}}) |
| void test_count_zeros(unsigned char uc, unsigned short us, unsigned int ui, unsigned long long ull) { |
| volatile int r; |
| r = __builtin_stdc_count_zeros(uc); |
| r = __builtin_stdc_count_zeros(us); |
| r = __builtin_stdc_count_zeros(ui); |
| r = __builtin_stdc_count_zeros(ull); |
| } |
| |
| // CHECK-LABEL: test_count_ones |
| // CHECK: call i8 @llvm.ctpop.i8(i8 %{{.*}}) |
| // CHECK: call i16 @llvm.ctpop.i16(i16 %{{.*}}) |
| // CHECK: call i32 @llvm.ctpop.i32(i32 %{{.*}}) |
| // CHECK: call i64 @llvm.ctpop.i64(i64 %{{.*}}) |
| void test_count_ones(unsigned char uc, unsigned short us, unsigned int ui, unsigned long long ull) { |
| volatile int r; |
| r = __builtin_stdc_count_ones(uc); |
| r = __builtin_stdc_count_ones(us); |
| r = __builtin_stdc_count_ones(ui); |
| r = __builtin_stdc_count_ones(ull); |
| } |
| |
| // CHECK-LABEL: test_has_single_bit |
| // CHECK: call i8 @llvm.ctpop.i8(i8 %{{.*}}) |
| // CHECK: call i16 @llvm.ctpop.i16(i16 %{{.*}}) |
| // CHECK: call i32 @llvm.ctpop.i32(i32 %{{.*}}) |
| // CHECK: call i64 @llvm.ctpop.i64(i64 %{{.*}}) |
| void test_has_single_bit(unsigned char uc, unsigned short us, unsigned int ui, unsigned long long ull) { |
| volatile int r; |
| r = __builtin_stdc_has_single_bit(uc); |
| r = __builtin_stdc_has_single_bit(us); |
| r = __builtin_stdc_has_single_bit(ui); |
| r = __builtin_stdc_has_single_bit(ull); |
| } |
| |
| // CHECK-LABEL: test_bit_width |
| // CHECK: call i8 @llvm.ctlz.i8(i8 %{{.*}}, i1 false) |
| // CHECK: call i16 @llvm.ctlz.i16(i16 %{{.*}}, i1 false) |
| // CHECK: call i32 @llvm.ctlz.i32(i32 %{{.*}}, i1 false) |
| // CHECK: call i64 @llvm.ctlz.i64(i64 %{{.*}}, i1 false) |
| void test_bit_width(unsigned char uc, unsigned short us, unsigned int ui, unsigned long long ull) { |
| volatile int r; |
| r = __builtin_stdc_bit_width(uc); |
| r = __builtin_stdc_bit_width(us); |
| r = __builtin_stdc_bit_width(ui); |
| r = __builtin_stdc_bit_width(ull); |
| } |
| |
| // CHECK-LABEL: test_bit_floor_uc |
| // CHECK: [[LZ:%.*]] = call i8 @llvm.ctlz.i8(i8 %{{.*}}, i1 true) |
| // CHECK: [[SHIFT:%.*]] = sub i8 7, [[LZ]] |
| // CHECK: [[SHIFTED:%.*]] = shl i8 1, [[SHIFT]] |
| // CHECK: [[ISZERO:%.*]] = icmp eq i8 %{{.*}}, 0 |
| // CHECK: select i1 [[ISZERO]], i8 0, i8 [[SHIFTED]] |
| unsigned char test_bit_floor_uc(unsigned char uc) { return __builtin_stdc_bit_floor(uc); } |
| |
| // CHECK-LABEL: test_bit_floor_us |
| // CHECK: [[LZ:%.*]] = call i16 @llvm.ctlz.i16(i16 %{{.*}}, i1 true) |
| // CHECK: [[SHIFT:%.*]] = sub i16 15, [[LZ]] |
| // CHECK: [[SHIFTED:%.*]] = shl i16 1, [[SHIFT]] |
| // CHECK: [[ISZERO:%.*]] = icmp eq i16 %{{.*}}, 0 |
| // CHECK: select i1 [[ISZERO]], i16 0, i16 [[SHIFTED]] |
| unsigned short test_bit_floor_us(unsigned short us) { return __builtin_stdc_bit_floor(us); } |
| |
| // CHECK-LABEL: test_bit_floor_ui |
| // CHECK: [[LZ:%.*]] = call i32 @llvm.ctlz.i32(i32 %{{.*}}, i1 true) |
| // CHECK: [[SHIFT:%.*]] = sub i32 31, [[LZ]] |
| // CHECK: [[SHIFTED:%.*]] = shl i32 1, [[SHIFT]] |
| // CHECK: [[ISZERO:%.*]] = icmp eq i32 %{{.*}}, 0 |
| // CHECK: select i1 [[ISZERO]], i32 0, i32 [[SHIFTED]] |
| unsigned int test_bit_floor_ui(unsigned int ui) { return __builtin_stdc_bit_floor(ui); } |
| |
| // CHECK-LABEL: test_bit_floor_ull |
| // CHECK: [[LZ:%.*]] = call i64 @llvm.ctlz.i64(i64 %{{.*}}, i1 true) |
| // CHECK: [[SHIFT:%.*]] = sub i64 63, [[LZ]] |
| // CHECK: [[SHIFTED:%.*]] = shl i64 1, [[SHIFT]] |
| // CHECK: [[ISZERO:%.*]] = icmp eq i64 %{{.*}}, 0 |
| // CHECK: select i1 [[ISZERO]], i64 0, i64 [[SHIFTED]] |
| unsigned long long test_bit_floor_ull(unsigned long long ull) { return __builtin_stdc_bit_floor(ull); } |
| |
| // CHECK-LABEL: test_bit_ceil_uc |
| // CHECK: icmp ule i8 %{{.*}}, 1 |
| // CHECK: br i1 %{{.*}}, label %bitceil.merge, label %bitceil.calc |
| // CHECK: bitceil.calc: |
| // CHECK: sub i8 %{{.*}}, 1 |
| // CHECK: [[LZ:%.*]] = call i8 @llvm.ctlz.i8(i8 %{{.*}}, i1 false) |
| // CHECK: [[SHIFT:%.*]] = sub i8 7, [[LZ]] |
| // CHECK: shl i8 2, [[SHIFT]] |
| // CHECK: bitceil.merge: |
| // CHECK: phi i8 [ 1, %{{.*}} ], [ %{{.*}}, %bitceil.calc ] |
| unsigned char test_bit_ceil_uc(unsigned char uc) { return __builtin_stdc_bit_ceil(uc); } |
| |
| // CHECK-LABEL: test_bit_ceil_us |
| // CHECK: icmp ule i16 %{{.*}}, 1 |
| // CHECK: br i1 %{{.*}}, label %bitceil.merge, label %bitceil.calc |
| // CHECK: bitceil.calc: |
| // CHECK: sub i16 %{{.*}}, 1 |
| // CHECK: [[LZ:%.*]] = call i16 @llvm.ctlz.i16(i16 %{{.*}}, i1 false) |
| // CHECK: [[SHIFT:%.*]] = sub i16 15, [[LZ]] |
| // CHECK: shl i16 2, [[SHIFT]] |
| // CHECK: bitceil.merge: |
| // CHECK: phi i16 [ 1, %{{.*}} ], [ %{{.*}}, %bitceil.calc ] |
| unsigned short test_bit_ceil_us(unsigned short us) { return __builtin_stdc_bit_ceil(us); } |
| |
| // CHECK-LABEL: test_bit_ceil_ui |
| // CHECK: icmp ule i32 %{{.*}}, 1 |
| // CHECK: br i1 %{{.*}}, label %bitceil.merge, label %bitceil.calc |
| // CHECK: bitceil.calc: |
| // CHECK: sub i32 %{{.*}}, 1 |
| // CHECK: [[LZ:%.*]] = call i32 @llvm.ctlz.i32(i32 %{{.*}}, i1 false) |
| // CHECK: [[SHIFT:%.*]] = sub i32 31, [[LZ]] |
| // CHECK: shl i32 2, [[SHIFT]] |
| // CHECK: bitceil.merge: |
| // CHECK: phi i32 [ 1, %{{.*}} ], [ %{{.*}}, %bitceil.calc ] |
| unsigned int test_bit_ceil_ui(unsigned int ui) { return __builtin_stdc_bit_ceil(ui); } |
| |
| // CHECK-LABEL: test_bit_ceil_ull |
| // CHECK: icmp ule i64 %{{.*}}, 1 |
| // CHECK: br i1 %{{.*}}, label %bitceil.merge, label %bitceil.calc |
| // CHECK: bitceil.calc: |
| // CHECK: sub i64 %{{.*}}, 1 |
| // CHECK: [[LZ:%.*]] = call i64 @llvm.ctlz.i64(i64 %{{.*}}, i1 false) |
| // CHECK: [[SHIFT:%.*]] = sub i64 63, [[LZ]] |
| // CHECK: shl i64 2, [[SHIFT]] |
| // CHECK: bitceil.merge: |
| // CHECK: phi i64 [ 1, %{{.*}} ], [ %{{.*}}, %bitceil.calc ] |
| unsigned long long test_bit_ceil_ull(unsigned long long ull) { return __builtin_stdc_bit_ceil(ull); } |
| |
| // CHECK-LABEL: test_bit_floor |
| // CHECK: call i8 @llvm.ctlz.i8(i8 %{{.*}}, i1 true) |
| // CHECK: call i16 @llvm.ctlz.i16(i16 %{{.*}}, i1 true) |
| // CHECK: call i32 @llvm.ctlz.i32(i32 %{{.*}}, i1 true) |
| // CHECK: call i64 @llvm.ctlz.i64(i64 %{{.*}}, i1 true) |
| void test_bit_floor(unsigned char uc, unsigned short us, unsigned int ui, unsigned long long ull) { |
| volatile unsigned char rc; |
| volatile unsigned short rs; |
| volatile unsigned int ri; |
| volatile unsigned long long rll; |
| rc = __builtin_stdc_bit_floor(uc); |
| rs = __builtin_stdc_bit_floor(us); |
| ri = __builtin_stdc_bit_floor(ui); |
| rll = __builtin_stdc_bit_floor(ull); |
| } |
| |
| // CHECK-LABEL: test_bit_ceil |
| // CHECK: call i8 @llvm.ctlz.i8(i8 %{{.*}}, i1 false) |
| // CHECK: call i16 @llvm.ctlz.i16(i16 %{{.*}}, i1 false) |
| // CHECK: call i32 @llvm.ctlz.i32(i32 %{{.*}}, i1 false) |
| // CHECK: call i64 @llvm.ctlz.i64(i64 %{{.*}}, i1 false) |
| void test_bit_ceil(unsigned char uc, unsigned short us, unsigned int ui, unsigned long long ull) { |
| volatile unsigned char rc; |
| volatile unsigned short rs; |
| volatile unsigned int ri; |
| volatile unsigned long long rll; |
| rc = __builtin_stdc_bit_ceil(uc); |
| rs = __builtin_stdc_bit_ceil(us); |
| ri = __builtin_stdc_bit_ceil(ui); |
| rll = __builtin_stdc_bit_ceil(ull); |
| } |
| |
| // Test with _BitInt types |
| // CHECK-LABEL: test_bitint |
| // CHECK: call i37 @llvm.ctlz.i37(i37 %{{.*}}, i1 false) |
| // CHECK: call i37 @llvm.cttz.i37(i37 %{{.*}}, i1 false) |
| // CHECK: call i37 @llvm.ctpop.i37(i37 %{{.*}}) |
| void test_bitint(unsigned _BitInt(37) bi) { |
| volatile int r; |
| r = __builtin_stdc_leading_zeros(bi); |
| r = __builtin_stdc_trailing_zeros(bi); |
| r = __builtin_stdc_count_ones(bi); |
| } |
| |
| // Additional _BitInt coverage |
| // CHECK-LABEL: test_bitint_floor_ceil |
| // CHECK: call i9 @llvm.ctlz.i9(i9 %{{.*}}, i1 true) |
| // CHECK: call i9 @llvm.ctlz.i9(i9 %{{.*}}, i1 false) |
| void test_bitint_floor_ceil(unsigned _BitInt(9) bi9) { |
| volatile unsigned _BitInt(9) rb; |
| rb = __builtin_stdc_bit_floor(bi9); |
| rb = __builtin_stdc_bit_ceil(bi9); |
| } |
| |
| // CHECK-LABEL: test_bitint_first_and_count |
| // CHECK: call i9 @llvm.ctlz.i9(i9 %{{.*}}, i1 false) |
| // CHECK: call i9 @llvm.cttz.i9(i9 %{{.*}}, i1 false) |
| // CHECK: call i9 @llvm.ctpop.i9(i9 %{{.*}}) |
| void test_bitint_first_and_count(unsigned _BitInt(9) bi9) { |
| volatile int r; |
| r = __builtin_stdc_first_leading_zero(bi9); |
| r = __builtin_stdc_first_trailing_zero(bi9); |
| r = __builtin_stdc_count_zeros(bi9); |
| } |
| |
| // CHECK-LABEL: test_bit_floor_all_ones_bitint |
| // CHECK: store volatile i32 65536, ptr %r |
| void test_bit_floor_all_ones_bitint(void) { |
| volatile unsigned _BitInt(17) r = |
| __builtin_stdc_bit_floor((unsigned _BitInt(17))(-1)); |
| } |
| |
| // CHECK-LABEL: test_first_trailing_zero_all_ones_bitint |
| // CHECK: store volatile i32 0, ptr %r |
| void test_first_trailing_zero_all_ones_bitint(void) { |
| volatile unsigned _BitInt(17) r = |
| __builtin_stdc_first_trailing_zero((unsigned _BitInt(17))(-1)); |
| } |
| |
| #ifdef __SIZEOF_INT128__ |
| // INT128-LABEL: test_int128 |
| // INT128: call i128 @llvm.ctlz.i128(i128 %{{.*}}, i1 false) |
| // INT128: call i128 @llvm.cttz.i128(i128 %{{.*}}, i1 false) |
| // INT128: call i128 @llvm.ctpop.i128(i128 %{{.*}}) |
| void test_int128(unsigned __int128 u128) { |
| volatile int r; |
| r = __builtin_stdc_leading_zeros(u128); |
| r = __builtin_stdc_trailing_zeros(u128); |
| r = __builtin_stdc_count_ones(u128); |
| } |
| |
| // INT128-LABEL: test_int128_leading_trailing_ones |
| // INT128: xor i128 %{{.*}}, -1 |
| // INT128: call i128 @llvm.ctlz.i128(i128 %{{.*}}, i1 false) |
| // INT128: xor i128 %{{.*}}, -1 |
| // INT128: call i128 @llvm.cttz.i128(i128 %{{.*}}, i1 false) |
| void test_int128_leading_trailing_ones(unsigned __int128 u128) { |
| volatile int r; |
| r = __builtin_stdc_leading_ones(u128); |
| r = __builtin_stdc_trailing_ones(u128); |
| } |
| |
| // INT128-LABEL: test_int128_first |
| // INT128: xor i128 %{{.*}}, -1 |
| // INT128: call i128 @llvm.ctlz.i128(i128 %{{.*}}, i1 false) |
| // INT128: call i128 @llvm.ctlz.i128(i128 %{{.*}}, i1 false) |
| // INT128: xor i128 %{{.*}}, -1 |
| // INT128: call i128 @llvm.cttz.i128(i128 %{{.*}}, i1 false) |
| // INT128: call i128 @llvm.cttz.i128(i128 %{{.*}}, i1 false) |
| void test_int128_first(unsigned __int128 u128) { |
| volatile int r; |
| r = __builtin_stdc_first_leading_zero(u128); |
| r = __builtin_stdc_first_leading_one(u128); |
| r = __builtin_stdc_first_trailing_zero(u128); |
| r = __builtin_stdc_first_trailing_one(u128); |
| } |
| |
| // INT128-LABEL: test_int128_count_has_width |
| // INT128: call i128 @llvm.ctpop.i128(i128 %{{.*}}) |
| // INT128: call i128 @llvm.ctpop.i128(i128 %{{.*}}) |
| // INT128: call i128 @llvm.ctpop.i128(i128 %{{.*}}) |
| // INT128: call i128 @llvm.ctlz.i128(i128 %{{.*}}, i1 false) |
| void test_int128_count_has_width(unsigned __int128 u128) { |
| volatile int r; |
| r = __builtin_stdc_count_zeros(u128); |
| r = __builtin_stdc_count_ones(u128); |
| r = __builtin_stdc_has_single_bit(u128); |
| r = __builtin_stdc_bit_width(u128); |
| } |
| |
| // INT128-LABEL: test_int128_floor_ceil |
| // INT128: call i128 @llvm.ctlz.i128(i128 %{{.*}}, i1 true) |
| // INT128: call i128 @llvm.ctlz.i128(i128 %{{.*}}, i1 false) |
| void test_int128_floor_ceil(unsigned __int128 u128) { |
| volatile unsigned __int128 r; |
| r = __builtin_stdc_bit_floor(u128); |
| r = __builtin_stdc_bit_ceil(u128); |
| } |
| #endif |
| |
| // CHECK-LABEL: test_ulong |
| // CHECK: call {{i32|i64}} @llvm.ctlz.{{i32|i64}}({{i32|i64}} %{{.*}}, i1 false) |
| // CHECK: xor {{i32|i64}} %{{.*}}, -1 |
| // CHECK: call {{i32|i64}} @llvm.ctlz.{{i32|i64}}({{i32|i64}} %{{.*}}, i1 false) |
| // CHECK: call {{i32|i64}} @llvm.cttz.{{i32|i64}}({{i32|i64}} %{{.*}}, i1 false) |
| // CHECK: xor {{i32|i64}} %{{.*}}, -1 |
| // CHECK: call {{i32|i64}} @llvm.cttz.{{i32|i64}}({{i32|i64}} %{{.*}}, i1 false) |
| // CHECK: xor {{i32|i64}} %{{.*}}, -1 |
| // CHECK: call {{i32|i64}} @llvm.ctlz.{{i32|i64}}({{i32|i64}} %{{.*}}, i1 false) |
| // CHECK: call {{i32|i64}} @llvm.ctlz.{{i32|i64}}({{i32|i64}} %{{.*}}, i1 false) |
| // CHECK: xor {{i32|i64}} %{{.*}}, -1 |
| // CHECK: call {{i32|i64}} @llvm.cttz.{{i32|i64}}({{i32|i64}} %{{.*}}, i1 false) |
| // CHECK: call {{i32|i64}} @llvm.cttz.{{i32|i64}}({{i32|i64}} %{{.*}}, i1 false) |
| // CHECK: call {{i32|i64}} @llvm.ctpop.{{i32|i64}}({{i32|i64}} %{{.*}}) |
| // CHECK: call {{i32|i64}} @llvm.ctpop.{{i32|i64}}({{i32|i64}} %{{.*}}) |
| // CHECK: call {{i32|i64}} @llvm.ctpop.{{i32|i64}}({{i32|i64}} %{{.*}}) |
| // CHECK: call {{i32|i64}} @llvm.ctlz.{{i32|i64}}({{i32|i64}} %{{.*}}, i1 false) |
| // CHECK: call {{i32|i64}} @llvm.ctlz.{{i32|i64}}({{i32|i64}} %{{.*}}, i1 true) |
| // CHECK: call {{i32|i64}} @llvm.ctlz.{{i32|i64}}({{i32|i64}} %{{.*}}, i1 false) |
| void test_ulong(unsigned long ul) { |
| volatile unsigned r; |
| volatile unsigned long rl; |
| volatile _Bool rb; |
| r = __builtin_stdc_leading_zeros(ul); |
| r = __builtin_stdc_leading_ones(ul); |
| r = __builtin_stdc_trailing_zeros(ul); |
| r = __builtin_stdc_trailing_ones(ul); |
| r = __builtin_stdc_first_leading_zero(ul); |
| r = __builtin_stdc_first_leading_one(ul); |
| r = __builtin_stdc_first_trailing_zero(ul); |
| r = __builtin_stdc_first_trailing_one(ul); |
| r = __builtin_stdc_count_zeros(ul); |
| r = __builtin_stdc_count_ones(ul); |
| rb = __builtin_stdc_has_single_bit(ul); |
| r = __builtin_stdc_bit_width(ul); |
| rl = __builtin_stdc_bit_floor(ul); |
| rl = __builtin_stdc_bit_ceil(ul); |
| } |
| |
| #ifdef TEST_LIB_SPELLINGS |
| #include <stdbit.h> |
| |
| // LIB-LABEL: test_lib_leading_zeros |
| // LIB: call i32 @llvm.ctlz.i32(i32 %{{.*}}, i1 false) |
| void test_lib_leading_zeros(unsigned ui) { |
| volatile unsigned r = stdc_leading_zeros(ui); |
| } |
| |
| // LIB-LABEL: test_lib_leading_ones |
| // LIB: xor i32 %{{.*}}, -1 |
| // LIB: call i32 @llvm.ctlz.i32(i32 %{{.*}}, i1 false) |
| void test_lib_leading_ones(unsigned ui) { |
| volatile unsigned r = stdc_leading_ones(ui); |
| } |
| |
| // LIB-LABEL: test_lib_trailing_zeros |
| // LIB: call i32 @llvm.cttz.i32(i32 %{{.*}}, i1 false) |
| void test_lib_trailing_zeros(unsigned ui) { |
| volatile unsigned r = stdc_trailing_zeros(ui); |
| } |
| |
| // LIB-LABEL: test_lib_trailing_ones |
| // LIB: xor i32 %{{.*}}, -1 |
| // LIB: call i32 @llvm.cttz.i32(i32 %{{.*}}, i1 false) |
| void test_lib_trailing_ones(unsigned ui) { |
| volatile unsigned r = stdc_trailing_ones(ui); |
| } |
| |
| // LIB-LABEL: test_lib_first_leading_zero |
| // LIB: call i32 @llvm.ctlz.i32(i32 %{{.*}}, i1 false) |
| void test_lib_first_leading_zero(unsigned ui) { |
| volatile unsigned r = stdc_first_leading_zero(ui); |
| } |
| |
| // LIB-LABEL: test_lib_first_leading_one |
| // LIB: call i32 @llvm.ctlz.i32(i32 %{{.*}}, i1 false) |
| void test_lib_first_leading_one(unsigned ui) { |
| volatile unsigned r = stdc_first_leading_one(ui); |
| } |
| |
| // LIB-LABEL: test_lib_first_trailing_zero |
| // LIB: xor i32 %{{.*}}, -1 |
| // LIB: call i32 @llvm.cttz.i32(i32 %{{.*}}, i1 false) |
| void test_lib_first_trailing_zero(unsigned ui) { |
| volatile unsigned r = stdc_first_trailing_zero(ui); |
| } |
| |
| // LIB-LABEL: test_lib_first_trailing_one |
| // LIB: call i32 @llvm.cttz.i32(i32 %{{.*}}, i1 false) |
| void test_lib_first_trailing_one(unsigned ui) { |
| volatile unsigned r = stdc_first_trailing_one(ui); |
| } |
| |
| // LIB-LABEL: test_lib_count_zeros |
| // LIB: call i32 @llvm.ctpop.i32(i32 %{{.*}}) |
| void test_lib_count_zeros(unsigned ui) { |
| volatile unsigned r = stdc_count_zeros(ui); |
| } |
| |
| // LIB-LABEL: test_lib_count_ones |
| // LIB: call i32 @llvm.ctpop.i32(i32 %{{.*}}) |
| void test_lib_count_ones(unsigned ui) { |
| volatile unsigned r = stdc_count_ones(ui); |
| } |
| |
| // LIB-LABEL: test_lib_has_single_bit |
| // LIB: call i32 @llvm.ctpop.i32(i32 %{{.*}}) |
| void test_lib_has_single_bit(unsigned ui) { |
| volatile _Bool r = stdc_has_single_bit(ui); |
| } |
| |
| // LIB-LABEL: test_lib_bit_width |
| // LIB: call i32 @llvm.ctlz.i32(i32 %{{.*}}, i1 false) |
| void test_lib_bit_width(unsigned ui) { |
| volatile unsigned r = stdc_bit_width(ui); |
| } |
| |
| // LIB-LABEL: test_lib_bit_floor |
| // LIB: call i32 @llvm.ctlz.i32(i32 %{{.*}}, i1 true) |
| void test_lib_bit_floor(unsigned ui) { |
| volatile unsigned r = stdc_bit_floor(ui); |
| } |
| |
| // LIB-LABEL: test_lib_bit_ceil |
| // LIB: call i32 @llvm.ctlz.i32(i32 %{{.*}}, i1 false) |
| void test_lib_bit_ceil(unsigned ui) { |
| volatile unsigned r = stdc_bit_ceil(ui); |
| } |
| |
| // LIB-LABEL: test_lib_typed_leading_zeros |
| // LIB: call i8 @llvm.ctlz.i8(i8 %{{.*}}, i1 false) |
| // LIB: call i16 @llvm.ctlz.i16(i16 %{{.*}}, i1 false) |
| // LIB: call i32 @llvm.ctlz.i32(i32 %{{.*}}, i1 false) |
| // LIB: call i64 @llvm.ctlz.i64(i64 %{{.*}}, i1 false) |
| void test_lib_typed_leading_zeros(unsigned char uc, unsigned short us, |
| unsigned int ui, unsigned long long ull) { |
| volatile unsigned r; |
| r = stdc_leading_zeros_uc(uc); |
| r = stdc_leading_zeros_us(us); |
| r = stdc_leading_zeros_ui(ui); |
| r = stdc_leading_zeros_ull(ull); |
| } |
| |
| // LIB-LABEL: test_lib_typed_leading_ones |
| // LIB: xor i8 %{{.*}}, -1 |
| // LIB: call i8 @llvm.ctlz.i8(i8 %{{.*}}, i1 false) |
| // LIB: xor i16 %{{.*}}, -1 |
| // LIB: call i16 @llvm.ctlz.i16(i16 %{{.*}}, i1 false) |
| // LIB: xor i32 %{{.*}}, -1 |
| // LIB: call i32 @llvm.ctlz.i32(i32 %{{.*}}, i1 false) |
| // LIB: xor i64 %{{.*}}, -1 |
| // LIB: call i64 @llvm.ctlz.i64(i64 %{{.*}}, i1 false) |
| void test_lib_typed_leading_ones(unsigned char uc, unsigned short us, |
| unsigned int ui, unsigned long long ull) { |
| volatile unsigned r; |
| r = stdc_leading_ones_uc(uc); |
| r = stdc_leading_ones_us(us); |
| r = stdc_leading_ones_ui(ui); |
| r = stdc_leading_ones_ull(ull); |
| } |
| |
| // LIB-LABEL: test_lib_typed_trailing_zeros |
| // LIB: call i8 @llvm.cttz.i8(i8 %{{.*}}, i1 false) |
| // LIB: call i16 @llvm.cttz.i16(i16 %{{.*}}, i1 false) |
| // LIB: call i32 @llvm.cttz.i32(i32 %{{.*}}, i1 false) |
| // LIB: call i64 @llvm.cttz.i64(i64 %{{.*}}, i1 false) |
| void test_lib_typed_trailing_zeros(unsigned char uc, unsigned short us, |
| unsigned int ui, unsigned long long ull) { |
| volatile unsigned r; |
| r = stdc_trailing_zeros_uc(uc); |
| r = stdc_trailing_zeros_us(us); |
| r = stdc_trailing_zeros_ui(ui); |
| r = stdc_trailing_zeros_ull(ull); |
| } |
| |
| // LIB-LABEL: test_lib_typed_trailing_ones |
| // LIB: xor i8 %{{.*}}, -1 |
| // LIB: call i8 @llvm.cttz.i8(i8 %{{.*}}, i1 false) |
| // LIB: xor i16 %{{.*}}, -1 |
| // LIB: call i16 @llvm.cttz.i16(i16 %{{.*}}, i1 false) |
| // LIB: xor i32 %{{.*}}, -1 |
| // LIB: call i32 @llvm.cttz.i32(i32 %{{.*}}, i1 false) |
| // LIB: xor i64 %{{.*}}, -1 |
| // LIB: call i64 @llvm.cttz.i64(i64 %{{.*}}, i1 false) |
| void test_lib_typed_trailing_ones(unsigned char uc, unsigned short us, |
| unsigned int ui, unsigned long long ull) { |
| volatile unsigned r; |
| r = stdc_trailing_ones_uc(uc); |
| r = stdc_trailing_ones_us(us); |
| r = stdc_trailing_ones_ui(ui); |
| r = stdc_trailing_ones_ull(ull); |
| } |
| |
| // LIB-LABEL: test_lib_typed_first_leading_zero |
| // LIB: xor i8 %{{.*}}, -1 |
| // LIB: call i8 @llvm.ctlz.i8(i8 %{{.*}}, i1 false) |
| // LIB: xor i16 %{{.*}}, -1 |
| // LIB: call i16 @llvm.ctlz.i16(i16 %{{.*}}, i1 false) |
| // LIB: xor i32 %{{.*}}, -1 |
| // LIB: call i32 @llvm.ctlz.i32(i32 %{{.*}}, i1 false) |
| // LIB: xor i64 %{{.*}}, -1 |
| // LIB: call i64 @llvm.ctlz.i64(i64 %{{.*}}, i1 false) |
| void test_lib_typed_first_leading_zero(unsigned char uc, unsigned short us, |
| unsigned int ui, unsigned long long ull) { |
| volatile unsigned r; |
| r = stdc_first_leading_zero_uc(uc); |
| r = stdc_first_leading_zero_us(us); |
| r = stdc_first_leading_zero_ui(ui); |
| r = stdc_first_leading_zero_ull(ull); |
| } |
| |
| // LIB-LABEL: test_lib_typed_first_leading_one |
| // LIB: call i8 @llvm.ctlz.i8(i8 %{{.*}}, i1 false) |
| // LIB: call i16 @llvm.ctlz.i16(i16 %{{.*}}, i1 false) |
| // LIB: call i32 @llvm.ctlz.i32(i32 %{{.*}}, i1 false) |
| // LIB: call i64 @llvm.ctlz.i64(i64 %{{.*}}, i1 false) |
| void test_lib_typed_first_leading_one(unsigned char uc, unsigned short us, |
| unsigned int ui, unsigned long long ull) { |
| volatile unsigned r; |
| r = stdc_first_leading_one_uc(uc); |
| r = stdc_first_leading_one_us(us); |
| r = stdc_first_leading_one_ui(ui); |
| r = stdc_first_leading_one_ull(ull); |
| } |
| |
| // LIB-LABEL: test_lib_typed_first_trailing_zero |
| // LIB: xor i8 %{{.*}}, -1 |
| // LIB: call i8 @llvm.cttz.i8(i8 %{{.*}}, i1 false) |
| // LIB: xor i16 %{{.*}}, -1 |
| // LIB: call i16 @llvm.cttz.i16(i16 %{{.*}}, i1 false) |
| // LIB: xor i32 %{{.*}}, -1 |
| // LIB: call i32 @llvm.cttz.i32(i32 %{{.*}}, i1 false) |
| // LIB: xor i64 %{{.*}}, -1 |
| // LIB: call i64 @llvm.cttz.i64(i64 %{{.*}}, i1 false) |
| void test_lib_typed_first_trailing_zero(unsigned char uc, unsigned short us, |
| unsigned int ui, unsigned long long ull) { |
| volatile unsigned r; |
| r = stdc_first_trailing_zero_uc(uc); |
| r = stdc_first_trailing_zero_us(us); |
| r = stdc_first_trailing_zero_ui(ui); |
| r = stdc_first_trailing_zero_ull(ull); |
| } |
| |
| // LIB-LABEL: test_lib_typed_first_trailing_one |
| // LIB: call i8 @llvm.cttz.i8(i8 %{{.*}}, i1 false) |
| // LIB: call i16 @llvm.cttz.i16(i16 %{{.*}}, i1 false) |
| // LIB: call i32 @llvm.cttz.i32(i32 %{{.*}}, i1 false) |
| // LIB: call i64 @llvm.cttz.i64(i64 %{{.*}}, i1 false) |
| void test_lib_typed_first_trailing_one(unsigned char uc, unsigned short us, |
| unsigned int ui, unsigned long long ull) { |
| volatile unsigned r; |
| r = stdc_first_trailing_one_uc(uc); |
| r = stdc_first_trailing_one_us(us); |
| r = stdc_first_trailing_one_ui(ui); |
| r = stdc_first_trailing_one_ull(ull); |
| } |
| |
| // LIB-LABEL: test_lib_typed_count_zeros |
| // LIB: call i8 @llvm.ctpop.i8(i8 %{{.*}}) |
| // LIB: call i16 @llvm.ctpop.i16(i16 %{{.*}}) |
| // LIB: call i32 @llvm.ctpop.i32(i32 %{{.*}}) |
| // LIB: call i64 @llvm.ctpop.i64(i64 %{{.*}}) |
| void test_lib_typed_count_zeros(unsigned char uc, unsigned short us, |
| unsigned int ui, unsigned long long ull) { |
| volatile unsigned r; |
| r = stdc_count_zeros_uc(uc); |
| r = stdc_count_zeros_us(us); |
| r = stdc_count_zeros_ui(ui); |
| r = stdc_count_zeros_ull(ull); |
| } |
| |
| // LIB-LABEL: test_lib_typed_count_ones |
| // LIB: call i8 @llvm.ctpop.i8(i8 %{{.*}}) |
| // LIB: call i16 @llvm.ctpop.i16(i16 %{{.*}}) |
| // LIB: call i32 @llvm.ctpop.i32(i32 %{{.*}}) |
| // LIB: call i64 @llvm.ctpop.i64(i64 %{{.*}}) |
| void test_lib_typed_count_ones(unsigned char uc, unsigned short us, |
| unsigned int ui, unsigned long long ull) { |
| volatile unsigned r; |
| r = stdc_count_ones_uc(uc); |
| r = stdc_count_ones_us(us); |
| r = stdc_count_ones_ui(ui); |
| r = stdc_count_ones_ull(ull); |
| } |
| |
| // LIB-LABEL: test_lib_typed_has_single_bit |
| // LIB: call i8 @llvm.ctpop.i8(i8 %{{.*}}) |
| // LIB: call i16 @llvm.ctpop.i16(i16 %{{.*}}) |
| // LIB: call i32 @llvm.ctpop.i32(i32 %{{.*}}) |
| // LIB: call i64 @llvm.ctpop.i64(i64 %{{.*}}) |
| void test_lib_typed_has_single_bit(unsigned char uc, unsigned short us, |
| unsigned int ui, unsigned long long ull) { |
| volatile _Bool r; |
| r = stdc_has_single_bit_uc(uc); |
| r = stdc_has_single_bit_us(us); |
| r = stdc_has_single_bit_ui(ui); |
| r = stdc_has_single_bit_ull(ull); |
| } |
| |
| // LIB-LABEL: test_lib_typed_bit_width |
| // LIB: call i8 @llvm.ctlz.i8(i8 %{{.*}}, i1 false) |
| // LIB: call i16 @llvm.ctlz.i16(i16 %{{.*}}, i1 false) |
| // LIB: call i32 @llvm.ctlz.i32(i32 %{{.*}}, i1 false) |
| // LIB: call i64 @llvm.ctlz.i64(i64 %{{.*}}, i1 false) |
| void test_lib_typed_bit_width(unsigned char uc, unsigned short us, |
| unsigned int ui, unsigned long long ull) { |
| volatile unsigned r; |
| r = stdc_bit_width_uc(uc); |
| r = stdc_bit_width_us(us); |
| r = stdc_bit_width_ui(ui); |
| r = stdc_bit_width_ull(ull); |
| } |
| |
| // LIB-LABEL: test_lib_typed_bit_floor |
| // LIB: call i8 @llvm.ctlz.i8(i8 %{{.*}}, i1 true) |
| // LIB: call i16 @llvm.ctlz.i16(i16 %{{.*}}, i1 true) |
| // LIB: call i32 @llvm.ctlz.i32(i32 %{{.*}}, i1 true) |
| // LIB: call i64 @llvm.ctlz.i64(i64 %{{.*}}, i1 true) |
| void test_lib_typed_bit_floor(unsigned char uc, unsigned short us, |
| unsigned int ui, unsigned long long ull) { |
| volatile unsigned char rc = stdc_bit_floor_uc(uc); |
| volatile unsigned short rs = stdc_bit_floor_us(us); |
| volatile unsigned int ri = stdc_bit_floor_ui(ui); |
| volatile unsigned long long rll = stdc_bit_floor_ull(ull); |
| } |
| |
| // LIB-LABEL: test_lib_typed_bit_ceil |
| // LIB: call i8 @llvm.ctlz.i8(i8 %{{.*}}, i1 false) |
| // LIB: call i16 @llvm.ctlz.i16(i16 %{{.*}}, i1 false) |
| // LIB: call i32 @llvm.ctlz.i32(i32 %{{.*}}, i1 false) |
| // LIB: call i64 @llvm.ctlz.i64(i64 %{{.*}}, i1 false) |
| void test_lib_typed_bit_ceil(unsigned char uc, unsigned short us, |
| unsigned int ui, unsigned long long ull) { |
| volatile unsigned char rc = stdc_bit_ceil_uc(uc); |
| volatile unsigned short rs = stdc_bit_ceil_us(us); |
| volatile unsigned int ri = stdc_bit_ceil_ui(ui); |
| volatile unsigned long long rll = stdc_bit_ceil_ull(ull); |
| } |
| |
| // LIB-LABEL: test_lib_typed_ul |
| // LIB: call {{i32|i64}} @llvm.ctlz.{{i32|i64}}({{i32|i64}} %{{.*}}, i1 false) |
| // LIB: xor {{i32|i64}} %{{.*}}, -1 |
| // LIB: call {{i32|i64}} @llvm.ctlz.{{i32|i64}}({{i32|i64}} %{{.*}}, i1 false) |
| // LIB: call {{i32|i64}} @llvm.cttz.{{i32|i64}}({{i32|i64}} %{{.*}}, i1 false) |
| // LIB: xor {{i32|i64}} %{{.*}}, -1 |
| // LIB: call {{i32|i64}} @llvm.cttz.{{i32|i64}}({{i32|i64}} %{{.*}}, i1 false) |
| // LIB: xor {{i32|i64}} %{{.*}}, -1 |
| // LIB: call {{i32|i64}} @llvm.ctlz.{{i32|i64}}({{i32|i64}} %{{.*}}, i1 false) |
| // LIB: call {{i32|i64}} @llvm.ctlz.{{i32|i64}}({{i32|i64}} %{{.*}}, i1 false) |
| // LIB: xor {{i32|i64}} %{{.*}}, -1 |
| // LIB: call {{i32|i64}} @llvm.cttz.{{i32|i64}}({{i32|i64}} %{{.*}}, i1 false) |
| // LIB: call {{i32|i64}} @llvm.cttz.{{i32|i64}}({{i32|i64}} %{{.*}}, i1 false) |
| // LIB: call {{i32|i64}} @llvm.ctpop.{{i32|i64}}({{i32|i64}} %{{.*}}) |
| // LIB: call {{i32|i64}} @llvm.ctpop.{{i32|i64}}({{i32|i64}} %{{.*}}) |
| // LIB: call {{i32|i64}} @llvm.ctpop.{{i32|i64}}({{i32|i64}} %{{.*}}) |
| // LIB: call {{i32|i64}} @llvm.ctlz.{{i32|i64}}({{i32|i64}} %{{.*}}, i1 false) |
| // LIB: call {{i32|i64}} @llvm.ctlz.{{i32|i64}}({{i32|i64}} %{{.*}}, i1 true) |
| // LIB: call {{i32|i64}} @llvm.ctlz.{{i32|i64}}({{i32|i64}} %{{.*}}, i1 false) |
| void test_lib_typed_ul(unsigned long ul) { |
| volatile unsigned r; |
| volatile unsigned long rl; |
| volatile _Bool rb; |
| r = stdc_leading_zeros_ul(ul); |
| r = stdc_leading_ones_ul(ul); |
| r = stdc_trailing_zeros_ul(ul); |
| r = stdc_trailing_ones_ul(ul); |
| r = stdc_first_leading_zero_ul(ul); |
| r = stdc_first_leading_one_ul(ul); |
| r = stdc_first_trailing_zero_ul(ul); |
| r = stdc_first_trailing_one_ul(ul); |
| r = stdc_count_zeros_ul(ul); |
| r = stdc_count_ones_ul(ul); |
| rb = stdc_has_single_bit_ul(ul); |
| r = stdc_bit_width_ul(ul); |
| rl = stdc_bit_floor_ul(ul); |
| rl = stdc_bit_ceil_ul(ul); |
| } |
| #endif |