blob: 1d7b99122135f0654f0ff57b87561445ce2ca5fe [file] [edit]
// 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