[Hexagon] Converting ALU32/ALU intrinsics to new patterns.
[oota-llvm.git] / test / CodeGen / Hexagon / intrinsics-mpy.ll
1 ; RUN: llc -march=hexagon -mcpu=hexagonv5 < %s | FileCheck %s
2
3 ; Verify that the mpy intrinsics are lowered into the right instructions.
4
5 @c = external global i32
6
7 ; CHECK: r{{[0-9]+}}{{ *}}={{ *}}mpy(r{{[0-9]+}}.l{{ *}},{{ *}}r{{[0-9]+}}.l)
8
9 define void @test1(i32 %a1, i32 %b1) #0 {
10 entry:
11   %0 = tail call i32 @llvm.hexagon.M2.mpy.ll.s0(i32 %a1, i32 %b1)
12   store i32 %0, i32* @c, align 4
13   ret void
14 }
15
16 declare i32 @llvm.hexagon.M2.mpy.ll.s0(i32, i32) #1
17
18 ; CHECK: r{{[0-9]+}}{{ *}}={{ *}}mpy(r{{[0-9]+}}.l{{ *}},{{ *}}r{{[0-9]+}}.h)
19
20 define void @test2(i32 %a2, i32 %b2) #0 {
21 entry:
22   %0 = tail call i32 @llvm.hexagon.M2.mpy.lh.s0(i32 %a2, i32 %b2)
23   store i32 %0, i32* @c, align 4
24   ret void
25 }
26
27 declare i32 @llvm.hexagon.M2.mpy.lh.s0(i32, i32) #1
28
29 ; CHECK: r{{[0-9]+}}{{ *}}={{ *}}mpy(r{{[0-9]+}}.h{{ *}},{{ *}}r{{[0-9]+}}.l)
30
31 define void @test3(i32 %a3, i32 %b3) #0 {
32 entry:
33   %0 = tail call i32 @llvm.hexagon.M2.mpy.hl.s0(i32 %a3, i32 %b3)
34   store i32 %0, i32* @c, align 4
35   ret void
36 }
37
38 declare i32 @llvm.hexagon.M2.mpy.hl.s0(i32, i32) #1
39
40 ; CHECK: r{{[0-9]+}}{{ *}}={{ *}}mpy(r{{[0-9]+}}.h{{ *}},{{ *}}r{{[0-9]+}}.h)
41
42 define void @test4(i32 %a4, i32 %b4) #0 {
43 entry:
44   %0 = tail call i32 @llvm.hexagon.M2.mpy.hh.s0(i32 %a4, i32 %b4)
45   store i32 %0, i32* @c, align 4
46   ret void
47 }
48
49 declare i32 @llvm.hexagon.M2.mpy.hh.s0(i32, i32) #1
50
51 ; CHECK: r{{[0-9]+}}{{ *}}={{ *}}mpy(r{{[0-9]+}}.l{{ *}},{{ *}}r{{[0-9]+}}.l):sat
52
53 define void @test5(i32 %a5, i32 %b5) #0 {
54 entry:
55   %0 = tail call i32 @llvm.hexagon.M2.mpy.sat.ll.s0(i32 %a5, i32 %b5)
56   store i32 %0, i32* @c, align 4
57   ret void
58 }
59
60 declare i32 @llvm.hexagon.M2.mpy.sat.ll.s0(i32, i32) #1
61
62 ; CHECK: r{{[0-9]+}}{{ *}}={{ *}}mpy(r{{[0-9]+}}.l{{ *}},{{ *}}r{{[0-9]+}}.h):sat
63
64 define void @test6(i32 %a6, i32 %b6) #0 {
65 entry:
66   %0 = tail call i32 @llvm.hexagon.M2.mpy.sat.lh.s0(i32 %a6, i32 %b6)
67   store i32 %0, i32* @c, align 4
68   ret void
69 }
70
71 declare i32 @llvm.hexagon.M2.mpy.sat.lh.s0(i32, i32) #1
72
73 ; CHECK: r{{[0-9]+}}{{ *}}={{ *}}mpy(r{{[0-9]+}}.h{{ *}},{{ *}}r{{[0-9]+}}.l):sat
74
75 define void @test7(i32 %a7, i32 %b7) #0 {
76 entry:
77   %0 = tail call i32 @llvm.hexagon.M2.mpy.sat.hl.s0(i32 %a7, i32 %b7)
78   store i32 %0, i32* @c, align 4
79   ret void
80 }
81
82 declare i32 @llvm.hexagon.M2.mpy.sat.hl.s0(i32, i32) #1
83
84 ; CHECK: r{{[0-9]+}}{{ *}}={{ *}}mpy(r{{[0-9]+}}.h{{ *}},{{ *}}r{{[0-9]+}}.h):sat
85
86 define void @test8(i32 %a8, i32 %b8) #0 {
87 entry:
88   %0 = tail call i32 @llvm.hexagon.M2.mpy.sat.hh.s0(i32 %a8, i32 %b8)
89   store i32 %0, i32* @c, align 4
90   ret void
91 }
92
93 declare i32 @llvm.hexagon.M2.mpy.sat.hh.s0(i32, i32) #1
94
95 ; CHECK: r{{[0-9]+}}{{ *}}={{ *}}mpy(r{{[0-9]+}}.l{{ *}},{{ *}}r{{[0-9]+}}.l):rnd
96
97 define void @test9(i32 %a9, i32 %b9) #0 {
98 entry:
99   %0 = tail call i32 @llvm.hexagon.M2.mpy.rnd.ll.s0(i32 %a9, i32 %b9)
100   store i32 %0, i32* @c, align 4
101   ret void
102 }
103
104 declare i32 @llvm.hexagon.M2.mpy.rnd.ll.s0(i32, i32) #1
105
106 ; CHECK: r{{[0-9]+}}{{ *}}={{ *}}mpy(r{{[0-9]+}}.l{{ *}},{{ *}}r{{[0-9]+}}.h):rnd
107
108 define void @test10(i32 %a10, i32 %b10) #0 {
109 entry:
110   %0 = tail call i32 @llvm.hexagon.M2.mpy.rnd.lh.s0(i32 %a10, i32 %b10)
111   store i32 %0, i32* @c, align 4
112   ret void
113 }
114
115 declare i32 @llvm.hexagon.M2.mpy.rnd.lh.s0(i32, i32) #1
116
117 ; CHECK: r{{[0-9]+}}{{ *}}={{ *}}mpy(r{{[0-9]+}}.h{{ *}},{{ *}}r{{[0-9]+}}.l):rnd
118
119 define void @test11(i32 %a11, i32 %b11) #0 {
120 entry:
121   %0 = tail call i32 @llvm.hexagon.M2.mpy.rnd.hl.s0(i32 %a11, i32 %b11)
122   store i32 %0, i32* @c, align 4
123   ret void
124 }
125
126 declare i32 @llvm.hexagon.M2.mpy.rnd.hl.s0(i32, i32) #1
127
128 ; CHECK: r{{[0-9]+}}{{ *}}={{ *}}mpy(r{{[0-9]+}}.h{{ *}},{{ *}}r{{[0-9]+}}.h):rnd
129
130 define void @test12(i32 %a12, i32 %b12) #0 {
131 entry:
132   %0 = tail call i32 @llvm.hexagon.M2.mpy.rnd.hh.s0(i32 %a12, i32 %b12)
133   store i32 %0, i32* @c, align 4
134   ret void
135 }
136
137 declare i32 @llvm.hexagon.M2.mpy.rnd.hh.s0(i32, i32) #1
138
139 ; CHECK: r{{[0-9]+}}{{ *}}={{ *}}mpy(r{{[0-9]+}}.l{{ *}},{{ *}}r{{[0-9]+}}.l):rnd:sat
140
141 define void @test13(i32 %a13, i32 %b13) #0 {
142 entry:
143   %0 = tail call i32 @llvm.hexagon.M2.mpy.sat.rnd.ll.s0(i32 %a13, i32 %b13)
144   store i32 %0, i32* @c, align 4
145   ret void
146 }
147
148 declare i32 @llvm.hexagon.M2.mpy.sat.rnd.ll.s0(i32, i32) #1
149
150 ; CHECK: r{{[0-9]+}}{{ *}}={{ *}}mpy(r{{[0-9]+}}.l{{ *}},{{ *}}r{{[0-9]+}}.h):rnd:sat
151
152 define void @test14(i32 %a14, i32 %b14) #0 {
153 entry:
154   %0 = tail call i32 @llvm.hexagon.M2.mpy.sat.rnd.lh.s0(i32 %a14, i32 %b14)
155   store i32 %0, i32* @c, align 4
156   ret void
157 }
158
159 declare i32 @llvm.hexagon.M2.mpy.sat.rnd.lh.s0(i32, i32) #1
160
161 ; CHECK: r{{[0-9]+}}{{ *}}={{ *}}mpy(r{{[0-9]+}}.h{{ *}},{{ *}}r{{[0-9]+}}.l):rnd:sat
162
163 define void @test15(i32 %a15, i32 %b15) #0 {
164 entry:
165   %0 = tail call i32 @llvm.hexagon.M2.mpy.sat.rnd.hl.s0(i32 %a15, i32 %b15)
166   store i32 %0, i32* @c, align 4
167   ret void
168 }
169
170 declare i32 @llvm.hexagon.M2.mpy.sat.rnd.hl.s0(i32, i32) #1
171
172 ; CHECK: r{{[0-9]+}}{{ *}}={{ *}}mpy(r{{[0-9]+}}.h{{ *}},{{ *}}r{{[0-9]+}}.h):rnd:sat
173
174 define void @test16(i32 %a16, i32 %b16) #0 {
175 entry:
176   %0 = tail call i32 @llvm.hexagon.M2.mpy.sat.rnd.hh.s0(i32 %a16, i32 %b16)
177   store i32 %0, i32* @c, align 4
178   ret void
179 }
180
181 declare i32 @llvm.hexagon.M2.mpy.sat.rnd.hh.s0(i32, i32) #1
182
183 ; CHECK: r{{[0-9]+}}{{ *}}={{ *}}mpyu(r{{[0-9]+}}.l{{ *}},{{ *}}r{{[0-9]+}}.l)
184
185 define void @test17(i32 %a17, i32 %b17) #0 {
186 entry:
187   %0 = tail call i32 @llvm.hexagon.M2.mpyu.ll.s0(i32 %a17, i32 %b17)
188   store i32 %0, i32* @c, align 4
189   ret void
190 }
191
192 declare i32 @llvm.hexagon.M2.mpyu.ll.s0(i32, i32) #1
193
194 ; CHECK: r{{[0-9]+}}{{ *}}={{ *}}mpyu(r{{[0-9]+}}.l{{ *}},{{ *}}r{{[0-9]+}}.h)
195
196 define void @test18(i32 %a18, i32 %b18) #0 {
197 entry:
198   %0 = tail call i32 @llvm.hexagon.M2.mpyu.lh.s0(i32 %a18, i32 %b18)
199   store i32 %0, i32* @c, align 4
200   ret void
201 }
202
203 declare i32 @llvm.hexagon.M2.mpyu.lh.s0(i32, i32) #1
204
205 ; CHECK: r{{[0-9]+}}{{ *}}={{ *}}mpyu(r{{[0-9]+}}.h{{ *}},{{ *}}r{{[0-9]+}}.l)
206
207 define void @test19(i32 %a19, i32 %b19) #0 {
208 entry:
209   %0 = tail call i32 @llvm.hexagon.M2.mpyu.hl.s0(i32 %a19, i32 %b19)
210   store i32 %0, i32* @c, align 4
211   ret void
212 }
213
214 declare i32 @llvm.hexagon.M2.mpyu.hl.s0(i32, i32) #1
215
216 ; CHECK: r{{[0-9]+}}{{ *}}={{ *}}mpyu(r{{[0-9]+}}.h{{ *}},{{ *}}r{{[0-9]+}}.h)
217
218 define void @test20(i32 %a20, i32 %b20) #0 {
219 entry:
220   %0 = tail call i32 @llvm.hexagon.M2.mpyu.hh.s0(i32 %a20, i32 %b20)
221   store i32 %0, i32* @c, align 4
222   ret void
223 }
224
225 declare i32 @llvm.hexagon.M2.mpyu.hh.s0(i32, i32) #1
226
227 ; CHECK: r{{[0-9]+}}{{ *}}={{ *}}mpy(r{{[0-9]+}}.l{{ *}},{{ *}}r{{[0-9]+}}.l):<<1
228
229 define void @test21(i32 %a21, i32 %b21) #0 {
230 entry:
231   %0 = tail call i32 @llvm.hexagon.M2.mpy.ll.s1(i32 %a21, i32 %b21)
232   store i32 %0, i32* @c, align 4
233   ret void
234 }
235
236 declare i32 @llvm.hexagon.M2.mpy.ll.s1(i32, i32) #1
237
238 ; CHECK: r{{[0-9]+}}{{ *}}={{ *}}mpy(r{{[0-9]+}}.l{{ *}},{{ *}}r{{[0-9]+}}.h):<<1
239
240 define void @test22(i32 %a22, i32 %b22) #0 {
241 entry:
242   %0 = tail call i32 @llvm.hexagon.M2.mpy.lh.s1(i32 %a22, i32 %b22)
243   store i32 %0, i32* @c, align 4
244   ret void
245 }
246
247 declare i32 @llvm.hexagon.M2.mpy.lh.s1(i32, i32) #1
248
249 ; CHECK: r{{[0-9]+}}{{ *}}={{ *}}mpy(r{{[0-9]+}}.h{{ *}},{{ *}}r{{[0-9]+}}.l):<<1
250
251 define void @test23(i32 %a23, i32 %b23) #0 {
252 entry:
253   %0 = tail call i32 @llvm.hexagon.M2.mpy.hl.s1(i32 %a23, i32 %b23)
254   store i32 %0, i32* @c, align 4
255   ret void
256 }
257
258 declare i32 @llvm.hexagon.M2.mpy.hl.s1(i32, i32) #1
259
260 ; CHECK: r{{[0-9]+}}{{ *}}={{ *}}mpy(r{{[0-9]+}}.h{{ *}},{{ *}}r{{[0-9]+}}.h):<<1
261
262 define void @test24(i32 %a24, i32 %b24) #0 {
263 entry:
264   %0 = tail call i32 @llvm.hexagon.M2.mpy.hh.s1(i32 %a24, i32 %b24)
265   store i32 %0, i32* @c, align 4
266   ret void
267 }
268
269 declare i32 @llvm.hexagon.M2.mpy.hh.s1(i32, i32) #1
270
271 ; CHECK: r{{[0-9]+}}{{ *}}={{ *}}mpy(r{{[0-9]+}}.l{{ *}},{{ *}}r{{[0-9]+}}.l):<<1:sat
272
273 define void @test25(i32 %a25, i32 %b25) #0 {
274 entry:
275   %0 = tail call i32 @llvm.hexagon.M2.mpy.sat.ll.s1(i32 %a25, i32 %b25)
276   store i32 %0, i32* @c, align 4
277   ret void
278 }
279
280 declare i32 @llvm.hexagon.M2.mpy.sat.ll.s1(i32, i32) #1
281
282 ; CHECK: r{{[0-9]+}}{{ *}}={{ *}}mpy(r{{[0-9]+}}.l{{ *}},{{ *}}r{{[0-9]+}}.h):<<1:sat
283
284 define void @test26(i32 %a26, i32 %b26) #0 {
285 entry:
286   %0 = tail call i32 @llvm.hexagon.M2.mpy.sat.lh.s1(i32 %a26, i32 %b26)
287   store i32 %0, i32* @c, align 4
288   ret void
289 }
290
291 declare i32 @llvm.hexagon.M2.mpy.sat.lh.s1(i32, i32) #1
292
293 ; CHECK: r{{[0-9]+}}{{ *}}={{ *}}mpy(r{{[0-9]+}}.h{{ *}},{{ *}}r{{[0-9]+}}.l):<<1:sat
294
295 define void @test27(i32 %a27, i32 %b27) #0 {
296 entry:
297   %0 = tail call i32 @llvm.hexagon.M2.mpy.sat.hl.s1(i32 %a27, i32 %b27)
298   store i32 %0, i32* @c, align 4
299   ret void
300 }
301
302 declare i32 @llvm.hexagon.M2.mpy.sat.hl.s1(i32, i32) #1
303
304 ; CHECK: r{{[0-9]+}}{{ *}}={{ *}}mpy(r{{[0-9]+}}.h{{ *}},{{ *}}r{{[0-9]+}}.h):<<1:sat
305
306 define void @test28(i32 %a28, i32 %b28) #0 {
307 entry:
308   %0 = tail call i32 @llvm.hexagon.M2.mpy.sat.hh.s1(i32 %a28, i32 %b28)
309   store i32 %0, i32* @c, align 4
310   ret void
311 }
312
313 declare i32 @llvm.hexagon.M2.mpy.sat.hh.s1(i32, i32) #1
314
315 ; CHECK: r{{[0-9]+}}{{ *}}={{ *}}mpy(r{{[0-9]+}}.l{{ *}},{{ *}}r{{[0-9]+}}.l):<<1:rnd
316
317 define void @test29(i32 %a29, i32 %b29) #0 {
318 entry:
319   %0 = tail call i32 @llvm.hexagon.M2.mpy.rnd.ll.s1(i32 %a29, i32 %b29)
320   store i32 %0, i32* @c, align 4
321   ret void
322 }
323
324 declare i32 @llvm.hexagon.M2.mpy.rnd.ll.s1(i32, i32) #1
325
326 ; CHECK: r{{[0-9]+}}{{ *}}={{ *}}mpy(r{{[0-9]+}}.l{{ *}},{{ *}}r{{[0-9]+}}.h):<<1:rnd
327
328 define void @test30(i32 %a30, i32 %b30) #0 {
329 entry:
330   %0 = tail call i32 @llvm.hexagon.M2.mpy.rnd.lh.s1(i32 %a30, i32 %b30)
331   store i32 %0, i32* @c, align 4
332   ret void
333 }
334
335 declare i32 @llvm.hexagon.M2.mpy.rnd.lh.s1(i32, i32) #1
336
337 ; CHECK: r{{[0-9]+}}{{ *}}={{ *}}mpy(r{{[0-9]+}}.h{{ *}},{{ *}}r{{[0-9]+}}.l):<<1:rnd
338
339 define void @test31(i32 %a31, i32 %b31) #0 {
340 entry:
341   %0 = tail call i32 @llvm.hexagon.M2.mpy.rnd.hl.s1(i32 %a31, i32 %b31)
342   store i32 %0, i32* @c, align 4
343   ret void
344 }
345
346 declare i32 @llvm.hexagon.M2.mpy.rnd.hl.s1(i32, i32) #1
347
348 ; CHECK: r{{[0-9]+}}{{ *}}={{ *}}mpy(r{{[0-9]+}}.h{{ *}},{{ *}}r{{[0-9]+}}.h):<<1:rnd
349
350 define void @test32(i32 %a32, i32 %b32) #0 {
351 entry:
352   %0 = tail call i32 @llvm.hexagon.M2.mpy.rnd.hh.s1(i32 %a32, i32 %b32)
353   store i32 %0, i32* @c, align 4
354   ret void
355 }
356
357 declare i32 @llvm.hexagon.M2.mpy.rnd.hh.s1(i32, i32) #1
358
359 ; CHECK: r{{[0-9]+}}{{ *}}={{ *}}mpy(r{{[0-9]+}}.l{{ *}},{{ *}}r{{[0-9]+}}.l):<<1:rnd:sat
360
361 define void @test33(i32 %a33, i32 %b33) #0 {
362 entry:
363   %0 = tail call i32 @llvm.hexagon.M2.mpy.sat.rnd.ll.s1(i32 %a33, i32 %b33)
364   store i32 %0, i32* @c, align 4
365   ret void
366 }
367
368 declare i32 @llvm.hexagon.M2.mpy.sat.rnd.ll.s1(i32, i32) #1
369
370 ; CHECK: r{{[0-9]+}}{{ *}}={{ *}}mpy(r{{[0-9]+}}.l{{ *}},{{ *}}r{{[0-9]+}}.h):<<1:rnd:sat
371
372 define void @test34(i32 %a34, i32 %b34) #0 {
373 entry:
374   %0 = tail call i32 @llvm.hexagon.M2.mpy.sat.rnd.lh.s1(i32 %a34, i32 %b34)
375   store i32 %0, i32* @c, align 4
376   ret void
377 }
378
379 declare i32 @llvm.hexagon.M2.mpy.sat.rnd.lh.s1(i32, i32) #1
380
381 ; CHECK: r{{[0-9]+}}{{ *}}={{ *}}mpy(r{{[0-9]+}}.h{{ *}},{{ *}}r{{[0-9]+}}.l):<<1:rnd:sat
382
383 define void @test35(i32 %a35, i32 %b35) #0 {
384 entry:
385   %0 = tail call i32 @llvm.hexagon.M2.mpy.sat.rnd.hl.s1(i32 %a35, i32 %b35)
386   store i32 %0, i32* @c, align 4
387   ret void
388 }
389
390 declare i32 @llvm.hexagon.M2.mpy.sat.rnd.hl.s1(i32, i32) #1
391
392 ; CHECK: r{{[0-9]+}}{{ *}}={{ *}}mpy(r{{[0-9]+}}.h{{ *}},{{ *}}r{{[0-9]+}}.h):<<1:rnd:sat
393
394 define void @test36(i32 %a36, i32 %b36) #0 {
395 entry:
396   %0 = tail call i32 @llvm.hexagon.M2.mpy.sat.rnd.hh.s1(i32 %a36, i32 %b36)
397   store i32 %0, i32* @c, align 4
398   ret void
399 }
400
401 declare i32 @llvm.hexagon.M2.mpy.sat.rnd.hh.s1(i32, i32) #1
402
403 ; CHECK: r{{[0-9]+}}{{ *}}={{ *}}mpyu(r{{[0-9]+}}.l{{ *}},{{ *}}r{{[0-9]+}}.l):<<1
404
405 define void @test37(i32 %a37, i32 %b37) #0 {
406 entry:
407   %0 = tail call i32 @llvm.hexagon.M2.mpyu.ll.s1(i32 %a37, i32 %b37)
408   store i32 %0, i32* @c, align 4
409   ret void
410 }
411
412 declare i32 @llvm.hexagon.M2.mpyu.ll.s1(i32, i32) #1
413
414 ; CHECK: r{{[0-9]+}}{{ *}}={{ *}}mpyu(r{{[0-9]+}}.l{{ *}},{{ *}}r{{[0-9]+}}.h):<<1
415
416 define void @test38(i32 %a38, i32 %b38) #0 {
417 entry:
418   %0 = tail call i32 @llvm.hexagon.M2.mpyu.lh.s1(i32 %a38, i32 %b38)
419   store i32 %0, i32* @c, align 4
420   ret void
421 }
422
423 declare i32 @llvm.hexagon.M2.mpyu.lh.s1(i32, i32) #1
424
425 ; CHECK: r{{[0-9]+}}{{ *}}={{ *}}mpyu(r{{[0-9]+}}.h{{ *}},{{ *}}r{{[0-9]+}}.l):<<1
426
427 define void @test39(i32 %a39, i32 %b39) #0 {
428 entry:
429   %0 = tail call i32 @llvm.hexagon.M2.mpyu.hl.s1(i32 %a39, i32 %b39)
430   store i32 %0, i32* @c, align 4
431   ret void
432 }
433
434 declare i32 @llvm.hexagon.M2.mpyu.hl.s1(i32, i32) #1
435
436 ; CHECK: r{{[0-9]+}}{{ *}}={{ *}}mpyu(r{{[0-9]+}}.h{{ *}},{{ *}}r{{[0-9]+}}.h):<<1
437
438 define void @test40(i32 %a40, i32 %b40) #0 {
439 entry:
440   %0 = tail call i32 @llvm.hexagon.M2.mpyu.hh.s1(i32 %a40, i32 %b40)
441   store i32 %0, i32* @c, align 4
442   ret void
443 }
444
445 declare i32 @llvm.hexagon.M2.mpyu.hh.s1(i32, i32) #1