Reapply r143206, with fixes. Disallow physical register lifetimes
[oota-llvm.git] / test / CodeGen / CellSPU / and_ops.ll
1 ; RUN: llc < %s -march=cellspu > %t1.s
2 ; RUN: grep and    %t1.s | count 234
3 ; RUN: grep andc   %t1.s | count 85
4 ; RUN: grep andi   %t1.s | count 37
5 ; RUN: grep andhi  %t1.s | count 30
6 ; RUN: grep andbi  %t1.s | count 4
7
8 ; CellSPU legalization is over-sensitive to Legalize's traversal order.
9 ; XFAIL: *
10
11 target datalayout = "E-p:32:32:128-f64:64:128-f32:32:128-i64:32:128-i32:32:128-i16:16:128-i8:8:128-i1:8:128-a0:0:128-v128:128:128-s0:128:128"
12 target triple = "spu"
13
14 ; AND instruction generation:
15 define <4 x i32> @and_v4i32_1(<4 x i32> %arg1, <4 x i32> %arg2) {
16         %A = and <4 x i32> %arg1, %arg2
17         ret <4 x i32> %A
18 }
19
20 define <4 x i32> @and_v4i32_2(<4 x i32> %arg1, <4 x i32> %arg2) {
21         %A = and <4 x i32> %arg2, %arg1
22         ret <4 x i32> %A
23 }
24
25 define <8 x i16> @and_v8i16_1(<8 x i16> %arg1, <8 x i16> %arg2) {
26         %A = and <8 x i16> %arg1, %arg2
27         ret <8 x i16> %A
28 }
29
30 define <8 x i16> @and_v8i16_2(<8 x i16> %arg1, <8 x i16> %arg2) {
31         %A = and <8 x i16> %arg2, %arg1
32         ret <8 x i16> %A
33 }
34
35 define <16 x i8> @and_v16i8_1(<16 x i8> %arg1, <16 x i8> %arg2) {
36         %A = and <16 x i8> %arg2, %arg1
37         ret <16 x i8> %A
38 }
39
40 define <16 x i8> @and_v16i8_2(<16 x i8> %arg1, <16 x i8> %arg2) {
41         %A = and <16 x i8> %arg1, %arg2
42         ret <16 x i8> %A
43 }
44
45 define i32 @and_i32_1(i32 %arg1, i32 %arg2) {
46         %A = and i32 %arg2, %arg1
47         ret i32 %A
48 }
49
50 define i32 @and_i32_2(i32 %arg1, i32 %arg2) {
51         %A = and i32 %arg1, %arg2
52         ret i32 %A
53 }
54
55 define i16 @and_i16_1(i16 %arg1, i16 %arg2) {
56         %A = and i16 %arg2, %arg1
57         ret i16 %A
58 }
59
60 define i16 @and_i16_2(i16 %arg1, i16 %arg2) {
61         %A = and i16 %arg1, %arg2
62         ret i16 %A
63 }
64
65 define i8 @and_i8_1(i8 %arg1, i8 %arg2) {
66         %A = and i8 %arg2, %arg1
67         ret i8 %A
68 }
69
70 define i8 @and_i8_2(i8 %arg1, i8 %arg2) {
71         %A = and i8 %arg1, %arg2
72         ret i8 %A
73 }
74
75 ; ANDC instruction generation:
76 define <4 x i32> @andc_v4i32_1(<4 x i32> %arg1, <4 x i32> %arg2) {
77         %A = xor <4 x i32> %arg2, < i32 -1, i32 -1, i32 -1, i32 -1 >
78         %B = and <4 x i32> %arg1, %A
79         ret <4 x i32> %B
80 }
81
82 define <4 x i32> @andc_v4i32_2(<4 x i32> %arg1, <4 x i32> %arg2) {
83         %A = xor <4 x i32> %arg1, < i32 -1, i32 -1, i32 -1, i32 -1 >
84         %B = and <4 x i32> %arg2, %A
85         ret <4 x i32> %B
86 }
87
88 define <4 x i32> @andc_v4i32_3(<4 x i32> %arg1, <4 x i32> %arg2) {
89         %A = xor <4 x i32> %arg1, < i32 -1, i32 -1, i32 -1, i32 -1 >
90         %B = and <4 x i32> %A, %arg2
91         ret <4 x i32> %B
92 }
93
94 define <8 x i16> @andc_v8i16_1(<8 x i16> %arg1, <8 x i16> %arg2) {
95         %A = xor <8 x i16> %arg2, < i16 -1, i16 -1, i16 -1, i16 -1,
96                                     i16 -1, i16 -1, i16 -1, i16 -1 >
97         %B = and <8 x i16> %arg1, %A
98         ret <8 x i16> %B
99 }
100
101 define <8 x i16> @andc_v8i16_2(<8 x i16> %arg1, <8 x i16> %arg2) {
102         %A = xor <8 x i16> %arg1, < i16 -1, i16 -1, i16 -1, i16 -1,
103                                     i16 -1, i16 -1, i16 -1, i16 -1 >
104         %B = and <8 x i16> %arg2, %A
105         ret <8 x i16> %B
106 }
107
108 define <16 x i8> @andc_v16i8_1(<16 x i8> %arg1, <16 x i8> %arg2) {
109         %A = xor <16 x i8> %arg1, < i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1,
110                                     i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1,
111                                     i8 -1, i8 -1, i8 -1, i8 -1 >
112         %B = and <16 x i8> %arg2, %A
113         ret <16 x i8> %B
114 }
115
116 define <16 x i8> @andc_v16i8_2(<16 x i8> %arg1, <16 x i8> %arg2) {
117         %A = xor <16 x i8> %arg2, < i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1,
118                                     i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1,
119                                     i8 -1, i8 -1, i8 -1, i8 -1 >
120         %B = and <16 x i8> %arg1, %A
121         ret <16 x i8> %B
122 }
123
124 define <16 x i8> @andc_v16i8_3(<16 x i8> %arg1, <16 x i8> %arg2) {
125         %A = xor <16 x i8> %arg2, < i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1,
126                                     i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1,
127                                     i8 -1, i8 -1, i8 -1, i8 -1 >
128         %B = and <16 x i8> %A, %arg1
129         ret <16 x i8> %B
130 }
131
132 define i32 @andc_i32_1(i32 %arg1, i32 %arg2) {
133         %A = xor i32 %arg2, -1
134         %B = and i32 %A, %arg1
135         ret i32 %B
136 }
137
138 define i32 @andc_i32_2(i32 %arg1, i32 %arg2) {
139         %A = xor i32 %arg1, -1
140         %B = and i32 %A, %arg2
141         ret i32 %B
142 }
143
144 define i32 @andc_i32_3(i32 %arg1, i32 %arg2) {
145         %A = xor i32 %arg2, -1
146         %B = and i32 %arg1, %A
147         ret i32 %B
148 }
149
150 define i16 @andc_i16_1(i16 %arg1, i16 %arg2) {
151         %A = xor i16 %arg2, -1
152         %B = and i16 %A, %arg1
153         ret i16 %B
154 }
155
156 define i16 @andc_i16_2(i16 %arg1, i16 %arg2) {
157         %A = xor i16 %arg1, -1
158         %B = and i16 %A, %arg2
159         ret i16 %B
160 }
161
162 define i16 @andc_i16_3(i16 %arg1, i16 %arg2) {
163         %A = xor i16 %arg2, -1
164         %B = and i16 %arg1, %A
165         ret i16 %B
166 }
167
168 define i8 @andc_i8_1(i8 %arg1, i8 %arg2) {
169         %A = xor i8 %arg2, -1
170         %B = and i8 %A, %arg1
171         ret i8 %B
172 }
173
174 define i8 @andc_i8_2(i8 %arg1, i8 %arg2) {
175         %A = xor i8 %arg1, -1
176         %B = and i8 %A, %arg2
177         ret i8 %B
178 }
179
180 define i8 @andc_i8_3(i8 %arg1, i8 %arg2) {
181         %A = xor i8 %arg2, -1
182         %B = and i8 %arg1, %A
183         ret i8 %B
184 }
185
186 ; ANDI instruction generation (i32 data type):
187 define <4 x i32> @andi_v4i32_1(<4 x i32> %in) {
188         %tmp2 = and <4 x i32> %in, < i32 511, i32 511, i32 511, i32 511 >
189         ret <4 x i32> %tmp2
190 }
191
192 define <4 x i32> @andi_v4i32_2(<4 x i32> %in) {
193         %tmp2 = and <4 x i32> %in, < i32 510, i32 510, i32 510, i32 510 >
194         ret <4 x i32> %tmp2
195 }
196
197 define <4 x i32> @andi_v4i32_3(<4 x i32> %in) {
198         %tmp2 = and <4 x i32> %in, < i32 -1, i32 -1, i32 -1, i32 -1 >
199         ret <4 x i32> %tmp2
200 }
201
202 define <4 x i32> @andi_v4i32_4(<4 x i32> %in) {
203         %tmp2 = and <4 x i32> %in, < i32 -512, i32 -512, i32 -512, i32 -512 >
204         ret <4 x i32> %tmp2
205 }
206
207 define zeroext i32 @andi_u32(i32 zeroext  %in)   {
208         %tmp37 = and i32 %in, 37
209         ret i32 %tmp37
210 }
211
212 define signext i32 @andi_i32(i32 signext  %in)   {
213         %tmp38 = and i32 %in, 37
214         ret i32 %tmp38
215 }
216
217 define i32 @andi_i32_1(i32 %in) {
218         %tmp37 = and i32 %in, 37
219         ret i32 %tmp37
220 }
221
222 ; ANDHI instruction generation (i16 data type):
223 define <8 x i16> @andhi_v8i16_1(<8 x i16> %in) {
224         %tmp2 = and <8 x i16> %in, < i16 511, i16 511, i16 511, i16 511,
225                                      i16 511, i16 511, i16 511, i16 511 >
226         ret <8 x i16> %tmp2
227 }
228
229 define <8 x i16> @andhi_v8i16_2(<8 x i16> %in) {
230         %tmp2 = and <8 x i16> %in, < i16 510, i16 510, i16 510, i16 510,
231                                      i16 510, i16 510, i16 510, i16 510 >
232         ret <8 x i16> %tmp2
233 }
234
235 define <8 x i16> @andhi_v8i16_3(<8 x i16> %in) {
236         %tmp2 = and <8 x i16> %in, < i16 -1, i16 -1, i16 -1, i16 -1, i16 -1,
237                                      i16 -1, i16 -1, i16 -1 >
238         ret <8 x i16> %tmp2
239 }
240
241 define <8 x i16> @andhi_v8i16_4(<8 x i16> %in) {
242         %tmp2 = and <8 x i16> %in, < i16 -512, i16 -512, i16 -512, i16 -512,
243                                      i16 -512, i16 -512, i16 -512, i16 -512 >
244         ret <8 x i16> %tmp2
245 }
246
247 define zeroext i16 @andhi_u16(i16 zeroext  %in)   {
248         %tmp37 = and i16 %in, 37         ; <i16> [#uses=1]
249         ret i16 %tmp37
250 }
251
252 define signext i16 @andhi_i16(i16 signext  %in)   {
253         %tmp38 = and i16 %in, 37         ; <i16> [#uses=1]
254         ret i16 %tmp38
255 }
256
257 ; i8 data type (s/b ANDBI if 8-bit registers were supported):
258 define <16 x i8> @and_v16i8(<16 x i8> %in) {
259         ; ANDBI generated for vector types
260         %tmp2 = and <16 x i8> %in, < i8 42, i8 42, i8 42, i8 42, i8 42, i8 42,
261                                      i8 42, i8 42, i8 42, i8 42, i8 42, i8 42,
262                                      i8 42, i8 42, i8 42, i8 42 >
263         ret <16 x i8> %tmp2
264 }
265
266 define zeroext i8 @and_u8(i8 zeroext  %in)   {
267         ; ANDBI generated:
268         %tmp37 = and i8 %in, 37
269         ret i8 %tmp37
270 }
271
272 define signext i8 @and_sext8(i8 signext  %in)   {
273         ; ANDBI generated
274         %tmp38 = and i8 %in, 37
275         ret i8 %tmp38
276 }
277
278 define i8 @and_i8(i8 %in) {
279         ; ANDBI generated
280         %tmp38 = and i8 %in, 205
281         ret i8 %tmp38
282 }