docs: Sphinxify TestingGuide
[oota-llvm.git] / test / CodeGen / CellSPU / or_ops.ll
1 ; RUN: llc < %s -march=cellspu > %t1.s
2 ; RUN: grep and    %t1.s | count 2
3 ; RUN: grep orc    %t1.s | count 85
4 ; RUN: grep ori    %t1.s | count 34
5 ; RUN: grep orhi   %t1.s | count 30
6 ; RUN: grep orbi   %t1.s | count 15
7 ; RUN: FileCheck %s < %t1.s
8
9 ; CellSPU legalization is over-sensitive to Legalize's traversal order.
10 ; XFAIL: *
11
12 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"
13 target triple = "spu"
14
15 ; OR instruction generation:
16 define <4 x i32> @or_v4i32_1(<4 x i32> %arg1, <4 x i32> %arg2) {
17         %A = or <4 x i32> %arg1, %arg2
18         ret <4 x i32> %A
19 }
20
21 define <4 x i32> @or_v4i32_2(<4 x i32> %arg1, <4 x i32> %arg2) {
22         %A = or <4 x i32> %arg2, %arg1
23         ret <4 x i32> %A
24 }
25
26 define <8 x i16> @or_v8i16_1(<8 x i16> %arg1, <8 x i16> %arg2) {
27         %A = or <8 x i16> %arg1, %arg2
28         ret <8 x i16> %A
29 }
30
31 define <8 x i16> @or_v8i16_2(<8 x i16> %arg1, <8 x i16> %arg2) {
32         %A = or <8 x i16> %arg2, %arg1
33         ret <8 x i16> %A
34 }
35
36 define <16 x i8> @or_v16i8_1(<16 x i8> %arg1, <16 x i8> %arg2) {
37         %A = or <16 x i8> %arg2, %arg1
38         ret <16 x i8> %A
39 }
40
41 define <16 x i8> @or_v16i8_2(<16 x i8> %arg1, <16 x i8> %arg2) {
42         %A = or <16 x i8> %arg1, %arg2
43         ret <16 x i8> %A
44 }
45
46 define i32 @or_i32_1(i32 %arg1, i32 %arg2) {
47         %A = or i32 %arg2, %arg1
48         ret i32 %A
49 }
50
51 define i32 @or_i32_2(i32 %arg1, i32 %arg2) {
52         %A = or i32 %arg1, %arg2
53         ret i32 %A
54 }
55
56 define i16 @or_i16_1(i16 %arg1, i16 %arg2) {
57         %A = or i16 %arg2, %arg1
58         ret i16 %A
59 }
60
61 define i16 @or_i16_2(i16 %arg1, i16 %arg2) {
62         %A = or i16 %arg1, %arg2
63         ret i16 %A
64 }
65
66 define i8 @or_i8_1(i8 %arg1, i8 %arg2) {
67         %A = or i8 %arg2, %arg1
68         ret i8 %A
69 }
70
71 define i8 @or_i8_2(i8 %arg1, i8 %arg2) {
72         %A = or i8 %arg1, %arg2
73         ret i8 %A
74 }
75
76 ; ORC instruction generation:
77 define <4 x i32> @orc_v4i32_1(<4 x i32> %arg1, <4 x i32> %arg2) {
78         %A = xor <4 x i32> %arg2, < i32 -1, i32 -1, i32 -1, i32 -1 >
79         %B = or <4 x i32> %arg1, %A
80         ret <4 x i32> %B
81 }
82
83 define <4 x i32> @orc_v4i32_2(<4 x i32> %arg1, <4 x i32> %arg2) {
84         %A = xor <4 x i32> %arg1, < i32 -1, i32 -1, i32 -1, i32 -1 >
85         %B = or <4 x i32> %arg2, %A
86         ret <4 x i32> %B
87 }
88
89 define <4 x i32> @orc_v4i32_3(<4 x i32> %arg1, <4 x i32> %arg2) {
90         %A = xor <4 x i32> %arg1, < i32 -1, i32 -1, i32 -1, i32 -1 >
91         %B = or <4 x i32> %A, %arg2
92         ret <4 x i32> %B
93 }
94
95 define <8 x i16> @orc_v8i16_1(<8 x i16> %arg1, <8 x i16> %arg2) {
96         %A = xor <8 x i16> %arg2, < i16 -1, i16 -1, i16 -1, i16 -1,
97                                     i16 -1, i16 -1, i16 -1, i16 -1 >
98         %B = or <8 x i16> %arg1, %A
99         ret <8 x i16> %B
100 }
101
102 define <8 x i16> @orc_v8i16_2(<8 x i16> %arg1, <8 x i16> %arg2) {
103         %A = xor <8 x i16> %arg1, < i16 -1, i16 -1, i16 -1, i16 -1,
104                                     i16 -1, i16 -1, i16 -1, i16 -1 >
105         %B = or <8 x i16> %arg2, %A
106         ret <8 x i16> %B
107 }
108
109 define <16 x i8> @orc_v16i8_1(<16 x i8> %arg1, <16 x i8> %arg2) {
110         %A = xor <16 x i8> %arg1, < i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1,
111                                     i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1,
112                                     i8 -1, i8 -1, i8 -1, i8 -1 >
113         %B = or <16 x i8> %arg2, %A
114         ret <16 x i8> %B
115 }
116
117 define <16 x i8> @orc_v16i8_2(<16 x i8> %arg1, <16 x i8> %arg2) {
118         %A = xor <16 x i8> %arg2, < i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1,
119                                     i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1,
120                                     i8 -1, i8 -1, i8 -1, i8 -1 >
121         %B = or <16 x i8> %arg1, %A
122         ret <16 x i8> %B
123 }
124
125 define <16 x i8> @orc_v16i8_3(<16 x i8> %arg1, <16 x i8> %arg2) {
126         %A = xor <16 x i8> %arg2, < i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1,
127                                     i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1,
128                                     i8 -1, i8 -1, i8 -1, i8 -1 >
129         %B = or <16 x i8> %A, %arg1
130         ret <16 x i8> %B
131 }
132
133 define i32 @orc_i32_1(i32 %arg1, i32 %arg2) {
134         %A = xor i32 %arg2, -1
135         %B = or i32 %A, %arg1
136         ret i32 %B
137 }
138
139 define i32 @orc_i32_2(i32 %arg1, i32 %arg2) {
140         %A = xor i32 %arg1, -1
141         %B = or i32 %A, %arg2
142         ret i32 %B
143 }
144
145 define i32 @orc_i32_3(i32 %arg1, i32 %arg2) {
146         %A = xor i32 %arg2, -1
147         %B = or i32 %arg1, %A
148         ret i32 %B
149 }
150
151 define i16 @orc_i16_1(i16 %arg1, i16 %arg2) {
152         %A = xor i16 %arg2, -1
153         %B = or i16 %A, %arg1
154         ret i16 %B
155 }
156
157 define i16 @orc_i16_2(i16 %arg1, i16 %arg2) {
158         %A = xor i16 %arg1, -1
159         %B = or i16 %A, %arg2
160         ret i16 %B
161 }
162
163 define i16 @orc_i16_3(i16 %arg1, i16 %arg2) {
164         %A = xor i16 %arg2, -1
165         %B = or i16 %arg1, %A
166         ret i16 %B
167 }
168
169 define i8 @orc_i8_1(i8 %arg1, i8 %arg2) {
170         %A = xor i8 %arg2, -1
171         %B = or i8 %A, %arg1
172         ret i8 %B
173 }
174
175 define i8 @orc_i8_2(i8 %arg1, i8 %arg2) {
176         %A = xor i8 %arg1, -1
177         %B = or i8 %A, %arg2
178         ret i8 %B
179 }
180
181 define i8 @orc_i8_3(i8 %arg1, i8 %arg2) {
182         %A = xor i8 %arg2, -1
183         %B = or i8 %arg1, %A
184         ret i8 %B
185 }
186
187 ; ORI instruction generation (i32 data type):
188 define <4 x i32> @ori_v4i32_1(<4 x i32> %in) {
189         %tmp2 = or <4 x i32> %in, < i32 511, i32 511, i32 511, i32 511 >
190         ret <4 x i32> %tmp2
191 }
192
193 define <4 x i32> @ori_v4i32_2(<4 x i32> %in) {
194         %tmp2 = or <4 x i32> %in, < i32 510, i32 510, i32 510, i32 510 >
195         ret <4 x i32> %tmp2
196 }
197
198 define <4 x i32> @ori_v4i32_3(<4 x i32> %in) {
199         %tmp2 = or <4 x i32> %in, < i32 -1, i32 -1, i32 -1, i32 -1 >
200         ret <4 x i32> %tmp2
201 }
202
203 define <4 x i32> @ori_v4i32_4(<4 x i32> %in) {
204         %tmp2 = or <4 x i32> %in, < i32 -512, i32 -512, i32 -512, i32 -512 >
205         ret <4 x i32> %tmp2
206 }
207
208 define zeroext i32 @ori_u32(i32 zeroext  %in)   {
209         %tmp37 = or i32 %in, 37         ; <i32> [#uses=1]
210         ret i32 %tmp37
211 }
212
213 define signext i32 @ori_i32(i32 signext  %in)   {
214         %tmp38 = or i32 %in, 37         ; <i32> [#uses=1]
215         ret i32 %tmp38
216 }
217
218 define i32 @ori_i32_600(i32 %in) {
219         ;600 does not fit into 'ori' immediate field
220         ;CHECK: ori_i32_600
221         ;CHECK: il
222         ;CHECK: ori
223         %tmp = or i32 %in, 600
224         ret i32 %tmp
225 }
226
227 ; ORHI instruction generation (i16 data type):
228 define <8 x i16> @orhi_v8i16_1(<8 x i16> %in) {
229         %tmp2 = or <8 x i16> %in, < i16 511, i16 511, i16 511, i16 511,
230                                     i16 511, i16 511, i16 511, i16 511 >
231         ret <8 x i16> %tmp2
232 }
233
234 define <8 x i16> @orhi_v8i16_2(<8 x i16> %in) {
235         %tmp2 = or <8 x i16> %in, < i16 510, i16 510, i16 510, i16 510,
236                                     i16 510, i16 510, i16 510, i16 510 >
237         ret <8 x i16> %tmp2
238 }
239
240 define <8 x i16> @orhi_v8i16_3(<8 x i16> %in) {
241         %tmp2 = or <8 x i16> %in, < i16 -1, i16 -1, i16 -1, i16 -1, i16 -1,
242                                     i16 -1, i16 -1, i16 -1 >
243         ret <8 x i16> %tmp2
244 }
245
246 define <8 x i16> @orhi_v8i16_4(<8 x i16> %in) {
247         %tmp2 = or <8 x i16> %in, < i16 -512, i16 -512, i16 -512, i16 -512,
248                                     i16 -512, i16 -512, i16 -512, i16 -512 >
249         ret <8 x i16> %tmp2
250 }
251
252 define zeroext i16 @orhi_u16(i16 zeroext  %in)   {
253         %tmp37 = or i16 %in, 37         ; <i16> [#uses=1]
254         ret i16 %tmp37
255 }
256
257 define signext i16 @orhi_i16(i16 signext  %in)   {
258         %tmp38 = or i16 %in, 37         ; <i16> [#uses=1]
259         ret i16 %tmp38
260 }
261
262 ; ORBI instruction generation (i8 data type):
263 define <16 x i8> @orbi_v16i8(<16 x i8> %in) {
264         %tmp2 = or <16 x i8> %in, < i8 42, i8 42, i8 42, i8 42, i8 42, i8 42,
265                                     i8 42, i8 42, i8 42, i8 42, i8 42, i8 42,
266                                     i8 42, i8 42, i8 42, i8 42 >
267         ret <16 x i8> %tmp2
268 }
269
270 define zeroext i8 @orbi_u8(i8 zeroext  %in)   {
271         %tmp37 = or i8 %in, 37         ; <i8> [#uses=1]
272         ret i8 %tmp37
273 }
274
275 define signext i8 @orbi_i8(i8 signext  %in)   {
276         %tmp38 = or i8 %in, 37         ; <i8> [#uses=1]
277         ret i8 %tmp38
278 }