1*f4a2713aSLionel Sambuc // RUN: %clang_cc1 %s -O3 -triple=x86_64-unknown-unknown -target-feature +tbm -emit-llvm -o - | FileCheck %s
2*f4a2713aSLionel Sambuc
3*f4a2713aSLionel Sambuc // Don't include mm_malloc.h, it's system specific.
4*f4a2713aSLionel Sambuc #define __MM_MALLOC_H
5*f4a2713aSLionel Sambuc
6*f4a2713aSLionel Sambuc #include <x86intrin.h>
7*f4a2713aSLionel Sambuc
test__bextri_u32(unsigned int a)8*f4a2713aSLionel Sambuc unsigned int test__bextri_u32(unsigned int a) {
9*f4a2713aSLionel Sambuc // CHECK: call i32 @llvm.x86.tbm.bextri.u32
10*f4a2713aSLionel Sambuc return __bextri_u32(a, 1);
11*f4a2713aSLionel Sambuc }
12*f4a2713aSLionel Sambuc
test__bextri_u64(unsigned long long a)13*f4a2713aSLionel Sambuc unsigned long long test__bextri_u64(unsigned long long a) {
14*f4a2713aSLionel Sambuc // CHECK: call i64 @llvm.x86.tbm.bextri.u64
15*f4a2713aSLionel Sambuc return __bextri_u64(a, 2);
16*f4a2713aSLionel Sambuc }
17*f4a2713aSLionel Sambuc
test__bextri_u64_bigint(unsigned long long a)18*f4a2713aSLionel Sambuc unsigned long long test__bextri_u64_bigint(unsigned long long a) {
19*f4a2713aSLionel Sambuc // CHECK: call i64 @llvm.x86.tbm.bextri.u64
20*f4a2713aSLionel Sambuc return __bextri_u64(a, 0x7fffffffffLL);
21*f4a2713aSLionel Sambuc }
22*f4a2713aSLionel Sambuc
test__blcfill_u32(unsigned int a)23*f4a2713aSLionel Sambuc unsigned int test__blcfill_u32(unsigned int a) {
24*f4a2713aSLionel Sambuc // CHECK: [[TMP:%.*]] = add i32 [[SRC:%.*]], 1
25*f4a2713aSLionel Sambuc // CHECK-NEXT: %{{.*}} = and i32 [[TMP]], [[SRC]]
26*f4a2713aSLionel Sambuc return __blcfill_u32(a);
27*f4a2713aSLionel Sambuc }
28*f4a2713aSLionel Sambuc
test__blcfill_u64(unsigned long long a)29*f4a2713aSLionel Sambuc unsigned long long test__blcfill_u64(unsigned long long a) {
30*f4a2713aSLionel Sambuc // CHECK: [[TMPT:%.*]] = add i64 [[SRC:%.*]], 1
31*f4a2713aSLionel Sambuc // CHECK-NEXT: %{{.*}} = and i64 [[TMP]], [[SRC]]
32*f4a2713aSLionel Sambuc return __blcfill_u64(a);
33*f4a2713aSLionel Sambuc }
34*f4a2713aSLionel Sambuc
test__blci_u32(unsigned int a)35*f4a2713aSLionel Sambuc unsigned int test__blci_u32(unsigned int a) {
36*f4a2713aSLionel Sambuc // CHECK: [[TMP:%.*]] = sub i32 -2, [[SRC:%.*]]
37*f4a2713aSLionel Sambuc // CHECK-NEXT: %{{.*}} = or i32 [[TMP]], [[SRC]]
38*f4a2713aSLionel Sambuc return __blci_u32(a);
39*f4a2713aSLionel Sambuc }
40*f4a2713aSLionel Sambuc
test__blci_u64(unsigned long long a)41*f4a2713aSLionel Sambuc unsigned long long test__blci_u64(unsigned long long a) {
42*f4a2713aSLionel Sambuc // CHECK: [[TMP:%.*]] = sub i64 -2, [[SRC:%.*]]
43*f4a2713aSLionel Sambuc // CHECK-NEXT: %{{.*}} = or i64 [[TMP]], [[SRC]]
44*f4a2713aSLionel Sambuc return __blci_u64(a);
45*f4a2713aSLionel Sambuc }
46*f4a2713aSLionel Sambuc
test__blcic_u32(unsigned int a)47*f4a2713aSLionel Sambuc unsigned int test__blcic_u32(unsigned int a) {
48*f4a2713aSLionel Sambuc // CHECK: [[TMP1:%.*]] = xor i32 [[SRC:%.*]], -1
49*f4a2713aSLionel Sambuc // CHECK-NEXT: [[TMP2:%.*]] = add i32 [[SRC]], 1
50*f4a2713aSLionel Sambuc // CHECK-NEXT: {{.*}} = and i32 [[TMP2]], [[TMP1]]
51*f4a2713aSLionel Sambuc return __blcic_u32(a);
52*f4a2713aSLionel Sambuc }
53*f4a2713aSLionel Sambuc
test__blcic_u64(unsigned long long a)54*f4a2713aSLionel Sambuc unsigned long long test__blcic_u64(unsigned long long a) {
55*f4a2713aSLionel Sambuc // CHECK: [[TMP1:%.*]] = xor i64 [[SRC:%.*]], -1
56*f4a2713aSLionel Sambuc // CHECK-NEXT: [[TMP2:%.*]] = add i64 [[SRC]], 1
57*f4a2713aSLionel Sambuc // CHECK-NEXT: {{.*}} = and i64 [[TMP2]], [[TMP1]]
58*f4a2713aSLionel Sambuc return __blcic_u64(a);
59*f4a2713aSLionel Sambuc }
60*f4a2713aSLionel Sambuc
test__blcmsk_u32(unsigned int a)61*f4a2713aSLionel Sambuc unsigned int test__blcmsk_u32(unsigned int a) {
62*f4a2713aSLionel Sambuc // CHECK: [[TMP:%.*]] = add i32 [[SRC:%.*]], 1
63*f4a2713aSLionel Sambuc // CHECK-NEXT: {{.*}} = xor i32 [[TMP]], [[SRC]]
64*f4a2713aSLionel Sambuc return __blcmsk_u32(a);
65*f4a2713aSLionel Sambuc }
66*f4a2713aSLionel Sambuc
test__blcmsk_u64(unsigned long long a)67*f4a2713aSLionel Sambuc unsigned long long test__blcmsk_u64(unsigned long long a) {
68*f4a2713aSLionel Sambuc // CHECK: [[TMP:%.*]] = add i64 [[SRC:%.*]], 1
69*f4a2713aSLionel Sambuc // CHECK-NEXT: {{.*}} = xor i64 [[TMP]], [[SRC]]
70*f4a2713aSLionel Sambuc return __blcmsk_u64(a);
71*f4a2713aSLionel Sambuc }
72*f4a2713aSLionel Sambuc
test__blcs_u32(unsigned int a)73*f4a2713aSLionel Sambuc unsigned int test__blcs_u32(unsigned int a) {
74*f4a2713aSLionel Sambuc // CHECK: [[TMP:%.*]] = add i32 [[SRC:%.*]], 1
75*f4a2713aSLionel Sambuc // CHECK-NEXT: {{.*}} = or i32 [[TMP]], [[SRC]]
76*f4a2713aSLionel Sambuc return __blcs_u32(a);
77*f4a2713aSLionel Sambuc }
78*f4a2713aSLionel Sambuc
test__blcs_u64(unsigned long long a)79*f4a2713aSLionel Sambuc unsigned long long test__blcs_u64(unsigned long long a) {
80*f4a2713aSLionel Sambuc // CHECK: [[TMP:%.*]] = add i64 [[SRC:%.*]], 1
81*f4a2713aSLionel Sambuc // CHECK-NEXT: {{.*}} = or i64 [[TMP]], [[SRC]]
82*f4a2713aSLionel Sambuc return __blcs_u64(a);
83*f4a2713aSLionel Sambuc }
84*f4a2713aSLionel Sambuc
test__blsfill_u32(unsigned int a)85*f4a2713aSLionel Sambuc unsigned int test__blsfill_u32(unsigned int a) {
86*f4a2713aSLionel Sambuc // CHECK: [[TMP:%.*]] = add i32 [[SRC:%.*]], -1
87*f4a2713aSLionel Sambuc // CHECK-NEXT: {{.*}} = or i32 [[TMP]], [[SRC]]
88*f4a2713aSLionel Sambuc return __blsfill_u32(a);
89*f4a2713aSLionel Sambuc }
90*f4a2713aSLionel Sambuc
test__blsfill_u64(unsigned long long a)91*f4a2713aSLionel Sambuc unsigned long long test__blsfill_u64(unsigned long long a) {
92*f4a2713aSLionel Sambuc // CHECK: [[TMP:%.*]] = add i64 [[SRC:%.*]], -1
93*f4a2713aSLionel Sambuc // CHECK-NEXT: {{.*}} = or i64 [[TMP]], [[SRC]]
94*f4a2713aSLionel Sambuc return __blsfill_u64(a);
95*f4a2713aSLionel Sambuc }
96*f4a2713aSLionel Sambuc
test__blsic_u32(unsigned int a)97*f4a2713aSLionel Sambuc unsigned int test__blsic_u32(unsigned int a) {
98*f4a2713aSLionel Sambuc // CHECK: [[TMP1:%.*]] = xor i32 [[SRC:%.*]], -1
99*f4a2713aSLionel Sambuc // CHECK-NEXT: [[TMP2:%.*]] = add i32 [[SRC:%.*]], -1
100*f4a2713aSLionel Sambuc // CHECK-NEXT: {{.*}} = or i32 [[TMP2]], [[TMP1]]
101*f4a2713aSLionel Sambuc return __blsic_u32(a);
102*f4a2713aSLionel Sambuc }
103*f4a2713aSLionel Sambuc
test__blsic_u64(unsigned long long a)104*f4a2713aSLionel Sambuc unsigned long long test__blsic_u64(unsigned long long a) {
105*f4a2713aSLionel Sambuc // CHECK: [[TMP1:%.*]] = xor i64 [[SRC:%.*]], -1
106*f4a2713aSLionel Sambuc // CHECK-NEXT: [[TMP2:%.*]] = add i64 [[SRC:%.*]], -1
107*f4a2713aSLionel Sambuc // CHECK-NEXT: {{.*}} = or i64 [[TMP2]], [[TMP1]]
108*f4a2713aSLionel Sambuc return __blsic_u64(a);
109*f4a2713aSLionel Sambuc }
110*f4a2713aSLionel Sambuc
test__t1mskc_u32(unsigned int a)111*f4a2713aSLionel Sambuc unsigned int test__t1mskc_u32(unsigned int a) {
112*f4a2713aSLionel Sambuc // CHECK: [[TMP1:%.*]] = xor i32 [[SRC:%.*]], -1
113*f4a2713aSLionel Sambuc // CHECK-NEXT: [[TMP2:%.*]] = add i32 [[SRC:%.*]], 1
114*f4a2713aSLionel Sambuc // CHECK-NEXT: {{.*}} = or i32 [[TMP2]], [[TMP1]]
115*f4a2713aSLionel Sambuc return __t1mskc_u32(a);
116*f4a2713aSLionel Sambuc }
117*f4a2713aSLionel Sambuc
test__t1mskc_u64(unsigned long long a)118*f4a2713aSLionel Sambuc unsigned long long test__t1mskc_u64(unsigned long long a) {
119*f4a2713aSLionel Sambuc // CHECK: [[TMP1:%.*]] = xor i64 [[SRC:%.*]], -1
120*f4a2713aSLionel Sambuc // CHECK-NEXT: [[TMP2:%.*]] = add i64 [[SRC:%.*]], 1
121*f4a2713aSLionel Sambuc // CHECK-NEXT: {{.*}} = or i64 [[TMP2]], [[TMP1]]
122*f4a2713aSLionel Sambuc return __t1mskc_u64(a);
123*f4a2713aSLionel Sambuc }
124*f4a2713aSLionel Sambuc
test__tzmsk_u32(unsigned int a)125*f4a2713aSLionel Sambuc unsigned int test__tzmsk_u32(unsigned int a) {
126*f4a2713aSLionel Sambuc // CHECK: [[TMP1:%.*]] = xor i32 [[SRC:%.*]], -1
127*f4a2713aSLionel Sambuc // CHECK-NEXT: [[TMP2:%.*]] = add i32 [[SRC:%.*]], -1
128*f4a2713aSLionel Sambuc // CHECK-NEXT: {{.*}} = and i32 [[TMP2]], [[TMP1]]
129*f4a2713aSLionel Sambuc return __tzmsk_u32(a);
130*f4a2713aSLionel Sambuc }
131*f4a2713aSLionel Sambuc
test__tzmsk_u64(unsigned long long a)132*f4a2713aSLionel Sambuc unsigned long long test__tzmsk_u64(unsigned long long a) {
133*f4a2713aSLionel Sambuc // CHECK: [[TMP1:%.*]] = xor i64 [[SRC:%.*]], -1
134*f4a2713aSLionel Sambuc // CHECK-NEXT: [[TMP2:%.*]] = add i64 [[SRC:%.*]], -1
135*f4a2713aSLionel Sambuc // CHECK-NEXT: {{.*}} = and i64 [[TMP2]], [[TMP1]]
136*f4a2713aSLionel Sambuc return __tzmsk_u64(a);
137*f4a2713aSLionel Sambuc }
138