2205 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc --mtriple=loongarch32 -mattr=-32s,+d < %s | FileCheck %s --check-prefix=LA32R3; RUN: llc --mtriple=loongarch32 -mattr=+32s,+d < %s | FileCheck %s --check-prefix=LA32S4; RUN: llc --mtriple=loongarch64 -mattr=+d < %s | FileCheck %s --check-prefix=LA645 6;; Exercise the 'mul' LLVM IR: https://llvm.org/docs/LangRef.html#mul-instruction7 8define i1 @mul_i1(i1 %a, i1 %b) {9; LA32R-LABEL: mul_i1:10; LA32R: # %bb.0: # %entry11; LA32R-NEXT: and $a0, $a0, $a112; LA32R-NEXT: ret13;14; LA32S-LABEL: mul_i1:15; LA32S: # %bb.0: # %entry16; LA32S-NEXT: and $a0, $a0, $a117; LA32S-NEXT: ret18;19; LA64-LABEL: mul_i1:20; LA64: # %bb.0: # %entry21; LA64-NEXT: and $a0, $a0, $a122; LA64-NEXT: ret23entry:24 %r = mul i1 %a, %b25 ret i1 %r26}27 28define i8 @mul_i8(i8 %a, i8 %b) {29; LA32R-LABEL: mul_i8:30; LA32R: # %bb.0: # %entry31; LA32R-NEXT: mul.w $a0, $a0, $a132; LA32R-NEXT: ret33;34; LA32S-LABEL: mul_i8:35; LA32S: # %bb.0: # %entry36; LA32S-NEXT: mul.w $a0, $a0, $a137; LA32S-NEXT: ret38;39; LA64-LABEL: mul_i8:40; LA64: # %bb.0: # %entry41; LA64-NEXT: mul.d $a0, $a0, $a142; LA64-NEXT: ret43entry:44 %r = mul i8 %a, %b45 ret i8 %r46}47 48define i16 @mul_i16(i16 %a, i16 %b) {49; LA32R-LABEL: mul_i16:50; LA32R: # %bb.0: # %entry51; LA32R-NEXT: mul.w $a0, $a0, $a152; LA32R-NEXT: ret53;54; LA32S-LABEL: mul_i16:55; LA32S: # %bb.0: # %entry56; LA32S-NEXT: mul.w $a0, $a0, $a157; LA32S-NEXT: ret58;59; LA64-LABEL: mul_i16:60; LA64: # %bb.0: # %entry61; LA64-NEXT: mul.d $a0, $a0, $a162; LA64-NEXT: ret63entry:64 %r = mul i16 %a, %b65 ret i16 %r66}67 68define i32 @mul_i32(i32 %a, i32 %b) {69; LA32R-LABEL: mul_i32:70; LA32R: # %bb.0: # %entry71; LA32R-NEXT: mul.w $a0, $a0, $a172; LA32R-NEXT: ret73;74; LA32S-LABEL: mul_i32:75; LA32S: # %bb.0: # %entry76; LA32S-NEXT: mul.w $a0, $a0, $a177; LA32S-NEXT: ret78;79; LA64-LABEL: mul_i32:80; LA64: # %bb.0: # %entry81; LA64-NEXT: mul.d $a0, $a0, $a182; LA64-NEXT: ret83entry:84 %r = mul i32 %a, %b85 ret i32 %r86}87 88define i64 @mul_i64(i64 %a, i64 %b) {89; LA32R-LABEL: mul_i64:90; LA32R: # %bb.0: # %entry91; LA32R-NEXT: mul.w $a3, $a0, $a392; LA32R-NEXT: mulh.wu $a4, $a0, $a293; LA32R-NEXT: add.w $a3, $a4, $a394; LA32R-NEXT: mul.w $a1, $a1, $a295; LA32R-NEXT: add.w $a1, $a3, $a196; LA32R-NEXT: mul.w $a0, $a0, $a297; LA32R-NEXT: ret98;99; LA32S-LABEL: mul_i64:100; LA32S: # %bb.0: # %entry101; LA32S-NEXT: mul.w $a3, $a0, $a3102; LA32S-NEXT: mulh.wu $a4, $a0, $a2103; LA32S-NEXT: add.w $a3, $a4, $a3104; LA32S-NEXT: mul.w $a1, $a1, $a2105; LA32S-NEXT: add.w $a1, $a3, $a1106; LA32S-NEXT: mul.w $a0, $a0, $a2107; LA32S-NEXT: ret108;109; LA64-LABEL: mul_i64:110; LA64: # %bb.0: # %entry111; LA64-NEXT: mul.d $a0, $a0, $a1112; LA64-NEXT: ret113entry:114 %r = mul i64 %a, %b115 ret i64 %r116}117 118define i64 @mul_pow2(i64 %a) {119; LA32R-LABEL: mul_pow2:120; LA32R: # %bb.0:121; LA32R-NEXT: srli.w $a2, $a0, 29122; LA32R-NEXT: slli.w $a1, $a1, 3123; LA32R-NEXT: or $a1, $a1, $a2124; LA32R-NEXT: slli.w $a0, $a0, 3125; LA32R-NEXT: ret126;127; LA32S-LABEL: mul_pow2:128; LA32S: # %bb.0:129; LA32S-NEXT: srli.w $a2, $a0, 29130; LA32S-NEXT: slli.w $a1, $a1, 3131; LA32S-NEXT: or $a1, $a1, $a2132; LA32S-NEXT: slli.w $a0, $a0, 3133; LA32S-NEXT: ret134;135; LA64-LABEL: mul_pow2:136; LA64: # %bb.0:137; LA64-NEXT: slli.d $a0, $a0, 3138; LA64-NEXT: ret139 %1 = mul i64 %a, 8140 ret i64 %1141}142 143define i64 @mul_p5(i64 %a) {144; LA32R-LABEL: mul_p5:145; LA32R: # %bb.0:146; LA32R-NEXT: ori $a2, $zero, 5147; LA32R-NEXT: mulh.wu $a2, $a0, $a2148; LA32R-NEXT: slli.w $a3, $a1, 2149; LA32R-NEXT: add.w $a1, $a3, $a1150; LA32R-NEXT: add.w $a1, $a2, $a1151; LA32R-NEXT: slli.w $a2, $a0, 2152; LA32R-NEXT: add.w $a0, $a2, $a0153; LA32R-NEXT: ret154;155; LA32S-LABEL: mul_p5:156; LA32S: # %bb.0:157; LA32S-NEXT: ori $a2, $zero, 5158; LA32S-NEXT: mulh.wu $a2, $a0, $a2159; LA32S-NEXT: alsl.w $a1, $a1, $a1, 2160; LA32S-NEXT: add.w $a1, $a2, $a1161; LA32S-NEXT: alsl.w $a0, $a0, $a0, 2162; LA32S-NEXT: ret163;164; LA64-LABEL: mul_p5:165; LA64: # %bb.0:166; LA64-NEXT: alsl.d $a0, $a0, $a0, 2167; LA64-NEXT: ret168 %1 = mul i64 %a, 5169 ret i64 %1170}171 172define i32 @mulh_w(i32 %a, i32 %b) {173; LA32R-LABEL: mulh_w:174; LA32R: # %bb.0:175; LA32R-NEXT: mulh.w $a0, $a0, $a1176; LA32R-NEXT: ret177;178; LA32S-LABEL: mulh_w:179; LA32S: # %bb.0:180; LA32S-NEXT: mulh.w $a0, $a0, $a1181; LA32S-NEXT: ret182;183; LA64-LABEL: mulh_w:184; LA64: # %bb.0:185; LA64-NEXT: mulw.d.w $a0, $a0, $a1186; LA64-NEXT: srli.d $a0, $a0, 32187; LA64-NEXT: ret188 %1 = sext i32 %a to i64189 %2 = sext i32 %b to i64190 %3 = mul i64 %1, %2191 %4 = lshr i64 %3, 32192 %5 = trunc i64 %4 to i32193 ret i32 %5194}195 196define i32 @mulh_wu(i32 %a, i32 %b) {197; LA32R-LABEL: mulh_wu:198; LA32R: # %bb.0:199; LA32R-NEXT: mulh.wu $a0, $a0, $a1200; LA32R-NEXT: ret201;202; LA32S-LABEL: mulh_wu:203; LA32S: # %bb.0:204; LA32S-NEXT: mulh.wu $a0, $a0, $a1205; LA32S-NEXT: ret206;207; LA64-LABEL: mulh_wu:208; LA64: # %bb.0:209; LA64-NEXT: mulw.d.wu $a0, $a0, $a1210; LA64-NEXT: srli.d $a0, $a0, 32211; LA64-NEXT: ret212 %1 = zext i32 %a to i64213 %2 = zext i32 %b to i64214 %3 = mul i64 %1, %2215 %4 = lshr i64 %3, 32216 %5 = trunc i64 %4 to i32217 ret i32 %5218}219 220define i64 @mulh_d(i64 %a, i64 %b) {221; LA32R-LABEL: mulh_d:222; LA32R: # %bb.0:223; LA32R-NEXT: srai.w $a5, $a1, 31224; LA32R-NEXT: srai.w $a6, $a3, 31225; LA32R-NEXT: mulh.wu $a4, $a0, $a2226; LA32R-NEXT: mul.w $a7, $a1, $a2227; LA32R-NEXT: add.w $a4, $a7, $a4228; LA32R-NEXT: sltu $a7, $a4, $a7229; LA32R-NEXT: mulh.wu $t0, $a1, $a2230; LA32R-NEXT: add.w $a7, $t0, $a7231; LA32R-NEXT: mul.w $t0, $a0, $a3232; LA32R-NEXT: add.w $a4, $t0, $a4233; LA32R-NEXT: sltu $a4, $a4, $t0234; LA32R-NEXT: mulh.wu $t0, $a0, $a3235; LA32R-NEXT: add.w $a4, $t0, $a4236; LA32R-NEXT: add.w $t0, $a7, $a4237; LA32R-NEXT: mul.w $t1, $a1, $a3238; LA32R-NEXT: add.w $t2, $t1, $t0239; LA32R-NEXT: mul.w $t3, $a2, $a5240; LA32R-NEXT: mul.w $t4, $a6, $a0241; LA32R-NEXT: add.w $t5, $t4, $t3242; LA32R-NEXT: add.w $a4, $t2, $t5243; LA32R-NEXT: sltu $t6, $a4, $t2244; LA32R-NEXT: sltu $t1, $t2, $t1245; LA32R-NEXT: sltu $a7, $t0, $a7246; LA32R-NEXT: mulh.wu $t0, $a1, $a3247; LA32R-NEXT: add.w $a7, $t0, $a7248; LA32R-NEXT: add.w $a7, $a7, $t1249; LA32R-NEXT: mulh.wu $a2, $a2, $a5250; LA32R-NEXT: add.w $a2, $a2, $t3251; LA32R-NEXT: mul.w $a3, $a3, $a5252; LA32R-NEXT: add.w $a2, $a2, $a3253; LA32R-NEXT: mul.w $a1, $a6, $a1254; LA32R-NEXT: mulh.wu $a0, $a6, $a0255; LA32R-NEXT: add.w $a0, $a0, $a1256; LA32R-NEXT: add.w $a0, $a0, $t4257; LA32R-NEXT: add.w $a0, $a0, $a2258; LA32R-NEXT: sltu $a1, $t5, $t4259; LA32R-NEXT: add.w $a0, $a0, $a1260; LA32R-NEXT: add.w $a0, $a7, $a0261; LA32R-NEXT: add.w $a1, $a0, $t6262; LA32R-NEXT: move $a0, $a4263; LA32R-NEXT: ret264;265; LA32S-LABEL: mulh_d:266; LA32S: # %bb.0:267; LA32S-NEXT: srai.w $a5, $a1, 31268; LA32S-NEXT: srai.w $a6, $a3, 31269; LA32S-NEXT: mulh.wu $a4, $a0, $a2270; LA32S-NEXT: mul.w $a7, $a1, $a2271; LA32S-NEXT: add.w $a4, $a7, $a4272; LA32S-NEXT: sltu $a7, $a4, $a7273; LA32S-NEXT: mulh.wu $t0, $a1, $a2274; LA32S-NEXT: add.w $a7, $t0, $a7275; LA32S-NEXT: mul.w $t0, $a0, $a3276; LA32S-NEXT: add.w $a4, $t0, $a4277; LA32S-NEXT: sltu $a4, $a4, $t0278; LA32S-NEXT: mulh.wu $t0, $a0, $a3279; LA32S-NEXT: add.w $a4, $t0, $a4280; LA32S-NEXT: add.w $t0, $a7, $a4281; LA32S-NEXT: mul.w $t1, $a1, $a3282; LA32S-NEXT: add.w $t2, $t1, $t0283; LA32S-NEXT: mul.w $t3, $a2, $a5284; LA32S-NEXT: mul.w $t4, $a6, $a0285; LA32S-NEXT: add.w $t5, $t4, $t3286; LA32S-NEXT: add.w $a4, $t2, $t5287; LA32S-NEXT: sltu $t6, $a4, $t2288; LA32S-NEXT: sltu $t1, $t2, $t1289; LA32S-NEXT: sltu $a7, $t0, $a7290; LA32S-NEXT: mulh.wu $t0, $a1, $a3291; LA32S-NEXT: add.w $a7, $t0, $a7292; LA32S-NEXT: add.w $a7, $a7, $t1293; LA32S-NEXT: mulh.wu $a2, $a2, $a5294; LA32S-NEXT: add.w $a2, $a2, $t3295; LA32S-NEXT: mul.w $a3, $a3, $a5296; LA32S-NEXT: add.w $a2, $a2, $a3297; LA32S-NEXT: mul.w $a1, $a6, $a1298; LA32S-NEXT: mulh.wu $a0, $a6, $a0299; LA32S-NEXT: add.w $a0, $a0, $a1300; LA32S-NEXT: add.w $a0, $a0, $t4301; LA32S-NEXT: add.w $a0, $a0, $a2302; LA32S-NEXT: sltu $a1, $t5, $t4303; LA32S-NEXT: add.w $a0, $a0, $a1304; LA32S-NEXT: add.w $a0, $a7, $a0305; LA32S-NEXT: add.w $a1, $a0, $t6306; LA32S-NEXT: move $a0, $a4307; LA32S-NEXT: ret308;309; LA64-LABEL: mulh_d:310; LA64: # %bb.0:311; LA64-NEXT: mulh.d $a0, $a0, $a1312; LA64-NEXT: ret313 %1 = sext i64 %a to i128314 %2 = sext i64 %b to i128315 %3 = mul i128 %1, %2316 %4 = lshr i128 %3, 64317 %5 = trunc i128 %4 to i64318 ret i64 %5319}320 321define i64 @mulh_du(i64 %a, i64 %b) {322; LA32R-LABEL: mulh_du:323; LA32R: # %bb.0:324; LA32R-NEXT: mulh.wu $a4, $a0, $a2325; LA32R-NEXT: mul.w $a5, $a1, $a2326; LA32R-NEXT: add.w $a4, $a5, $a4327; LA32R-NEXT: sltu $a5, $a4, $a5328; LA32R-NEXT: mulh.wu $a2, $a1, $a2329; LA32R-NEXT: add.w $a2, $a2, $a5330; LA32R-NEXT: mul.w $a5, $a0, $a3331; LA32R-NEXT: add.w $a4, $a5, $a4332; LA32R-NEXT: sltu $a4, $a4, $a5333; LA32R-NEXT: mulh.wu $a0, $a0, $a3334; LA32R-NEXT: add.w $a0, $a0, $a4335; LA32R-NEXT: add.w $a4, $a2, $a0336; LA32R-NEXT: mul.w $a5, $a1, $a3337; LA32R-NEXT: add.w $a0, $a5, $a4338; LA32R-NEXT: sltu $a5, $a0, $a5339; LA32R-NEXT: sltu $a2, $a4, $a2340; LA32R-NEXT: mulh.wu $a1, $a1, $a3341; LA32R-NEXT: add.w $a1, $a1, $a2342; LA32R-NEXT: add.w $a1, $a1, $a5343; LA32R-NEXT: ret344;345; LA32S-LABEL: mulh_du:346; LA32S: # %bb.0:347; LA32S-NEXT: mulh.wu $a4, $a0, $a2348; LA32S-NEXT: mul.w $a5, $a1, $a2349; LA32S-NEXT: add.w $a4, $a5, $a4350; LA32S-NEXT: sltu $a5, $a4, $a5351; LA32S-NEXT: mulh.wu $a2, $a1, $a2352; LA32S-NEXT: add.w $a2, $a2, $a5353; LA32S-NEXT: mul.w $a5, $a0, $a3354; LA32S-NEXT: add.w $a4, $a5, $a4355; LA32S-NEXT: sltu $a4, $a4, $a5356; LA32S-NEXT: mulh.wu $a0, $a0, $a3357; LA32S-NEXT: add.w $a0, $a0, $a4358; LA32S-NEXT: add.w $a4, $a2, $a0359; LA32S-NEXT: mul.w $a5, $a1, $a3360; LA32S-NEXT: add.w $a0, $a5, $a4361; LA32S-NEXT: sltu $a5, $a0, $a5362; LA32S-NEXT: sltu $a2, $a4, $a2363; LA32S-NEXT: mulh.wu $a1, $a1, $a3364; LA32S-NEXT: add.w $a1, $a1, $a2365; LA32S-NEXT: add.w $a1, $a1, $a5366; LA32S-NEXT: ret367;368; LA64-LABEL: mulh_du:369; LA64: # %bb.0:370; LA64-NEXT: mulh.du $a0, $a0, $a1371; LA64-NEXT: ret372 %1 = zext i64 %a to i128373 %2 = zext i64 %b to i128374 %3 = mul i128 %1, %2375 %4 = lshr i128 %3, 64376 %5 = trunc i128 %4 to i64377 ret i64 %5378}379 380define i64 @mulw_d_w(i32 %a, i32 %b) {381; LA32R-LABEL: mulw_d_w:382; LA32R: # %bb.0:383; LA32R-NEXT: mul.w $a2, $a0, $a1384; LA32R-NEXT: mulh.w $a1, $a0, $a1385; LA32R-NEXT: move $a0, $a2386; LA32R-NEXT: ret387;388; LA32S-LABEL: mulw_d_w:389; LA32S: # %bb.0:390; LA32S-NEXT: mul.w $a2, $a0, $a1391; LA32S-NEXT: mulh.w $a1, $a0, $a1392; LA32S-NEXT: move $a0, $a2393; LA32S-NEXT: ret394;395; LA64-LABEL: mulw_d_w:396; LA64: # %bb.0:397; LA64-NEXT: mulw.d.w $a0, $a0, $a1398; LA64-NEXT: ret399 %1 = sext i32 %a to i64400 %2 = sext i32 %b to i64401 %3 = mul i64 %1, %2402 ret i64 %3403}404 405define i64 @mulw_d_wu(i32 %a, i32 %b) {406; LA32R-LABEL: mulw_d_wu:407; LA32R: # %bb.0:408; LA32R-NEXT: mul.w $a2, $a0, $a1409; LA32R-NEXT: mulh.wu $a1, $a0, $a1410; LA32R-NEXT: move $a0, $a2411; LA32R-NEXT: ret412;413; LA32S-LABEL: mulw_d_wu:414; LA32S: # %bb.0:415; LA32S-NEXT: mul.w $a2, $a0, $a1416; LA32S-NEXT: mulh.wu $a1, $a0, $a1417; LA32S-NEXT: move $a0, $a2418; LA32S-NEXT: ret419;420; LA64-LABEL: mulw_d_wu:421; LA64: # %bb.0:422; LA64-NEXT: mulw.d.wu $a0, $a0, $a1423; LA64-NEXT: ret424 %1 = zext i32 %a to i64425 %2 = zext i32 %b to i64426 %3 = mul i64 %1, %2427 ret i64 %3428}429 430define signext i32 @mul_i32_11(i32 %a) {431; LA32R-LABEL: mul_i32_11:432; LA32R: # %bb.0:433; LA32R-NEXT: ori $a1, $zero, 11434; LA32R-NEXT: mul.w $a0, $a0, $a1435; LA32R-NEXT: ret436;437; LA32S-LABEL: mul_i32_11:438; LA32S: # %bb.0:439; LA32S-NEXT: alsl.w $a1, $a0, $a0, 2440; LA32S-NEXT: alsl.w $a0, $a1, $a0, 1441; LA32S-NEXT: ret442;443; LA64-LABEL: mul_i32_11:444; LA64: # %bb.0:445; LA64-NEXT: alsl.w $a1, $a0, $a0, 2446; LA64-NEXT: alsl.w $a0, $a1, $a0, 1447; LA64-NEXT: ret448 %b = mul i32 %a, 11449 ret i32 %b450}451 452define signext i32 @mul_i32_13(i32 %a) {453; LA32R-LABEL: mul_i32_13:454; LA32R: # %bb.0:455; LA32R-NEXT: ori $a1, $zero, 13456; LA32R-NEXT: mul.w $a0, $a0, $a1457; LA32R-NEXT: ret458;459; LA32S-LABEL: mul_i32_13:460; LA32S: # %bb.0:461; LA32S-NEXT: alsl.w $a1, $a0, $a0, 1462; LA32S-NEXT: alsl.w $a0, $a1, $a0, 2463; LA32S-NEXT: ret464;465; LA64-LABEL: mul_i32_13:466; LA64: # %bb.0:467; LA64-NEXT: alsl.w $a1, $a0, $a0, 1468; LA64-NEXT: alsl.w $a0, $a1, $a0, 2469; LA64-NEXT: ret470 %b = mul i32 %a, 13471 ret i32 %b472}473 474define signext i32 @mul_i32_19(i32 %a) {475; LA32R-LABEL: mul_i32_19:476; LA32R: # %bb.0:477; LA32R-NEXT: ori $a1, $zero, 19478; LA32R-NEXT: mul.w $a0, $a0, $a1479; LA32R-NEXT: ret480;481; LA32S-LABEL: mul_i32_19:482; LA32S: # %bb.0:483; LA32S-NEXT: alsl.w $a1, $a0, $a0, 3484; LA32S-NEXT: alsl.w $a0, $a1, $a0, 1485; LA32S-NEXT: ret486;487; LA64-LABEL: mul_i32_19:488; LA64: # %bb.0:489; LA64-NEXT: alsl.w $a1, $a0, $a0, 3490; LA64-NEXT: alsl.w $a0, $a1, $a0, 1491; LA64-NEXT: ret492 %b = mul i32 %a, 19493 ret i32 %b494}495 496define signext i32 @mul_i32_21(i32 %a) {497; LA32R-LABEL: mul_i32_21:498; LA32R: # %bb.0:499; LA32R-NEXT: ori $a1, $zero, 21500; LA32R-NEXT: mul.w $a0, $a0, $a1501; LA32R-NEXT: ret502;503; LA32S-LABEL: mul_i32_21:504; LA32S: # %bb.0:505; LA32S-NEXT: alsl.w $a1, $a0, $a0, 2506; LA32S-NEXT: alsl.w $a0, $a1, $a0, 2507; LA32S-NEXT: ret508;509; LA64-LABEL: mul_i32_21:510; LA64: # %bb.0:511; LA64-NEXT: alsl.w $a1, $a0, $a0, 2512; LA64-NEXT: alsl.w $a0, $a1, $a0, 2513; LA64-NEXT: ret514 %b = mul i32 %a, 21515 ret i32 %b516}517 518define signext i32 @mul_i32_25(i32 %a) {519; LA32R-LABEL: mul_i32_25:520; LA32R: # %bb.0:521; LA32R-NEXT: ori $a1, $zero, 25522; LA32R-NEXT: mul.w $a0, $a0, $a1523; LA32R-NEXT: ret524;525; LA32S-LABEL: mul_i32_25:526; LA32S: # %bb.0:527; LA32S-NEXT: alsl.w $a1, $a0, $a0, 1528; LA32S-NEXT: alsl.w $a0, $a1, $a0, 3529; LA32S-NEXT: ret530;531; LA64-LABEL: mul_i32_25:532; LA64: # %bb.0:533; LA64-NEXT: alsl.w $a1, $a0, $a0, 1534; LA64-NEXT: alsl.w $a0, $a1, $a0, 3535; LA64-NEXT: ret536 %b = mul i32 %a, 25537 ret i32 %b538}539 540define signext i32 @mul_i32_27(i32 %a) {541; LA32R-LABEL: mul_i32_27:542; LA32R: # %bb.0:543; LA32R-NEXT: ori $a1, $zero, 27544; LA32R-NEXT: mul.w $a0, $a0, $a1545; LA32R-NEXT: ret546;547; LA32S-LABEL: mul_i32_27:548; LA32S: # %bb.0:549; LA32S-NEXT: alsl.w $a0, $a0, $a0, 1550; LA32S-NEXT: alsl.w $a0, $a0, $a0, 3551; LA32S-NEXT: ret552;553; LA64-LABEL: mul_i32_27:554; LA64: # %bb.0:555; LA64-NEXT: alsl.w $a0, $a0, $a0, 1556; LA64-NEXT: alsl.w $a0, $a0, $a0, 3557; LA64-NEXT: ret558 %b = mul i32 %a, 27559 ret i32 %b560}561 562define signext i32 @mul_i32_35(i32 %a) {563; LA32R-LABEL: mul_i32_35:564; LA32R: # %bb.0:565; LA32R-NEXT: ori $a1, $zero, 35566; LA32R-NEXT: mul.w $a0, $a0, $a1567; LA32R-NEXT: ret568;569; LA32S-LABEL: mul_i32_35:570; LA32S: # %bb.0:571; LA32S-NEXT: alsl.w $a1, $a0, $a0, 4572; LA32S-NEXT: alsl.w $a0, $a1, $a0, 1573; LA32S-NEXT: ret574;575; LA64-LABEL: mul_i32_35:576; LA64: # %bb.0:577; LA64-NEXT: alsl.w $a1, $a0, $a0, 4578; LA64-NEXT: alsl.w $a0, $a1, $a0, 1579; LA64-NEXT: ret580 %b = mul i32 %a, 35581 ret i32 %b582}583 584define signext i32 @mul_i32_37(i32 %a) {585; LA32R-LABEL: mul_i32_37:586; LA32R: # %bb.0:587; LA32R-NEXT: ori $a1, $zero, 37588; LA32R-NEXT: mul.w $a0, $a0, $a1589; LA32R-NEXT: ret590;591; LA32S-LABEL: mul_i32_37:592; LA32S: # %bb.0:593; LA32S-NEXT: alsl.w $a1, $a0, $a0, 3594; LA32S-NEXT: alsl.w $a0, $a1, $a0, 2595; LA32S-NEXT: ret596;597; LA64-LABEL: mul_i32_37:598; LA64: # %bb.0:599; LA64-NEXT: alsl.w $a1, $a0, $a0, 3600; LA64-NEXT: alsl.w $a0, $a1, $a0, 2601; LA64-NEXT: ret602 %b = mul i32 %a, 37603 ret i32 %b604}605 606define signext i32 @mul_i32_41(i32 %a) {607; LA32R-LABEL: mul_i32_41:608; LA32R: # %bb.0:609; LA32R-NEXT: ori $a1, $zero, 41610; LA32R-NEXT: mul.w $a0, $a0, $a1611; LA32R-NEXT: ret612;613; LA32S-LABEL: mul_i32_41:614; LA32S: # %bb.0:615; LA32S-NEXT: alsl.w $a1, $a0, $a0, 2616; LA32S-NEXT: alsl.w $a0, $a1, $a0, 3617; LA32S-NEXT: ret618;619; LA64-LABEL: mul_i32_41:620; LA64: # %bb.0:621; LA64-NEXT: alsl.w $a1, $a0, $a0, 2622; LA64-NEXT: alsl.w $a0, $a1, $a0, 3623; LA64-NEXT: ret624 %b = mul i32 %a, 41625 ret i32 %b626}627 628define signext i32 @mul_i32_45(i32 %a) {629; LA32R-LABEL: mul_i32_45:630; LA32R: # %bb.0:631; LA32R-NEXT: ori $a1, $zero, 45632; LA32R-NEXT: mul.w $a0, $a0, $a1633; LA32R-NEXT: ret634;635; LA32S-LABEL: mul_i32_45:636; LA32S: # %bb.0:637; LA32S-NEXT: alsl.w $a0, $a0, $a0, 2638; LA32S-NEXT: alsl.w $a0, $a0, $a0, 3639; LA32S-NEXT: ret640;641; LA64-LABEL: mul_i32_45:642; LA64: # %bb.0:643; LA64-NEXT: alsl.w $a0, $a0, $a0, 2644; LA64-NEXT: alsl.w $a0, $a0, $a0, 3645; LA64-NEXT: ret646 %b = mul i32 %a, 45647 ret i32 %b648}649 650define signext i32 @mul_i32_49(i32 %a) {651; LA32R-LABEL: mul_i32_49:652; LA32R: # %bb.0:653; LA32R-NEXT: ori $a1, $zero, 49654; LA32R-NEXT: mul.w $a0, $a0, $a1655; LA32R-NEXT: ret656;657; LA32S-LABEL: mul_i32_49:658; LA32S: # %bb.0:659; LA32S-NEXT: alsl.w $a1, $a0, $a0, 1660; LA32S-NEXT: alsl.w $a0, $a1, $a0, 4661; LA32S-NEXT: ret662;663; LA64-LABEL: mul_i32_49:664; LA64: # %bb.0:665; LA64-NEXT: alsl.w $a1, $a0, $a0, 1666; LA64-NEXT: alsl.w $a0, $a1, $a0, 4667; LA64-NEXT: ret668 %b = mul i32 %a, 49669 ret i32 %b670}671 672define signext i32 @mul_i32_51(i32 %a) {673; LA32R-LABEL: mul_i32_51:674; LA32R: # %bb.0:675; LA32R-NEXT: ori $a1, $zero, 51676; LA32R-NEXT: mul.w $a0, $a0, $a1677; LA32R-NEXT: ret678;679; LA32S-LABEL: mul_i32_51:680; LA32S: # %bb.0:681; LA32S-NEXT: alsl.w $a0, $a0, $a0, 1682; LA32S-NEXT: alsl.w $a0, $a0, $a0, 4683; LA32S-NEXT: ret684;685; LA64-LABEL: mul_i32_51:686; LA64: # %bb.0:687; LA64-NEXT: alsl.w $a0, $a0, $a0, 1688; LA64-NEXT: alsl.w $a0, $a0, $a0, 4689; LA64-NEXT: ret690 %b = mul i32 %a, 51691 ret i32 %b692}693 694define signext i32 @mul_i32_69(i32 %a) {695; LA32R-LABEL: mul_i32_69:696; LA32R: # %bb.0:697; LA32R-NEXT: ori $a1, $zero, 69698; LA32R-NEXT: mul.w $a0, $a0, $a1699; LA32R-NEXT: ret700;701; LA32S-LABEL: mul_i32_69:702; LA32S: # %bb.0:703; LA32S-NEXT: alsl.w $a1, $a0, $a0, 4704; LA32S-NEXT: alsl.w $a0, $a1, $a0, 2705; LA32S-NEXT: ret706;707; LA64-LABEL: mul_i32_69:708; LA64: # %bb.0:709; LA64-NEXT: alsl.w $a1, $a0, $a0, 4710; LA64-NEXT: alsl.w $a0, $a1, $a0, 2711; LA64-NEXT: ret712 %b = mul i32 %a, 69713 ret i32 %b714}715 716define signext i32 @mul_i32_73(i32 %a) {717; LA32R-LABEL: mul_i32_73:718; LA32R: # %bb.0:719; LA32R-NEXT: ori $a1, $zero, 73720; LA32R-NEXT: mul.w $a0, $a0, $a1721; LA32R-NEXT: ret722;723; LA32S-LABEL: mul_i32_73:724; LA32S: # %bb.0:725; LA32S-NEXT: alsl.w $a1, $a0, $a0, 3726; LA32S-NEXT: alsl.w $a0, $a1, $a0, 3727; LA32S-NEXT: ret728;729; LA64-LABEL: mul_i32_73:730; LA64: # %bb.0:731; LA64-NEXT: alsl.w $a1, $a0, $a0, 3732; LA64-NEXT: alsl.w $a0, $a1, $a0, 3733; LA64-NEXT: ret734 %b = mul i32 %a, 73735 ret i32 %b736}737 738define signext i32 @mul_i32_81(i32 %a) {739; LA32R-LABEL: mul_i32_81:740; LA32R: # %bb.0:741; LA32R-NEXT: ori $a1, $zero, 81742; LA32R-NEXT: mul.w $a0, $a0, $a1743; LA32R-NEXT: ret744;745; LA32S-LABEL: mul_i32_81:746; LA32S: # %bb.0:747; LA32S-NEXT: alsl.w $a1, $a0, $a0, 2748; LA32S-NEXT: alsl.w $a0, $a1, $a0, 4749; LA32S-NEXT: ret750;751; LA64-LABEL: mul_i32_81:752; LA64: # %bb.0:753; LA64-NEXT: alsl.w $a1, $a0, $a0, 2754; LA64-NEXT: alsl.w $a0, $a1, $a0, 4755; LA64-NEXT: ret756 %b = mul i32 %a, 81757 ret i32 %b758}759 760define signext i32 @mul_i32_85(i32 %a) {761; LA32R-LABEL: mul_i32_85:762; LA32R: # %bb.0:763; LA32R-NEXT: ori $a1, $zero, 85764; LA32R-NEXT: mul.w $a0, $a0, $a1765; LA32R-NEXT: ret766;767; LA32S-LABEL: mul_i32_85:768; LA32S: # %bb.0:769; LA32S-NEXT: alsl.w $a0, $a0, $a0, 2770; LA32S-NEXT: alsl.w $a0, $a0, $a0, 4771; LA32S-NEXT: ret772;773; LA64-LABEL: mul_i32_85:774; LA64: # %bb.0:775; LA64-NEXT: alsl.w $a0, $a0, $a0, 2776; LA64-NEXT: alsl.w $a0, $a0, $a0, 4777; LA64-NEXT: ret778 %b = mul i32 %a, 85779 ret i32 %b780}781 782define signext i32 @mul_i32_137(i32 %a) {783; LA32R-LABEL: mul_i32_137:784; LA32R: # %bb.0:785; LA32R-NEXT: ori $a1, $zero, 137786; LA32R-NEXT: mul.w $a0, $a0, $a1787; LA32R-NEXT: ret788;789; LA32S-LABEL: mul_i32_137:790; LA32S: # %bb.0:791; LA32S-NEXT: alsl.w $a1, $a0, $a0, 4792; LA32S-NEXT: alsl.w $a0, $a1, $a0, 3793; LA32S-NEXT: ret794;795; LA64-LABEL: mul_i32_137:796; LA64: # %bb.0:797; LA64-NEXT: alsl.w $a1, $a0, $a0, 4798; LA64-NEXT: alsl.w $a0, $a1, $a0, 3799; LA64-NEXT: ret800 %b = mul i32 %a, 137801 ret i32 %b802}803 804define signext i32 @mul_i32_145(i32 %a) {805; LA32R-LABEL: mul_i32_145:806; LA32R: # %bb.0:807; LA32R-NEXT: ori $a1, $zero, 145808; LA32R-NEXT: mul.w $a0, $a0, $a1809; LA32R-NEXT: ret810;811; LA32S-LABEL: mul_i32_145:812; LA32S: # %bb.0:813; LA32S-NEXT: alsl.w $a1, $a0, $a0, 3814; LA32S-NEXT: alsl.w $a0, $a1, $a0, 4815; LA32S-NEXT: ret816;817; LA64-LABEL: mul_i32_145:818; LA64: # %bb.0:819; LA64-NEXT: alsl.w $a1, $a0, $a0, 3820; LA64-NEXT: alsl.w $a0, $a1, $a0, 4821; LA64-NEXT: ret822 %b = mul i32 %a, 145823 ret i32 %b824}825 826define signext i32 @mul_i32_153(i32 %a) {827; LA32R-LABEL: mul_i32_153:828; LA32R: # %bb.0:829; LA32R-NEXT: ori $a1, $zero, 153830; LA32R-NEXT: mul.w $a0, $a0, $a1831; LA32R-NEXT: ret832;833; LA32S-LABEL: mul_i32_153:834; LA32S: # %bb.0:835; LA32S-NEXT: alsl.w $a0, $a0, $a0, 3836; LA32S-NEXT: alsl.w $a0, $a0, $a0, 4837; LA32S-NEXT: ret838;839; LA64-LABEL: mul_i32_153:840; LA64: # %bb.0:841; LA64-NEXT: alsl.w $a0, $a0, $a0, 3842; LA64-NEXT: alsl.w $a0, $a0, $a0, 4843; LA64-NEXT: ret844 %b = mul i32 %a, 153845 ret i32 %b846}847 848define signext i32 @mul_i32_273(i32 %a) {849; LA32R-LABEL: mul_i32_273:850; LA32R: # %bb.0:851; LA32R-NEXT: ori $a1, $zero, 273852; LA32R-NEXT: mul.w $a0, $a0, $a1853; LA32R-NEXT: ret854;855; LA32S-LABEL: mul_i32_273:856; LA32S: # %bb.0:857; LA32S-NEXT: alsl.w $a1, $a0, $a0, 4858; LA32S-NEXT: alsl.w $a0, $a1, $a0, 4859; LA32S-NEXT: ret860;861; LA64-LABEL: mul_i32_273:862; LA64: # %bb.0:863; LA64-NEXT: alsl.w $a1, $a0, $a0, 4864; LA64-NEXT: alsl.w $a0, $a1, $a0, 4865; LA64-NEXT: ret866 %b = mul i32 %a, 273867 ret i32 %b868}869 870define signext i32 @mul_i32_289(i32 %a) {871; LA32R-LABEL: mul_i32_289:872; LA32R: # %bb.0:873; LA32R-NEXT: ori $a1, $zero, 289874; LA32R-NEXT: mul.w $a0, $a0, $a1875; LA32R-NEXT: ret876;877; LA32S-LABEL: mul_i32_289:878; LA32S: # %bb.0:879; LA32S-NEXT: alsl.w $a0, $a0, $a0, 4880; LA32S-NEXT: alsl.w $a0, $a0, $a0, 4881; LA32S-NEXT: ret882;883; LA64-LABEL: mul_i32_289:884; LA64: # %bb.0:885; LA64-NEXT: alsl.w $a0, $a0, $a0, 4886; LA64-NEXT: alsl.w $a0, $a0, $a0, 4887; LA64-NEXT: ret888 %b = mul i32 %a, 289889 ret i32 %b890}891 892define i64 @mul_i64_11(i64 %a) {893; LA32R-LABEL: mul_i64_11:894; LA32R: # %bb.0:895; LA32R-NEXT: ori $a2, $zero, 11896; LA32R-NEXT: mul.w $a1, $a1, $a2897; LA32R-NEXT: mulh.wu $a3, $a0, $a2898; LA32R-NEXT: add.w $a1, $a3, $a1899; LA32R-NEXT: mul.w $a0, $a0, $a2900; LA32R-NEXT: ret901;902; LA32S-LABEL: mul_i64_11:903; LA32S: # %bb.0:904; LA32S-NEXT: ori $a2, $zero, 11905; LA32S-NEXT: mul.w $a1, $a1, $a2906; LA32S-NEXT: mulh.wu $a3, $a0, $a2907; LA32S-NEXT: add.w $a1, $a3, $a1908; LA32S-NEXT: mul.w $a0, $a0, $a2909; LA32S-NEXT: ret910;911; LA64-LABEL: mul_i64_11:912; LA64: # %bb.0:913; LA64-NEXT: alsl.d $a1, $a0, $a0, 2914; LA64-NEXT: alsl.d $a0, $a1, $a0, 1915; LA64-NEXT: ret916 %b = mul i64 %a, 11917 ret i64 %b918}919 920define i64 @mul_i64_13(i64 %a) {921; LA32R-LABEL: mul_i64_13:922; LA32R: # %bb.0:923; LA32R-NEXT: ori $a2, $zero, 13924; LA32R-NEXT: mul.w $a1, $a1, $a2925; LA32R-NEXT: mulh.wu $a3, $a0, $a2926; LA32R-NEXT: add.w $a1, $a3, $a1927; LA32R-NEXT: mul.w $a0, $a0, $a2928; LA32R-NEXT: ret929;930; LA32S-LABEL: mul_i64_13:931; LA32S: # %bb.0:932; LA32S-NEXT: ori $a2, $zero, 13933; LA32S-NEXT: mul.w $a1, $a1, $a2934; LA32S-NEXT: mulh.wu $a3, $a0, $a2935; LA32S-NEXT: add.w $a1, $a3, $a1936; LA32S-NEXT: mul.w $a0, $a0, $a2937; LA32S-NEXT: ret938;939; LA64-LABEL: mul_i64_13:940; LA64: # %bb.0:941; LA64-NEXT: alsl.d $a1, $a0, $a0, 1942; LA64-NEXT: alsl.d $a0, $a1, $a0, 2943; LA64-NEXT: ret944 %b = mul i64 %a, 13945 ret i64 %b946}947 948define i64 @mul_i64_19(i64 %a) {949; LA32R-LABEL: mul_i64_19:950; LA32R: # %bb.0:951; LA32R-NEXT: ori $a2, $zero, 19952; LA32R-NEXT: mul.w $a1, $a1, $a2953; LA32R-NEXT: mulh.wu $a3, $a0, $a2954; LA32R-NEXT: add.w $a1, $a3, $a1955; LA32R-NEXT: mul.w $a0, $a0, $a2956; LA32R-NEXT: ret957;958; LA32S-LABEL: mul_i64_19:959; LA32S: # %bb.0:960; LA32S-NEXT: ori $a2, $zero, 19961; LA32S-NEXT: mul.w $a1, $a1, $a2962; LA32S-NEXT: mulh.wu $a3, $a0, $a2963; LA32S-NEXT: add.w $a1, $a3, $a1964; LA32S-NEXT: mul.w $a0, $a0, $a2965; LA32S-NEXT: ret966;967; LA64-LABEL: mul_i64_19:968; LA64: # %bb.0:969; LA64-NEXT: alsl.d $a1, $a0, $a0, 3970; LA64-NEXT: alsl.d $a0, $a1, $a0, 1971; LA64-NEXT: ret972 %b = mul i64 %a, 19973 ret i64 %b974}975 976define i64 @mul_i64_21(i64 %a) {977; LA32R-LABEL: mul_i64_21:978; LA32R: # %bb.0:979; LA32R-NEXT: ori $a2, $zero, 21980; LA32R-NEXT: mul.w $a1, $a1, $a2981; LA32R-NEXT: mulh.wu $a3, $a0, $a2982; LA32R-NEXT: add.w $a1, $a3, $a1983; LA32R-NEXT: mul.w $a0, $a0, $a2984; LA32R-NEXT: ret985;986; LA32S-LABEL: mul_i64_21:987; LA32S: # %bb.0:988; LA32S-NEXT: ori $a2, $zero, 21989; LA32S-NEXT: mul.w $a1, $a1, $a2990; LA32S-NEXT: mulh.wu $a3, $a0, $a2991; LA32S-NEXT: add.w $a1, $a3, $a1992; LA32S-NEXT: mul.w $a0, $a0, $a2993; LA32S-NEXT: ret994;995; LA64-LABEL: mul_i64_21:996; LA64: # %bb.0:997; LA64-NEXT: alsl.d $a1, $a0, $a0, 2998; LA64-NEXT: alsl.d $a0, $a1, $a0, 2999; LA64-NEXT: ret1000 %b = mul i64 %a, 211001 ret i64 %b1002}1003 1004define i64 @mul_i64_25(i64 %a) {1005; LA32R-LABEL: mul_i64_25:1006; LA32R: # %bb.0:1007; LA32R-NEXT: ori $a2, $zero, 251008; LA32R-NEXT: mul.w $a1, $a1, $a21009; LA32R-NEXT: mulh.wu $a3, $a0, $a21010; LA32R-NEXT: add.w $a1, $a3, $a11011; LA32R-NEXT: mul.w $a0, $a0, $a21012; LA32R-NEXT: ret1013;1014; LA32S-LABEL: mul_i64_25:1015; LA32S: # %bb.0:1016; LA32S-NEXT: ori $a2, $zero, 251017; LA32S-NEXT: mul.w $a1, $a1, $a21018; LA32S-NEXT: mulh.wu $a3, $a0, $a21019; LA32S-NEXT: add.w $a1, $a3, $a11020; LA32S-NEXT: mul.w $a0, $a0, $a21021; LA32S-NEXT: ret1022;1023; LA64-LABEL: mul_i64_25:1024; LA64: # %bb.0:1025; LA64-NEXT: alsl.d $a1, $a0, $a0, 11026; LA64-NEXT: alsl.d $a0, $a1, $a0, 31027; LA64-NEXT: ret1028 %b = mul i64 %a, 251029 ret i64 %b1030}1031 1032define i64 @mul_i64_27(i64 %a) {1033; LA32R-LABEL: mul_i64_27:1034; LA32R: # %bb.0:1035; LA32R-NEXT: ori $a2, $zero, 271036; LA32R-NEXT: mul.w $a1, $a1, $a21037; LA32R-NEXT: mulh.wu $a3, $a0, $a21038; LA32R-NEXT: add.w $a1, $a3, $a11039; LA32R-NEXT: mul.w $a0, $a0, $a21040; LA32R-NEXT: ret1041;1042; LA32S-LABEL: mul_i64_27:1043; LA32S: # %bb.0:1044; LA32S-NEXT: ori $a2, $zero, 271045; LA32S-NEXT: mul.w $a1, $a1, $a21046; LA32S-NEXT: mulh.wu $a3, $a0, $a21047; LA32S-NEXT: add.w $a1, $a3, $a11048; LA32S-NEXT: mul.w $a0, $a0, $a21049; LA32S-NEXT: ret1050;1051; LA64-LABEL: mul_i64_27:1052; LA64: # %bb.0:1053; LA64-NEXT: alsl.d $a0, $a0, $a0, 11054; LA64-NEXT: alsl.d $a0, $a0, $a0, 31055; LA64-NEXT: ret1056 %b = mul i64 %a, 271057 ret i64 %b1058}1059 1060define i64 @mul_i64_35(i64 %a) {1061; LA32R-LABEL: mul_i64_35:1062; LA32R: # %bb.0:1063; LA32R-NEXT: ori $a2, $zero, 351064; LA32R-NEXT: mul.w $a1, $a1, $a21065; LA32R-NEXT: mulh.wu $a3, $a0, $a21066; LA32R-NEXT: add.w $a1, $a3, $a11067; LA32R-NEXT: mul.w $a0, $a0, $a21068; LA32R-NEXT: ret1069;1070; LA32S-LABEL: mul_i64_35:1071; LA32S: # %bb.0:1072; LA32S-NEXT: ori $a2, $zero, 351073; LA32S-NEXT: mul.w $a1, $a1, $a21074; LA32S-NEXT: mulh.wu $a3, $a0, $a21075; LA32S-NEXT: add.w $a1, $a3, $a11076; LA32S-NEXT: mul.w $a0, $a0, $a21077; LA32S-NEXT: ret1078;1079; LA64-LABEL: mul_i64_35:1080; LA64: # %bb.0:1081; LA64-NEXT: alsl.d $a1, $a0, $a0, 41082; LA64-NEXT: alsl.d $a0, $a1, $a0, 11083; LA64-NEXT: ret1084 %b = mul i64 %a, 351085 ret i64 %b1086}1087 1088define i64 @mul_i64_37(i64 %a) {1089; LA32R-LABEL: mul_i64_37:1090; LA32R: # %bb.0:1091; LA32R-NEXT: ori $a2, $zero, 371092; LA32R-NEXT: mul.w $a1, $a1, $a21093; LA32R-NEXT: mulh.wu $a3, $a0, $a21094; LA32R-NEXT: add.w $a1, $a3, $a11095; LA32R-NEXT: mul.w $a0, $a0, $a21096; LA32R-NEXT: ret1097;1098; LA32S-LABEL: mul_i64_37:1099; LA32S: # %bb.0:1100; LA32S-NEXT: ori $a2, $zero, 371101; LA32S-NEXT: mul.w $a1, $a1, $a21102; LA32S-NEXT: mulh.wu $a3, $a0, $a21103; LA32S-NEXT: add.w $a1, $a3, $a11104; LA32S-NEXT: mul.w $a0, $a0, $a21105; LA32S-NEXT: ret1106;1107; LA64-LABEL: mul_i64_37:1108; LA64: # %bb.0:1109; LA64-NEXT: alsl.d $a1, $a0, $a0, 31110; LA64-NEXT: alsl.d $a0, $a1, $a0, 21111; LA64-NEXT: ret1112 %b = mul i64 %a, 371113 ret i64 %b1114}1115 1116define i64 @mul_i64_41(i64 %a) {1117; LA32R-LABEL: mul_i64_41:1118; LA32R: # %bb.0:1119; LA32R-NEXT: ori $a2, $zero, 411120; LA32R-NEXT: mul.w $a1, $a1, $a21121; LA32R-NEXT: mulh.wu $a3, $a0, $a21122; LA32R-NEXT: add.w $a1, $a3, $a11123; LA32R-NEXT: mul.w $a0, $a0, $a21124; LA32R-NEXT: ret1125;1126; LA32S-LABEL: mul_i64_41:1127; LA32S: # %bb.0:1128; LA32S-NEXT: ori $a2, $zero, 411129; LA32S-NEXT: mul.w $a1, $a1, $a21130; LA32S-NEXT: mulh.wu $a3, $a0, $a21131; LA32S-NEXT: add.w $a1, $a3, $a11132; LA32S-NEXT: mul.w $a0, $a0, $a21133; LA32S-NEXT: ret1134;1135; LA64-LABEL: mul_i64_41:1136; LA64: # %bb.0:1137; LA64-NEXT: alsl.d $a1, $a0, $a0, 21138; LA64-NEXT: alsl.d $a0, $a1, $a0, 31139; LA64-NEXT: ret1140 %b = mul i64 %a, 411141 ret i64 %b1142}1143 1144define i64 @mul_i64_45(i64 %a) {1145; LA32R-LABEL: mul_i64_45:1146; LA32R: # %bb.0:1147; LA32R-NEXT: ori $a2, $zero, 451148; LA32R-NEXT: mul.w $a1, $a1, $a21149; LA32R-NEXT: mulh.wu $a3, $a0, $a21150; LA32R-NEXT: add.w $a1, $a3, $a11151; LA32R-NEXT: mul.w $a0, $a0, $a21152; LA32R-NEXT: ret1153;1154; LA32S-LABEL: mul_i64_45:1155; LA32S: # %bb.0:1156; LA32S-NEXT: ori $a2, $zero, 451157; LA32S-NEXT: mul.w $a1, $a1, $a21158; LA32S-NEXT: mulh.wu $a3, $a0, $a21159; LA32S-NEXT: add.w $a1, $a3, $a11160; LA32S-NEXT: mul.w $a0, $a0, $a21161; LA32S-NEXT: ret1162;1163; LA64-LABEL: mul_i64_45:1164; LA64: # %bb.0:1165; LA64-NEXT: alsl.d $a0, $a0, $a0, 21166; LA64-NEXT: alsl.d $a0, $a0, $a0, 31167; LA64-NEXT: ret1168 %b = mul i64 %a, 451169 ret i64 %b1170}1171 1172define i64 @mul_i64_49(i64 %a) {1173; LA32R-LABEL: mul_i64_49:1174; LA32R: # %bb.0:1175; LA32R-NEXT: ori $a2, $zero, 491176; LA32R-NEXT: mul.w $a1, $a1, $a21177; LA32R-NEXT: mulh.wu $a3, $a0, $a21178; LA32R-NEXT: add.w $a1, $a3, $a11179; LA32R-NEXT: mul.w $a0, $a0, $a21180; LA32R-NEXT: ret1181;1182; LA32S-LABEL: mul_i64_49:1183; LA32S: # %bb.0:1184; LA32S-NEXT: ori $a2, $zero, 491185; LA32S-NEXT: mul.w $a1, $a1, $a21186; LA32S-NEXT: mulh.wu $a3, $a0, $a21187; LA32S-NEXT: add.w $a1, $a3, $a11188; LA32S-NEXT: mul.w $a0, $a0, $a21189; LA32S-NEXT: ret1190;1191; LA64-LABEL: mul_i64_49:1192; LA64: # %bb.0:1193; LA64-NEXT: alsl.d $a1, $a0, $a0, 11194; LA64-NEXT: alsl.d $a0, $a1, $a0, 41195; LA64-NEXT: ret1196 %b = mul i64 %a, 491197 ret i64 %b1198}1199 1200define i64 @mul_i64_51(i64 %a) {1201; LA32R-LABEL: mul_i64_51:1202; LA32R: # %bb.0:1203; LA32R-NEXT: ori $a2, $zero, 511204; LA32R-NEXT: mul.w $a1, $a1, $a21205; LA32R-NEXT: mulh.wu $a3, $a0, $a21206; LA32R-NEXT: add.w $a1, $a3, $a11207; LA32R-NEXT: mul.w $a0, $a0, $a21208; LA32R-NEXT: ret1209;1210; LA32S-LABEL: mul_i64_51:1211; LA32S: # %bb.0:1212; LA32S-NEXT: ori $a2, $zero, 511213; LA32S-NEXT: mul.w $a1, $a1, $a21214; LA32S-NEXT: mulh.wu $a3, $a0, $a21215; LA32S-NEXT: add.w $a1, $a3, $a11216; LA32S-NEXT: mul.w $a0, $a0, $a21217; LA32S-NEXT: ret1218;1219; LA64-LABEL: mul_i64_51:1220; LA64: # %bb.0:1221; LA64-NEXT: alsl.d $a0, $a0, $a0, 11222; LA64-NEXT: alsl.d $a0, $a0, $a0, 41223; LA64-NEXT: ret1224 %b = mul i64 %a, 511225 ret i64 %b1226}1227 1228define i64 @mul_i64_69(i64 %a) {1229; LA32R-LABEL: mul_i64_69:1230; LA32R: # %bb.0:1231; LA32R-NEXT: ori $a2, $zero, 691232; LA32R-NEXT: mul.w $a1, $a1, $a21233; LA32R-NEXT: mulh.wu $a3, $a0, $a21234; LA32R-NEXT: add.w $a1, $a3, $a11235; LA32R-NEXT: mul.w $a0, $a0, $a21236; LA32R-NEXT: ret1237;1238; LA32S-LABEL: mul_i64_69:1239; LA32S: # %bb.0:1240; LA32S-NEXT: ori $a2, $zero, 691241; LA32S-NEXT: mul.w $a1, $a1, $a21242; LA32S-NEXT: mulh.wu $a3, $a0, $a21243; LA32S-NEXT: add.w $a1, $a3, $a11244; LA32S-NEXT: mul.w $a0, $a0, $a21245; LA32S-NEXT: ret1246;1247; LA64-LABEL: mul_i64_69:1248; LA64: # %bb.0:1249; LA64-NEXT: alsl.d $a1, $a0, $a0, 41250; LA64-NEXT: alsl.d $a0, $a1, $a0, 21251; LA64-NEXT: ret1252 %b = mul i64 %a, 691253 ret i64 %b1254}1255 1256define i64 @mul_i64_73(i64 %a) {1257; LA32R-LABEL: mul_i64_73:1258; LA32R: # %bb.0:1259; LA32R-NEXT: ori $a2, $zero, 731260; LA32R-NEXT: mul.w $a1, $a1, $a21261; LA32R-NEXT: mulh.wu $a3, $a0, $a21262; LA32R-NEXT: add.w $a1, $a3, $a11263; LA32R-NEXT: mul.w $a0, $a0, $a21264; LA32R-NEXT: ret1265;1266; LA32S-LABEL: mul_i64_73:1267; LA32S: # %bb.0:1268; LA32S-NEXT: ori $a2, $zero, 731269; LA32S-NEXT: mul.w $a1, $a1, $a21270; LA32S-NEXT: mulh.wu $a3, $a0, $a21271; LA32S-NEXT: add.w $a1, $a3, $a11272; LA32S-NEXT: mul.w $a0, $a0, $a21273; LA32S-NEXT: ret1274;1275; LA64-LABEL: mul_i64_73:1276; LA64: # %bb.0:1277; LA64-NEXT: alsl.d $a1, $a0, $a0, 31278; LA64-NEXT: alsl.d $a0, $a1, $a0, 31279; LA64-NEXT: ret1280 %b = mul i64 %a, 731281 ret i64 %b1282}1283 1284define i64 @mul_i64_81(i64 %a) {1285; LA32R-LABEL: mul_i64_81:1286; LA32R: # %bb.0:1287; LA32R-NEXT: ori $a2, $zero, 811288; LA32R-NEXT: mul.w $a1, $a1, $a21289; LA32R-NEXT: mulh.wu $a3, $a0, $a21290; LA32R-NEXT: add.w $a1, $a3, $a11291; LA32R-NEXT: mul.w $a0, $a0, $a21292; LA32R-NEXT: ret1293;1294; LA32S-LABEL: mul_i64_81:1295; LA32S: # %bb.0:1296; LA32S-NEXT: ori $a2, $zero, 811297; LA32S-NEXT: mul.w $a1, $a1, $a21298; LA32S-NEXT: mulh.wu $a3, $a0, $a21299; LA32S-NEXT: add.w $a1, $a3, $a11300; LA32S-NEXT: mul.w $a0, $a0, $a21301; LA32S-NEXT: ret1302;1303; LA64-LABEL: mul_i64_81:1304; LA64: # %bb.0:1305; LA64-NEXT: alsl.d $a1, $a0, $a0, 21306; LA64-NEXT: alsl.d $a0, $a1, $a0, 41307; LA64-NEXT: ret1308 %b = mul i64 %a, 811309 ret i64 %b1310}1311 1312define i64 @mul_i64_85(i64 %a) {1313; LA32R-LABEL: mul_i64_85:1314; LA32R: # %bb.0:1315; LA32R-NEXT: ori $a2, $zero, 851316; LA32R-NEXT: mul.w $a1, $a1, $a21317; LA32R-NEXT: mulh.wu $a3, $a0, $a21318; LA32R-NEXT: add.w $a1, $a3, $a11319; LA32R-NEXT: mul.w $a0, $a0, $a21320; LA32R-NEXT: ret1321;1322; LA32S-LABEL: mul_i64_85:1323; LA32S: # %bb.0:1324; LA32S-NEXT: ori $a2, $zero, 851325; LA32S-NEXT: mul.w $a1, $a1, $a21326; LA32S-NEXT: mulh.wu $a3, $a0, $a21327; LA32S-NEXT: add.w $a1, $a3, $a11328; LA32S-NEXT: mul.w $a0, $a0, $a21329; LA32S-NEXT: ret1330;1331; LA64-LABEL: mul_i64_85:1332; LA64: # %bb.0:1333; LA64-NEXT: alsl.d $a0, $a0, $a0, 21334; LA64-NEXT: alsl.d $a0, $a0, $a0, 41335; LA64-NEXT: ret1336 %b = mul i64 %a, 851337 ret i64 %b1338}1339 1340define i64 @mul_i64_137(i64 %a) {1341; LA32R-LABEL: mul_i64_137:1342; LA32R: # %bb.0:1343; LA32R-NEXT: ori $a2, $zero, 1371344; LA32R-NEXT: mul.w $a1, $a1, $a21345; LA32R-NEXT: mulh.wu $a3, $a0, $a21346; LA32R-NEXT: add.w $a1, $a3, $a11347; LA32R-NEXT: mul.w $a0, $a0, $a21348; LA32R-NEXT: ret1349;1350; LA32S-LABEL: mul_i64_137:1351; LA32S: # %bb.0:1352; LA32S-NEXT: ori $a2, $zero, 1371353; LA32S-NEXT: mul.w $a1, $a1, $a21354; LA32S-NEXT: mulh.wu $a3, $a0, $a21355; LA32S-NEXT: add.w $a1, $a3, $a11356; LA32S-NEXT: mul.w $a0, $a0, $a21357; LA32S-NEXT: ret1358;1359; LA64-LABEL: mul_i64_137:1360; LA64: # %bb.0:1361; LA64-NEXT: alsl.d $a1, $a0, $a0, 41362; LA64-NEXT: alsl.d $a0, $a1, $a0, 31363; LA64-NEXT: ret1364 %b = mul i64 %a, 1371365 ret i64 %b1366}1367 1368define i64 @mul_i64_145(i64 %a) {1369; LA32R-LABEL: mul_i64_145:1370; LA32R: # %bb.0:1371; LA32R-NEXT: ori $a2, $zero, 1451372; LA32R-NEXT: mul.w $a1, $a1, $a21373; LA32R-NEXT: mulh.wu $a3, $a0, $a21374; LA32R-NEXT: add.w $a1, $a3, $a11375; LA32R-NEXT: mul.w $a0, $a0, $a21376; LA32R-NEXT: ret1377;1378; LA32S-LABEL: mul_i64_145:1379; LA32S: # %bb.0:1380; LA32S-NEXT: ori $a2, $zero, 1451381; LA32S-NEXT: mul.w $a1, $a1, $a21382; LA32S-NEXT: mulh.wu $a3, $a0, $a21383; LA32S-NEXT: add.w $a1, $a3, $a11384; LA32S-NEXT: mul.w $a0, $a0, $a21385; LA32S-NEXT: ret1386;1387; LA64-LABEL: mul_i64_145:1388; LA64: # %bb.0:1389; LA64-NEXT: alsl.d $a1, $a0, $a0, 31390; LA64-NEXT: alsl.d $a0, $a1, $a0, 41391; LA64-NEXT: ret1392 %b = mul i64 %a, 1451393 ret i64 %b1394}1395 1396define i64 @mul_i64_153(i64 %a) {1397; LA32R-LABEL: mul_i64_153:1398; LA32R: # %bb.0:1399; LA32R-NEXT: ori $a2, $zero, 1531400; LA32R-NEXT: mul.w $a1, $a1, $a21401; LA32R-NEXT: mulh.wu $a3, $a0, $a21402; LA32R-NEXT: add.w $a1, $a3, $a11403; LA32R-NEXT: mul.w $a0, $a0, $a21404; LA32R-NEXT: ret1405;1406; LA32S-LABEL: mul_i64_153:1407; LA32S: # %bb.0:1408; LA32S-NEXT: ori $a2, $zero, 1531409; LA32S-NEXT: mul.w $a1, $a1, $a21410; LA32S-NEXT: mulh.wu $a3, $a0, $a21411; LA32S-NEXT: add.w $a1, $a3, $a11412; LA32S-NEXT: mul.w $a0, $a0, $a21413; LA32S-NEXT: ret1414;1415; LA64-LABEL: mul_i64_153:1416; LA64: # %bb.0:1417; LA64-NEXT: alsl.d $a0, $a0, $a0, 31418; LA64-NEXT: alsl.d $a0, $a0, $a0, 41419; LA64-NEXT: ret1420 %b = mul i64 %a, 1531421 ret i64 %b1422}1423 1424define i64 @mul_i64_273(i64 %a) {1425; LA32R-LABEL: mul_i64_273:1426; LA32R: # %bb.0:1427; LA32R-NEXT: ori $a2, $zero, 2731428; LA32R-NEXT: mul.w $a1, $a1, $a21429; LA32R-NEXT: mulh.wu $a3, $a0, $a21430; LA32R-NEXT: add.w $a1, $a3, $a11431; LA32R-NEXT: mul.w $a0, $a0, $a21432; LA32R-NEXT: ret1433;1434; LA32S-LABEL: mul_i64_273:1435; LA32S: # %bb.0:1436; LA32S-NEXT: ori $a2, $zero, 2731437; LA32S-NEXT: mul.w $a1, $a1, $a21438; LA32S-NEXT: mulh.wu $a3, $a0, $a21439; LA32S-NEXT: add.w $a1, $a3, $a11440; LA32S-NEXT: mul.w $a0, $a0, $a21441; LA32S-NEXT: ret1442;1443; LA64-LABEL: mul_i64_273:1444; LA64: # %bb.0:1445; LA64-NEXT: alsl.d $a1, $a0, $a0, 41446; LA64-NEXT: alsl.d $a0, $a1, $a0, 41447; LA64-NEXT: ret1448 %b = mul i64 %a, 2731449 ret i64 %b1450}1451 1452define i64 @mul_i64_289(i64 %a) {1453; LA32R-LABEL: mul_i64_289:1454; LA32R: # %bb.0:1455; LA32R-NEXT: ori $a2, $zero, 2891456; LA32R-NEXT: mul.w $a1, $a1, $a21457; LA32R-NEXT: mulh.wu $a3, $a0, $a21458; LA32R-NEXT: add.w $a1, $a3, $a11459; LA32R-NEXT: mul.w $a0, $a0, $a21460; LA32R-NEXT: ret1461;1462; LA32S-LABEL: mul_i64_289:1463; LA32S: # %bb.0:1464; LA32S-NEXT: ori $a2, $zero, 2891465; LA32S-NEXT: mul.w $a1, $a1, $a21466; LA32S-NEXT: mulh.wu $a3, $a0, $a21467; LA32S-NEXT: add.w $a1, $a3, $a11468; LA32S-NEXT: mul.w $a0, $a0, $a21469; LA32S-NEXT: ret1470;1471; LA64-LABEL: mul_i64_289:1472; LA64: # %bb.0:1473; LA64-NEXT: alsl.d $a0, $a0, $a0, 41474; LA64-NEXT: alsl.d $a0, $a0, $a0, 41475; LA64-NEXT: ret1476 %b = mul i64 %a, 2891477 ret i64 %b1478}1479 1480define signext i32 @mul_i32_4098(i32 %a) {1481; LA32R-LABEL: mul_i32_4098:1482; LA32R: # %bb.0:1483; LA32R-NEXT: slli.w $a1, $a0, 11484; LA32R-NEXT: slli.w $a0, $a0, 121485; LA32R-NEXT: add.w $a0, $a0, $a11486; LA32R-NEXT: ret1487;1488; LA32S-LABEL: mul_i32_4098:1489; LA32S: # %bb.0:1490; LA32S-NEXT: slli.w $a1, $a0, 121491; LA32S-NEXT: alsl.w $a0, $a0, $a1, 11492; LA32S-NEXT: ret1493;1494; LA64-LABEL: mul_i32_4098:1495; LA64: # %bb.0:1496; LA64-NEXT: slli.d $a1, $a0, 121497; LA64-NEXT: alsl.w $a0, $a0, $a1, 11498; LA64-NEXT: ret1499 %b = mul i32 %a, 40981500 ret i32 %b1501}1502 1503define signext i32 @mul_i32_4100(i32 %a) {1504; LA32R-LABEL: mul_i32_4100:1505; LA32R: # %bb.0:1506; LA32R-NEXT: slli.w $a1, $a0, 21507; LA32R-NEXT: slli.w $a0, $a0, 121508; LA32R-NEXT: add.w $a0, $a0, $a11509; LA32R-NEXT: ret1510;1511; LA32S-LABEL: mul_i32_4100:1512; LA32S: # %bb.0:1513; LA32S-NEXT: slli.w $a1, $a0, 121514; LA32S-NEXT: alsl.w $a0, $a0, $a1, 21515; LA32S-NEXT: ret1516;1517; LA64-LABEL: mul_i32_4100:1518; LA64: # %bb.0:1519; LA64-NEXT: slli.d $a1, $a0, 121520; LA64-NEXT: alsl.w $a0, $a0, $a1, 21521; LA64-NEXT: ret1522 %b = mul i32 %a, 41001523 ret i32 %b1524}1525 1526define signext i32 @mul_i32_4104(i32 %a) {1527; LA32R-LABEL: mul_i32_4104:1528; LA32R: # %bb.0:1529; LA32R-NEXT: slli.w $a1, $a0, 31530; LA32R-NEXT: slli.w $a0, $a0, 121531; LA32R-NEXT: add.w $a0, $a0, $a11532; LA32R-NEXT: ret1533;1534; LA32S-LABEL: mul_i32_4104:1535; LA32S: # %bb.0:1536; LA32S-NEXT: slli.w $a1, $a0, 121537; LA32S-NEXT: alsl.w $a0, $a0, $a1, 31538; LA32S-NEXT: ret1539;1540; LA64-LABEL: mul_i32_4104:1541; LA64: # %bb.0:1542; LA64-NEXT: slli.d $a1, $a0, 121543; LA64-NEXT: alsl.w $a0, $a0, $a1, 31544; LA64-NEXT: ret1545 %b = mul i32 %a, 41041546 ret i32 %b1547}1548 1549define signext i32 @mul_i32_4112(i32 %a) {1550; LA32R-LABEL: mul_i32_4112:1551; LA32R: # %bb.0:1552; LA32R-NEXT: slli.w $a1, $a0, 41553; LA32R-NEXT: slli.w $a0, $a0, 121554; LA32R-NEXT: add.w $a0, $a0, $a11555; LA32R-NEXT: ret1556;1557; LA32S-LABEL: mul_i32_4112:1558; LA32S: # %bb.0:1559; LA32S-NEXT: slli.w $a1, $a0, 121560; LA32S-NEXT: alsl.w $a0, $a0, $a1, 41561; LA32S-NEXT: ret1562;1563; LA64-LABEL: mul_i32_4112:1564; LA64: # %bb.0:1565; LA64-NEXT: slli.d $a1, $a0, 121566; LA64-NEXT: alsl.w $a0, $a0, $a1, 41567; LA64-NEXT: ret1568 %b = mul i32 %a, 41121569 ret i32 %b1570}1571 1572define i64 @mul_i64_4098(i64 %a) {1573; LA32R-LABEL: mul_i64_4098:1574; LA32R: # %bb.0:1575; LA32R-NEXT: lu12i.w $a2, 11576; LA32R-NEXT: ori $a2, $a2, 21577; LA32R-NEXT: mul.w $a1, $a1, $a21578; LA32R-NEXT: mulh.wu $a3, $a0, $a21579; LA32R-NEXT: add.w $a1, $a3, $a11580; LA32R-NEXT: mul.w $a0, $a0, $a21581; LA32R-NEXT: ret1582;1583; LA32S-LABEL: mul_i64_4098:1584; LA32S: # %bb.0:1585; LA32S-NEXT: lu12i.w $a2, 11586; LA32S-NEXT: ori $a2, $a2, 21587; LA32S-NEXT: mul.w $a1, $a1, $a21588; LA32S-NEXT: mulh.wu $a3, $a0, $a21589; LA32S-NEXT: add.w $a1, $a3, $a11590; LA32S-NEXT: mul.w $a0, $a0, $a21591; LA32S-NEXT: ret1592;1593; LA64-LABEL: mul_i64_4098:1594; LA64: # %bb.0:1595; LA64-NEXT: slli.d $a1, $a0, 121596; LA64-NEXT: alsl.d $a0, $a0, $a1, 11597; LA64-NEXT: ret1598 %b = mul i64 %a, 40981599 ret i64 %b1600}1601 1602define i64 @mul_i64_4100(i64 %a) {1603; LA32R-LABEL: mul_i64_4100:1604; LA32R: # %bb.0:1605; LA32R-NEXT: lu12i.w $a2, 11606; LA32R-NEXT: ori $a2, $a2, 41607; LA32R-NEXT: mul.w $a1, $a1, $a21608; LA32R-NEXT: mulh.wu $a3, $a0, $a21609; LA32R-NEXT: add.w $a1, $a3, $a11610; LA32R-NEXT: mul.w $a0, $a0, $a21611; LA32R-NEXT: ret1612;1613; LA32S-LABEL: mul_i64_4100:1614; LA32S: # %bb.0:1615; LA32S-NEXT: lu12i.w $a2, 11616; LA32S-NEXT: ori $a2, $a2, 41617; LA32S-NEXT: mul.w $a1, $a1, $a21618; LA32S-NEXT: mulh.wu $a3, $a0, $a21619; LA32S-NEXT: add.w $a1, $a3, $a11620; LA32S-NEXT: mul.w $a0, $a0, $a21621; LA32S-NEXT: ret1622;1623; LA64-LABEL: mul_i64_4100:1624; LA64: # %bb.0:1625; LA64-NEXT: slli.d $a1, $a0, 121626; LA64-NEXT: alsl.d $a0, $a0, $a1, 21627; LA64-NEXT: ret1628 %b = mul i64 %a, 41001629 ret i64 %b1630}1631 1632define i64 @mul_i64_4104(i64 %a) {1633; LA32R-LABEL: mul_i64_4104:1634; LA32R: # %bb.0:1635; LA32R-NEXT: lu12i.w $a2, 11636; LA32R-NEXT: ori $a2, $a2, 81637; LA32R-NEXT: mul.w $a1, $a1, $a21638; LA32R-NEXT: mulh.wu $a3, $a0, $a21639; LA32R-NEXT: add.w $a1, $a3, $a11640; LA32R-NEXT: mul.w $a0, $a0, $a21641; LA32R-NEXT: ret1642;1643; LA32S-LABEL: mul_i64_4104:1644; LA32S: # %bb.0:1645; LA32S-NEXT: lu12i.w $a2, 11646; LA32S-NEXT: ori $a2, $a2, 81647; LA32S-NEXT: mul.w $a1, $a1, $a21648; LA32S-NEXT: mulh.wu $a3, $a0, $a21649; LA32S-NEXT: add.w $a1, $a3, $a11650; LA32S-NEXT: mul.w $a0, $a0, $a21651; LA32S-NEXT: ret1652;1653; LA64-LABEL: mul_i64_4104:1654; LA64: # %bb.0:1655; LA64-NEXT: slli.d $a1, $a0, 121656; LA64-NEXT: alsl.d $a0, $a0, $a1, 31657; LA64-NEXT: ret1658 %b = mul i64 %a, 41041659 ret i64 %b1660}1661 1662define i64 @mul_i64_4112(i64 %a) {1663; LA32R-LABEL: mul_i64_4112:1664; LA32R: # %bb.0:1665; LA32R-NEXT: lu12i.w $a2, 11666; LA32R-NEXT: ori $a2, $a2, 161667; LA32R-NEXT: mul.w $a1, $a1, $a21668; LA32R-NEXT: mulh.wu $a3, $a0, $a21669; LA32R-NEXT: add.w $a1, $a3, $a11670; LA32R-NEXT: mul.w $a0, $a0, $a21671; LA32R-NEXT: ret1672;1673; LA32S-LABEL: mul_i64_4112:1674; LA32S: # %bb.0:1675; LA32S-NEXT: lu12i.w $a2, 11676; LA32S-NEXT: ori $a2, $a2, 161677; LA32S-NEXT: mul.w $a1, $a1, $a21678; LA32S-NEXT: mulh.wu $a3, $a0, $a21679; LA32S-NEXT: add.w $a1, $a3, $a11680; LA32S-NEXT: mul.w $a0, $a0, $a21681; LA32S-NEXT: ret1682;1683; LA64-LABEL: mul_i64_4112:1684; LA64: # %bb.0:1685; LA64-NEXT: slli.d $a1, $a0, 121686; LA64-NEXT: alsl.d $a0, $a0, $a1, 41687; LA64-NEXT: ret1688 %b = mul i64 %a, 41121689 ret i64 %b1690}1691 1692define signext i32 @mul_i32_768(i32 %a) {1693; LA32R-LABEL: mul_i32_768:1694; LA32R: # %bb.0:1695; LA32R-NEXT: ori $a1, $zero, 7681696; LA32R-NEXT: mul.w $a0, $a0, $a11697; LA32R-NEXT: ret1698;1699; LA32S-LABEL: mul_i32_768:1700; LA32S: # %bb.0:1701; LA32S-NEXT: alsl.w $a0, $a0, $a0, 11702; LA32S-NEXT: slli.w $a0, $a0, 81703; LA32S-NEXT: ret1704;1705; LA64-LABEL: mul_i32_768:1706; LA64: # %bb.0:1707; LA64-NEXT: alsl.w $a0, $a0, $a0, 11708; LA64-NEXT: slli.w $a0, $a0, 81709; LA64-NEXT: ret1710 %b = mul i32 %a, 7681711 ret i32 %b1712}1713 1714define signext i32 @mul_i32_1280(i32 %a) {1715; LA32R-LABEL: mul_i32_1280:1716; LA32R: # %bb.0:1717; LA32R-NEXT: ori $a1, $zero, 12801718; LA32R-NEXT: mul.w $a0, $a0, $a11719; LA32R-NEXT: ret1720;1721; LA32S-LABEL: mul_i32_1280:1722; LA32S: # %bb.0:1723; LA32S-NEXT: alsl.w $a0, $a0, $a0, 21724; LA32S-NEXT: slli.w $a0, $a0, 81725; LA32S-NEXT: ret1726;1727; LA64-LABEL: mul_i32_1280:1728; LA64: # %bb.0:1729; LA64-NEXT: alsl.w $a0, $a0, $a0, 21730; LA64-NEXT: slli.w $a0, $a0, 81731; LA64-NEXT: ret1732 %b = mul i32 %a, 12801733 ret i32 %b1734}1735 1736define signext i32 @mul_i32_2304(i32 %a) {1737; LA32R-LABEL: mul_i32_2304:1738; LA32R: # %bb.0:1739; LA32R-NEXT: ori $a1, $zero, 23041740; LA32R-NEXT: mul.w $a0, $a0, $a11741; LA32R-NEXT: ret1742;1743; LA32S-LABEL: mul_i32_2304:1744; LA32S: # %bb.0:1745; LA32S-NEXT: alsl.w $a0, $a0, $a0, 31746; LA32S-NEXT: slli.w $a0, $a0, 81747; LA32S-NEXT: ret1748;1749; LA64-LABEL: mul_i32_2304:1750; LA64: # %bb.0:1751; LA64-NEXT: alsl.w $a0, $a0, $a0, 31752; LA64-NEXT: slli.w $a0, $a0, 81753; LA64-NEXT: ret1754 %b = mul i32 %a, 23041755 ret i32 %b1756}1757 1758define signext i32 @mul_i32_4352(i32 %a) {1759; LA32R-LABEL: mul_i32_4352:1760; LA32R: # %bb.0:1761; LA32R-NEXT: lu12i.w $a1, 11762; LA32R-NEXT: ori $a1, $a1, 2561763; LA32R-NEXT: mul.w $a0, $a0, $a11764; LA32R-NEXT: ret1765;1766; LA32S-LABEL: mul_i32_4352:1767; LA32S: # %bb.0:1768; LA32S-NEXT: alsl.w $a0, $a0, $a0, 41769; LA32S-NEXT: slli.w $a0, $a0, 81770; LA32S-NEXT: ret1771;1772; LA64-LABEL: mul_i32_4352:1773; LA64: # %bb.0:1774; LA64-NEXT: alsl.w $a0, $a0, $a0, 41775; LA64-NEXT: slli.w $a0, $a0, 81776; LA64-NEXT: ret1777 %b = mul i32 %a, 43521778 ret i32 %b1779}1780 1781define i64 @mul_i64_768(i64 %a) {1782; LA32R-LABEL: mul_i64_768:1783; LA32R: # %bb.0:1784; LA32R-NEXT: ori $a2, $zero, 7681785; LA32R-NEXT: mul.w $a1, $a1, $a21786; LA32R-NEXT: mulh.wu $a3, $a0, $a21787; LA32R-NEXT: add.w $a1, $a3, $a11788; LA32R-NEXT: mul.w $a0, $a0, $a21789; LA32R-NEXT: ret1790;1791; LA32S-LABEL: mul_i64_768:1792; LA32S: # %bb.0:1793; LA32S-NEXT: ori $a2, $zero, 7681794; LA32S-NEXT: mul.w $a1, $a1, $a21795; LA32S-NEXT: mulh.wu $a3, $a0, $a21796; LA32S-NEXT: add.w $a1, $a3, $a11797; LA32S-NEXT: mul.w $a0, $a0, $a21798; LA32S-NEXT: ret1799;1800; LA64-LABEL: mul_i64_768:1801; LA64: # %bb.0:1802; LA64-NEXT: alsl.d $a0, $a0, $a0, 11803; LA64-NEXT: slli.d $a0, $a0, 81804; LA64-NEXT: ret1805 %b = mul i64 %a, 7681806 ret i64 %b1807}1808 1809define i64 @mul_i64_1280(i64 %a) {1810; LA32R-LABEL: mul_i64_1280:1811; LA32R: # %bb.0:1812; LA32R-NEXT: ori $a2, $zero, 12801813; LA32R-NEXT: mul.w $a1, $a1, $a21814; LA32R-NEXT: mulh.wu $a3, $a0, $a21815; LA32R-NEXT: add.w $a1, $a3, $a11816; LA32R-NEXT: mul.w $a0, $a0, $a21817; LA32R-NEXT: ret1818;1819; LA32S-LABEL: mul_i64_1280:1820; LA32S: # %bb.0:1821; LA32S-NEXT: ori $a2, $zero, 12801822; LA32S-NEXT: mul.w $a1, $a1, $a21823; LA32S-NEXT: mulh.wu $a3, $a0, $a21824; LA32S-NEXT: add.w $a1, $a3, $a11825; LA32S-NEXT: mul.w $a0, $a0, $a21826; LA32S-NEXT: ret1827;1828; LA64-LABEL: mul_i64_1280:1829; LA64: # %bb.0:1830; LA64-NEXT: alsl.d $a0, $a0, $a0, 21831; LA64-NEXT: slli.d $a0, $a0, 81832; LA64-NEXT: ret1833 %b = mul i64 %a, 12801834 ret i64 %b1835}1836 1837define i64 @mul_i64_2304(i64 %a) {1838; LA32R-LABEL: mul_i64_2304:1839; LA32R: # %bb.0:1840; LA32R-NEXT: ori $a2, $zero, 23041841; LA32R-NEXT: mul.w $a1, $a1, $a21842; LA32R-NEXT: mulh.wu $a3, $a0, $a21843; LA32R-NEXT: add.w $a1, $a3, $a11844; LA32R-NEXT: mul.w $a0, $a0, $a21845; LA32R-NEXT: ret1846;1847; LA32S-LABEL: mul_i64_2304:1848; LA32S: # %bb.0:1849; LA32S-NEXT: ori $a2, $zero, 23041850; LA32S-NEXT: mul.w $a1, $a1, $a21851; LA32S-NEXT: mulh.wu $a3, $a0, $a21852; LA32S-NEXT: add.w $a1, $a3, $a11853; LA32S-NEXT: mul.w $a0, $a0, $a21854; LA32S-NEXT: ret1855;1856; LA64-LABEL: mul_i64_2304:1857; LA64: # %bb.0:1858; LA64-NEXT: alsl.d $a0, $a0, $a0, 31859; LA64-NEXT: slli.d $a0, $a0, 81860; LA64-NEXT: ret1861 %b = mul i64 %a, 23041862 ret i64 %b1863}1864 1865define i64 @mul_i64_4352(i64 %a) {1866; LA32R-LABEL: mul_i64_4352:1867; LA32R: # %bb.0:1868; LA32R-NEXT: lu12i.w $a2, 11869; LA32R-NEXT: ori $a2, $a2, 2561870; LA32R-NEXT: mul.w $a1, $a1, $a21871; LA32R-NEXT: mulh.wu $a3, $a0, $a21872; LA32R-NEXT: add.w $a1, $a3, $a11873; LA32R-NEXT: mul.w $a0, $a0, $a21874; LA32R-NEXT: ret1875;1876; LA32S-LABEL: mul_i64_4352:1877; LA32S: # %bb.0:1878; LA32S-NEXT: lu12i.w $a2, 11879; LA32S-NEXT: ori $a2, $a2, 2561880; LA32S-NEXT: mul.w $a1, $a1, $a21881; LA32S-NEXT: mulh.wu $a3, $a0, $a21882; LA32S-NEXT: add.w $a1, $a3, $a11883; LA32S-NEXT: mul.w $a0, $a0, $a21884; LA32S-NEXT: ret1885;1886; LA64-LABEL: mul_i64_4352:1887; LA64: # %bb.0:1888; LA64-NEXT: alsl.d $a0, $a0, $a0, 41889; LA64-NEXT: slli.d $a0, $a0, 81890; LA64-NEXT: ret1891 %b = mul i64 %a, 43521892 ret i64 %b1893}1894 1895define signext i32 @mul_i32_65792(i32 %a) {1896; LA32R-LABEL: mul_i32_65792:1897; LA32R: # %bb.0:1898; LA32R-NEXT: slli.w $a1, $a0, 81899; LA32R-NEXT: slli.w $a0, $a0, 161900; LA32R-NEXT: add.w $a0, $a0, $a11901; LA32R-NEXT: ret1902;1903; LA32S-LABEL: mul_i32_65792:1904; LA32S: # %bb.0:1905; LA32S-NEXT: slli.w $a1, $a0, 81906; LA32S-NEXT: slli.w $a0, $a0, 161907; LA32S-NEXT: add.w $a0, $a0, $a11908; LA32S-NEXT: ret1909;1910; LA64-LABEL: mul_i32_65792:1911; LA64: # %bb.0:1912; LA64-NEXT: slli.d $a1, $a0, 81913; LA64-NEXT: slli.d $a0, $a0, 161914; LA64-NEXT: add.w $a0, $a0, $a11915; LA64-NEXT: ret1916 %b = mul i32 %a, 657921917 ret i32 %b1918}1919 1920define signext i32 @mul_i32_65280(i32 %a) {1921; LA32R-LABEL: mul_i32_65280:1922; LA32R: # %bb.0:1923; LA32R-NEXT: slli.w $a1, $a0, 81924; LA32R-NEXT: slli.w $a0, $a0, 161925; LA32R-NEXT: sub.w $a0, $a0, $a11926; LA32R-NEXT: ret1927;1928; LA32S-LABEL: mul_i32_65280:1929; LA32S: # %bb.0:1930; LA32S-NEXT: slli.w $a1, $a0, 81931; LA32S-NEXT: slli.w $a0, $a0, 161932; LA32S-NEXT: sub.w $a0, $a0, $a11933; LA32S-NEXT: ret1934;1935; LA64-LABEL: mul_i32_65280:1936; LA64: # %bb.0:1937; LA64-NEXT: slli.d $a1, $a0, 81938; LA64-NEXT: slli.d $a0, $a0, 161939; LA64-NEXT: sub.w $a0, $a0, $a11940; LA64-NEXT: ret1941 %b = mul i32 %a, 652801942 ret i32 %b1943}1944 1945define signext i32 @mul_i32_minus_65280(i32 %a) {1946; LA32R-LABEL: mul_i32_minus_65280:1947; LA32R: # %bb.0:1948; LA32R-NEXT: slli.w $a1, $a0, 161949; LA32R-NEXT: slli.w $a0, $a0, 81950; LA32R-NEXT: sub.w $a0, $a0, $a11951; LA32R-NEXT: ret1952;1953; LA32S-LABEL: mul_i32_minus_65280:1954; LA32S: # %bb.0:1955; LA32S-NEXT: slli.w $a1, $a0, 161956; LA32S-NEXT: slli.w $a0, $a0, 81957; LA32S-NEXT: sub.w $a0, $a0, $a11958; LA32S-NEXT: ret1959;1960; LA64-LABEL: mul_i32_minus_65280:1961; LA64: # %bb.0:1962; LA64-NEXT: slli.d $a1, $a0, 161963; LA64-NEXT: slli.d $a0, $a0, 81964; LA64-NEXT: sub.w $a0, $a0, $a11965; LA64-NEXT: ret1966 %b = mul i32 %a, -652801967 ret i32 %b1968}1969 1970define i64 @mul_i64_65792(i64 %a) {1971; LA32R-LABEL: mul_i64_65792:1972; LA32R: # %bb.0:1973; LA32R-NEXT: lu12i.w $a2, 161974; LA32R-NEXT: ori $a2, $a2, 2561975; LA32R-NEXT: mul.w $a1, $a1, $a21976; LA32R-NEXT: mulh.wu $a3, $a0, $a21977; LA32R-NEXT: add.w $a1, $a3, $a11978; LA32R-NEXT: mul.w $a0, $a0, $a21979; LA32R-NEXT: ret1980;1981; LA32S-LABEL: mul_i64_65792:1982; LA32S: # %bb.0:1983; LA32S-NEXT: lu12i.w $a2, 161984; LA32S-NEXT: ori $a2, $a2, 2561985; LA32S-NEXT: mul.w $a1, $a1, $a21986; LA32S-NEXT: mulh.wu $a3, $a0, $a21987; LA32S-NEXT: add.w $a1, $a3, $a11988; LA32S-NEXT: mul.w $a0, $a0, $a21989; LA32S-NEXT: ret1990;1991; LA64-LABEL: mul_i64_65792:1992; LA64: # %bb.0:1993; LA64-NEXT: slli.d $a1, $a0, 81994; LA64-NEXT: slli.d $a0, $a0, 161995; LA64-NEXT: add.d $a0, $a0, $a11996; LA64-NEXT: ret1997 %b = mul i64 %a, 657921998 ret i64 %b1999}2000 2001define i64 @mul_i64_65280(i64 %a) {2002; LA32R-LABEL: mul_i64_65280:2003; LA32R: # %bb.0:2004; LA32R-NEXT: lu12i.w $a2, 152005; LA32R-NEXT: ori $a2, $a2, 38402006; LA32R-NEXT: mul.w $a1, $a1, $a22007; LA32R-NEXT: mulh.wu $a3, $a0, $a22008; LA32R-NEXT: add.w $a1, $a3, $a12009; LA32R-NEXT: mul.w $a0, $a0, $a22010; LA32R-NEXT: ret2011;2012; LA32S-LABEL: mul_i64_65280:2013; LA32S: # %bb.0:2014; LA32S-NEXT: lu12i.w $a2, 152015; LA32S-NEXT: ori $a2, $a2, 38402016; LA32S-NEXT: mul.w $a1, $a1, $a22017; LA32S-NEXT: mulh.wu $a3, $a0, $a22018; LA32S-NEXT: add.w $a1, $a3, $a12019; LA32S-NEXT: mul.w $a0, $a0, $a22020; LA32S-NEXT: ret2021;2022; LA64-LABEL: mul_i64_65280:2023; LA64: # %bb.0:2024; LA64-NEXT: slli.d $a1, $a0, 82025; LA64-NEXT: slli.d $a0, $a0, 162026; LA64-NEXT: sub.d $a0, $a0, $a12027; LA64-NEXT: ret2028 %b = mul i64 %a, 652802029 ret i64 %b2030}2031 2032define i64 @mul_i64_minus_65280(i64 %a) {2033; LA32R-LABEL: mul_i64_minus_65280:2034; LA32R: # %bb.0:2035; LA32R-NEXT: lu12i.w $a2, -162036; LA32R-NEXT: ori $a2, $a2, 2562037; LA32R-NEXT: mul.w $a1, $a1, $a22038; LA32R-NEXT: mulh.wu $a3, $a0, $a22039; LA32R-NEXT: sub.w $a3, $a3, $a02040; LA32R-NEXT: add.w $a1, $a3, $a12041; LA32R-NEXT: mul.w $a0, $a0, $a22042; LA32R-NEXT: ret2043;2044; LA32S-LABEL: mul_i64_minus_65280:2045; LA32S: # %bb.0:2046; LA32S-NEXT: lu12i.w $a2, -162047; LA32S-NEXT: ori $a2, $a2, 2562048; LA32S-NEXT: mul.w $a1, $a1, $a22049; LA32S-NEXT: mulh.wu $a3, $a0, $a22050; LA32S-NEXT: sub.w $a3, $a3, $a02051; LA32S-NEXT: add.w $a1, $a3, $a12052; LA32S-NEXT: mul.w $a0, $a0, $a22053; LA32S-NEXT: ret2054;2055; LA64-LABEL: mul_i64_minus_65280:2056; LA64: # %bb.0:2057; LA64-NEXT: slli.d $a1, $a0, 162058; LA64-NEXT: slli.d $a0, $a0, 82059; LA64-NEXT: sub.d $a0, $a0, $a12060; LA64-NEXT: ret2061 %b = mul i64 %a, -652802062 ret i64 %b2063}2064 2065;; This multiplication is not transformed, due to2066;; 1088 can be composed via a single ORI.2067define i64 @mul_i64_1088(i64 %a) {2068; LA32R-LABEL: mul_i64_1088:2069; LA32R: # %bb.0:2070; LA32R-NEXT: ori $a2, $zero, 10882071; LA32R-NEXT: mul.w $a1, $a1, $a22072; LA32R-NEXT: mulh.wu $a3, $a0, $a22073; LA32R-NEXT: add.w $a1, $a3, $a12074; LA32R-NEXT: mul.w $a0, $a0, $a22075; LA32R-NEXT: ret2076;2077; LA32S-LABEL: mul_i64_1088:2078; LA32S: # %bb.0:2079; LA32S-NEXT: ori $a2, $zero, 10882080; LA32S-NEXT: mul.w $a1, $a1, $a22081; LA32S-NEXT: mulh.wu $a3, $a0, $a22082; LA32S-NEXT: add.w $a1, $a3, $a12083; LA32S-NEXT: mul.w $a0, $a0, $a22084; LA32S-NEXT: ret2085;2086; LA64-LABEL: mul_i64_1088:2087; LA64: # %bb.0:2088; LA64-NEXT: alsl.d $a0, $a0, $a0, 42089; LA64-NEXT: slli.d $a0, $a0, 62090; LA64-NEXT: ret2091 %b = mul i64 %a, 10882092 ret i64 %b2093}2094 2095;; This multiplication is not transformed, due to2096;; -992 can be composed via a single ADDI.2097define i64 @mul_i64_minus_992(i64 %a) {2098; LA32R-LABEL: mul_i64_minus_992:2099; LA32R: # %bb.0:2100; LA32R-NEXT: addi.w $a2, $zero, -9922101; LA32R-NEXT: mul.w $a1, $a1, $a22102; LA32R-NEXT: mulh.wu $a3, $a0, $a22103; LA32R-NEXT: sub.w $a3, $a3, $a02104; LA32R-NEXT: add.w $a1, $a3, $a12105; LA32R-NEXT: mul.w $a0, $a0, $a22106; LA32R-NEXT: ret2107;2108; LA32S-LABEL: mul_i64_minus_992:2109; LA32S: # %bb.0:2110; LA32S-NEXT: addi.w $a2, $zero, -9922111; LA32S-NEXT: mul.w $a1, $a1, $a22112; LA32S-NEXT: mulh.wu $a3, $a0, $a22113; LA32S-NEXT: sub.w $a3, $a3, $a02114; LA32S-NEXT: add.w $a1, $a3, $a12115; LA32S-NEXT: mul.w $a0, $a0, $a22116; LA32S-NEXT: ret2117;2118; LA64-LABEL: mul_i64_minus_992:2119; LA64: # %bb.0:2120; LA64-NEXT: addi.w $a1, $zero, -9922121; LA64-NEXT: mul.d $a0, $a0, $a12122; LA64-NEXT: ret2123 %b = mul i64 %a, -9922124 ret i64 %b2125}2126 2127;; This multiplication is not transformed, due to2128;; 4456448 can be composed via a single LUI.2129define i64 @mul_i64_4456448(i64 %a) {2130; LA32R-LABEL: mul_i64_4456448:2131; LA32R: # %bb.0:2132; LA32R-NEXT: lu12i.w $a2, 10882133; LA32R-NEXT: mul.w $a1, $a1, $a22134; LA32R-NEXT: mulh.wu $a3, $a0, $a22135; LA32R-NEXT: add.w $a1, $a3, $a12136; LA32R-NEXT: mul.w $a0, $a0, $a22137; LA32R-NEXT: ret2138;2139; LA32S-LABEL: mul_i64_4456448:2140; LA32S: # %bb.0:2141; LA32S-NEXT: lu12i.w $a2, 10882142; LA32S-NEXT: mul.w $a1, $a1, $a22143; LA32S-NEXT: mulh.wu $a3, $a0, $a22144; LA32S-NEXT: add.w $a1, $a3, $a12145; LA32S-NEXT: mul.w $a0, $a0, $a22146; LA32S-NEXT: ret2147;2148; LA64-LABEL: mul_i64_4456448:2149; LA64: # %bb.0:2150; LA64-NEXT: alsl.d $a0, $a0, $a0, 42151; LA64-NEXT: slli.d $a0, $a0, 182152; LA64-NEXT: ret2153 %b = mul i64 %a, 44564482154 ret i64 %b2155}2156 2157;; This multiplication is not transformed, due to2158;; 65280 is used multiple times.2159define i64 @mul_i64_65280_twice(i64 %a, i64 %b) {2160; LA32R-LABEL: mul_i64_65280_twice:2161; LA32R: # %bb.0:2162; LA32R-NEXT: lu12i.w $a4, 152163; LA32R-NEXT: ori $a4, $a4, 38402164; LA32R-NEXT: mul.w $a1, $a1, $a42165; LA32R-NEXT: mulh.wu $a5, $a0, $a42166; LA32R-NEXT: add.w $a1, $a5, $a12167; LA32R-NEXT: mul.w $a0, $a0, $a42168; LA32R-NEXT: mul.w $a3, $a3, $a42169; LA32R-NEXT: mulh.wu $a5, $a2, $a42170; LA32R-NEXT: add.w $a3, $a5, $a32171; LA32R-NEXT: mul.w $a2, $a2, $a42172; LA32R-NEXT: xor $a1, $a1, $a32173; LA32R-NEXT: xor $a0, $a0, $a22174; LA32R-NEXT: ret2175;2176; LA32S-LABEL: mul_i64_65280_twice:2177; LA32S: # %bb.0:2178; LA32S-NEXT: lu12i.w $a4, 152179; LA32S-NEXT: ori $a4, $a4, 38402180; LA32S-NEXT: mul.w $a1, $a1, $a42181; LA32S-NEXT: mulh.wu $a5, $a0, $a42182; LA32S-NEXT: add.w $a1, $a5, $a12183; LA32S-NEXT: mul.w $a0, $a0, $a42184; LA32S-NEXT: mul.w $a3, $a3, $a42185; LA32S-NEXT: mulh.wu $a5, $a2, $a42186; LA32S-NEXT: add.w $a3, $a5, $a32187; LA32S-NEXT: mul.w $a2, $a2, $a42188; LA32S-NEXT: xor $a1, $a1, $a32189; LA32S-NEXT: xor $a0, $a0, $a22190; LA32S-NEXT: ret2191;2192; LA64-LABEL: mul_i64_65280_twice:2193; LA64: # %bb.0:2194; LA64-NEXT: lu12i.w $a2, 152195; LA64-NEXT: ori $a2, $a2, 38402196; LA64-NEXT: mul.d $a0, $a0, $a22197; LA64-NEXT: mul.d $a1, $a1, $a22198; LA64-NEXT: xor $a0, $a0, $a12199; LA64-NEXT: ret2200 %c = mul i64 %a, 652802201 %d = mul i64 %b, 652802202 %e = xor i64 %c, %d2203 ret i64 %e2204}2205