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