428 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=mipsel-mti-linux-gnu < %s | FileCheck %s -check-prefix=MIPS323; RUN: llc -mtriple=mips64el-mti-linux-gnu < %s | FileCheck %s -check-prefix=MIPS644 5 6define i32 @mul5_32(i32 signext %a) {7; MIPS32-LABEL: mul5_32:8; MIPS32: # %bb.0: # %entry9; MIPS32-NEXT: sll $1, $4, 210; MIPS32-NEXT: jr $ra11; MIPS32-NEXT: addu $2, $1, $412;13; MIPS64-LABEL: mul5_32:14; MIPS64: # %bb.0: # %entry15; MIPS64-NEXT: sll $1, $4, 216; MIPS64-NEXT: jr $ra17; MIPS64-NEXT: addu $2, $1, $418entry:19 %mul = mul nsw i32 %a, 520 ret i32 %mul21}22 23define i32 @mul27_32(i32 signext %a) {24; MIPS32-LABEL: mul27_32:25; MIPS32: # %bb.0: # %entry26; MIPS32-NEXT: sll $1, $4, 227; MIPS32-NEXT: addu $1, $1, $428; MIPS32-NEXT: sll $2, $4, 529; MIPS32-NEXT: jr $ra30; MIPS32-NEXT: subu $2, $2, $131;32; MIPS64-LABEL: mul27_32:33; MIPS64: # %bb.0: # %entry34; MIPS64-NEXT: sll $1, $4, 235; MIPS64-NEXT: addu $1, $1, $436; MIPS64-NEXT: sll $2, $4, 537; MIPS64-NEXT: jr $ra38; MIPS64-NEXT: subu $2, $2, $139entry:40 %mul = mul nsw i32 %a, 2741 ret i32 %mul42}43 44define i32 @muln2147483643_32(i32 signext %a) {45; MIPS32-LABEL: muln2147483643_32:46; MIPS32: # %bb.0: # %entry47; MIPS32-NEXT: sll $1, $4, 248; MIPS32-NEXT: addu $1, $1, $449; MIPS32-NEXT: sll $2, $4, 3150; MIPS32-NEXT: jr $ra51; MIPS32-NEXT: addu $2, $2, $152;53; MIPS64-LABEL: muln2147483643_32:54; MIPS64: # %bb.0: # %entry55; MIPS64-NEXT: sll $1, $4, 256; MIPS64-NEXT: addu $1, $1, $457; MIPS64-NEXT: sll $2, $4, 3158; MIPS64-NEXT: jr $ra59; MIPS64-NEXT: addu $2, $2, $160entry:61 %mul = mul nsw i32 %a, -214748364362 ret i32 %mul63}64 65define i64 @muln9223372036854775805_64(i64 signext %a) {66; MIPS32-LABEL: muln9223372036854775805_64:67; MIPS32: # %bb.0: # %entry68; MIPS32-NEXT: sll $1, $4, 169; MIPS32-NEXT: addu $2, $1, $470; MIPS32-NEXT: sltu $1, $2, $171; MIPS32-NEXT: srl $3, $4, 3172; MIPS32-NEXT: sll $6, $5, 173; MIPS32-NEXT: or $3, $6, $374; MIPS32-NEXT: addu $3, $3, $575; MIPS32-NEXT: addu $1, $3, $176; MIPS32-NEXT: sll $3, $4, 3177; MIPS32-NEXT: jr $ra78; MIPS32-NEXT: addu $3, $3, $179;80; MIPS64-LABEL: muln9223372036854775805_64:81; MIPS64: # %bb.0: # %entry82; MIPS64-NEXT: dsll $1, $4, 183; MIPS64-NEXT: daddu $1, $1, $484; MIPS64-NEXT: dsll $2, $4, 6385; MIPS64-NEXT: jr $ra86; MIPS64-NEXT: daddu $2, $2, $187entry:88 %mul = mul nsw i64 %a, -922337203685477580589 ret i64 %mul90}91 92define i128 @muln170141183460469231731687303715884105725_128(i128 signext %a) {93; MIPS32-LABEL: muln170141183460469231731687303715884105725_128:94; MIPS32: # %bb.0: # %entry95; MIPS32-NEXT: sll $1, $4, 196; MIPS32-NEXT: addu $2, $1, $497; MIPS32-NEXT: sltu $1, $2, $198; MIPS32-NEXT: srl $3, $4, 3199; MIPS32-NEXT: sll $8, $5, 1100; MIPS32-NEXT: or $8, $8, $3101; MIPS32-NEXT: addu $3, $8, $5102; MIPS32-NEXT: addu $3, $3, $1103; MIPS32-NEXT: sltu $9, $3, $8104; MIPS32-NEXT: xor $8, $3, $8105; MIPS32-NEXT: movz $9, $1, $8106; MIPS32-NEXT: srl $1, $5, 31107; MIPS32-NEXT: sll $5, $6, 1108; MIPS32-NEXT: or $5, $5, $1109; MIPS32-NEXT: addu $8, $5, $6110; MIPS32-NEXT: addu $1, $8, $9111; MIPS32-NEXT: sltu $5, $8, $5112; MIPS32-NEXT: srl $6, $6, 31113; MIPS32-NEXT: sll $9, $7, 1114; MIPS32-NEXT: or $6, $9, $6115; MIPS32-NEXT: addu $6, $6, $7116; MIPS32-NEXT: addu $5, $6, $5117; MIPS32-NEXT: sll $4, $4, 31118; MIPS32-NEXT: sltu $6, $1, $8119; MIPS32-NEXT: addu $5, $5, $6120; MIPS32-NEXT: addu $5, $4, $5121; MIPS32-NEXT: jr $ra122; MIPS32-NEXT: move $4, $1123;124; MIPS64-LABEL: muln170141183460469231731687303715884105725_128:125; MIPS64: # %bb.0: # %entry126; MIPS64-NEXT: dsrl $1, $4, 63127; MIPS64-NEXT: dsll $2, $5, 1128; MIPS64-NEXT: or $1, $2, $1129; MIPS64-NEXT: daddu $1, $1, $5130; MIPS64-NEXT: dsll $3, $4, 1131; MIPS64-NEXT: daddu $2, $3, $4132; MIPS64-NEXT: sltu $3, $2, $3133; MIPS64-NEXT: dsll $3, $3, 32134; MIPS64-NEXT: dsrl $3, $3, 32135; MIPS64-NEXT: daddu $1, $1, $3136; MIPS64-NEXT: dsll $3, $4, 63137; MIPS64-NEXT: jr $ra138; MIPS64-NEXT: daddu $3, $3, $1139entry:140 %mul = mul nsw i128 %a, -170141183460469231731687303715884105725141 ret i128 %mul142}143 144define i128 @mul170141183460469231731687303715884105723_128(i128 signext %a) {145; MIPS32-LABEL: mul170141183460469231731687303715884105723_128:146; MIPS32: # %bb.0: # %entry147; MIPS32-NEXT: sll $1, $4, 2148; MIPS32-NEXT: addu $2, $1, $4149; MIPS32-NEXT: sltu $1, $2, $1150; MIPS32-NEXT: srl $3, $4, 30151; MIPS32-NEXT: sll $8, $5, 2152; MIPS32-NEXT: or $3, $8, $3153; MIPS32-NEXT: addu $8, $3, $5154; MIPS32-NEXT: addu $8, $8, $1155; MIPS32-NEXT: sltu $9, $8, $3156; MIPS32-NEXT: xor $3, $8, $3157; MIPS32-NEXT: sltu $10, $zero, $8158; MIPS32-NEXT: sltu $11, $zero, $2159; MIPS32-NEXT: movz $10, $11, $8160; MIPS32-NEXT: movz $9, $1, $3161; MIPS32-NEXT: srl $1, $5, 30162; MIPS32-NEXT: sll $3, $6, 2163; MIPS32-NEXT: or $1, $3, $1164; MIPS32-NEXT: addu $3, $1, $6165; MIPS32-NEXT: addu $5, $3, $9166; MIPS32-NEXT: sll $4, $4, 31167; MIPS32-NEXT: negu $9, $5168; MIPS32-NEXT: sltu $12, $9, $10169; MIPS32-NEXT: sltu $13, $5, $3170; MIPS32-NEXT: sltu $1, $3, $1171; MIPS32-NEXT: srl $3, $6, 30172; MIPS32-NEXT: sll $6, $7, 2173; MIPS32-NEXT: or $3, $6, $3174; MIPS32-NEXT: addu $3, $3, $7175; MIPS32-NEXT: addu $1, $3, $1176; MIPS32-NEXT: addu $1, $1, $13177; MIPS32-NEXT: subu $1, $4, $1178; MIPS32-NEXT: sltu $3, $zero, $5179; MIPS32-NEXT: subu $1, $1, $3180; MIPS32-NEXT: subu $5, $1, $12181; MIPS32-NEXT: subu $4, $9, $10182; MIPS32-NEXT: addu $1, $8, $11183; MIPS32-NEXT: negu $3, $1184; MIPS32-NEXT: jr $ra185; MIPS32-NEXT: negu $2, $2186;187; MIPS64-LABEL: mul170141183460469231731687303715884105723_128:188; MIPS64: # %bb.0: # %entry189; MIPS64-NEXT: dsrl $1, $4, 62190; MIPS64-NEXT: dsll $2, $5, 2191; MIPS64-NEXT: or $1, $2, $1192; MIPS64-NEXT: daddu $1, $1, $5193; MIPS64-NEXT: dsll $2, $4, 2194; MIPS64-NEXT: daddu $5, $2, $4195; MIPS64-NEXT: sltu $2, $5, $2196; MIPS64-NEXT: dsll $2, $2, 32197; MIPS64-NEXT: dsrl $2, $2, 32198; MIPS64-NEXT: daddu $1, $1, $2199; MIPS64-NEXT: dsll $2, $4, 63200; MIPS64-NEXT: dsubu $1, $2, $1201; MIPS64-NEXT: sltu $2, $zero, $5202; MIPS64-NEXT: dsll $2, $2, 32203; MIPS64-NEXT: dsrl $2, $2, 32204; MIPS64-NEXT: dsubu $3, $1, $2205; MIPS64-NEXT: jr $ra206; MIPS64-NEXT: dnegu $2, $5207entry:208 %mul = mul nsw i128 %a, 170141183460469231731687303715884105723209 ret i128 %mul210}211 212define i32 @mul42949673_32(i32 %a) {213; MIPS32-LABEL: mul42949673_32:214; MIPS32: # %bb.0:215; MIPS32-NEXT: lui $1, 655216; MIPS32-NEXT: ori $1, $1, 23593217; MIPS32-NEXT: jr $ra218; MIPS32-NEXT: mul $2, $4, $1219;220; MIPS64-LABEL: mul42949673_32:221; MIPS64: # %bb.0:222; MIPS64-NEXT: lui $1, 655223; MIPS64-NEXT: ori $1, $1, 23593224; MIPS64-NEXT: sll $2, $4, 0225; MIPS64-NEXT: jr $ra226; MIPS64-NEXT: mul $2, $2, $1227 %b = mul i32 %a, 42949673228 ret i32 %b229}230 231define i64 @mul42949673_64(i64 %a) {232; MIPS32-LABEL: mul42949673_64:233; MIPS32: # %bb.0: # %entry234; MIPS32-NEXT: lui $1, 655235; MIPS32-NEXT: ori $1, $1, 23593236; MIPS32-NEXT: multu $4, $1237; MIPS32-NEXT: mflo $2238; MIPS32-NEXT: mfhi $3239; MIPS32-NEXT: mul $1, $5, $1240; MIPS32-NEXT: jr $ra241; MIPS32-NEXT: addu $3, $3, $1242;243; MIPS64-LABEL: mul42949673_64:244; MIPS64: # %bb.0: # %entry245; MIPS64-NEXT: lui $1, 655246; MIPS64-NEXT: ori $1, $1, 23593247; MIPS64-NEXT: dmult $4, $1248; MIPS64-NEXT: jr $ra249; MIPS64-NEXT: mflo $2250entry:251 %b = mul i64 %a, 42949673252 ret i64 %b253}254 255define i32 @mul22224078_32(i32 %a) {256; MIPS32-LABEL: mul22224078_32:257; MIPS32: # %bb.0: # %entry258; MIPS32-NEXT: lui $1, 339259; MIPS32-NEXT: ori $1, $1, 7374260; MIPS32-NEXT: jr $ra261; MIPS32-NEXT: mul $2, $4, $1262;263; MIPS64-LABEL: mul22224078_32:264; MIPS64: # %bb.0: # %entry265; MIPS64-NEXT: lui $1, 339266; MIPS64-NEXT: ori $1, $1, 7374267; MIPS64-NEXT: sll $2, $4, 0268; MIPS64-NEXT: jr $ra269; MIPS64-NEXT: mul $2, $2, $1270entry:271 %b = mul i32 %a, 22224078272 ret i32 %b273}274 275define i64 @mul22224078_64(i64 %a) {276; MIPS32-LABEL: mul22224078_64:277; MIPS32: # %bb.0: # %entry278; MIPS32-NEXT: lui $1, 339279; MIPS32-NEXT: ori $1, $1, 7374280; MIPS32-NEXT: multu $4, $1281; MIPS32-NEXT: mflo $2282; MIPS32-NEXT: mfhi $3283; MIPS32-NEXT: mul $1, $5, $1284; MIPS32-NEXT: jr $ra285; MIPS32-NEXT: addu $3, $3, $1286;287; MIPS64-LABEL: mul22224078_64:288; MIPS64: # %bb.0: # %entry289; MIPS64-NEXT: lui $1, 339290; MIPS64-NEXT: ori $1, $1, 7374291; MIPS64-NEXT: dmult $4, $1292; MIPS64-NEXT: jr $ra293; MIPS64-NEXT: mflo $2294entry:295 %b = mul i64 %a, 22224078296 ret i64 %b297}298 299define i32 @mul22245375_32(i32 %a) {300; MIPS32-LABEL: mul22245375_32:301; MIPS32: # %bb.0: # %entry302; MIPS32-NEXT: lui $1, 339303; MIPS32-NEXT: ori $1, $1, 28671304; MIPS32-NEXT: jr $ra305; MIPS32-NEXT: mul $2, $4, $1306;307; MIPS64-LABEL: mul22245375_32:308; MIPS64: # %bb.0: # %entry309; MIPS64-NEXT: lui $1, 339310; MIPS64-NEXT: ori $1, $1, 28671311; MIPS64-NEXT: sll $2, $4, 0312; MIPS64-NEXT: jr $ra313; MIPS64-NEXT: mul $2, $2, $1314entry:315 %b = mul i32 %a, 22245375316 ret i32 %b317}318 319define i64 @mul22245375_64(i64 %a) {320; MIPS32-LABEL: mul22245375_64:321; MIPS32: # %bb.0: # %entry322; MIPS32-NEXT: lui $1, 339323; MIPS32-NEXT: ori $1, $1, 28671324; MIPS32-NEXT: multu $4, $1325; MIPS32-NEXT: mflo $2326; MIPS32-NEXT: mfhi $3327; MIPS32-NEXT: mul $1, $5, $1328; MIPS32-NEXT: jr $ra329; MIPS32-NEXT: addu $3, $3, $1330;331; MIPS64-LABEL: mul22245375_64:332; MIPS64: # %bb.0: # %entry333; MIPS64-NEXT: lui $1, 339334; MIPS64-NEXT: ori $1, $1, 28671335; MIPS64-NEXT: dmult $4, $1336; MIPS64-NEXT: jr $ra337; MIPS64-NEXT: mflo $2338entry:339 %b = mul i64 %a, 22245375340 ret i64 %b341}342 343define i32 @mul25165824_32(i32 %a) {344; MIPS32-LABEL: mul25165824_32:345; MIPS32: # %bb.0: # %entry346; MIPS32-NEXT: lui $1, 339347; MIPS32-NEXT: ori $1, $1, 28671348; MIPS32-NEXT: jr $ra349; MIPS32-NEXT: mul $2, $4, $1350;351; MIPS64-LABEL: mul25165824_32:352; MIPS64: # %bb.0: # %entry353; MIPS64-NEXT: lui $1, 339354; MIPS64-NEXT: ori $1, $1, 28671355; MIPS64-NEXT: sll $2, $4, 0356; MIPS64-NEXT: jr $ra357; MIPS64-NEXT: mul $2, $2, $1358entry:359 %b = mul i32 %a, 22245375360 ret i32 %b361}362 363define i64 @mul25165824_64(i64 %a) {364; MIPS32-LABEL: mul25165824_64:365; MIPS32: # %bb.0: # %entry366; MIPS32-NEXT: srl $1, $4, 9367; MIPS32-NEXT: sll $2, $5, 23368; MIPS32-NEXT: or $1, $2, $1369; MIPS32-NEXT: srl $2, $4, 8370; MIPS32-NEXT: sll $3, $5, 24371; MIPS32-NEXT: or $2, $3, $2372; MIPS32-NEXT: addu $1, $2, $1373; MIPS32-NEXT: sll $2, $4, 23374; MIPS32-NEXT: sll $3, $4, 24375; MIPS32-NEXT: addu $2, $3, $2376; MIPS32-NEXT: sltu $3, $2, $3377; MIPS32-NEXT: jr $ra378; MIPS32-NEXT: addu $3, $1, $3379;380; MIPS64-LABEL: mul25165824_64:381; MIPS64: # %bb.0: # %entry382; MIPS64-NEXT: dsll $1, $4, 23383; MIPS64-NEXT: dsll $2, $4, 24384; MIPS64-NEXT: jr $ra385; MIPS64-NEXT: daddu $2, $2, $1386entry:387 %b = mul i64 %a, 25165824388 ret i64 %b389}390 391define i32 @mul33554432_32(i32 %a) {392; MIPS32-LABEL: mul33554432_32:393; MIPS32: # %bb.0: # %entry394; MIPS32-NEXT: lui $1, 339395; MIPS32-NEXT: ori $1, $1, 28671396; MIPS32-NEXT: jr $ra397; MIPS32-NEXT: mul $2, $4, $1398;399; MIPS64-LABEL: mul33554432_32:400; MIPS64: # %bb.0: # %entry401; MIPS64-NEXT: lui $1, 339402; MIPS64-NEXT: ori $1, $1, 28671403; MIPS64-NEXT: sll $2, $4, 0404; MIPS64-NEXT: jr $ra405; MIPS64-NEXT: mul $2, $2, $1406entry:407 %b = mul i32 %a, 22245375408 ret i32 %b409}410 411define i64 @mul33554432_64(i64 %a) {412; MIPS32-LABEL: mul33554432_64:413; MIPS32: # %bb.0: # %entry414; MIPS32-NEXT: srl $1, $4, 7415; MIPS32-NEXT: sll $2, $5, 25416; MIPS32-NEXT: or $3, $2, $1417; MIPS32-NEXT: jr $ra418; MIPS32-NEXT: sll $2, $4, 25419;420; MIPS64-LABEL: mul33554432_64:421; MIPS64: # %bb.0: # %entry422; MIPS64-NEXT: jr $ra423; MIPS64-NEXT: dsll $2, $4, 25424entry:425 %b = mul i64 %a, 33554432426 ret i64 %b427}428