[RISCV] Add shrinkwrap test cases showing gaps in current impl
[llvm-project.git] / llvm / test / CodeGen / Hexagon / mul64-sext.ll
blobb615c0a5962943dfcb1ffaafc1f488d7a8ff74d4
1 ; RUN: llc -march=hexagon < %s | FileCheck %s
3 target triple = "hexagon-unknown--elf"
5 ; CHECK-LABEL: mul_1
6 ; CHECK: r1:0 = mpy(r2,r0)
7 define i64 @mul_1(i64 %a0, i64 %a1) #0 {
8 b2:
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
17 ; CHECK-LABEL: mul_2
18 ; CHECK: r0 = memb(r0+#0)
19 ; CHECK: r1:0 = mpy(r2,r0)
20 ; CHECK: jumpr r31
21 define i64 @mul_2(ptr %a0, i64 %a1) #0 {
22 b2:
23   %v3 = load i8, ptr %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
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
35 define i64 @mul_3(i64 %a0, i64 %a1) #0 {
36 b2:
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
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
49 define i64 @mul_4(i64 %a0, i64 %a1) #0 {
50 b2:
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
59 ; CHECK-LABEL: mul_acc_1
60 ; CHECK: r5:4 += mpy(r2,r0)
61 ; CHECK: r1:0 = combine(r5,r4)
62 ; CHECK: jumpr r31
63 define i64 @mul_acc_1(i64 %a0, i64 %a1, i64 %a2) #0 {
64 b3:
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
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
79 define i64 @mul_acc_2(i64 %a0, ptr %a1, i64 %a2) #0 {
80 b3:
81   %v4 = shl i64 %a0, 32
82   %v5 = ashr exact i64 %v4, 32
83   %v6 = load i32, ptr %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
90 ; CHECK-LABEL: mul_nac_1
91 ; CHECK: r5:4 -= mpy(r2,r0)
92 ; CHECK: r1:0 = combine(r5,r4)
93 ; CHECK: jumpr r31
94 define i64 @mul_nac_1(i64 %a0, i64 %a1, i64 %a2) #0 {
95 b3:
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
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
110 define i64 @mul_nac_2(ptr %a0, i64 %a1, i64 %a2) #0 {
112   %v4 = load i32, ptr %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
121 attributes #0 = { nounwind }