Clang Project

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