@@ -128,19 +128,16 @@ entry:
128
128
ret i64 %zext
129
129
}
130
130
131
- ;; Check that alsl.w or alsl.d is not emitted.
132
131
define i8 @mul_add_i8 (i8 signext %a , i8 signext %b ) nounwind {
133
132
; LA32-LABEL: mul_add_i8:
134
133
; LA32: # %bb.0: # %entry
135
- ; LA32-NEXT: ori $a2, $zero, 3
136
- ; LA32-NEXT: mul.w $a0, $a0, $a2
134
+ ; LA32-NEXT: alsl.w $a0, $a0, $a0, 1
137
135
; LA32-NEXT: add.w $a0, $a1, $a0
138
136
; LA32-NEXT: ret
139
137
;
140
138
; LA64-LABEL: mul_add_i8:
141
139
; LA64: # %bb.0: # %entry
142
- ; LA64-NEXT: ori $a2, $zero, 3
143
- ; LA64-NEXT: mul.d $a0, $a0, $a2
140
+ ; LA64-NEXT: alsl.d $a0, $a0, $a0, 1
144
141
; LA64-NEXT: add.d $a0, $a1, $a0
145
142
; LA64-NEXT: ret
146
143
entry:
@@ -192,21 +189,23 @@ entry:
192
189
define i64 @mul_add_i64 (i64 signext %a , i64 signext %b ) nounwind {
193
190
; LA32-LABEL: mul_add_i64:
194
191
; LA32: # %bb.0: # %entry
192
+ ; LA32-NEXT: slli.w $a4, $a1, 4
193
+ ; LA32-NEXT: sub.w $a1, $a4, $a1
195
194
; LA32-NEXT: ori $a4, $zero, 15
196
- ; LA32-NEXT: mul.w $a1, $a1, $a4
197
- ; LA32-NEXT: mulh.wu $a5, $a0, $a4
198
- ; LA32-NEXT: add.w $a1, $a5, $a1
195
+ ; LA32-NEXT: mulh.wu $a4, $a0, $a4
196
+ ; LA32-NEXT: add.w $a1, $a4, $a1
199
197
; LA32-NEXT: add.w $a1, $a3, $a1
200
- ; LA32-NEXT: mul.w $a0, $a0, $a4
198
+ ; LA32-NEXT: slli.w $a3, $a0, 4
199
+ ; LA32-NEXT: sub.w $a0, $a3, $a0
201
200
; LA32-NEXT: add.w $a0, $a2, $a0
202
201
; LA32-NEXT: sltu $a2, $a0, $a2
203
202
; LA32-NEXT: add.w $a1, $a1, $a2
204
203
; LA32-NEXT: ret
205
204
;
206
205
; LA64-LABEL: mul_add_i64:
207
206
; LA64: # %bb.0: # %entry
208
- ; LA64-NEXT: ori $a2, $zero, 15
209
- ; LA64-NEXT: mul .d $a0, $a0 , $a2
207
+ ; LA64-NEXT: slli.d $a2, $a0, 4
208
+ ; LA64-NEXT: sub .d $a0, $a2 , $a0
210
209
; LA64-NEXT: add.d $a0, $a1, $a0
211
210
; LA64-NEXT: ret
212
211
entry:
@@ -218,16 +217,14 @@ entry:
218
217
define i32 @mul_add_zext_i8 (i8 signext %a , i8 signext %b ) nounwind {
219
218
; LA32-LABEL: mul_add_zext_i8:
220
219
; LA32: # %bb.0: # %entry
221
- ; LA32-NEXT: ori $a2, $zero, 5
222
- ; LA32-NEXT: mul.w $a0, $a0, $a2
220
+ ; LA32-NEXT: alsl.w $a0, $a0, $a0, 2
223
221
; LA32-NEXT: add.w $a0, $a1, $a0
224
222
; LA32-NEXT: andi $a0, $a0, 255
225
223
; LA32-NEXT: ret
226
224
;
227
225
; LA64-LABEL: mul_add_zext_i8:
228
226
; LA64: # %bb.0: # %entry
229
- ; LA64-NEXT: ori $a2, $zero, 5
230
- ; LA64-NEXT: mul.d $a0, $a0, $a2
227
+ ; LA64-NEXT: alsl.d $a0, $a0, $a0, 2
231
228
; LA64-NEXT: add.d $a0, $a1, $a0
232
229
; LA64-NEXT: andi $a0, $a0, 255
233
230
; LA64-NEXT: ret
@@ -241,16 +238,16 @@ entry:
241
238
define i32 @mul_add_zext_i16 (i16 signext %a , i16 signext %b ) nounwind {
242
239
; LA32-LABEL: mul_add_zext_i16:
243
240
; LA32: # %bb.0: # %entry
244
- ; LA32-NEXT: ori $a2, $zero, 15
245
- ; LA32-NEXT: mul .w $a0, $a0 , $a2
241
+ ; LA32-NEXT: slli.w $a2, $a0, 4
242
+ ; LA32-NEXT: sub .w $a0, $a2 , $a0
246
243
; LA32-NEXT: add.w $a0, $a1, $a0
247
244
; LA32-NEXT: bstrpick.w $a0, $a0, 15, 0
248
245
; LA32-NEXT: ret
249
246
;
250
247
; LA64-LABEL: mul_add_zext_i16:
251
248
; LA64: # %bb.0: # %entry
252
- ; LA64-NEXT: ori $a2, $zero, 15
253
- ; LA64-NEXT: mul .d $a0, $a0 , $a2
249
+ ; LA64-NEXT: slli.d $a2, $a0, 4
250
+ ; LA64-NEXT: sub .d $a0, $a2 , $a0
254
251
; LA64-NEXT: add.d $a0, $a1, $a0
255
252
; LA64-NEXT: bstrpick.d $a0, $a0, 15, 0
256
253
; LA64-NEXT: ret
@@ -261,20 +258,17 @@ entry:
261
258
ret i32 %zext
262
259
}
263
260
264
- ;; Check that alsl.wu is not emitted.
265
261
define i64 @mul_add_zext_i32 (i32 signext %a , i32 signext %b ) nounwind {
266
262
; LA32-LABEL: mul_add_zext_i32:
267
263
; LA32: # %bb.0: # %entry
268
- ; LA32-NEXT: ori $a2, $zero, 5
269
- ; LA32-NEXT: mul.w $a0, $a0, $a2
264
+ ; LA32-NEXT: alsl.w $a0, $a0, $a0, 2
270
265
; LA32-NEXT: add.w $a0, $a1, $a0
271
266
; LA32-NEXT: move $a1, $zero
272
267
; LA32-NEXT: ret
273
268
;
274
269
; LA64-LABEL: mul_add_zext_i32:
275
270
; LA64: # %bb.0: # %entry
276
- ; LA64-NEXT: ori $a2, $zero, 5
277
- ; LA64-NEXT: mul.d $a0, $a0, $a2
271
+ ; LA64-NEXT: alsl.d $a0, $a0, $a0, 2
278
272
; LA64-NEXT: add.d $a0, $a1, $a0
279
273
; LA64-NEXT: bstrpick.d $a0, $a0, 31, 0
280
274
; LA64-NEXT: ret
@@ -284,3 +278,86 @@ entry:
284
278
%zext = zext i32 %add to i64
285
279
ret i64 %zext
286
280
}
281
+
282
+ define i8 @alsl_neg_i8 (i8 signext %a , i8 signext %b ) nounwind {
283
+ ; LA32-LABEL: alsl_neg_i8:
284
+ ; LA32: # %bb.0: # %entry
285
+ ; LA32-NEXT: alsl.w $a0, $a0, $a0, 1
286
+ ; LA32-NEXT: sub.w $a0, $a1, $a0
287
+ ; LA32-NEXT: ret
288
+ ;
289
+ ; LA64-LABEL: alsl_neg_i8:
290
+ ; LA64: # %bb.0: # %entry
291
+ ; LA64-NEXT: alsl.d $a0, $a0, $a0, 1
292
+ ; LA64-NEXT: sub.d $a0, $a1, $a0
293
+ ; LA64-NEXT: ret
294
+ entry:
295
+ %mul = mul nsw i8 %a , -3
296
+ %add = add nsw i8 %b , %mul
297
+ ret i8 %add
298
+ }
299
+
300
+ define i16 @alsl_neg_i16 (i16 signext %a , i16 signext %b ) nounwind {
301
+ ; LA32-LABEL: alsl_neg_i16:
302
+ ; LA32: # %bb.0: # %entry
303
+ ; LA32-NEXT: alsl.w $a0, $a0, $a0, 2
304
+ ; LA32-NEXT: sub.w $a0, $a1, $a0
305
+ ; LA32-NEXT: ret
306
+ ;
307
+ ; LA64-LABEL: alsl_neg_i16:
308
+ ; LA64: # %bb.0: # %entry
309
+ ; LA64-NEXT: alsl.d $a0, $a0, $a0, 2
310
+ ; LA64-NEXT: sub.d $a0, $a1, $a0
311
+ ; LA64-NEXT: ret
312
+ entry:
313
+ %mul = mul nsw i16 %a , -5
314
+ %add = add nsw i16 %b , %mul
315
+ ret i16 %add
316
+ }
317
+
318
+ define i32 @alsl_neg_i32 (i32 signext %a , i32 signext %b ) nounwind {
319
+ ; LA32-LABEL: alsl_neg_i32:
320
+ ; LA32: # %bb.0: # %entry
321
+ ; LA32-NEXT: alsl.w $a0, $a0, $a0, 3
322
+ ; LA32-NEXT: sub.w $a0, $a1, $a0
323
+ ; LA32-NEXT: ret
324
+ ;
325
+ ; LA64-LABEL: alsl_neg_i32:
326
+ ; LA64: # %bb.0: # %entry
327
+ ; LA64-NEXT: alsl.d $a0, $a0, $a0, 3
328
+ ; LA64-NEXT: sub.d $a0, $a1, $a0
329
+ ; LA64-NEXT: ret
330
+ entry:
331
+ %mul = mul nsw i32 %a , -9
332
+ %add = add nsw i32 %b , %mul
333
+ ret i32 %add
334
+ }
335
+
336
+ define i64 @mul_add_neg_i64 (i64 signext %a , i64 signext %b ) nounwind {
337
+ ; LA32-LABEL: mul_add_neg_i64:
338
+ ; LA32: # %bb.0: # %entry
339
+ ; LA32-NEXT: slli.w $a4, $a1, 4
340
+ ; LA32-NEXT: sub.w $a1, $a1, $a4
341
+ ; LA32-NEXT: addi.w $a4, $zero, -15
342
+ ; LA32-NEXT: mulh.wu $a4, $a0, $a4
343
+ ; LA32-NEXT: sub.w $a4, $a4, $a0
344
+ ; LA32-NEXT: add.w $a1, $a4, $a1
345
+ ; LA32-NEXT: add.w $a1, $a3, $a1
346
+ ; LA32-NEXT: slli.w $a3, $a0, 4
347
+ ; LA32-NEXT: sub.w $a0, $a0, $a3
348
+ ; LA32-NEXT: add.w $a0, $a2, $a0
349
+ ; LA32-NEXT: sltu $a2, $a0, $a2
350
+ ; LA32-NEXT: add.w $a1, $a1, $a2
351
+ ; LA32-NEXT: ret
352
+ ;
353
+ ; LA64-LABEL: mul_add_neg_i64:
354
+ ; LA64: # %bb.0: # %entry
355
+ ; LA64-NEXT: slli.d $a2, $a0, 4
356
+ ; LA64-NEXT: sub.d $a0, $a0, $a2
357
+ ; LA64-NEXT: add.d $a0, $a1, $a0
358
+ ; LA64-NEXT: ret
359
+ entry:
360
+ %mul = mul nsw i64 %a , -15
361
+ %add = add nsw i64 %b , %mul
362
+ ret i64 %add
363
+ }
0 commit comments