xref: /llvm-project/llvm/test/CodeGen/LoongArch/ir-instruction/mul.ll (revision 9d4f7f44b64d87d1068859906f43b7ce03a7388b)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc --mtriple=loongarch32 -mattr=+d < %s | FileCheck %s --check-prefix=LA32
3; RUN: llc --mtriple=loongarch64 -mattr=+d < %s | FileCheck %s --check-prefix=LA64
4
5;; Exercise the 'mul' LLVM IR: https://llvm.org/docs/LangRef.html#mul-instruction
6
7define i1 @mul_i1(i1 %a, i1 %b) {
8; LA32-LABEL: mul_i1:
9; LA32:       # %bb.0: # %entry
10; LA32-NEXT:    mul.w $a0, $a0, $a1
11; LA32-NEXT:    ret
12;
13; LA64-LABEL: mul_i1:
14; LA64:       # %bb.0: # %entry
15; LA64-NEXT:    mul.d $a0, $a0, $a1
16; LA64-NEXT:    ret
17entry:
18  %r = mul i1 %a, %b
19  ret i1 %r
20}
21
22define i8 @mul_i8(i8 %a, i8 %b) {
23; LA32-LABEL: mul_i8:
24; LA32:       # %bb.0: # %entry
25; LA32-NEXT:    mul.w $a0, $a0, $a1
26; LA32-NEXT:    ret
27;
28; LA64-LABEL: mul_i8:
29; LA64:       # %bb.0: # %entry
30; LA64-NEXT:    mul.d $a0, $a0, $a1
31; LA64-NEXT:    ret
32entry:
33  %r = mul i8 %a, %b
34  ret i8 %r
35}
36
37define i16 @mul_i16(i16 %a, i16 %b) {
38; LA32-LABEL: mul_i16:
39; LA32:       # %bb.0: # %entry
40; LA32-NEXT:    mul.w $a0, $a0, $a1
41; LA32-NEXT:    ret
42;
43; LA64-LABEL: mul_i16:
44; LA64:       # %bb.0: # %entry
45; LA64-NEXT:    mul.d $a0, $a0, $a1
46; LA64-NEXT:    ret
47entry:
48  %r = mul i16 %a, %b
49  ret i16 %r
50}
51
52define i32 @mul_i32(i32 %a, i32 %b) {
53; LA32-LABEL: mul_i32:
54; LA32:       # %bb.0: # %entry
55; LA32-NEXT:    mul.w $a0, $a0, $a1
56; LA32-NEXT:    ret
57;
58; LA64-LABEL: mul_i32:
59; LA64:       # %bb.0: # %entry
60; LA64-NEXT:    mul.d $a0, $a0, $a1
61; LA64-NEXT:    ret
62entry:
63  %r = mul i32 %a, %b
64  ret i32 %r
65}
66
67define i64 @mul_i64(i64 %a, i64 %b) {
68; LA32-LABEL: mul_i64:
69; LA32:       # %bb.0: # %entry
70; LA32-NEXT:    mul.w $a3, $a0, $a3
71; LA32-NEXT:    mulh.wu $a4, $a0, $a2
72; LA32-NEXT:    add.w $a3, $a4, $a3
73; LA32-NEXT:    mul.w $a1, $a1, $a2
74; LA32-NEXT:    add.w $a1, $a3, $a1
75; LA32-NEXT:    mul.w $a0, $a0, $a2
76; LA32-NEXT:    ret
77;
78; LA64-LABEL: mul_i64:
79; LA64:       # %bb.0: # %entry
80; LA64-NEXT:    mul.d $a0, $a0, $a1
81; LA64-NEXT:    ret
82entry:
83  %r = mul i64 %a, %b
84  ret i64 %r
85}
86
87define i64 @mul_pow2(i64 %a) {
88; LA32-LABEL: mul_pow2:
89; LA32:       # %bb.0:
90; LA32-NEXT:    srli.w $a2, $a0, 29
91; LA32-NEXT:    slli.w $a1, $a1, 3
92; LA32-NEXT:    or $a1, $a1, $a2
93; LA32-NEXT:    slli.w $a0, $a0, 3
94; LA32-NEXT:    ret
95;
96; LA64-LABEL: mul_pow2:
97; LA64:       # %bb.0:
98; LA64-NEXT:    slli.d $a0, $a0, 3
99; LA64-NEXT:    ret
100  %1 = mul i64 %a, 8
101  ret i64 %1
102}
103
104define i64 @mul_p5(i64 %a) {
105; LA32-LABEL: mul_p5:
106; LA32:       # %bb.0:
107; LA32-NEXT:    ori $a2, $zero, 5
108; LA32-NEXT:    mulh.wu $a2, $a0, $a2
109; LA32-NEXT:    alsl.w $a1, $a1, $a1, 2
110; LA32-NEXT:    add.w $a1, $a2, $a1
111; LA32-NEXT:    alsl.w $a0, $a0, $a0, 2
112; LA32-NEXT:    ret
113;
114; LA64-LABEL: mul_p5:
115; LA64:       # %bb.0:
116; LA64-NEXT:    alsl.d $a0, $a0, $a0, 2
117; LA64-NEXT:    ret
118  %1 = mul i64 %a, 5
119  ret i64 %1
120}
121
122define i32 @mulh_w(i32 %a, i32 %b) {
123; LA32-LABEL: mulh_w:
124; LA32:       # %bb.0:
125; LA32-NEXT:    mulh.w $a0, $a0, $a1
126; LA32-NEXT:    ret
127;
128; LA64-LABEL: mulh_w:
129; LA64:       # %bb.0:
130; LA64-NEXT:    mulw.d.w $a0, $a0, $a1
131; LA64-NEXT:    srli.d $a0, $a0, 32
132; LA64-NEXT:    ret
133  %1 = sext i32 %a to i64
134  %2 = sext i32 %b to i64
135  %3 = mul i64 %1, %2
136  %4 = lshr i64 %3, 32
137  %5 = trunc i64 %4 to i32
138  ret i32 %5
139}
140
141define i32 @mulh_wu(i32 %a, i32 %b) {
142; LA32-LABEL: mulh_wu:
143; LA32:       # %bb.0:
144; LA32-NEXT:    mulh.wu $a0, $a0, $a1
145; LA32-NEXT:    ret
146;
147; LA64-LABEL: mulh_wu:
148; LA64:       # %bb.0:
149; LA64-NEXT:    mulw.d.wu $a0, $a0, $a1
150; LA64-NEXT:    srli.d $a0, $a0, 32
151; LA64-NEXT:    ret
152  %1 = zext i32 %a to i64
153  %2 = zext i32 %b to i64
154  %3 = mul i64 %1, %2
155  %4 = lshr i64 %3, 32
156  %5 = trunc i64 %4 to i32
157  ret i32 %5
158}
159
160define i64 @mulh_d(i64 %a, i64 %b) {
161; LA32-LABEL: mulh_d:
162; LA32:       # %bb.0:
163; LA32-NEXT:    srai.w $a5, $a1, 31
164; LA32-NEXT:    srai.w $a6, $a3, 31
165; LA32-NEXT:    mulh.wu $a4, $a0, $a2
166; LA32-NEXT:    mul.w $a7, $a1, $a2
167; LA32-NEXT:    add.w $a4, $a7, $a4
168; LA32-NEXT:    sltu $a7, $a4, $a7
169; LA32-NEXT:    mulh.wu $t0, $a1, $a2
170; LA32-NEXT:    add.w $a7, $t0, $a7
171; LA32-NEXT:    mul.w $t0, $a0, $a3
172; LA32-NEXT:    add.w $a4, $t0, $a4
173; LA32-NEXT:    sltu $a4, $a4, $t0
174; LA32-NEXT:    mulh.wu $t0, $a0, $a3
175; LA32-NEXT:    add.w $a4, $t0, $a4
176; LA32-NEXT:    add.w $t0, $a7, $a4
177; LA32-NEXT:    mul.w $t1, $a1, $a3
178; LA32-NEXT:    add.w $t2, $t1, $t0
179; LA32-NEXT:    mul.w $t3, $a2, $a5
180; LA32-NEXT:    mul.w $t4, $a6, $a0
181; LA32-NEXT:    add.w $t5, $t4, $t3
182; LA32-NEXT:    add.w $a4, $t2, $t5
183; LA32-NEXT:    sltu $t6, $a4, $t2
184; LA32-NEXT:    sltu $t1, $t2, $t1
185; LA32-NEXT:    sltu $a7, $t0, $a7
186; LA32-NEXT:    mulh.wu $t0, $a1, $a3
187; LA32-NEXT:    add.w $a7, $t0, $a7
188; LA32-NEXT:    add.w $a7, $a7, $t1
189; LA32-NEXT:    mulh.wu $a2, $a2, $a5
190; LA32-NEXT:    add.w $a2, $a2, $t3
191; LA32-NEXT:    mul.w $a3, $a3, $a5
192; LA32-NEXT:    add.w $a2, $a2, $a3
193; LA32-NEXT:    mul.w $a1, $a6, $a1
194; LA32-NEXT:    mulh.wu $a0, $a6, $a0
195; LA32-NEXT:    add.w $a0, $a0, $a1
196; LA32-NEXT:    add.w $a0, $a0, $t4
197; LA32-NEXT:    add.w $a0, $a0, $a2
198; LA32-NEXT:    sltu $a1, $t5, $t4
199; LA32-NEXT:    add.w $a0, $a0, $a1
200; LA32-NEXT:    add.w $a0, $a7, $a0
201; LA32-NEXT:    add.w $a1, $a0, $t6
202; LA32-NEXT:    move $a0, $a4
203; LA32-NEXT:    ret
204;
205; LA64-LABEL: mulh_d:
206; LA64:       # %bb.0:
207; LA64-NEXT:    mulh.d $a0, $a0, $a1
208; LA64-NEXT:    ret
209  %1 = sext i64 %a to i128
210  %2 = sext i64 %b to i128
211  %3 = mul i128 %1, %2
212  %4 = lshr i128 %3, 64
213  %5 = trunc i128 %4 to i64
214  ret i64 %5
215}
216
217define i64 @mulh_du(i64 %a, i64 %b) {
218; LA32-LABEL: mulh_du:
219; LA32:       # %bb.0:
220; LA32-NEXT:    mulh.wu $a4, $a0, $a2
221; LA32-NEXT:    mul.w $a5, $a1, $a2
222; LA32-NEXT:    add.w $a4, $a5, $a4
223; LA32-NEXT:    sltu $a5, $a4, $a5
224; LA32-NEXT:    mulh.wu $a2, $a1, $a2
225; LA32-NEXT:    add.w $a2, $a2, $a5
226; LA32-NEXT:    mul.w $a5, $a0, $a3
227; LA32-NEXT:    add.w $a4, $a5, $a4
228; LA32-NEXT:    sltu $a4, $a4, $a5
229; LA32-NEXT:    mulh.wu $a0, $a0, $a3
230; LA32-NEXT:    add.w $a0, $a0, $a4
231; LA32-NEXT:    add.w $a4, $a2, $a0
232; LA32-NEXT:    mul.w $a5, $a1, $a3
233; LA32-NEXT:    add.w $a0, $a5, $a4
234; LA32-NEXT:    sltu $a5, $a0, $a5
235; LA32-NEXT:    sltu $a2, $a4, $a2
236; LA32-NEXT:    mulh.wu $a1, $a1, $a3
237; LA32-NEXT:    add.w $a1, $a1, $a2
238; LA32-NEXT:    add.w $a1, $a1, $a5
239; LA32-NEXT:    ret
240;
241; LA64-LABEL: mulh_du:
242; LA64:       # %bb.0:
243; LA64-NEXT:    mulh.du $a0, $a0, $a1
244; LA64-NEXT:    ret
245  %1 = zext i64 %a to i128
246  %2 = zext i64 %b to i128
247  %3 = mul i128 %1, %2
248  %4 = lshr i128 %3, 64
249  %5 = trunc i128 %4 to i64
250  ret i64 %5
251}
252
253define i64 @mulw_d_w(i32 %a, i32 %b) {
254; LA32-LABEL: mulw_d_w:
255; LA32:       # %bb.0:
256; LA32-NEXT:    mul.w $a2, $a0, $a1
257; LA32-NEXT:    mulh.w $a1, $a0, $a1
258; LA32-NEXT:    move $a0, $a2
259; LA32-NEXT:    ret
260;
261; LA64-LABEL: mulw_d_w:
262; LA64:       # %bb.0:
263; LA64-NEXT:    mulw.d.w $a0, $a0, $a1
264; LA64-NEXT:    ret
265  %1 = sext i32 %a to i64
266  %2 = sext i32 %b to i64
267  %3 = mul i64 %1, %2
268  ret i64 %3
269}
270
271define i64 @mulw_d_wu(i32 %a, i32 %b) {
272; LA32-LABEL: mulw_d_wu:
273; LA32:       # %bb.0:
274; LA32-NEXT:    mul.w $a2, $a0, $a1
275; LA32-NEXT:    mulh.wu $a1, $a0, $a1
276; LA32-NEXT:    move $a0, $a2
277; LA32-NEXT:    ret
278;
279; LA64-LABEL: mulw_d_wu:
280; LA64:       # %bb.0:
281; LA64-NEXT:    mulw.d.wu $a0, $a0, $a1
282; LA64-NEXT:    ret
283  %1 = zext i32 %a to i64
284  %2 = zext i32 %b to i64
285  %3 = mul i64 %1, %2
286  ret i64 %3
287}
288
289define signext i32 @mul_i32_11(i32 %a) {
290; LA32-LABEL: mul_i32_11:
291; LA32:       # %bb.0:
292; LA32-NEXT:    alsl.w $a1, $a0, $a0, 2
293; LA32-NEXT:    alsl.w $a0, $a1, $a0, 1
294; LA32-NEXT:    ret
295;
296; LA64-LABEL: mul_i32_11:
297; LA64:       # %bb.0:
298; LA64-NEXT:    alsl.w $a1, $a0, $a0, 2
299; LA64-NEXT:    alsl.w $a0, $a1, $a0, 1
300; LA64-NEXT:    ret
301  %b = mul i32 %a, 11
302  ret i32 %b
303}
304
305define signext i32 @mul_i32_13(i32 %a) {
306; LA32-LABEL: mul_i32_13:
307; LA32:       # %bb.0:
308; LA32-NEXT:    alsl.w $a1, $a0, $a0, 1
309; LA32-NEXT:    alsl.w $a0, $a1, $a0, 2
310; LA32-NEXT:    ret
311;
312; LA64-LABEL: mul_i32_13:
313; LA64:       # %bb.0:
314; LA64-NEXT:    alsl.w $a1, $a0, $a0, 1
315; LA64-NEXT:    alsl.w $a0, $a1, $a0, 2
316; LA64-NEXT:    ret
317  %b = mul i32 %a, 13
318  ret i32 %b
319}
320
321define signext i32 @mul_i32_19(i32 %a) {
322; LA32-LABEL: mul_i32_19:
323; LA32:       # %bb.0:
324; LA32-NEXT:    alsl.w $a1, $a0, $a0, 3
325; LA32-NEXT:    alsl.w $a0, $a1, $a0, 1
326; LA32-NEXT:    ret
327;
328; LA64-LABEL: mul_i32_19:
329; LA64:       # %bb.0:
330; LA64-NEXT:    alsl.w $a1, $a0, $a0, 3
331; LA64-NEXT:    alsl.w $a0, $a1, $a0, 1
332; LA64-NEXT:    ret
333  %b = mul i32 %a, 19
334  ret i32 %b
335}
336
337define signext i32 @mul_i32_21(i32 %a) {
338; LA32-LABEL: mul_i32_21:
339; LA32:       # %bb.0:
340; LA32-NEXT:    alsl.w $a1, $a0, $a0, 2
341; LA32-NEXT:    alsl.w $a0, $a1, $a0, 2
342; LA32-NEXT:    ret
343;
344; LA64-LABEL: mul_i32_21:
345; LA64:       # %bb.0:
346; LA64-NEXT:    alsl.w $a1, $a0, $a0, 2
347; LA64-NEXT:    alsl.w $a0, $a1, $a0, 2
348; LA64-NEXT:    ret
349  %b = mul i32 %a, 21
350  ret i32 %b
351}
352
353define signext i32 @mul_i32_25(i32 %a) {
354; LA32-LABEL: mul_i32_25:
355; LA32:       # %bb.0:
356; LA32-NEXT:    alsl.w $a1, $a0, $a0, 1
357; LA32-NEXT:    alsl.w $a0, $a1, $a0, 3
358; LA32-NEXT:    ret
359;
360; LA64-LABEL: mul_i32_25:
361; LA64:       # %bb.0:
362; LA64-NEXT:    alsl.w $a1, $a0, $a0, 1
363; LA64-NEXT:    alsl.w $a0, $a1, $a0, 3
364; LA64-NEXT:    ret
365  %b = mul i32 %a, 25
366  ret i32 %b
367}
368
369define signext i32 @mul_i32_27(i32 %a) {
370; LA32-LABEL: mul_i32_27:
371; LA32:       # %bb.0:
372; LA32-NEXT:    alsl.w $a0, $a0, $a0, 1
373; LA32-NEXT:    alsl.w $a0, $a0, $a0, 3
374; LA32-NEXT:    ret
375;
376; LA64-LABEL: mul_i32_27:
377; LA64:       # %bb.0:
378; LA64-NEXT:    alsl.w $a0, $a0, $a0, 1
379; LA64-NEXT:    alsl.w $a0, $a0, $a0, 3
380; LA64-NEXT:    ret
381  %b = mul i32 %a, 27
382  ret i32 %b
383}
384
385define signext i32 @mul_i32_35(i32 %a) {
386; LA32-LABEL: mul_i32_35:
387; LA32:       # %bb.0:
388; LA32-NEXT:    alsl.w $a1, $a0, $a0, 4
389; LA32-NEXT:    alsl.w $a0, $a1, $a0, 1
390; LA32-NEXT:    ret
391;
392; LA64-LABEL: mul_i32_35:
393; LA64:       # %bb.0:
394; LA64-NEXT:    alsl.w $a1, $a0, $a0, 4
395; LA64-NEXT:    alsl.w $a0, $a1, $a0, 1
396; LA64-NEXT:    ret
397  %b = mul i32 %a, 35
398  ret i32 %b
399}
400
401define signext i32 @mul_i32_37(i32 %a) {
402; LA32-LABEL: mul_i32_37:
403; LA32:       # %bb.0:
404; LA32-NEXT:    alsl.w $a1, $a0, $a0, 3
405; LA32-NEXT:    alsl.w $a0, $a1, $a0, 2
406; LA32-NEXT:    ret
407;
408; LA64-LABEL: mul_i32_37:
409; LA64:       # %bb.0:
410; LA64-NEXT:    alsl.w $a1, $a0, $a0, 3
411; LA64-NEXT:    alsl.w $a0, $a1, $a0, 2
412; LA64-NEXT:    ret
413  %b = mul i32 %a, 37
414  ret i32 %b
415}
416
417define signext i32 @mul_i32_41(i32 %a) {
418; LA32-LABEL: mul_i32_41:
419; LA32:       # %bb.0:
420; LA32-NEXT:    alsl.w $a1, $a0, $a0, 2
421; LA32-NEXT:    alsl.w $a0, $a1, $a0, 3
422; LA32-NEXT:    ret
423;
424; LA64-LABEL: mul_i32_41:
425; LA64:       # %bb.0:
426; LA64-NEXT:    alsl.w $a1, $a0, $a0, 2
427; LA64-NEXT:    alsl.w $a0, $a1, $a0, 3
428; LA64-NEXT:    ret
429  %b = mul i32 %a, 41
430  ret i32 %b
431}
432
433define signext i32 @mul_i32_45(i32 %a) {
434; LA32-LABEL: mul_i32_45:
435; LA32:       # %bb.0:
436; LA32-NEXT:    alsl.w $a0, $a0, $a0, 2
437; LA32-NEXT:    alsl.w $a0, $a0, $a0, 3
438; LA32-NEXT:    ret
439;
440; LA64-LABEL: mul_i32_45:
441; LA64:       # %bb.0:
442; LA64-NEXT:    alsl.w $a0, $a0, $a0, 2
443; LA64-NEXT:    alsl.w $a0, $a0, $a0, 3
444; LA64-NEXT:    ret
445  %b = mul i32 %a, 45
446  ret i32 %b
447}
448
449define signext i32 @mul_i32_49(i32 %a) {
450; LA32-LABEL: mul_i32_49:
451; LA32:       # %bb.0:
452; LA32-NEXT:    alsl.w $a1, $a0, $a0, 1
453; LA32-NEXT:    alsl.w $a0, $a1, $a0, 4
454; LA32-NEXT:    ret
455;
456; LA64-LABEL: mul_i32_49:
457; LA64:       # %bb.0:
458; LA64-NEXT:    alsl.w $a1, $a0, $a0, 1
459; LA64-NEXT:    alsl.w $a0, $a1, $a0, 4
460; LA64-NEXT:    ret
461  %b = mul i32 %a, 49
462  ret i32 %b
463}
464
465define signext i32 @mul_i32_51(i32 %a) {
466; LA32-LABEL: mul_i32_51:
467; LA32:       # %bb.0:
468; LA32-NEXT:    alsl.w $a0, $a0, $a0, 1
469; LA32-NEXT:    alsl.w $a0, $a0, $a0, 4
470; LA32-NEXT:    ret
471;
472; LA64-LABEL: mul_i32_51:
473; LA64:       # %bb.0:
474; LA64-NEXT:    alsl.w $a0, $a0, $a0, 1
475; LA64-NEXT:    alsl.w $a0, $a0, $a0, 4
476; LA64-NEXT:    ret
477  %b = mul i32 %a, 51
478  ret i32 %b
479}
480
481define signext i32 @mul_i32_69(i32 %a) {
482; LA32-LABEL: mul_i32_69:
483; LA32:       # %bb.0:
484; LA32-NEXT:    alsl.w $a1, $a0, $a0, 4
485; LA32-NEXT:    alsl.w $a0, $a1, $a0, 2
486; LA32-NEXT:    ret
487;
488; LA64-LABEL: mul_i32_69:
489; LA64:       # %bb.0:
490; LA64-NEXT:    alsl.w $a1, $a0, $a0, 4
491; LA64-NEXT:    alsl.w $a0, $a1, $a0, 2
492; LA64-NEXT:    ret
493  %b = mul i32 %a, 69
494  ret i32 %b
495}
496
497define signext i32 @mul_i32_73(i32 %a) {
498; LA32-LABEL: mul_i32_73:
499; LA32:       # %bb.0:
500; LA32-NEXT:    alsl.w $a1, $a0, $a0, 3
501; LA32-NEXT:    alsl.w $a0, $a1, $a0, 3
502; LA32-NEXT:    ret
503;
504; LA64-LABEL: mul_i32_73:
505; LA64:       # %bb.0:
506; LA64-NEXT:    alsl.w $a1, $a0, $a0, 3
507; LA64-NEXT:    alsl.w $a0, $a1, $a0, 3
508; LA64-NEXT:    ret
509  %b = mul i32 %a, 73
510  ret i32 %b
511}
512
513define signext i32 @mul_i32_81(i32 %a) {
514; LA32-LABEL: mul_i32_81:
515; LA32:       # %bb.0:
516; LA32-NEXT:    alsl.w $a1, $a0, $a0, 2
517; LA32-NEXT:    alsl.w $a0, $a1, $a0, 4
518; LA32-NEXT:    ret
519;
520; LA64-LABEL: mul_i32_81:
521; LA64:       # %bb.0:
522; LA64-NEXT:    alsl.w $a1, $a0, $a0, 2
523; LA64-NEXT:    alsl.w $a0, $a1, $a0, 4
524; LA64-NEXT:    ret
525  %b = mul i32 %a, 81
526  ret i32 %b
527}
528
529define signext i32 @mul_i32_85(i32 %a) {
530; LA32-LABEL: mul_i32_85:
531; LA32:       # %bb.0:
532; LA32-NEXT:    alsl.w $a0, $a0, $a0, 2
533; LA32-NEXT:    alsl.w $a0, $a0, $a0, 4
534; LA32-NEXT:    ret
535;
536; LA64-LABEL: mul_i32_85:
537; LA64:       # %bb.0:
538; LA64-NEXT:    alsl.w $a0, $a0, $a0, 2
539; LA64-NEXT:    alsl.w $a0, $a0, $a0, 4
540; LA64-NEXT:    ret
541  %b = mul i32 %a, 85
542  ret i32 %b
543}
544
545define signext i32 @mul_i32_137(i32 %a) {
546; LA32-LABEL: mul_i32_137:
547; LA32:       # %bb.0:
548; LA32-NEXT:    alsl.w $a1, $a0, $a0, 4
549; LA32-NEXT:    alsl.w $a0, $a1, $a0, 3
550; LA32-NEXT:    ret
551;
552; LA64-LABEL: mul_i32_137:
553; LA64:       # %bb.0:
554; LA64-NEXT:    alsl.w $a1, $a0, $a0, 4
555; LA64-NEXT:    alsl.w $a0, $a1, $a0, 3
556; LA64-NEXT:    ret
557  %b = mul i32 %a, 137
558  ret i32 %b
559}
560
561define signext i32 @mul_i32_145(i32 %a) {
562; LA32-LABEL: mul_i32_145:
563; LA32:       # %bb.0:
564; LA32-NEXT:    alsl.w $a1, $a0, $a0, 3
565; LA32-NEXT:    alsl.w $a0, $a1, $a0, 4
566; LA32-NEXT:    ret
567;
568; LA64-LABEL: mul_i32_145:
569; LA64:       # %bb.0:
570; LA64-NEXT:    alsl.w $a1, $a0, $a0, 3
571; LA64-NEXT:    alsl.w $a0, $a1, $a0, 4
572; LA64-NEXT:    ret
573  %b = mul i32 %a, 145
574  ret i32 %b
575}
576
577define signext i32 @mul_i32_153(i32 %a) {
578; LA32-LABEL: mul_i32_153:
579; LA32:       # %bb.0:
580; LA32-NEXT:    alsl.w $a0, $a0, $a0, 3
581; LA32-NEXT:    alsl.w $a0, $a0, $a0, 4
582; LA32-NEXT:    ret
583;
584; LA64-LABEL: mul_i32_153:
585; LA64:       # %bb.0:
586; LA64-NEXT:    alsl.w $a0, $a0, $a0, 3
587; LA64-NEXT:    alsl.w $a0, $a0, $a0, 4
588; LA64-NEXT:    ret
589  %b = mul i32 %a, 153
590  ret i32 %b
591}
592
593define signext i32 @mul_i32_273(i32 %a) {
594; LA32-LABEL: mul_i32_273:
595; LA32:       # %bb.0:
596; LA32-NEXT:    alsl.w $a1, $a0, $a0, 4
597; LA32-NEXT:    alsl.w $a0, $a1, $a0, 4
598; LA32-NEXT:    ret
599;
600; LA64-LABEL: mul_i32_273:
601; LA64:       # %bb.0:
602; LA64-NEXT:    alsl.w $a1, $a0, $a0, 4
603; LA64-NEXT:    alsl.w $a0, $a1, $a0, 4
604; LA64-NEXT:    ret
605  %b = mul i32 %a, 273
606  ret i32 %b
607}
608
609define signext i32 @mul_i32_289(i32 %a) {
610; LA32-LABEL: mul_i32_289:
611; LA32:       # %bb.0:
612; LA32-NEXT:    alsl.w $a0, $a0, $a0, 4
613; LA32-NEXT:    alsl.w $a0, $a0, $a0, 4
614; LA32-NEXT:    ret
615;
616; LA64-LABEL: mul_i32_289:
617; LA64:       # %bb.0:
618; LA64-NEXT:    alsl.w $a0, $a0, $a0, 4
619; LA64-NEXT:    alsl.w $a0, $a0, $a0, 4
620; LA64-NEXT:    ret
621  %b = mul i32 %a, 289
622  ret i32 %b
623}
624
625define i64 @mul_i64_11(i64 %a) {
626; LA32-LABEL: mul_i64_11:
627; LA32:       # %bb.0:
628; LA32-NEXT:    ori $a2, $zero, 11
629; LA32-NEXT:    mul.w $a1, $a1, $a2
630; LA32-NEXT:    mulh.wu $a3, $a0, $a2
631; LA32-NEXT:    add.w $a1, $a3, $a1
632; LA32-NEXT:    mul.w $a0, $a0, $a2
633; LA32-NEXT:    ret
634;
635; LA64-LABEL: mul_i64_11:
636; LA64:       # %bb.0:
637; LA64-NEXT:    alsl.d $a1, $a0, $a0, 2
638; LA64-NEXT:    alsl.d $a0, $a1, $a0, 1
639; LA64-NEXT:    ret
640  %b = mul i64 %a, 11
641  ret i64 %b
642}
643
644define i64 @mul_i64_13(i64 %a) {
645; LA32-LABEL: mul_i64_13:
646; LA32:       # %bb.0:
647; LA32-NEXT:    ori $a2, $zero, 13
648; LA32-NEXT:    mul.w $a1, $a1, $a2
649; LA32-NEXT:    mulh.wu $a3, $a0, $a2
650; LA32-NEXT:    add.w $a1, $a3, $a1
651; LA32-NEXT:    mul.w $a0, $a0, $a2
652; LA32-NEXT:    ret
653;
654; LA64-LABEL: mul_i64_13:
655; LA64:       # %bb.0:
656; LA64-NEXT:    alsl.d $a1, $a0, $a0, 1
657; LA64-NEXT:    alsl.d $a0, $a1, $a0, 2
658; LA64-NEXT:    ret
659  %b = mul i64 %a, 13
660  ret i64 %b
661}
662
663define i64 @mul_i64_19(i64 %a) {
664; LA32-LABEL: mul_i64_19:
665; LA32:       # %bb.0:
666; LA32-NEXT:    ori $a2, $zero, 19
667; LA32-NEXT:    mul.w $a1, $a1, $a2
668; LA32-NEXT:    mulh.wu $a3, $a0, $a2
669; LA32-NEXT:    add.w $a1, $a3, $a1
670; LA32-NEXT:    mul.w $a0, $a0, $a2
671; LA32-NEXT:    ret
672;
673; LA64-LABEL: mul_i64_19:
674; LA64:       # %bb.0:
675; LA64-NEXT:    alsl.d $a1, $a0, $a0, 3
676; LA64-NEXT:    alsl.d $a0, $a1, $a0, 1
677; LA64-NEXT:    ret
678  %b = mul i64 %a, 19
679  ret i64 %b
680}
681
682define i64 @mul_i64_21(i64 %a) {
683; LA32-LABEL: mul_i64_21:
684; LA32:       # %bb.0:
685; LA32-NEXT:    ori $a2, $zero, 21
686; LA32-NEXT:    mul.w $a1, $a1, $a2
687; LA32-NEXT:    mulh.wu $a3, $a0, $a2
688; LA32-NEXT:    add.w $a1, $a3, $a1
689; LA32-NEXT:    mul.w $a0, $a0, $a2
690; LA32-NEXT:    ret
691;
692; LA64-LABEL: mul_i64_21:
693; LA64:       # %bb.0:
694; LA64-NEXT:    alsl.d $a1, $a0, $a0, 2
695; LA64-NEXT:    alsl.d $a0, $a1, $a0, 2
696; LA64-NEXT:    ret
697  %b = mul i64 %a, 21
698  ret i64 %b
699}
700
701define i64 @mul_i64_25(i64 %a) {
702; LA32-LABEL: mul_i64_25:
703; LA32:       # %bb.0:
704; LA32-NEXT:    ori $a2, $zero, 25
705; LA32-NEXT:    mul.w $a1, $a1, $a2
706; LA32-NEXT:    mulh.wu $a3, $a0, $a2
707; LA32-NEXT:    add.w $a1, $a3, $a1
708; LA32-NEXT:    mul.w $a0, $a0, $a2
709; LA32-NEXT:    ret
710;
711; LA64-LABEL: mul_i64_25:
712; LA64:       # %bb.0:
713; LA64-NEXT:    alsl.d $a1, $a0, $a0, 1
714; LA64-NEXT:    alsl.d $a0, $a1, $a0, 3
715; LA64-NEXT:    ret
716  %b = mul i64 %a, 25
717  ret i64 %b
718}
719
720define i64 @mul_i64_27(i64 %a) {
721; LA32-LABEL: mul_i64_27:
722; LA32:       # %bb.0:
723; LA32-NEXT:    ori $a2, $zero, 27
724; LA32-NEXT:    mul.w $a1, $a1, $a2
725; LA32-NEXT:    mulh.wu $a3, $a0, $a2
726; LA32-NEXT:    add.w $a1, $a3, $a1
727; LA32-NEXT:    mul.w $a0, $a0, $a2
728; LA32-NEXT:    ret
729;
730; LA64-LABEL: mul_i64_27:
731; LA64:       # %bb.0:
732; LA64-NEXT:    alsl.d $a0, $a0, $a0, 1
733; LA64-NEXT:    alsl.d $a0, $a0, $a0, 3
734; LA64-NEXT:    ret
735  %b = mul i64 %a, 27
736  ret i64 %b
737}
738
739define i64 @mul_i64_35(i64 %a) {
740; LA32-LABEL: mul_i64_35:
741; LA32:       # %bb.0:
742; LA32-NEXT:    ori $a2, $zero, 35
743; LA32-NEXT:    mul.w $a1, $a1, $a2
744; LA32-NEXT:    mulh.wu $a3, $a0, $a2
745; LA32-NEXT:    add.w $a1, $a3, $a1
746; LA32-NEXT:    mul.w $a0, $a0, $a2
747; LA32-NEXT:    ret
748;
749; LA64-LABEL: mul_i64_35:
750; LA64:       # %bb.0:
751; LA64-NEXT:    alsl.d $a1, $a0, $a0, 4
752; LA64-NEXT:    alsl.d $a0, $a1, $a0, 1
753; LA64-NEXT:    ret
754  %b = mul i64 %a, 35
755  ret i64 %b
756}
757
758define i64 @mul_i64_37(i64 %a) {
759; LA32-LABEL: mul_i64_37:
760; LA32:       # %bb.0:
761; LA32-NEXT:    ori $a2, $zero, 37
762; LA32-NEXT:    mul.w $a1, $a1, $a2
763; LA32-NEXT:    mulh.wu $a3, $a0, $a2
764; LA32-NEXT:    add.w $a1, $a3, $a1
765; LA32-NEXT:    mul.w $a0, $a0, $a2
766; LA32-NEXT:    ret
767;
768; LA64-LABEL: mul_i64_37:
769; LA64:       # %bb.0:
770; LA64-NEXT:    alsl.d $a1, $a0, $a0, 3
771; LA64-NEXT:    alsl.d $a0, $a1, $a0, 2
772; LA64-NEXT:    ret
773  %b = mul i64 %a, 37
774  ret i64 %b
775}
776
777define i64 @mul_i64_41(i64 %a) {
778; LA32-LABEL: mul_i64_41:
779; LA32:       # %bb.0:
780; LA32-NEXT:    ori $a2, $zero, 41
781; LA32-NEXT:    mul.w $a1, $a1, $a2
782; LA32-NEXT:    mulh.wu $a3, $a0, $a2
783; LA32-NEXT:    add.w $a1, $a3, $a1
784; LA32-NEXT:    mul.w $a0, $a0, $a2
785; LA32-NEXT:    ret
786;
787; LA64-LABEL: mul_i64_41:
788; LA64:       # %bb.0:
789; LA64-NEXT:    alsl.d $a1, $a0, $a0, 2
790; LA64-NEXT:    alsl.d $a0, $a1, $a0, 3
791; LA64-NEXT:    ret
792  %b = mul i64 %a, 41
793  ret i64 %b
794}
795
796define i64 @mul_i64_45(i64 %a) {
797; LA32-LABEL: mul_i64_45:
798; LA32:       # %bb.0:
799; LA32-NEXT:    ori $a2, $zero, 45
800; LA32-NEXT:    mul.w $a1, $a1, $a2
801; LA32-NEXT:    mulh.wu $a3, $a0, $a2
802; LA32-NEXT:    add.w $a1, $a3, $a1
803; LA32-NEXT:    mul.w $a0, $a0, $a2
804; LA32-NEXT:    ret
805;
806; LA64-LABEL: mul_i64_45:
807; LA64:       # %bb.0:
808; LA64-NEXT:    alsl.d $a0, $a0, $a0, 2
809; LA64-NEXT:    alsl.d $a0, $a0, $a0, 3
810; LA64-NEXT:    ret
811  %b = mul i64 %a, 45
812  ret i64 %b
813}
814
815define i64 @mul_i64_49(i64 %a) {
816; LA32-LABEL: mul_i64_49:
817; LA32:       # %bb.0:
818; LA32-NEXT:    ori $a2, $zero, 49
819; LA32-NEXT:    mul.w $a1, $a1, $a2
820; LA32-NEXT:    mulh.wu $a3, $a0, $a2
821; LA32-NEXT:    add.w $a1, $a3, $a1
822; LA32-NEXT:    mul.w $a0, $a0, $a2
823; LA32-NEXT:    ret
824;
825; LA64-LABEL: mul_i64_49:
826; LA64:       # %bb.0:
827; LA64-NEXT:    alsl.d $a1, $a0, $a0, 1
828; LA64-NEXT:    alsl.d $a0, $a1, $a0, 4
829; LA64-NEXT:    ret
830  %b = mul i64 %a, 49
831  ret i64 %b
832}
833
834define i64 @mul_i64_51(i64 %a) {
835; LA32-LABEL: mul_i64_51:
836; LA32:       # %bb.0:
837; LA32-NEXT:    ori $a2, $zero, 51
838; LA32-NEXT:    mul.w $a1, $a1, $a2
839; LA32-NEXT:    mulh.wu $a3, $a0, $a2
840; LA32-NEXT:    add.w $a1, $a3, $a1
841; LA32-NEXT:    mul.w $a0, $a0, $a2
842; LA32-NEXT:    ret
843;
844; LA64-LABEL: mul_i64_51:
845; LA64:       # %bb.0:
846; LA64-NEXT:    alsl.d $a0, $a0, $a0, 1
847; LA64-NEXT:    alsl.d $a0, $a0, $a0, 4
848; LA64-NEXT:    ret
849  %b = mul i64 %a, 51
850  ret i64 %b
851}
852
853define i64 @mul_i64_69(i64 %a) {
854; LA32-LABEL: mul_i64_69:
855; LA32:       # %bb.0:
856; LA32-NEXT:    ori $a2, $zero, 69
857; LA32-NEXT:    mul.w $a1, $a1, $a2
858; LA32-NEXT:    mulh.wu $a3, $a0, $a2
859; LA32-NEXT:    add.w $a1, $a3, $a1
860; LA32-NEXT:    mul.w $a0, $a0, $a2
861; LA32-NEXT:    ret
862;
863; LA64-LABEL: mul_i64_69:
864; LA64:       # %bb.0:
865; LA64-NEXT:    alsl.d $a1, $a0, $a0, 4
866; LA64-NEXT:    alsl.d $a0, $a1, $a0, 2
867; LA64-NEXT:    ret
868  %b = mul i64 %a, 69
869  ret i64 %b
870}
871
872define i64 @mul_i64_73(i64 %a) {
873; LA32-LABEL: mul_i64_73:
874; LA32:       # %bb.0:
875; LA32-NEXT:    ori $a2, $zero, 73
876; LA32-NEXT:    mul.w $a1, $a1, $a2
877; LA32-NEXT:    mulh.wu $a3, $a0, $a2
878; LA32-NEXT:    add.w $a1, $a3, $a1
879; LA32-NEXT:    mul.w $a0, $a0, $a2
880; LA32-NEXT:    ret
881;
882; LA64-LABEL: mul_i64_73:
883; LA64:       # %bb.0:
884; LA64-NEXT:    alsl.d $a1, $a0, $a0, 3
885; LA64-NEXT:    alsl.d $a0, $a1, $a0, 3
886; LA64-NEXT:    ret
887  %b = mul i64 %a, 73
888  ret i64 %b
889}
890
891define i64 @mul_i64_81(i64 %a) {
892; LA32-LABEL: mul_i64_81:
893; LA32:       # %bb.0:
894; LA32-NEXT:    ori $a2, $zero, 81
895; LA32-NEXT:    mul.w $a1, $a1, $a2
896; LA32-NEXT:    mulh.wu $a3, $a0, $a2
897; LA32-NEXT:    add.w $a1, $a3, $a1
898; LA32-NEXT:    mul.w $a0, $a0, $a2
899; LA32-NEXT:    ret
900;
901; LA64-LABEL: mul_i64_81:
902; LA64:       # %bb.0:
903; LA64-NEXT:    alsl.d $a1, $a0, $a0, 2
904; LA64-NEXT:    alsl.d $a0, $a1, $a0, 4
905; LA64-NEXT:    ret
906  %b = mul i64 %a, 81
907  ret i64 %b
908}
909
910define i64 @mul_i64_85(i64 %a) {
911; LA32-LABEL: mul_i64_85:
912; LA32:       # %bb.0:
913; LA32-NEXT:    ori $a2, $zero, 85
914; LA32-NEXT:    mul.w $a1, $a1, $a2
915; LA32-NEXT:    mulh.wu $a3, $a0, $a2
916; LA32-NEXT:    add.w $a1, $a3, $a1
917; LA32-NEXT:    mul.w $a0, $a0, $a2
918; LA32-NEXT:    ret
919;
920; LA64-LABEL: mul_i64_85:
921; LA64:       # %bb.0:
922; LA64-NEXT:    alsl.d $a0, $a0, $a0, 2
923; LA64-NEXT:    alsl.d $a0, $a0, $a0, 4
924; LA64-NEXT:    ret
925  %b = mul i64 %a, 85
926  ret i64 %b
927}
928
929define i64 @mul_i64_137(i64 %a) {
930; LA32-LABEL: mul_i64_137:
931; LA32:       # %bb.0:
932; LA32-NEXT:    ori $a2, $zero, 137
933; LA32-NEXT:    mul.w $a1, $a1, $a2
934; LA32-NEXT:    mulh.wu $a3, $a0, $a2
935; LA32-NEXT:    add.w $a1, $a3, $a1
936; LA32-NEXT:    mul.w $a0, $a0, $a2
937; LA32-NEXT:    ret
938;
939; LA64-LABEL: mul_i64_137:
940; LA64:       # %bb.0:
941; LA64-NEXT:    alsl.d $a1, $a0, $a0, 4
942; LA64-NEXT:    alsl.d $a0, $a1, $a0, 3
943; LA64-NEXT:    ret
944  %b = mul i64 %a, 137
945  ret i64 %b
946}
947
948define i64 @mul_i64_145(i64 %a) {
949; LA32-LABEL: mul_i64_145:
950; LA32:       # %bb.0:
951; LA32-NEXT:    ori $a2, $zero, 145
952; LA32-NEXT:    mul.w $a1, $a1, $a2
953; LA32-NEXT:    mulh.wu $a3, $a0, $a2
954; LA32-NEXT:    add.w $a1, $a3, $a1
955; LA32-NEXT:    mul.w $a0, $a0, $a2
956; LA32-NEXT:    ret
957;
958; LA64-LABEL: mul_i64_145:
959; LA64:       # %bb.0:
960; LA64-NEXT:    alsl.d $a1, $a0, $a0, 3
961; LA64-NEXT:    alsl.d $a0, $a1, $a0, 4
962; LA64-NEXT:    ret
963  %b = mul i64 %a, 145
964  ret i64 %b
965}
966
967define i64 @mul_i64_153(i64 %a) {
968; LA32-LABEL: mul_i64_153:
969; LA32:       # %bb.0:
970; LA32-NEXT:    ori $a2, $zero, 153
971; LA32-NEXT:    mul.w $a1, $a1, $a2
972; LA32-NEXT:    mulh.wu $a3, $a0, $a2
973; LA32-NEXT:    add.w $a1, $a3, $a1
974; LA32-NEXT:    mul.w $a0, $a0, $a2
975; LA32-NEXT:    ret
976;
977; LA64-LABEL: mul_i64_153:
978; LA64:       # %bb.0:
979; LA64-NEXT:    alsl.d $a0, $a0, $a0, 3
980; LA64-NEXT:    alsl.d $a0, $a0, $a0, 4
981; LA64-NEXT:    ret
982  %b = mul i64 %a, 153
983  ret i64 %b
984}
985
986define i64 @mul_i64_273(i64 %a) {
987; LA32-LABEL: mul_i64_273:
988; LA32:       # %bb.0:
989; LA32-NEXT:    ori $a2, $zero, 273
990; LA32-NEXT:    mul.w $a1, $a1, $a2
991; LA32-NEXT:    mulh.wu $a3, $a0, $a2
992; LA32-NEXT:    add.w $a1, $a3, $a1
993; LA32-NEXT:    mul.w $a0, $a0, $a2
994; LA32-NEXT:    ret
995;
996; LA64-LABEL: mul_i64_273:
997; LA64:       # %bb.0:
998; LA64-NEXT:    alsl.d $a1, $a0, $a0, 4
999; LA64-NEXT:    alsl.d $a0, $a1, $a0, 4
1000; LA64-NEXT:    ret
1001  %b = mul i64 %a, 273
1002  ret i64 %b
1003}
1004
1005define i64 @mul_i64_289(i64 %a) {
1006; LA32-LABEL: mul_i64_289:
1007; LA32:       # %bb.0:
1008; LA32-NEXT:    ori $a2, $zero, 289
1009; LA32-NEXT:    mul.w $a1, $a1, $a2
1010; LA32-NEXT:    mulh.wu $a3, $a0, $a2
1011; LA32-NEXT:    add.w $a1, $a3, $a1
1012; LA32-NEXT:    mul.w $a0, $a0, $a2
1013; LA32-NEXT:    ret
1014;
1015; LA64-LABEL: mul_i64_289:
1016; LA64:       # %bb.0:
1017; LA64-NEXT:    alsl.d $a0, $a0, $a0, 4
1018; LA64-NEXT:    alsl.d $a0, $a0, $a0, 4
1019; LA64-NEXT:    ret
1020  %b = mul i64 %a, 289
1021  ret i64 %b
1022}
1023
1024define signext i32 @mul_i32_4098(i32 %a) {
1025; LA32-LABEL: mul_i32_4098:
1026; LA32:       # %bb.0:
1027; LA32-NEXT:    slli.w $a1, $a0, 12
1028; LA32-NEXT:    alsl.w $a0, $a0, $a1, 1
1029; LA32-NEXT:    ret
1030;
1031; LA64-LABEL: mul_i32_4098:
1032; LA64:       # %bb.0:
1033; LA64-NEXT:    slli.d $a1, $a0, 12
1034; LA64-NEXT:    alsl.w $a0, $a0, $a1, 1
1035; LA64-NEXT:    ret
1036  %b = mul i32 %a, 4098
1037  ret i32 %b
1038}
1039
1040define signext i32 @mul_i32_4100(i32 %a) {
1041; LA32-LABEL: mul_i32_4100:
1042; LA32:       # %bb.0:
1043; LA32-NEXT:    slli.w $a1, $a0, 12
1044; LA32-NEXT:    alsl.w $a0, $a0, $a1, 2
1045; LA32-NEXT:    ret
1046;
1047; LA64-LABEL: mul_i32_4100:
1048; LA64:       # %bb.0:
1049; LA64-NEXT:    slli.d $a1, $a0, 12
1050; LA64-NEXT:    alsl.w $a0, $a0, $a1, 2
1051; LA64-NEXT:    ret
1052  %b = mul i32 %a, 4100
1053  ret i32 %b
1054}
1055
1056define signext i32 @mul_i32_4104(i32 %a) {
1057; LA32-LABEL: mul_i32_4104:
1058; LA32:       # %bb.0:
1059; LA32-NEXT:    slli.w $a1, $a0, 12
1060; LA32-NEXT:    alsl.w $a0, $a0, $a1, 3
1061; LA32-NEXT:    ret
1062;
1063; LA64-LABEL: mul_i32_4104:
1064; LA64:       # %bb.0:
1065; LA64-NEXT:    slli.d $a1, $a0, 12
1066; LA64-NEXT:    alsl.w $a0, $a0, $a1, 3
1067; LA64-NEXT:    ret
1068  %b = mul i32 %a, 4104
1069  ret i32 %b
1070}
1071
1072define signext i32 @mul_i32_4112(i32 %a) {
1073; LA32-LABEL: mul_i32_4112:
1074; LA32:       # %bb.0:
1075; LA32-NEXT:    slli.w $a1, $a0, 12
1076; LA32-NEXT:    alsl.w $a0, $a0, $a1, 4
1077; LA32-NEXT:    ret
1078;
1079; LA64-LABEL: mul_i32_4112:
1080; LA64:       # %bb.0:
1081; LA64-NEXT:    slli.d $a1, $a0, 12
1082; LA64-NEXT:    alsl.w $a0, $a0, $a1, 4
1083; LA64-NEXT:    ret
1084  %b = mul i32 %a, 4112
1085  ret i32 %b
1086}
1087
1088define i64 @mul_i64_4098(i64 %a) {
1089; LA32-LABEL: mul_i64_4098:
1090; LA32:       # %bb.0:
1091; LA32-NEXT:    lu12i.w $a2, 1
1092; LA32-NEXT:    ori $a2, $a2, 2
1093; LA32-NEXT:    mul.w $a1, $a1, $a2
1094; LA32-NEXT:    mulh.wu $a3, $a0, $a2
1095; LA32-NEXT:    add.w $a1, $a3, $a1
1096; LA32-NEXT:    mul.w $a0, $a0, $a2
1097; LA32-NEXT:    ret
1098;
1099; LA64-LABEL: mul_i64_4098:
1100; LA64:       # %bb.0:
1101; LA64-NEXT:    slli.d $a1, $a0, 12
1102; LA64-NEXT:    alsl.d $a0, $a0, $a1, 1
1103; LA64-NEXT:    ret
1104  %b = mul i64 %a, 4098
1105  ret i64 %b
1106}
1107
1108define i64 @mul_i64_4100(i64 %a) {
1109; LA32-LABEL: mul_i64_4100:
1110; LA32:       # %bb.0:
1111; LA32-NEXT:    lu12i.w $a2, 1
1112; LA32-NEXT:    ori $a2, $a2, 4
1113; LA32-NEXT:    mul.w $a1, $a1, $a2
1114; LA32-NEXT:    mulh.wu $a3, $a0, $a2
1115; LA32-NEXT:    add.w $a1, $a3, $a1
1116; LA32-NEXT:    mul.w $a0, $a0, $a2
1117; LA32-NEXT:    ret
1118;
1119; LA64-LABEL: mul_i64_4100:
1120; LA64:       # %bb.0:
1121; LA64-NEXT:    slli.d $a1, $a0, 12
1122; LA64-NEXT:    alsl.d $a0, $a0, $a1, 2
1123; LA64-NEXT:    ret
1124  %b = mul i64 %a, 4100
1125  ret i64 %b
1126}
1127
1128define i64 @mul_i64_4104(i64 %a) {
1129; LA32-LABEL: mul_i64_4104:
1130; LA32:       # %bb.0:
1131; LA32-NEXT:    lu12i.w $a2, 1
1132; LA32-NEXT:    ori $a2, $a2, 8
1133; LA32-NEXT:    mul.w $a1, $a1, $a2
1134; LA32-NEXT:    mulh.wu $a3, $a0, $a2
1135; LA32-NEXT:    add.w $a1, $a3, $a1
1136; LA32-NEXT:    mul.w $a0, $a0, $a2
1137; LA32-NEXT:    ret
1138;
1139; LA64-LABEL: mul_i64_4104:
1140; LA64:       # %bb.0:
1141; LA64-NEXT:    slli.d $a1, $a0, 12
1142; LA64-NEXT:    alsl.d $a0, $a0, $a1, 3
1143; LA64-NEXT:    ret
1144  %b = mul i64 %a, 4104
1145  ret i64 %b
1146}
1147
1148define i64 @mul_i64_4112(i64 %a) {
1149; LA32-LABEL: mul_i64_4112:
1150; LA32:       # %bb.0:
1151; LA32-NEXT:    lu12i.w $a2, 1
1152; LA32-NEXT:    ori $a2, $a2, 16
1153; LA32-NEXT:    mul.w $a1, $a1, $a2
1154; LA32-NEXT:    mulh.wu $a3, $a0, $a2
1155; LA32-NEXT:    add.w $a1, $a3, $a1
1156; LA32-NEXT:    mul.w $a0, $a0, $a2
1157; LA32-NEXT:    ret
1158;
1159; LA64-LABEL: mul_i64_4112:
1160; LA64:       # %bb.0:
1161; LA64-NEXT:    slli.d $a1, $a0, 12
1162; LA64-NEXT:    alsl.d $a0, $a0, $a1, 4
1163; LA64-NEXT:    ret
1164  %b = mul i64 %a, 4112
1165  ret i64 %b
1166}
1167
1168define signext i32 @mul_i32_768(i32 %a) {
1169; LA32-LABEL: mul_i32_768:
1170; LA32:       # %bb.0:
1171; LA32-NEXT:    alsl.w $a0, $a0, $a0, 1
1172; LA32-NEXT:    slli.w $a0, $a0, 8
1173; LA32-NEXT:    ret
1174;
1175; LA64-LABEL: mul_i32_768:
1176; LA64:       # %bb.0:
1177; LA64-NEXT:    alsl.w $a0, $a0, $a0, 1
1178; LA64-NEXT:    slli.w $a0, $a0, 8
1179; LA64-NEXT:    ret
1180  %b = mul i32 %a, 768
1181  ret i32 %b
1182}
1183
1184define signext i32 @mul_i32_1280(i32 %a) {
1185; LA32-LABEL: mul_i32_1280:
1186; LA32:       # %bb.0:
1187; LA32-NEXT:    alsl.w $a0, $a0, $a0, 2
1188; LA32-NEXT:    slli.w $a0, $a0, 8
1189; LA32-NEXT:    ret
1190;
1191; LA64-LABEL: mul_i32_1280:
1192; LA64:       # %bb.0:
1193; LA64-NEXT:    alsl.w $a0, $a0, $a0, 2
1194; LA64-NEXT:    slli.w $a0, $a0, 8
1195; LA64-NEXT:    ret
1196  %b = mul i32 %a, 1280
1197  ret i32 %b
1198}
1199
1200define signext i32 @mul_i32_2304(i32 %a) {
1201; LA32-LABEL: mul_i32_2304:
1202; LA32:       # %bb.0:
1203; LA32-NEXT:    alsl.w $a0, $a0, $a0, 3
1204; LA32-NEXT:    slli.w $a0, $a0, 8
1205; LA32-NEXT:    ret
1206;
1207; LA64-LABEL: mul_i32_2304:
1208; LA64:       # %bb.0:
1209; LA64-NEXT:    alsl.w $a0, $a0, $a0, 3
1210; LA64-NEXT:    slli.w $a0, $a0, 8
1211; LA64-NEXT:    ret
1212  %b = mul i32 %a, 2304
1213  ret i32 %b
1214}
1215
1216define signext i32 @mul_i32_4352(i32 %a) {
1217; LA32-LABEL: mul_i32_4352:
1218; LA32:       # %bb.0:
1219; LA32-NEXT:    alsl.w $a0, $a0, $a0, 4
1220; LA32-NEXT:    slli.w $a0, $a0, 8
1221; LA32-NEXT:    ret
1222;
1223; LA64-LABEL: mul_i32_4352:
1224; LA64:       # %bb.0:
1225; LA64-NEXT:    alsl.w $a0, $a0, $a0, 4
1226; LA64-NEXT:    slli.w $a0, $a0, 8
1227; LA64-NEXT:    ret
1228  %b = mul i32 %a, 4352
1229  ret i32 %b
1230}
1231
1232define i64 @mul_i64_768(i64 %a) {
1233; LA32-LABEL: mul_i64_768:
1234; LA32:       # %bb.0:
1235; LA32-NEXT:    ori $a2, $zero, 768
1236; LA32-NEXT:    mul.w $a1, $a1, $a2
1237; LA32-NEXT:    mulh.wu $a3, $a0, $a2
1238; LA32-NEXT:    add.w $a1, $a3, $a1
1239; LA32-NEXT:    mul.w $a0, $a0, $a2
1240; LA32-NEXT:    ret
1241;
1242; LA64-LABEL: mul_i64_768:
1243; LA64:       # %bb.0:
1244; LA64-NEXT:    alsl.d $a0, $a0, $a0, 1
1245; LA64-NEXT:    slli.d $a0, $a0, 8
1246; LA64-NEXT:    ret
1247  %b = mul i64 %a, 768
1248  ret i64 %b
1249}
1250
1251define i64 @mul_i64_1280(i64 %a) {
1252; LA32-LABEL: mul_i64_1280:
1253; LA32:       # %bb.0:
1254; LA32-NEXT:    ori $a2, $zero, 1280
1255; LA32-NEXT:    mul.w $a1, $a1, $a2
1256; LA32-NEXT:    mulh.wu $a3, $a0, $a2
1257; LA32-NEXT:    add.w $a1, $a3, $a1
1258; LA32-NEXT:    mul.w $a0, $a0, $a2
1259; LA32-NEXT:    ret
1260;
1261; LA64-LABEL: mul_i64_1280:
1262; LA64:       # %bb.0:
1263; LA64-NEXT:    alsl.d $a0, $a0, $a0, 2
1264; LA64-NEXT:    slli.d $a0, $a0, 8
1265; LA64-NEXT:    ret
1266  %b = mul i64 %a, 1280
1267  ret i64 %b
1268}
1269
1270define i64 @mul_i64_2304(i64 %a) {
1271; LA32-LABEL: mul_i64_2304:
1272; LA32:       # %bb.0:
1273; LA32-NEXT:    ori $a2, $zero, 2304
1274; LA32-NEXT:    mul.w $a1, $a1, $a2
1275; LA32-NEXT:    mulh.wu $a3, $a0, $a2
1276; LA32-NEXT:    add.w $a1, $a3, $a1
1277; LA32-NEXT:    mul.w $a0, $a0, $a2
1278; LA32-NEXT:    ret
1279;
1280; LA64-LABEL: mul_i64_2304:
1281; LA64:       # %bb.0:
1282; LA64-NEXT:    alsl.d $a0, $a0, $a0, 3
1283; LA64-NEXT:    slli.d $a0, $a0, 8
1284; LA64-NEXT:    ret
1285  %b = mul i64 %a, 2304
1286  ret i64 %b
1287}
1288
1289define i64 @mul_i64_4352(i64 %a) {
1290; LA32-LABEL: mul_i64_4352:
1291; LA32:       # %bb.0:
1292; LA32-NEXT:    lu12i.w $a2, 1
1293; LA32-NEXT:    ori $a2, $a2, 256
1294; LA32-NEXT:    mul.w $a1, $a1, $a2
1295; LA32-NEXT:    mulh.wu $a3, $a0, $a2
1296; LA32-NEXT:    add.w $a1, $a3, $a1
1297; LA32-NEXT:    mul.w $a0, $a0, $a2
1298; LA32-NEXT:    ret
1299;
1300; LA64-LABEL: mul_i64_4352:
1301; LA64:       # %bb.0:
1302; LA64-NEXT:    alsl.d $a0, $a0, $a0, 4
1303; LA64-NEXT:    slli.d $a0, $a0, 8
1304; LA64-NEXT:    ret
1305  %b = mul i64 %a, 4352
1306  ret i64 %b
1307}
1308
1309define signext i32 @mul_i32_65792(i32 %a) {
1310; LA32-LABEL: mul_i32_65792:
1311; LA32:       # %bb.0:
1312; LA32-NEXT:    slli.w $a1, $a0, 8
1313; LA32-NEXT:    slli.w $a0, $a0, 16
1314; LA32-NEXT:    add.w $a0, $a0, $a1
1315; LA32-NEXT:    ret
1316;
1317; LA64-LABEL: mul_i32_65792:
1318; LA64:       # %bb.0:
1319; LA64-NEXT:    slli.d $a1, $a0, 8
1320; LA64-NEXT:    slli.d $a0, $a0, 16
1321; LA64-NEXT:    add.w $a0, $a0, $a1
1322; LA64-NEXT:    ret
1323  %b = mul i32 %a, 65792
1324  ret i32 %b
1325}
1326
1327define signext i32 @mul_i32_65280(i32 %a) {
1328; LA32-LABEL: mul_i32_65280:
1329; LA32:       # %bb.0:
1330; LA32-NEXT:    slli.w $a1, $a0, 8
1331; LA32-NEXT:    slli.w $a0, $a0, 16
1332; LA32-NEXT:    sub.w $a0, $a0, $a1
1333; LA32-NEXT:    ret
1334;
1335; LA64-LABEL: mul_i32_65280:
1336; LA64:       # %bb.0:
1337; LA64-NEXT:    slli.d $a1, $a0, 8
1338; LA64-NEXT:    slli.d $a0, $a0, 16
1339; LA64-NEXT:    sub.w $a0, $a0, $a1
1340; LA64-NEXT:    ret
1341  %b = mul i32 %a, 65280
1342  ret i32 %b
1343}
1344
1345define signext i32 @mul_i32_minus_65280(i32 %a) {
1346; LA32-LABEL: mul_i32_minus_65280:
1347; LA32:       # %bb.0:
1348; LA32-NEXT:    slli.w $a1, $a0, 16
1349; LA32-NEXT:    slli.w $a0, $a0, 8
1350; LA32-NEXT:    sub.w $a0, $a0, $a1
1351; LA32-NEXT:    ret
1352;
1353; LA64-LABEL: mul_i32_minus_65280:
1354; LA64:       # %bb.0:
1355; LA64-NEXT:    slli.d $a1, $a0, 16
1356; LA64-NEXT:    slli.d $a0, $a0, 8
1357; LA64-NEXT:    sub.w $a0, $a0, $a1
1358; LA64-NEXT:    ret
1359  %b = mul i32 %a, -65280
1360  ret i32 %b
1361}
1362
1363define i64 @mul_i64_65792(i64 %a) {
1364; LA32-LABEL: mul_i64_65792:
1365; LA32:       # %bb.0:
1366; LA32-NEXT:    lu12i.w $a2, 16
1367; LA32-NEXT:    ori $a2, $a2, 256
1368; LA32-NEXT:    mul.w $a1, $a1, $a2
1369; LA32-NEXT:    mulh.wu $a3, $a0, $a2
1370; LA32-NEXT:    add.w $a1, $a3, $a1
1371; LA32-NEXT:    mul.w $a0, $a0, $a2
1372; LA32-NEXT:    ret
1373;
1374; LA64-LABEL: mul_i64_65792:
1375; LA64:       # %bb.0:
1376; LA64-NEXT:    slli.d $a1, $a0, 8
1377; LA64-NEXT:    slli.d $a0, $a0, 16
1378; LA64-NEXT:    add.d $a0, $a0, $a1
1379; LA64-NEXT:    ret
1380  %b = mul i64 %a, 65792
1381  ret i64 %b
1382}
1383
1384define i64 @mul_i64_65280(i64 %a) {
1385; LA32-LABEL: mul_i64_65280:
1386; LA32:       # %bb.0:
1387; LA32-NEXT:    lu12i.w $a2, 15
1388; LA32-NEXT:    ori $a2, $a2, 3840
1389; LA32-NEXT:    mul.w $a1, $a1, $a2
1390; LA32-NEXT:    mulh.wu $a3, $a0, $a2
1391; LA32-NEXT:    add.w $a1, $a3, $a1
1392; LA32-NEXT:    mul.w $a0, $a0, $a2
1393; LA32-NEXT:    ret
1394;
1395; LA64-LABEL: mul_i64_65280:
1396; LA64:       # %bb.0:
1397; LA64-NEXT:    slli.d $a1, $a0, 8
1398; LA64-NEXT:    slli.d $a0, $a0, 16
1399; LA64-NEXT:    sub.d $a0, $a0, $a1
1400; LA64-NEXT:    ret
1401  %b = mul i64 %a, 65280
1402  ret i64 %b
1403}
1404
1405define i64 @mul_i64_minus_65280(i64 %a) {
1406; LA32-LABEL: mul_i64_minus_65280:
1407; LA32:       # %bb.0:
1408; LA32-NEXT:    lu12i.w $a2, -16
1409; LA32-NEXT:    ori $a2, $a2, 256
1410; LA32-NEXT:    mul.w $a1, $a1, $a2
1411; LA32-NEXT:    mulh.wu $a3, $a0, $a2
1412; LA32-NEXT:    sub.w $a3, $a3, $a0
1413; LA32-NEXT:    add.w $a1, $a3, $a1
1414; LA32-NEXT:    mul.w $a0, $a0, $a2
1415; LA32-NEXT:    ret
1416;
1417; LA64-LABEL: mul_i64_minus_65280:
1418; LA64:       # %bb.0:
1419; LA64-NEXT:    slli.d $a1, $a0, 16
1420; LA64-NEXT:    slli.d $a0, $a0, 8
1421; LA64-NEXT:    sub.d $a0, $a0, $a1
1422; LA64-NEXT:    ret
1423  %b = mul i64 %a, -65280
1424  ret i64 %b
1425}
1426
1427;; This multiplication is not transformed, due to
1428;; 1088 can be composed via a single ORI.
1429define i64 @mul_i64_1088(i64 %a) {
1430; LA32-LABEL: mul_i64_1088:
1431; LA32:       # %bb.0:
1432; LA32-NEXT:    ori $a2, $zero, 1088
1433; LA32-NEXT:    mul.w $a1, $a1, $a2
1434; LA32-NEXT:    mulh.wu $a3, $a0, $a2
1435; LA32-NEXT:    add.w $a1, $a3, $a1
1436; LA32-NEXT:    mul.w $a0, $a0, $a2
1437; LA32-NEXT:    ret
1438;
1439; LA64-LABEL: mul_i64_1088:
1440; LA64:       # %bb.0:
1441; LA64-NEXT:    alsl.d $a0, $a0, $a0, 4
1442; LA64-NEXT:    slli.d $a0, $a0, 6
1443; LA64-NEXT:    ret
1444  %b = mul i64 %a, 1088
1445  ret i64 %b
1446}
1447
1448;; This multiplication is not transformed, due to
1449;; -992 can be composed via a single ADDI.
1450define i64 @mul_i64_minus_992(i64 %a) {
1451; LA32-LABEL: mul_i64_minus_992:
1452; LA32:       # %bb.0:
1453; LA32-NEXT:    addi.w $a2, $zero, -992
1454; LA32-NEXT:    mul.w $a1, $a1, $a2
1455; LA32-NEXT:    mulh.wu $a3, $a0, $a2
1456; LA32-NEXT:    sub.w $a3, $a3, $a0
1457; LA32-NEXT:    add.w $a1, $a3, $a1
1458; LA32-NEXT:    mul.w $a0, $a0, $a2
1459; LA32-NEXT:    ret
1460;
1461; LA64-LABEL: mul_i64_minus_992:
1462; LA64:       # %bb.0:
1463; LA64-NEXT:    addi.w $a1, $zero, -992
1464; LA64-NEXT:    mul.d $a0, $a0, $a1
1465; LA64-NEXT:    ret
1466  %b = mul i64 %a, -992
1467  ret i64 %b
1468}
1469
1470;; This multiplication is not transformed, due to
1471;; 4456448 can be composed via a single LUI.
1472define i64 @mul_i64_4456448(i64 %a) {
1473; LA32-LABEL: mul_i64_4456448:
1474; LA32:       # %bb.0:
1475; LA32-NEXT:    lu12i.w $a2, 1088
1476; LA32-NEXT:    mul.w $a1, $a1, $a2
1477; LA32-NEXT:    mulh.wu $a3, $a0, $a2
1478; LA32-NEXT:    add.w $a1, $a3, $a1
1479; LA32-NEXT:    mul.w $a0, $a0, $a2
1480; LA32-NEXT:    ret
1481;
1482; LA64-LABEL: mul_i64_4456448:
1483; LA64:       # %bb.0:
1484; LA64-NEXT:    alsl.d $a0, $a0, $a0, 4
1485; LA64-NEXT:    slli.d $a0, $a0, 18
1486; LA64-NEXT:    ret
1487  %b = mul i64 %a, 4456448
1488  ret i64 %b
1489}
1490
1491;; This multiplication is not transformed, due to
1492;; 65280 is used multiple times.
1493define i64 @mul_i64_65280_twice(i64 %a, i64 %b) {
1494; LA32-LABEL: mul_i64_65280_twice:
1495; LA32:       # %bb.0:
1496; LA32-NEXT:    lu12i.w $a4, 15
1497; LA32-NEXT:    ori $a4, $a4, 3840
1498; LA32-NEXT:    mul.w $a1, $a1, $a4
1499; LA32-NEXT:    mulh.wu $a5, $a0, $a4
1500; LA32-NEXT:    add.w $a1, $a5, $a1
1501; LA32-NEXT:    mul.w $a0, $a0, $a4
1502; LA32-NEXT:    mul.w $a3, $a3, $a4
1503; LA32-NEXT:    mulh.wu $a5, $a2, $a4
1504; LA32-NEXT:    add.w $a3, $a5, $a3
1505; LA32-NEXT:    mul.w $a2, $a2, $a4
1506; LA32-NEXT:    xor $a1, $a1, $a3
1507; LA32-NEXT:    xor $a0, $a0, $a2
1508; LA32-NEXT:    ret
1509;
1510; LA64-LABEL: mul_i64_65280_twice:
1511; LA64:       # %bb.0:
1512; LA64-NEXT:    lu12i.w $a2, 15
1513; LA64-NEXT:    ori $a2, $a2, 3840
1514; LA64-NEXT:    mul.d $a0, $a0, $a2
1515; LA64-NEXT:    mul.d $a1, $a1, $a2
1516; LA64-NEXT:    xor $a0, $a0, $a1
1517; LA64-NEXT:    ret
1518  %c = mul i64 %a, 65280
1519  %d = mul i64 %b, 65280
1520  %e = xor i64 %c, %d
1521  ret i64 %e
1522}
1523