1; RUN: llc -march=hexagon < %s | FileCheck %s
2
3target triple = "hexagon-unknown--elf"
4
5; CHECK-LABEL: mul_1
6; CHECK: r1:0 = mpy(r2,r0)
7define i64 @mul_1(i64 %a0, i64 %a1) #0 {
8b2:
9  %v3 = shl i64 %a0, 32
10  %v4 = ashr exact i64 %v3, 32
11  %v5 = shl i64 %a1, 32
12  %v6 = ashr exact i64 %v5, 32
13  %v7 = mul nsw i64 %v6, %v4
14  ret i64 %v7
15}
16
17; CHECK-LABEL: mul_2
18; CHECK: r0 = memb(r0+#0)
19; CHECK: r1:0 = mpy(r2,r0)
20; CHECK: jumpr r31
21define i64 @mul_2(i8* %a0, i64 %a1) #0 {
22b2:
23  %v3 = load i8, i8* %a0
24  %v4 = sext i8 %v3 to i64
25  %v5 = shl i64 %a1, 32
26  %v6 = ashr exact i64 %v5, 32
27  %v7 = mul nsw i64 %v6, %v4
28  ret i64 %v7
29}
30
31; CHECK-LABEL: mul_3
32; CHECK: r[[REG30:[0-9]+]] = sxth(r2)
33; CHECK: r1:0 = mpy(r[[REG30]],r0)
34; CHECK: jumpr r31
35define i64 @mul_3(i64 %a0, i64 %a1) #0 {
36b2:
37  %v3 = shl i64 %a0, 32
38  %v4 = ashr exact i64 %v3, 32
39  %v5 = shl i64 %a1, 48
40  %v6 = ashr exact i64 %v5, 48
41  %v7 = mul nsw i64 %v6, %v4
42  ret i64 %v7
43}
44
45; CHECK-LABEL: mul_4
46; CHECK: r[[REG40:[0-9]+]] = asrh(r2)
47; CHECK: r1:0 = mpy(r1,r[[REG40]])
48; CHECK: jumpr r31
49define i64 @mul_4(i64 %a0, i64 %a1) #0 {
50b2:
51  %v3 = ashr i64 %a0, 32
52  %v4 = trunc i64 %a1 to i32
53  %v5 = ashr i32 %v4, 16
54  %v6 = sext i32 %v5 to i64
55  %v7 = mul nsw i64 %v3, %v6
56  ret i64 %v7
57}
58
59; CHECK-LABEL: mul_acc_1
60; CHECK: r5:4 += mpy(r2,r0)
61; CHECK: r1:0 = combine(r5,r4)
62; CHECK: jumpr r31
63define i64 @mul_acc_1(i64 %a0, i64 %a1, i64 %a2) #0 {
64b3:
65  %v4 = shl i64 %a0, 32
66  %v5 = ashr exact i64 %v4, 32
67  %v6 = shl i64 %a1, 32
68  %v7 = ashr exact i64 %v6, 32
69  %v8 = mul nsw i64 %v7, %v5
70  %v9 = add i64 %a2, %v8
71  ret i64 %v9
72}
73
74; CHECK-LABEL: mul_acc_2
75; CHECK: r2 = memw(r2+#0)
76; CHECK: r5:4 += mpy(r2,r0)
77; CHECK: r1:0 = combine(r5,r4)
78; CHECK: jumpr r31
79define i64 @mul_acc_2(i64 %a0, i32* %a1, i64 %a2) #0 {
80b3:
81  %v4 = shl i64 %a0, 32
82  %v5 = ashr exact i64 %v4, 32
83  %v6 = load i32, i32* %a1
84  %v7 = sext i32 %v6 to i64
85  %v8 = mul nsw i64 %v7, %v5
86  %v9 = add i64 %a2, %v8
87  ret i64 %v9
88}
89
90; CHECK-LABEL: mul_nac_1
91; CHECK: r5:4 -= mpy(r2,r0)
92; CHECK: r1:0 = combine(r5,r4)
93; CHECK: jumpr r31
94define i64 @mul_nac_1(i64 %a0, i64 %a1, i64 %a2) #0 {
95b3:
96  %v4 = shl i64 %a0, 32
97  %v5 = ashr exact i64 %v4, 32
98  %v6 = shl i64 %a1, 32
99  %v7 = ashr exact i64 %v6, 32
100  %v8 = mul nsw i64 %v7, %v5
101  %v9 = sub i64 %a2, %v8
102  ret i64 %v9
103}
104
105; CHECK-LABEL: mul_nac_2
106; CHECK: r1:0 = combine(r5,r4)
107; CHECK: r6 = memw(r0+#0)
108; CHECK: r1:0 -= mpy(r2,r6)
109; CHECK: jumpr r31
110define i64 @mul_nac_2(i32* %a0, i64 %a1, i64 %a2) #0 {
111b3:
112  %v4 = load i32, i32* %a0
113  %v5 = sext i32 %v4 to i64
114  %v6 = shl i64 %a1, 32
115  %v7 = ashr exact i64 %v6, 32
116  %v8 = mul nsw i64 %v7, %v5
117  %v9 = sub i64 %a2, %v8
118  ret i64 %v9
119}
120
121attributes #0 = { nounwind }
122