1 ; RUN: llc -march=hexagon -mcpu=hexagonv5 < %s | FileCheck %s
3 ; Verify that the mpy intrinsics are lowered into the right instructions.
5 @c = external global i32
7 ; CHECK: r{{[0-9]+}}{{ *}}={{ *}}mpy(r{{[0-9]+}}.l{{ *}},{{ *}}r{{[0-9]+}}.l)
9 define void @test1(i32 %a1, i32 %b1) #0 {
11 %0 = tail call i32 @llvm.hexagon.M2.mpy.ll.s0(i32 %a1, i32 %b1)
12 store i32 %0, i32* @c, align 4
16 declare i32 @llvm.hexagon.M2.mpy.ll.s0(i32, i32) #1
18 ; CHECK: r{{[0-9]+}}{{ *}}={{ *}}mpy(r{{[0-9]+}}.l{{ *}},{{ *}}r{{[0-9]+}}.h)
20 define void @test2(i32 %a2, i32 %b2) #0 {
22 %0 = tail call i32 @llvm.hexagon.M2.mpy.lh.s0(i32 %a2, i32 %b2)
23 store i32 %0, i32* @c, align 4
27 declare i32 @llvm.hexagon.M2.mpy.lh.s0(i32, i32) #1
29 ; CHECK: r{{[0-9]+}}{{ *}}={{ *}}mpy(r{{[0-9]+}}.h{{ *}},{{ *}}r{{[0-9]+}}.l)
31 define void @test3(i32 %a3, i32 %b3) #0 {
33 %0 = tail call i32 @llvm.hexagon.M2.mpy.hl.s0(i32 %a3, i32 %b3)
34 store i32 %0, i32* @c, align 4
38 declare i32 @llvm.hexagon.M2.mpy.hl.s0(i32, i32) #1
40 ; CHECK: r{{[0-9]+}}{{ *}}={{ *}}mpy(r{{[0-9]+}}.h{{ *}},{{ *}}r{{[0-9]+}}.h)
42 define void @test4(i32 %a4, i32 %b4) #0 {
44 %0 = tail call i32 @llvm.hexagon.M2.mpy.hh.s0(i32 %a4, i32 %b4)
45 store i32 %0, i32* @c, align 4
49 declare i32 @llvm.hexagon.M2.mpy.hh.s0(i32, i32) #1
51 ; CHECK: r{{[0-9]+}}{{ *}}={{ *}}mpy(r{{[0-9]+}}.l{{ *}},{{ *}}r{{[0-9]+}}.l):sat
53 define void @test5(i32 %a5, i32 %b5) #0 {
55 %0 = tail call i32 @llvm.hexagon.M2.mpy.sat.ll.s0(i32 %a5, i32 %b5)
56 store i32 %0, i32* @c, align 4
60 declare i32 @llvm.hexagon.M2.mpy.sat.ll.s0(i32, i32) #1
62 ; CHECK: r{{[0-9]+}}{{ *}}={{ *}}mpy(r{{[0-9]+}}.l{{ *}},{{ *}}r{{[0-9]+}}.h):sat
64 define void @test6(i32 %a6, i32 %b6) #0 {
66 %0 = tail call i32 @llvm.hexagon.M2.mpy.sat.lh.s0(i32 %a6, i32 %b6)
67 store i32 %0, i32* @c, align 4
71 declare i32 @llvm.hexagon.M2.mpy.sat.lh.s0(i32, i32) #1
73 ; CHECK: r{{[0-9]+}}{{ *}}={{ *}}mpy(r{{[0-9]+}}.h{{ *}},{{ *}}r{{[0-9]+}}.l):sat
75 define void @test7(i32 %a7, i32 %b7) #0 {
77 %0 = tail call i32 @llvm.hexagon.M2.mpy.sat.hl.s0(i32 %a7, i32 %b7)
78 store i32 %0, i32* @c, align 4
82 declare i32 @llvm.hexagon.M2.mpy.sat.hl.s0(i32, i32) #1
84 ; CHECK: r{{[0-9]+}}{{ *}}={{ *}}mpy(r{{[0-9]+}}.h{{ *}},{{ *}}r{{[0-9]+}}.h):sat
86 define void @test8(i32 %a8, i32 %b8) #0 {
88 %0 = tail call i32 @llvm.hexagon.M2.mpy.sat.hh.s0(i32 %a8, i32 %b8)
89 store i32 %0, i32* @c, align 4
93 declare i32 @llvm.hexagon.M2.mpy.sat.hh.s0(i32, i32) #1
95 ; CHECK: r{{[0-9]+}}{{ *}}={{ *}}mpy(r{{[0-9]+}}.l{{ *}},{{ *}}r{{[0-9]+}}.l):rnd
97 define void @test9(i32 %a9, i32 %b9) #0 {
99 %0 = tail call i32 @llvm.hexagon.M2.mpy.rnd.ll.s0(i32 %a9, i32 %b9)
100 store i32 %0, i32* @c, align 4
104 declare i32 @llvm.hexagon.M2.mpy.rnd.ll.s0(i32, i32) #1
106 ; CHECK: r{{[0-9]+}}{{ *}}={{ *}}mpy(r{{[0-9]+}}.l{{ *}},{{ *}}r{{[0-9]+}}.h):rnd
108 define void @test10(i32 %a10, i32 %b10) #0 {
110 %0 = tail call i32 @llvm.hexagon.M2.mpy.rnd.lh.s0(i32 %a10, i32 %b10)
111 store i32 %0, i32* @c, align 4
115 declare i32 @llvm.hexagon.M2.mpy.rnd.lh.s0(i32, i32) #1
117 ; CHECK: r{{[0-9]+}}{{ *}}={{ *}}mpy(r{{[0-9]+}}.h{{ *}},{{ *}}r{{[0-9]+}}.l):rnd
119 define void @test11(i32 %a11, i32 %b11) #0 {
121 %0 = tail call i32 @llvm.hexagon.M2.mpy.rnd.hl.s0(i32 %a11, i32 %b11)
122 store i32 %0, i32* @c, align 4
126 declare i32 @llvm.hexagon.M2.mpy.rnd.hl.s0(i32, i32) #1
128 ; CHECK: r{{[0-9]+}}{{ *}}={{ *}}mpy(r{{[0-9]+}}.h{{ *}},{{ *}}r{{[0-9]+}}.h):rnd
130 define void @test12(i32 %a12, i32 %b12) #0 {
132 %0 = tail call i32 @llvm.hexagon.M2.mpy.rnd.hh.s0(i32 %a12, i32 %b12)
133 store i32 %0, i32* @c, align 4
137 declare i32 @llvm.hexagon.M2.mpy.rnd.hh.s0(i32, i32) #1
139 ; CHECK: r{{[0-9]+}}{{ *}}={{ *}}mpy(r{{[0-9]+}}.l{{ *}},{{ *}}r{{[0-9]+}}.l):rnd:sat
141 define void @test13(i32 %a13, i32 %b13) #0 {
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
148 declare i32 @llvm.hexagon.M2.mpy.sat.rnd.ll.s0(i32, i32) #1
150 ; CHECK: r{{[0-9]+}}{{ *}}={{ *}}mpy(r{{[0-9]+}}.l{{ *}},{{ *}}r{{[0-9]+}}.h):rnd:sat
152 define void @test14(i32 %a14, i32 %b14) #0 {
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
159 declare i32 @llvm.hexagon.M2.mpy.sat.rnd.lh.s0(i32, i32) #1
161 ; CHECK: r{{[0-9]+}}{{ *}}={{ *}}mpy(r{{[0-9]+}}.h{{ *}},{{ *}}r{{[0-9]+}}.l):rnd:sat
163 define void @test15(i32 %a15, i32 %b15) #0 {
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
170 declare i32 @llvm.hexagon.M2.mpy.sat.rnd.hl.s0(i32, i32) #1
172 ; CHECK: r{{[0-9]+}}{{ *}}={{ *}}mpy(r{{[0-9]+}}.h{{ *}},{{ *}}r{{[0-9]+}}.h):rnd:sat
174 define void @test16(i32 %a16, i32 %b16) #0 {
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
181 declare i32 @llvm.hexagon.M2.mpy.sat.rnd.hh.s0(i32, i32) #1
183 ; CHECK: r{{[0-9]+}}{{ *}}={{ *}}mpyu(r{{[0-9]+}}.l{{ *}},{{ *}}r{{[0-9]+}}.l)
185 define void @test17(i32 %a17, i32 %b17) #0 {
187 %0 = tail call i32 @llvm.hexagon.M2.mpyu.ll.s0(i32 %a17, i32 %b17)
188 store i32 %0, i32* @c, align 4
192 declare i32 @llvm.hexagon.M2.mpyu.ll.s0(i32, i32) #1
194 ; CHECK: r{{[0-9]+}}{{ *}}={{ *}}mpyu(r{{[0-9]+}}.l{{ *}},{{ *}}r{{[0-9]+}}.h)
196 define void @test18(i32 %a18, i32 %b18) #0 {
198 %0 = tail call i32 @llvm.hexagon.M2.mpyu.lh.s0(i32 %a18, i32 %b18)
199 store i32 %0, i32* @c, align 4
203 declare i32 @llvm.hexagon.M2.mpyu.lh.s0(i32, i32) #1
205 ; CHECK: r{{[0-9]+}}{{ *}}={{ *}}mpyu(r{{[0-9]+}}.h{{ *}},{{ *}}r{{[0-9]+}}.l)
207 define void @test19(i32 %a19, i32 %b19) #0 {
209 %0 = tail call i32 @llvm.hexagon.M2.mpyu.hl.s0(i32 %a19, i32 %b19)
210 store i32 %0, i32* @c, align 4
214 declare i32 @llvm.hexagon.M2.mpyu.hl.s0(i32, i32) #1
216 ; CHECK: r{{[0-9]+}}{{ *}}={{ *}}mpyu(r{{[0-9]+}}.h{{ *}},{{ *}}r{{[0-9]+}}.h)
218 define void @test20(i32 %a20, i32 %b20) #0 {
220 %0 = tail call i32 @llvm.hexagon.M2.mpyu.hh.s0(i32 %a20, i32 %b20)
221 store i32 %0, i32* @c, align 4
225 declare i32 @llvm.hexagon.M2.mpyu.hh.s0(i32, i32) #1
227 ; CHECK: r{{[0-9]+}}{{ *}}={{ *}}mpy(r{{[0-9]+}}.l{{ *}},{{ *}}r{{[0-9]+}}.l):<<1
229 define void @test21(i32 %a21, i32 %b21) #0 {
231 %0 = tail call i32 @llvm.hexagon.M2.mpy.ll.s1(i32 %a21, i32 %b21)
232 store i32 %0, i32* @c, align 4
236 declare i32 @llvm.hexagon.M2.mpy.ll.s1(i32, i32) #1
238 ; CHECK: r{{[0-9]+}}{{ *}}={{ *}}mpy(r{{[0-9]+}}.l{{ *}},{{ *}}r{{[0-9]+}}.h):<<1
240 define void @test22(i32 %a22, i32 %b22) #0 {
242 %0 = tail call i32 @llvm.hexagon.M2.mpy.lh.s1(i32 %a22, i32 %b22)
243 store i32 %0, i32* @c, align 4
247 declare i32 @llvm.hexagon.M2.mpy.lh.s1(i32, i32) #1
249 ; CHECK: r{{[0-9]+}}{{ *}}={{ *}}mpy(r{{[0-9]+}}.h{{ *}},{{ *}}r{{[0-9]+}}.l):<<1
251 define void @test23(i32 %a23, i32 %b23) #0 {
253 %0 = tail call i32 @llvm.hexagon.M2.mpy.hl.s1(i32 %a23, i32 %b23)
254 store i32 %0, i32* @c, align 4
258 declare i32 @llvm.hexagon.M2.mpy.hl.s1(i32, i32) #1
260 ; CHECK: r{{[0-9]+}}{{ *}}={{ *}}mpy(r{{[0-9]+}}.h{{ *}},{{ *}}r{{[0-9]+}}.h):<<1
262 define void @test24(i32 %a24, i32 %b24) #0 {
264 %0 = tail call i32 @llvm.hexagon.M2.mpy.hh.s1(i32 %a24, i32 %b24)
265 store i32 %0, i32* @c, align 4
269 declare i32 @llvm.hexagon.M2.mpy.hh.s1(i32, i32) #1
271 ; CHECK: r{{[0-9]+}}{{ *}}={{ *}}mpy(r{{[0-9]+}}.l{{ *}},{{ *}}r{{[0-9]+}}.l):<<1:sat
273 define void @test25(i32 %a25, i32 %b25) #0 {
275 %0 = tail call i32 @llvm.hexagon.M2.mpy.sat.ll.s1(i32 %a25, i32 %b25)
276 store i32 %0, i32* @c, align 4
280 declare i32 @llvm.hexagon.M2.mpy.sat.ll.s1(i32, i32) #1
282 ; CHECK: r{{[0-9]+}}{{ *}}={{ *}}mpy(r{{[0-9]+}}.l{{ *}},{{ *}}r{{[0-9]+}}.h):<<1:sat
284 define void @test26(i32 %a26, i32 %b26) #0 {
286 %0 = tail call i32 @llvm.hexagon.M2.mpy.sat.lh.s1(i32 %a26, i32 %b26)
287 store i32 %0, i32* @c, align 4
291 declare i32 @llvm.hexagon.M2.mpy.sat.lh.s1(i32, i32) #1
293 ; CHECK: r{{[0-9]+}}{{ *}}={{ *}}mpy(r{{[0-9]+}}.h{{ *}},{{ *}}r{{[0-9]+}}.l):<<1:sat
295 define void @test27(i32 %a27, i32 %b27) #0 {
297 %0 = tail call i32 @llvm.hexagon.M2.mpy.sat.hl.s1(i32 %a27, i32 %b27)
298 store i32 %0, i32* @c, align 4
302 declare i32 @llvm.hexagon.M2.mpy.sat.hl.s1(i32, i32) #1
304 ; CHECK: r{{[0-9]+}}{{ *}}={{ *}}mpy(r{{[0-9]+}}.h{{ *}},{{ *}}r{{[0-9]+}}.h):<<1:sat
306 define void @test28(i32 %a28, i32 %b28) #0 {
308 %0 = tail call i32 @llvm.hexagon.M2.mpy.sat.hh.s1(i32 %a28, i32 %b28)
309 store i32 %0, i32* @c, align 4
313 declare i32 @llvm.hexagon.M2.mpy.sat.hh.s1(i32, i32) #1
315 ; CHECK: r{{[0-9]+}}{{ *}}={{ *}}mpy(r{{[0-9]+}}.l{{ *}},{{ *}}r{{[0-9]+}}.l):<<1:rnd
317 define void @test29(i32 %a29, i32 %b29) #0 {
319 %0 = tail call i32 @llvm.hexagon.M2.mpy.rnd.ll.s1(i32 %a29, i32 %b29)
320 store i32 %0, i32* @c, align 4
324 declare i32 @llvm.hexagon.M2.mpy.rnd.ll.s1(i32, i32) #1
326 ; CHECK: r{{[0-9]+}}{{ *}}={{ *}}mpy(r{{[0-9]+}}.l{{ *}},{{ *}}r{{[0-9]+}}.h):<<1:rnd
328 define void @test30(i32 %a30, i32 %b30) #0 {
330 %0 = tail call i32 @llvm.hexagon.M2.mpy.rnd.lh.s1(i32 %a30, i32 %b30)
331 store i32 %0, i32* @c, align 4
335 declare i32 @llvm.hexagon.M2.mpy.rnd.lh.s1(i32, i32) #1
337 ; CHECK: r{{[0-9]+}}{{ *}}={{ *}}mpy(r{{[0-9]+}}.h{{ *}},{{ *}}r{{[0-9]+}}.l):<<1:rnd
339 define void @test31(i32 %a31, i32 %b31) #0 {
341 %0 = tail call i32 @llvm.hexagon.M2.mpy.rnd.hl.s1(i32 %a31, i32 %b31)
342 store i32 %0, i32* @c, align 4
346 declare i32 @llvm.hexagon.M2.mpy.rnd.hl.s1(i32, i32) #1
348 ; CHECK: r{{[0-9]+}}{{ *}}={{ *}}mpy(r{{[0-9]+}}.h{{ *}},{{ *}}r{{[0-9]+}}.h):<<1:rnd
350 define void @test32(i32 %a32, i32 %b32) #0 {
352 %0 = tail call i32 @llvm.hexagon.M2.mpy.rnd.hh.s1(i32 %a32, i32 %b32)
353 store i32 %0, i32* @c, align 4
357 declare i32 @llvm.hexagon.M2.mpy.rnd.hh.s1(i32, i32) #1
359 ; CHECK: r{{[0-9]+}}{{ *}}={{ *}}mpy(r{{[0-9]+}}.l{{ *}},{{ *}}r{{[0-9]+}}.l):<<1:rnd:sat
361 define void @test33(i32 %a33, i32 %b33) #0 {
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
368 declare i32 @llvm.hexagon.M2.mpy.sat.rnd.ll.s1(i32, i32) #1
370 ; CHECK: r{{[0-9]+}}{{ *}}={{ *}}mpy(r{{[0-9]+}}.l{{ *}},{{ *}}r{{[0-9]+}}.h):<<1:rnd:sat
372 define void @test34(i32 %a34, i32 %b34) #0 {
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
379 declare i32 @llvm.hexagon.M2.mpy.sat.rnd.lh.s1(i32, i32) #1
381 ; CHECK: r{{[0-9]+}}{{ *}}={{ *}}mpy(r{{[0-9]+}}.h{{ *}},{{ *}}r{{[0-9]+}}.l):<<1:rnd:sat
383 define void @test35(i32 %a35, i32 %b35) #0 {
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
390 declare i32 @llvm.hexagon.M2.mpy.sat.rnd.hl.s1(i32, i32) #1
392 ; CHECK: r{{[0-9]+}}{{ *}}={{ *}}mpy(r{{[0-9]+}}.h{{ *}},{{ *}}r{{[0-9]+}}.h):<<1:rnd:sat
394 define void @test36(i32 %a36, i32 %b36) #0 {
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
401 declare i32 @llvm.hexagon.M2.mpy.sat.rnd.hh.s1(i32, i32) #1
403 ; CHECK: r{{[0-9]+}}{{ *}}={{ *}}mpyu(r{{[0-9]+}}.l{{ *}},{{ *}}r{{[0-9]+}}.l):<<1
405 define void @test37(i32 %a37, i32 %b37) #0 {
407 %0 = tail call i32 @llvm.hexagon.M2.mpyu.ll.s1(i32 %a37, i32 %b37)
408 store i32 %0, i32* @c, align 4
412 declare i32 @llvm.hexagon.M2.mpyu.ll.s1(i32, i32) #1
414 ; CHECK: r{{[0-9]+}}{{ *}}={{ *}}mpyu(r{{[0-9]+}}.l{{ *}},{{ *}}r{{[0-9]+}}.h):<<1
416 define void @test38(i32 %a38, i32 %b38) #0 {
418 %0 = tail call i32 @llvm.hexagon.M2.mpyu.lh.s1(i32 %a38, i32 %b38)
419 store i32 %0, i32* @c, align 4
423 declare i32 @llvm.hexagon.M2.mpyu.lh.s1(i32, i32) #1
425 ; CHECK: r{{[0-9]+}}{{ *}}={{ *}}mpyu(r{{[0-9]+}}.h{{ *}},{{ *}}r{{[0-9]+}}.l):<<1
427 define void @test39(i32 %a39, i32 %b39) #0 {
429 %0 = tail call i32 @llvm.hexagon.M2.mpyu.hl.s1(i32 %a39, i32 %b39)
430 store i32 %0, i32* @c, align 4
434 declare i32 @llvm.hexagon.M2.mpyu.hl.s1(i32, i32) #1
436 ; CHECK: r{{[0-9]+}}{{ *}}={{ *}}mpyu(r{{[0-9]+}}.h{{ *}},{{ *}}r{{[0-9]+}}.h):<<1
438 define void @test40(i32 %a40, i32 %b40) #0 {
440 %0 = tail call i32 @llvm.hexagon.M2.mpyu.hh.s1(i32 %a40, i32 %b40)
441 store i32 %0, i32* @c, align 4
445 declare i32 @llvm.hexagon.M2.mpyu.hh.s1(i32, i32) #1