Merging r261039:
[oota-llvm.git] / test / CodeGen / X86 / tbm_patterns.ll
1 ; RUN: llc -mtriple=x86_64-unknown-unknown -mattr=+tbm < %s | FileCheck %s
2
3 define i32 @test_x86_tbm_bextri_u32(i32 %a) nounwind readnone {
4 entry:
5   ; CHECK-LABEL: test_x86_tbm_bextri_u32:
6   ; CHECK-NOT: mov
7   ; CHECK: bextr $
8   %0 = lshr i32 %a, 4
9   %1 = and i32 %0, 4095
10   ret i32 %1
11 }
12
13 define i32 @test_x86_tbm_bextri_u32_m(i32* nocapture %a) nounwind readonly {
14 entry:
15   ; CHECK-LABEL: test_x86_tbm_bextri_u32_m:
16   ; CHECK-NOT: mov
17   ; CHECK: bextr $
18   %0 = load i32, i32* %a
19   %1 = lshr i32 %0, 4
20   %2 = and i32 %1, 4095
21   ret i32 %2
22 }
23
24 define i64 @test_x86_tbm_bextri_u64(i64 %a) nounwind readnone {
25 entry:
26   ; CHECK-LABEL: test_x86_tbm_bextri_u64:
27   ; CHECK-NOT: mov
28   ; CHECK: bextr $
29   %0 = lshr i64 %a, 4
30   %1 = and i64 %0, 4095
31   ret i64 %1
32 }
33
34 define i64 @test_x86_tbm_bextri_u64_m(i64* nocapture %a) nounwind readonly {
35 entry:
36   ; CHECK-LABEL: test_x86_tbm_bextri_u64_m:
37   ; CHECK-NOT: mov
38   ; CHECK: bextr $
39   %0 = load i64, i64* %a
40   %1 = lshr i64 %0, 4
41   %2 = and i64 %1, 4095
42   ret i64 %2
43 }
44
45 define i32 @test_x86_tbm_blcfill_u32(i32 %a) nounwind readnone {
46 entry:
47   ; CHECK-LABEL: test_x86_tbm_blcfill_u32:
48   ; CHECK-NOT: mov
49   ; CHECK: blcfill %
50   %0 = add i32 %a, 1
51   %1 = and i32 %0, %a
52   ret i32 %1
53 }
54
55 define i64 @test_x86_tbm_blcfill_u64(i64 %a) nounwind readnone {
56 entry:
57   ; CHECK-LABEL: test_x86_tbm_blcfill_u64:
58   ; CHECK-NOT: mov
59   ; CHECK: blcfill %
60   %0 = add i64 %a, 1
61   %1 = and i64 %0, %a
62   ret i64 %1
63 }
64
65 define i32 @test_x86_tbm_blci_u32(i32 %a) nounwind readnone {
66 entry:
67   ; CHECK-LABEL: test_x86_tbm_blci_u32:
68   ; CHECK-NOT: mov
69   ; CHECK: blci %
70   %0 = add i32 1, %a
71   %1 = xor i32 %0, -1
72   %2 = or i32 %1, %a
73   ret i32 %2
74 }
75
76 define i64 @test_x86_tbm_blci_u64(i64 %a) nounwind readnone {
77 entry:
78   ; CHECK-LABEL: test_x86_tbm_blci_u64:
79   ; CHECK-NOT: mov
80   ; CHECK: blci %
81   %0 = add i64 1, %a
82   %1 = xor i64 %0, -1
83   %2 = or i64 %1, %a
84   ret i64 %2
85 }
86
87 define i32 @test_x86_tbm_blci_u32_b(i32 %a) nounwind readnone {
88 entry:
89   ; CHECK-LABEL: test_x86_tbm_blci_u32_b:
90   ; CHECK-NOT: mov
91   ; CHECK: blci %
92   %0 = sub i32 -2, %a
93   %1 = or i32 %0, %a
94   ret i32 %1
95 }
96
97 define i64 @test_x86_tbm_blci_u64_b(i64 %a) nounwind readnone {
98 entry:
99   ; CHECK-LABEL: test_x86_tbm_blci_u64_b:
100   ; CHECK-NOT: mov
101   ; CHECK: blci %
102   %0 = sub i64 -2, %a
103   %1 = or i64 %0, %a
104   ret i64 %1
105 }
106
107 define i32 @test_x86_tbm_blcic_u32(i32 %a) nounwind readnone {
108 entry:
109   ; CHECK-LABEL: test_x86_tbm_blcic_u32:
110   ; CHECK-NOT: mov
111   ; CHECK: blcic %
112   %0 = xor i32 %a, -1
113   %1 = add i32 %a, 1
114   %2 = and i32 %1, %0
115   ret i32 %2
116 }
117
118 define i64 @test_x86_tbm_blcic_u64(i64 %a) nounwind readnone {
119 entry:
120   ; CHECK-LABEL: test_x86_tbm_blcic_u64:
121   ; CHECK-NOT: mov
122   ; CHECK: blcic %
123   %0 = xor i64 %a, -1
124   %1 = add i64 %a, 1
125   %2 = and i64 %1, %0
126   ret i64 %2
127 }
128
129 define i32 @test_x86_tbm_blcmsk_u32(i32 %a) nounwind readnone {
130 entry:
131   ; CHECK-LABEL: test_x86_tbm_blcmsk_u32:
132   ; CHECK-NOT: mov
133   ; CHECK: blcmsk %
134   %0 = add i32 %a, 1
135   %1 = xor i32 %0, %a
136   ret i32 %1
137 }
138
139 define i64 @test_x86_tbm_blcmsk_u64(i64 %a) nounwind readnone {
140 entry:
141   ; CHECK-LABEL: test_x86_tbm_blcmsk_u64:
142   ; CHECK-NOT: mov
143   ; CHECK: blcmsk %
144   %0 = add i64 %a, 1
145   %1 = xor i64 %0, %a
146   ret i64 %1
147 }
148
149 define i32 @test_x86_tbm_blcs_u32(i32 %a) nounwind readnone {
150 entry:
151   ; CHECK-LABEL: test_x86_tbm_blcs_u32:
152   ; CHECK-NOT: mov
153   ; CHECK: blcs %
154   %0 = add i32 %a, 1
155   %1 = or i32 %0, %a
156   ret i32 %1
157 }
158
159 define i64 @test_x86_tbm_blcs_u64(i64 %a) nounwind readnone {
160 entry:
161   ; CHECK-LABEL: test_x86_tbm_blcs_u64:
162   ; CHECK-NOT: mov
163   ; CHECK: blcs %
164   %0 = add i64 %a, 1
165   %1 = or i64 %0, %a
166   ret i64 %1
167 }
168
169 define i32 @test_x86_tbm_blsfill_u32(i32 %a) nounwind readnone {
170 entry:
171   ; CHECK-LABEL: test_x86_tbm_blsfill_u32:
172   ; CHECK-NOT: mov
173   ; CHECK: blsfill %
174   %0 = add i32 %a, -1
175   %1 = or i32 %0, %a
176   ret i32 %1
177 }
178
179 define i64 @test_x86_tbm_blsfill_u64(i64 %a) nounwind readnone {
180 entry:
181   ; CHECK-LABEL: test_x86_tbm_blsfill_u64:
182   ; CHECK-NOT: mov
183   ; CHECK: blsfill %
184   %0 = add i64 %a, -1
185   %1 = or i64 %0, %a
186   ret i64 %1
187 }
188
189 define i32 @test_x86_tbm_blsic_u32(i32 %a) nounwind readnone {
190 entry:
191   ; CHECK-LABEL: test_x86_tbm_blsic_u32:
192   ; CHECK-NOT: mov
193   ; CHECK: blsic %
194   %0 = xor i32 %a, -1
195   %1 = add i32 %a, -1
196   %2 = or i32 %0, %1
197   ret i32 %2
198 }
199
200 define i64 @test_x86_tbm_blsic_u64(i64 %a) nounwind readnone {
201 entry:
202   ; CHECK-LABEL: test_x86_tbm_blsic_u64:
203   ; CHECK-NOT: mov
204   ; CHECK: blsic %
205   %0 = xor i64 %a, -1
206   %1 = add i64 %a, -1
207   %2 = or i64 %0, %1
208   ret i64 %2
209 }
210
211 define i32 @test_x86_tbm_t1mskc_u32(i32 %a) nounwind readnone {
212 entry:
213   ; CHECK-LABEL: test_x86_tbm_t1mskc_u32:
214   ; CHECK-NOT: mov
215   ; CHECK: t1mskc %
216   %0 = xor i32 %a, -1
217   %1 = add i32 %a, 1
218   %2 = or i32 %0, %1
219   ret i32 %2
220 }
221
222 define i64 @Ttest_x86_tbm_t1mskc_u64(i64 %a) nounwind readnone {
223 entry:
224   ; CHECK-LABEL: test_x86_tbm_t1mskc_u64:
225   ; CHECK-NOT: mov
226   ; CHECK: t1mskc %
227   %0 = xor i64 %a, -1
228   %1 = add i64 %a, 1
229   %2 = or i64 %0, %1
230   ret i64 %2
231 }
232
233 define i32 @test_x86_tbm_tzmsk_u32(i32 %a) nounwind readnone {
234 entry:
235   ; CHECK-LABEL: test_x86_tbm_tzmsk_u32:
236   ; CHECK-NOT: mov
237   ; CHECK: tzmsk %
238   %0 = xor i32 %a, -1
239   %1 = add i32 %a, -1
240   %2 = and i32 %0, %1
241   ret i32 %2
242 }
243
244 define i64 @test_x86_tbm_tzmsk_u64(i64 %a) nounwind readnone {
245 entry:
246   ; CHECK-LABEL: test_x86_tbm_tzmsk_u64:
247   ; CHECK-NOT: mov
248   ; CHECK: tzmsk %
249   %0 = xor i64 %a, -1
250   %1 = add i64 %a, -1
251   %2 = and i64 %0, %1
252   ret i64 %2
253 }