@@ -15,14 +15,14 @@ define dso_local i32 @mul(i32 %a, i32 %b) local_unnamed_addr #0 {
1515;
1616; RV32IMXQCIAC-LABEL: mul:
1717; RV32IMXQCIAC: # %bb.0: # %entry
18- ; RV32IMXQCIAC-NEXT: li a0, 33
19- ; RV32IMXQCIAC-NEXT: mul a0, a1, a0
18+ ; RV32IMXQCIAC-NEXT: slli a0, a1, 5
19+ ; RV32IMXQCIAC-NEXT: add a0, a0, a1
2020; RV32IMXQCIAC-NEXT: ret
2121;
2222; RV32IZBAMXQCIAC-LABEL: mul:
2323; RV32IZBAMXQCIAC: # %bb.0: # %entry
24- ; RV32IZBAMXQCIAC-NEXT: li a0, 33
25- ; RV32IZBAMXQCIAC-NEXT: mul a0, a1, a0
24+ ; RV32IZBAMXQCIAC-NEXT: slli a0, a1, 5
25+ ; RV32IZBAMXQCIAC-NEXT: add a0, a0, a1
2626; RV32IZBAMXQCIAC-NEXT: ret
2727entry:
2828 %mul = mul nsw i32 %b , 33
@@ -52,6 +52,29 @@ entry:
5252 ret i32 %add
5353}
5454
55+ define dso_local i32 @muliadd2 (i32 %a , i32 %b ) local_unnamed_addr #0 {
56+ ; RV32IM-LABEL: muliadd2:
57+ ; RV32IM: # %bb.0: # %entry
58+ ; RV32IM-NEXT: li a2, 1111
59+ ; RV32IM-NEXT: mul a1, a1, a2
60+ ; RV32IM-NEXT: add a0, a1, a0
61+ ; RV32IM-NEXT: ret
62+ ;
63+ ; RV32IMXQCIAC-LABEL: muliadd2:
64+ ; RV32IMXQCIAC: # %bb.0: # %entry
65+ ; RV32IMXQCIAC-NEXT: qc.muliadd a0, a1, 1111
66+ ; RV32IMXQCIAC-NEXT: ret
67+ ;
68+ ; RV32IZBAMXQCIAC-LABEL: muliadd2:
69+ ; RV32IZBAMXQCIAC: # %bb.0: # %entry
70+ ; RV32IZBAMXQCIAC-NEXT: qc.muliadd a0, a1, 1111
71+ ; RV32IZBAMXQCIAC-NEXT: ret
72+ entry:
73+ %mul = mul nsw i32 %b , 1111
74+ %add = add nsw i32 %mul , %a
75+ ret i32 %add
76+ }
77+
5578define dso_local i32 @muliadd_neg (i32 %a , i32 %b ) local_unnamed_addr #0 {
5679; RV32IM-LABEL: muliadd_neg:
5780; RV32IM: # %bb.0: # %entry
@@ -75,6 +98,29 @@ entry:
7598 ret i32 %add
7699}
77100
101+ define dso_local i32 @muliadd_neg2 (i32 %a , i32 %b ) local_unnamed_addr #0 {
102+ ; RV32IM-LABEL: muliadd_neg2:
103+ ; RV32IM: # %bb.0: # %entry
104+ ; RV32IM-NEXT: li a2, -2045
105+ ; RV32IM-NEXT: mul a1, a1, a2
106+ ; RV32IM-NEXT: add a0, a1, a0
107+ ; RV32IM-NEXT: ret
108+ ;
109+ ; RV32IMXQCIAC-LABEL: muliadd_neg2:
110+ ; RV32IMXQCIAC: # %bb.0: # %entry
111+ ; RV32IMXQCIAC-NEXT: qc.muliadd a0, a1, -2045
112+ ; RV32IMXQCIAC-NEXT: ret
113+ ;
114+ ; RV32IZBAMXQCIAC-LABEL: muliadd_neg2:
115+ ; RV32IZBAMXQCIAC: # %bb.0: # %entry
116+ ; RV32IZBAMXQCIAC-NEXT: qc.muliadd a0, a1, -2045
117+ ; RV32IZBAMXQCIAC-NEXT: ret
118+ entry:
119+ %mul = mul nsw i32 %b , -2045
120+ %add = add nsw i32 %mul , %a
121+ ret i32 %add
122+ }
123+
78124define dso_local i32 @pow2immplus1 (i32 %a , i32 %b ) local_unnamed_addr #0 {
79125; RV32IM-LABEL: pow2immplus1:
80126; RV32IM: # %bb.0: # %entry
@@ -85,19 +131,82 @@ define dso_local i32 @pow2immplus1(i32 %a, i32 %b) local_unnamed_addr #0 {
85131;
86132; RV32IMXQCIAC-LABEL: pow2immplus1:
87133; RV32IMXQCIAC: # %bb.0: # %entry
88- ; RV32IMXQCIAC-NEXT: qc.muliadd a0, a1, 33
134+ ; RV32IMXQCIAC-NEXT: slli a2, a1, 5
135+ ; RV32IMXQCIAC-NEXT: add a0, a0, a1
136+ ; RV32IMXQCIAC-NEXT: add a0, a0, a2
89137; RV32IMXQCIAC-NEXT: ret
90138;
91139; RV32IZBAMXQCIAC-LABEL: pow2immplus1:
92140; RV32IZBAMXQCIAC: # %bb.0: # %entry
93- ; RV32IZBAMXQCIAC-NEXT: qc.muliadd a0, a1, 33
141+ ; RV32IZBAMXQCIAC-NEXT: slli a2, a1, 5
142+ ; RV32IZBAMXQCIAC-NEXT: add a0, a0, a1
143+ ; RV32IZBAMXQCIAC-NEXT: add a0, a0, a2
94144; RV32IZBAMXQCIAC-NEXT: ret
95145entry:
96146 %mul = mul nsw i32 %b , 33
97147 %add = add nsw i32 %mul , %a
98148 ret i32 %add
99149}
100150
151+ define dso_local i32 @pow2immminus2 (i32 %a , i32 %b ) local_unnamed_addr #0 {
152+ ; RV32IM-LABEL: pow2immminus2:
153+ ; RV32IM: # %bb.0: # %entry
154+ ; RV32IM-NEXT: slli a2, a1, 1
155+ ; RV32IM-NEXT: slli a1, a1, 7
156+ ; RV32IM-NEXT: sub a1, a1, a2
157+ ; RV32IM-NEXT: add a0, a1, a0
158+ ; RV32IM-NEXT: ret
159+ ;
160+ ; RV32IMXQCIAC-LABEL: pow2immminus2:
161+ ; RV32IMXQCIAC: # %bb.0: # %entry
162+ ; RV32IMXQCIAC-NEXT: slli a2, a1, 1
163+ ; RV32IMXQCIAC-NEXT: slli a1, a1, 7
164+ ; RV32IMXQCIAC-NEXT: sub a1, a1, a2
165+ ; RV32IMXQCIAC-NEXT: add a0, a0, a1
166+ ; RV32IMXQCIAC-NEXT: ret
167+ ;
168+ ; RV32IZBAMXQCIAC-LABEL: pow2immminus2:
169+ ; RV32IZBAMXQCIAC: # %bb.0: # %entry
170+ ; RV32IZBAMXQCIAC-NEXT: slli a2, a1, 1
171+ ; RV32IZBAMXQCIAC-NEXT: slli a1, a1, 7
172+ ; RV32IZBAMXQCIAC-NEXT: sub a1, a1, a2
173+ ; RV32IZBAMXQCIAC-NEXT: add a0, a0, a1
174+ ; RV32IZBAMXQCIAC-NEXT: ret
175+ entry:
176+ %mul = mul nsw i32 %b , 126
177+ %add = add nsw i32 %mul , %a
178+ ret i32 %add
179+ }
180+
181+ define dso_local i32 @pow2minuspow2 (i32 %a , i32 %b ) local_unnamed_addr #0 {
182+ ; RV32IM-LABEL: pow2minuspow2:
183+ ; RV32IM: # %bb.0: # %entry
184+ ; RV32IM-NEXT: slli a2, a1, 7
185+ ; RV32IM-NEXT: slli a1, a1, 9
186+ ; RV32IM-NEXT: sub a1, a1, a2
187+ ; RV32IM-NEXT: add a0, a1, a0
188+ ; RV32IM-NEXT: ret
189+ ;
190+ ; RV32IMXQCIAC-LABEL: pow2minuspow2:
191+ ; RV32IMXQCIAC: # %bb.0: # %entry
192+ ; RV32IMXQCIAC-NEXT: slli a2, a1, 7
193+ ; RV32IMXQCIAC-NEXT: slli a1, a1, 9
194+ ; RV32IMXQCIAC-NEXT: sub a1, a1, a2
195+ ; RV32IMXQCIAC-NEXT: add a0, a0, a1
196+ ; RV32IMXQCIAC-NEXT: ret
197+ ;
198+ ; RV32IZBAMXQCIAC-LABEL: pow2minuspow2:
199+ ; RV32IZBAMXQCIAC: # %bb.0: # %entry
200+ ; RV32IZBAMXQCIAC-NEXT: sh1add a1, a1, a1
201+ ; RV32IZBAMXQCIAC-NEXT: slli a1, a1, 7
202+ ; RV32IZBAMXQCIAC-NEXT: add a0, a0, a1
203+ ; RV32IZBAMXQCIAC-NEXT: ret
204+ entry:
205+ %mul = mul nsw i32 %b , 384
206+ %add = add nsw i32 %mul , %a
207+ ret i32 %add
208+ }
209+
101210define dso_local i32 @gtsimm12 (i32 %a , i32 %b ) local_unnamed_addr #0 {
102211; RV32IM-LABEL: gtsimm12:
103212; RV32IM: # %bb.0: # %entry
0 commit comments