519 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 6define i8 @alsl_i8(i8 signext %a, i8 signext %b) nounwind {7; LA32R-LABEL: alsl_i8:8; LA32R: # %bb.0: # %entry9; LA32R-NEXT: slli.w $a0, $a0, 110; LA32R-NEXT: add.w $a0, $a1, $a011; LA32R-NEXT: ret12;13; LA32S-LABEL: alsl_i8:14; LA32S: # %bb.0: # %entry15; LA32S-NEXT: alsl.w $a0, $a0, $a1, 116; LA32S-NEXT: ret17;18; LA64-LABEL: alsl_i8:19; LA64: # %bb.0: # %entry20; LA64-NEXT: alsl.d $a0, $a0, $a1, 121; LA64-NEXT: ret22entry:23 %mul = mul nsw i8 %a, 224 %add = add nsw i8 %b, %mul25 ret i8 %add26}27 28define i16 @alsl_i16(i16 signext %a, i16 signext %b) nounwind {29; LA32R-LABEL: alsl_i16:30; LA32R: # %bb.0: # %entry31; LA32R-NEXT: slli.w $a0, $a0, 232; LA32R-NEXT: add.w $a0, $a1, $a033; LA32R-NEXT: ret34;35; LA32S-LABEL: alsl_i16:36; LA32S: # %bb.0: # %entry37; LA32S-NEXT: alsl.w $a0, $a0, $a1, 238; LA32S-NEXT: ret39;40; LA64-LABEL: alsl_i16:41; LA64: # %bb.0: # %entry42; LA64-NEXT: alsl.d $a0, $a0, $a1, 243; LA64-NEXT: ret44entry:45 %mul = mul nsw i16 %a, 446 %add = add nsw i16 %b, %mul47 ret i16 %add48}49 50define i32 @alsl_i32(i32 signext %a, i32 signext %b) nounwind {51; LA32R-LABEL: alsl_i32:52; LA32R: # %bb.0: # %entry53; LA32R-NEXT: slli.w $a0, $a0, 354; LA32R-NEXT: add.w $a0, $a1, $a055; LA32R-NEXT: ret56;57; LA32S-LABEL: alsl_i32:58; LA32S: # %bb.0: # %entry59; LA32S-NEXT: alsl.w $a0, $a0, $a1, 360; LA32S-NEXT: ret61;62; LA64-LABEL: alsl_i32:63; LA64: # %bb.0: # %entry64; LA64-NEXT: alsl.w $a0, $a0, $a1, 365; LA64-NEXT: ret66entry:67 %mul = mul nsw i32 %a, 868 %add = add nsw i32 %b, %mul69 ret i32 %add70}71 72define i64 @alsl_i64(i64 signext %a, i64 signext %b) nounwind {73; LA32R-LABEL: alsl_i64:74; LA32R: # %bb.0: # %entry75; LA32R-NEXT: srli.w $a4, $a0, 2876; LA32R-NEXT: slli.w $a1, $a1, 477; LA32R-NEXT: or $a1, $a1, $a478; LA32R-NEXT: slli.w $a0, $a0, 479; LA32R-NEXT: add.w $a0, $a2, $a080; LA32R-NEXT: sltu $a2, $a0, $a281; LA32R-NEXT: add.w $a1, $a3, $a182; LA32R-NEXT: add.w $a1, $a1, $a283; LA32R-NEXT: ret84;85; LA32S-LABEL: alsl_i64:86; LA32S: # %bb.0: # %entry87; LA32S-NEXT: srli.w $a4, $a0, 2888; LA32S-NEXT: slli.w $a1, $a1, 489; LA32S-NEXT: or $a1, $a1, $a490; LA32S-NEXT: alsl.w $a0, $a0, $a2, 491; LA32S-NEXT: sltu $a2, $a0, $a292; LA32S-NEXT: add.w $a1, $a3, $a193; LA32S-NEXT: add.w $a1, $a1, $a294; LA32S-NEXT: ret95;96; LA64-LABEL: alsl_i64:97; LA64: # %bb.0: # %entry98; LA64-NEXT: alsl.d $a0, $a0, $a1, 499; LA64-NEXT: ret100entry:101 %mul = mul nsw i64 %a, 16102 %add = add nsw i64 %b, %mul103 ret i64 %add104}105 106define i32 @alsl_zext_i8(i8 signext %a, i8 signext %b) nounwind {107; LA32R-LABEL: alsl_zext_i8:108; LA32R: # %bb.0: # %entry109; LA32R-NEXT: slli.w $a0, $a0, 1110; LA32R-NEXT: add.w $a0, $a1, $a0111; LA32R-NEXT: andi $a0, $a0, 255112; LA32R-NEXT: ret113;114; LA32S-LABEL: alsl_zext_i8:115; LA32S: # %bb.0: # %entry116; LA32S-NEXT: alsl.w $a0, $a0, $a1, 1117; LA32S-NEXT: andi $a0, $a0, 255118; LA32S-NEXT: ret119;120; LA64-LABEL: alsl_zext_i8:121; LA64: # %bb.0: # %entry122; LA64-NEXT: alsl.d $a0, $a0, $a1, 1123; LA64-NEXT: andi $a0, $a0, 255124; LA64-NEXT: ret125entry:126 %mul = mul nsw i8 %a, 2127 %add = add nsw i8 %b, %mul128 %zext = zext i8 %add to i32129 ret i32 %zext130}131 132define i32 @alsl_zext_i16(i16 signext %a, i16 signext %b) nounwind {133; LA32R-LABEL: alsl_zext_i16:134; LA32R: # %bb.0: # %entry135; LA32R-NEXT: slli.w $a0, $a0, 2136; LA32R-NEXT: add.w $a0, $a1, $a0137; LA32R-NEXT: lu12i.w $a1, 15138; LA32R-NEXT: ori $a1, $a1, 4095139; LA32R-NEXT: and $a0, $a0, $a1140; LA32R-NEXT: ret141;142; LA32S-LABEL: alsl_zext_i16:143; LA32S: # %bb.0: # %entry144; LA32S-NEXT: alsl.w $a0, $a0, $a1, 2145; LA32S-NEXT: bstrpick.w $a0, $a0, 15, 0146; LA32S-NEXT: ret147;148; LA64-LABEL: alsl_zext_i16:149; LA64: # %bb.0: # %entry150; LA64-NEXT: alsl.d $a0, $a0, $a1, 2151; LA64-NEXT: bstrpick.d $a0, $a0, 15, 0152; LA64-NEXT: ret153entry:154 %mul = mul nsw i16 %a, 4155 %add = add nsw i16 %b, %mul156 %zext = zext i16 %add to i32157 ret i32 %zext158}159 160define i64 @alsl_zext_i32(i32 signext %a, i32 signext %b) nounwind {161; LA32R-LABEL: alsl_zext_i32:162; LA32R: # %bb.0: # %entry163; LA32R-NEXT: slli.w $a0, $a0, 3164; LA32R-NEXT: add.w $a0, $a1, $a0165; LA32R-NEXT: move $a1, $zero166; LA32R-NEXT: ret167;168; LA32S-LABEL: alsl_zext_i32:169; LA32S: # %bb.0: # %entry170; LA32S-NEXT: alsl.w $a0, $a0, $a1, 3171; LA32S-NEXT: move $a1, $zero172; LA32S-NEXT: ret173;174; LA64-LABEL: alsl_zext_i32:175; LA64: # %bb.0: # %entry176; LA64-NEXT: alsl.wu $a0, $a0, $a1, 3177; LA64-NEXT: ret178entry:179 %mul = mul nsw i32 %a, 8180 %add = add nsw i32 %b, %mul181 %zext = zext i32 %add to i64182 ret i64 %zext183}184 185define i8 @mul_add_i8(i8 signext %a, i8 signext %b) nounwind {186; LA32R-LABEL: mul_add_i8:187; LA32R: # %bb.0: # %entry188; LA32R-NEXT: slli.w $a2, $a0, 1189; LA32R-NEXT: add.w $a0, $a2, $a0190; LA32R-NEXT: add.w $a0, $a1, $a0191; LA32R-NEXT: ret192;193; LA32S-LABEL: mul_add_i8:194; LA32S: # %bb.0: # %entry195; LA32S-NEXT: alsl.w $a0, $a0, $a0, 1196; LA32S-NEXT: add.w $a0, $a1, $a0197; LA32S-NEXT: ret198;199; LA64-LABEL: mul_add_i8:200; LA64: # %bb.0: # %entry201; LA64-NEXT: alsl.d $a0, $a0, $a0, 1202; LA64-NEXT: add.d $a0, $a1, $a0203; LA64-NEXT: ret204entry:205 %mul = mul nsw i8 %a, 3206 %add = add nsw i8 %b, %mul207 ret i8 %add208}209 210define i16 @mul_add_i16(i16 signext %a, i16 signext %b) nounwind {211; LA32R-LABEL: mul_add_i16:212; LA32R: # %bb.0: # %entry213; LA32R-NEXT: slli.w $a2, $a0, 1214; LA32R-NEXT: slli.w $a0, $a0, 3215; LA32R-NEXT: add.w $a0, $a0, $a2216; LA32R-NEXT: add.w $a0, $a1, $a0217; LA32R-NEXT: ret218;219; LA32S-LABEL: mul_add_i16:220; LA32S: # %bb.0: # %entry221; LA32S-NEXT: slli.w $a2, $a0, 3222; LA32S-NEXT: alsl.w $a0, $a0, $a2, 1223; LA32S-NEXT: add.w $a0, $a1, $a0224; LA32S-NEXT: ret225;226; LA64-LABEL: mul_add_i16:227; LA64: # %bb.0: # %entry228; LA64-NEXT: slli.d $a2, $a0, 3229; LA64-NEXT: alsl.d $a0, $a0, $a2, 1230; LA64-NEXT: add.d $a0, $a1, $a0231; LA64-NEXT: ret232entry:233 %mul = mul nsw i16 %a, 10234 %add = add nsw i16 %b, %mul235 ret i16 %add236}237 238define i32 @mul_add_i32(i32 signext %a, i32 signext %b) nounwind {239; LA32R-LABEL: mul_add_i32:240; LA32R: # %bb.0: # %entry241; LA32R-NEXT: slli.w $a2, $a0, 2242; LA32R-NEXT: slli.w $a0, $a0, 3243; LA32R-NEXT: add.w $a0, $a0, $a2244; LA32R-NEXT: add.w $a0, $a1, $a0245; LA32R-NEXT: ret246;247; LA32S-LABEL: mul_add_i32:248; LA32S: # %bb.0: # %entry249; LA32S-NEXT: slli.w $a2, $a0, 3250; LA32S-NEXT: alsl.w $a0, $a0, $a2, 2251; LA32S-NEXT: add.w $a0, $a1, $a0252; LA32S-NEXT: ret253;254; LA64-LABEL: mul_add_i32:255; LA64: # %bb.0: # %entry256; LA64-NEXT: slli.d $a2, $a0, 3257; LA64-NEXT: alsl.d $a0, $a0, $a2, 2258; LA64-NEXT: add.w $a0, $a1, $a0259; LA64-NEXT: ret260entry:261 %mul = mul nsw i32 %a, 12262 %add = add nsw i32 %b, %mul263 ret i32 %add264}265 266define i64 @mul_add_i64(i64 signext %a, i64 signext %b) nounwind {267; LA32R-LABEL: mul_add_i64:268; LA32R: # %bb.0: # %entry269; LA32R-NEXT: ori $a4, $zero, 15270; LA32R-NEXT: mulh.wu $a4, $a0, $a4271; LA32R-NEXT: slli.w $a5, $a1, 4272; LA32R-NEXT: sub.w $a1, $a5, $a1273; LA32R-NEXT: add.w $a1, $a4, $a1274; LA32R-NEXT: slli.w $a4, $a0, 4275; LA32R-NEXT: sub.w $a0, $a4, $a0276; LA32R-NEXT: add.w $a1, $a3, $a1277; LA32R-NEXT: add.w $a0, $a2, $a0278; LA32R-NEXT: sltu $a2, $a0, $a2279; LA32R-NEXT: add.w $a1, $a1, $a2280; LA32R-NEXT: ret281;282; LA32S-LABEL: mul_add_i64:283; LA32S: # %bb.0: # %entry284; LA32S-NEXT: ori $a4, $zero, 15285; LA32S-NEXT: mulh.wu $a4, $a0, $a4286; LA32S-NEXT: slli.w $a5, $a1, 4287; LA32S-NEXT: sub.w $a1, $a5, $a1288; LA32S-NEXT: add.w $a1, $a4, $a1289; LA32S-NEXT: slli.w $a4, $a0, 4290; LA32S-NEXT: sub.w $a0, $a4, $a0291; LA32S-NEXT: add.w $a1, $a3, $a1292; LA32S-NEXT: add.w $a0, $a2, $a0293; LA32S-NEXT: sltu $a2, $a0, $a2294; LA32S-NEXT: add.w $a1, $a1, $a2295; LA32S-NEXT: ret296;297; LA64-LABEL: mul_add_i64:298; LA64: # %bb.0: # %entry299; LA64-NEXT: slli.d $a2, $a0, 4300; LA64-NEXT: sub.d $a0, $a2, $a0301; LA64-NEXT: add.d $a0, $a1, $a0302; LA64-NEXT: ret303entry:304 %mul = mul nsw i64 %a, 15305 %add = add nsw i64 %b, %mul306 ret i64 %add307}308 309define i32 @mul_add_zext_i8(i8 signext %a, i8 signext %b) nounwind {310; LA32R-LABEL: mul_add_zext_i8:311; LA32R: # %bb.0: # %entry312; LA32R-NEXT: slli.w $a2, $a0, 2313; LA32R-NEXT: add.w $a0, $a2, $a0314; LA32R-NEXT: add.w $a0, $a1, $a0315; LA32R-NEXT: andi $a0, $a0, 255316; LA32R-NEXT: ret317;318; LA32S-LABEL: mul_add_zext_i8:319; LA32S: # %bb.0: # %entry320; LA32S-NEXT: alsl.w $a0, $a0, $a0, 2321; LA32S-NEXT: add.w $a0, $a1, $a0322; LA32S-NEXT: andi $a0, $a0, 255323; LA32S-NEXT: ret324;325; LA64-LABEL: mul_add_zext_i8:326; LA64: # %bb.0: # %entry327; LA64-NEXT: alsl.d $a0, $a0, $a0, 2328; LA64-NEXT: add.d $a0, $a1, $a0329; LA64-NEXT: andi $a0, $a0, 255330; LA64-NEXT: ret331entry:332 %mul = mul nsw i8 %a, 5333 %add = add nsw i8 %b, %mul334 %zext = zext i8 %add to i32335 ret i32 %zext336}337 338define i32 @mul_add_zext_i16(i16 signext %a, i16 signext %b) nounwind {339; LA32R-LABEL: mul_add_zext_i16:340; LA32R: # %bb.0: # %entry341; LA32R-NEXT: slli.w $a2, $a0, 4342; LA32R-NEXT: sub.w $a0, $a2, $a0343; LA32R-NEXT: add.w $a0, $a1, $a0344; LA32R-NEXT: lu12i.w $a1, 15345; LA32R-NEXT: ori $a1, $a1, 4095346; LA32R-NEXT: and $a0, $a0, $a1347; LA32R-NEXT: ret348;349; LA32S-LABEL: mul_add_zext_i16:350; LA32S: # %bb.0: # %entry351; LA32S-NEXT: slli.w $a2, $a0, 4352; LA32S-NEXT: sub.w $a0, $a2, $a0353; LA32S-NEXT: add.w $a0, $a1, $a0354; LA32S-NEXT: bstrpick.w $a0, $a0, 15, 0355; LA32S-NEXT: ret356;357; LA64-LABEL: mul_add_zext_i16:358; LA64: # %bb.0: # %entry359; LA64-NEXT: slli.d $a2, $a0, 4360; LA64-NEXT: sub.d $a0, $a2, $a0361; LA64-NEXT: add.d $a0, $a1, $a0362; LA64-NEXT: bstrpick.d $a0, $a0, 15, 0363; LA64-NEXT: ret364entry:365 %mul = mul nsw i16 %a, 15366 %add = add nsw i16 %b, %mul367 %zext = zext i16 %add to i32368 ret i32 %zext369}370 371define i64 @mul_add_zext_i32(i32 signext %a, i32 signext %b) nounwind {372; LA32R-LABEL: mul_add_zext_i32:373; LA32R: # %bb.0: # %entry374; LA32R-NEXT: slli.w $a2, $a0, 2375; LA32R-NEXT: add.w $a0, $a2, $a0376; LA32R-NEXT: add.w $a0, $a1, $a0377; LA32R-NEXT: move $a1, $zero378; LA32R-NEXT: ret379;380; LA32S-LABEL: mul_add_zext_i32:381; LA32S: # %bb.0: # %entry382; LA32S-NEXT: alsl.w $a0, $a0, $a0, 2383; LA32S-NEXT: add.w $a0, $a1, $a0384; LA32S-NEXT: move $a1, $zero385; LA32S-NEXT: ret386;387; LA64-LABEL: mul_add_zext_i32:388; LA64: # %bb.0: # %entry389; LA64-NEXT: alsl.d $a0, $a0, $a0, 2390; LA64-NEXT: add.d $a0, $a1, $a0391; LA64-NEXT: bstrpick.d $a0, $a0, 31, 0392; LA64-NEXT: ret393entry:394 %mul = mul nsw i32 %a, 5395 %add = add nsw i32 %b, %mul396 %zext = zext i32 %add to i64397 ret i64 %zext398}399 400define i8 @alsl_neg_i8(i8 signext %a, i8 signext %b) nounwind {401; LA32R-LABEL: alsl_neg_i8:402; LA32R: # %bb.0: # %entry403; LA32R-NEXT: slli.w $a2, $a0, 1404; LA32R-NEXT: add.w $a0, $a2, $a0405; LA32R-NEXT: sub.w $a0, $a1, $a0406; LA32R-NEXT: ret407;408; LA32S-LABEL: alsl_neg_i8:409; LA32S: # %bb.0: # %entry410; LA32S-NEXT: alsl.w $a0, $a0, $a0, 1411; LA32S-NEXT: sub.w $a0, $a1, $a0412; LA32S-NEXT: ret413;414; LA64-LABEL: alsl_neg_i8:415; LA64: # %bb.0: # %entry416; LA64-NEXT: alsl.d $a0, $a0, $a0, 1417; LA64-NEXT: sub.d $a0, $a1, $a0418; LA64-NEXT: ret419entry:420 %mul = mul nsw i8 %a, -3421 %add = add nsw i8 %b, %mul422 ret i8 %add423}424 425define i16 @alsl_neg_i16(i16 signext %a, i16 signext %b) nounwind {426; LA32R-LABEL: alsl_neg_i16:427; LA32R: # %bb.0: # %entry428; LA32R-NEXT: slli.w $a2, $a0, 2429; LA32R-NEXT: add.w $a0, $a2, $a0430; LA32R-NEXT: sub.w $a0, $a1, $a0431; LA32R-NEXT: ret432;433; LA32S-LABEL: alsl_neg_i16:434; LA32S: # %bb.0: # %entry435; LA32S-NEXT: alsl.w $a0, $a0, $a0, 2436; LA32S-NEXT: sub.w $a0, $a1, $a0437; LA32S-NEXT: ret438;439; LA64-LABEL: alsl_neg_i16:440; LA64: # %bb.0: # %entry441; LA64-NEXT: alsl.d $a0, $a0, $a0, 2442; LA64-NEXT: sub.d $a0, $a1, $a0443; LA64-NEXT: ret444entry:445 %mul = mul nsw i16 %a, -5446 %add = add nsw i16 %b, %mul447 ret i16 %add448}449 450define i32 @alsl_neg_i32(i32 signext %a, i32 signext %b) nounwind {451; LA32R-LABEL: alsl_neg_i32:452; LA32R: # %bb.0: # %entry453; LA32R-NEXT: slli.w $a2, $a0, 3454; LA32R-NEXT: add.w $a0, $a2, $a0455; LA32R-NEXT: sub.w $a0, $a1, $a0456; LA32R-NEXT: ret457;458; LA32S-LABEL: alsl_neg_i32:459; LA32S: # %bb.0: # %entry460; LA32S-NEXT: alsl.w $a0, $a0, $a0, 3461; LA32S-NEXT: sub.w $a0, $a1, $a0462; LA32S-NEXT: ret463;464; LA64-LABEL: alsl_neg_i32:465; LA64: # %bb.0: # %entry466; LA64-NEXT: alsl.d $a0, $a0, $a0, 3467; LA64-NEXT: sub.w $a0, $a1, $a0468; LA64-NEXT: ret469entry:470 %mul = mul nsw i32 %a, -9471 %add = add nsw i32 %b, %mul472 ret i32 %add473}474 475define i64 @mul_add_neg_i64(i64 signext %a, i64 signext %b) nounwind {476; LA32R-LABEL: mul_add_neg_i64:477; LA32R: # %bb.0: # %entry478; LA32R-NEXT: slli.w $a4, $a1, 4479; LA32R-NEXT: sub.w $a1, $a1, $a4480; LA32R-NEXT: addi.w $a4, $zero, -15481; LA32R-NEXT: mulh.wu $a4, $a0, $a4482; LA32R-NEXT: sub.w $a4, $a4, $a0483; LA32R-NEXT: add.w $a1, $a4, $a1484; LA32R-NEXT: slli.w $a4, $a0, 4485; LA32R-NEXT: sub.w $a0, $a0, $a4486; LA32R-NEXT: add.w $a1, $a3, $a1487; LA32R-NEXT: add.w $a0, $a2, $a0488; LA32R-NEXT: sltu $a2, $a0, $a2489; LA32R-NEXT: add.w $a1, $a1, $a2490; LA32R-NEXT: ret491;492; LA32S-LABEL: mul_add_neg_i64:493; LA32S: # %bb.0: # %entry494; LA32S-NEXT: slli.w $a4, $a1, 4495; LA32S-NEXT: sub.w $a1, $a1, $a4496; LA32S-NEXT: addi.w $a4, $zero, -15497; LA32S-NEXT: mulh.wu $a4, $a0, $a4498; LA32S-NEXT: sub.w $a4, $a4, $a0499; LA32S-NEXT: add.w $a1, $a4, $a1500; LA32S-NEXT: slli.w $a4, $a0, 4501; LA32S-NEXT: sub.w $a0, $a0, $a4502; LA32S-NEXT: add.w $a1, $a3, $a1503; LA32S-NEXT: add.w $a0, $a2, $a0504; LA32S-NEXT: sltu $a2, $a0, $a2505; LA32S-NEXT: add.w $a1, $a1, $a2506; LA32S-NEXT: ret507;508; LA64-LABEL: mul_add_neg_i64:509; LA64: # %bb.0: # %entry510; LA64-NEXT: slli.d $a2, $a0, 4511; LA64-NEXT: sub.d $a0, $a0, $a2512; LA64-NEXT: add.d $a0, $a1, $a0513; LA64-NEXT: ret514entry:515 %mul = mul nsw i64 %a, -15516 %add = add nsw i64 %b, %mul517 ret i64 %add518}519