brintos

brintos / llvm-project-archived public Read only

0
0
Text · 29.8 KiB · 9e98b2d Raw
1034 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 signext i32 @rotl_32(i32 signext %x, i32 signext %y) nounwind {7; LA32R-LABEL: rotl_32:8; LA32R:       # %bb.0:9; LA32R-NEXT:    sub.w $a2, $zero, $a110; LA32R-NEXT:    sll.w $a1, $a0, $a111; LA32R-NEXT:    srl.w $a0, $a0, $a212; LA32R-NEXT:    or $a0, $a1, $a013; LA32R-NEXT:    ret14;15; LA32S-LABEL: rotl_32:16; LA32S:       # %bb.0:17; LA32S-NEXT:    sub.w $a1, $zero, $a118; LA32S-NEXT:    rotr.w $a0, $a0, $a119; LA32S-NEXT:    ret20;21; LA64-LABEL: rotl_32:22; LA64:       # %bb.0:23; LA64-NEXT:    sub.d $a1, $zero, $a124; LA64-NEXT:    rotr.w $a0, $a0, $a125; LA64-NEXT:    ret26  %z = sub i32 32, %y27  %b = shl i32 %x, %y28  %c = lshr i32 %x, %z29  %d = or i32 %b, %c30  ret i32 %d31}32 33define signext i32 @rotr_32(i32 signext %x, i32 signext %y) nounwind {34; LA32R-LABEL: rotr_32:35; LA32R:       # %bb.0:36; LA32R-NEXT:    sub.w $a2, $zero, $a137; LA32R-NEXT:    srl.w $a1, $a0, $a138; LA32R-NEXT:    sll.w $a0, $a0, $a239; LA32R-NEXT:    or $a0, $a1, $a040; LA32R-NEXT:    ret41;42; LA32S-LABEL: rotr_32:43; LA32S:       # %bb.0:44; LA32S-NEXT:    rotr.w $a0, $a0, $a145; LA32S-NEXT:    ret46;47; LA64-LABEL: rotr_32:48; LA64:       # %bb.0:49; LA64-NEXT:    rotr.w $a0, $a0, $a150; LA64-NEXT:    ret51  %z = sub i32 32, %y52  %b = lshr i32 %x, %y53  %c = shl i32 %x, %z54  %d = or i32 %b, %c55  ret i32 %d56}57 58define i64 @rotl_64(i64 %x, i64 %y) nounwind {59; LA32R-LABEL: rotl_64:60; LA32R:       # %bb.0:61; LA32R-NEXT:    addi.w $a3, $a2, -3262; LA32R-NEXT:    slti $a4, $a3, 063; LA32R-NEXT:    sub.w $a4, $zero, $a464; LA32R-NEXT:    sll.w $a5, $a0, $a265; LA32R-NEXT:    bltz $a3, .LBB2_266; LA32R-NEXT:  # %bb.1:67; LA32R-NEXT:    sll.w $a3, $a0, $a368; LA32R-NEXT:    b .LBB2_369; LA32R-NEXT:  .LBB2_2:70; LA32R-NEXT:    sll.w $a3, $a1, $a271; LA32R-NEXT:    xori $a6, $a2, 3172; LA32R-NEXT:    srli.w $a7, $a0, 173; LA32R-NEXT:    srl.w $a6, $a7, $a674; LA32R-NEXT:    or $a3, $a3, $a675; LA32R-NEXT:  .LBB2_3:76; LA32R-NEXT:    and $a4, $a4, $a577; LA32R-NEXT:    sub.w $a7, $zero, $a278; LA32R-NEXT:    ori $a5, $zero, 3279; LA32R-NEXT:    sub.w $a6, $a5, $a280; LA32R-NEXT:    srl.w $a5, $a1, $a781; LA32R-NEXT:    bltz $a6, .LBB2_582; LA32R-NEXT:  # %bb.4:83; LA32R-NEXT:    move $a0, $a584; LA32R-NEXT:    b .LBB2_685; LA32R-NEXT:  .LBB2_5:86; LA32R-NEXT:    srl.w $a0, $a0, $a787; LA32R-NEXT:    ori $a7, $zero, 6488; LA32R-NEXT:    sub.w $a2, $a7, $a289; LA32R-NEXT:    xori $a2, $a2, 3190; LA32R-NEXT:    slli.w $a1, $a1, 191; LA32R-NEXT:    sll.w $a1, $a1, $a292; LA32R-NEXT:    or $a0, $a0, $a193; LA32R-NEXT:  .LBB2_6:94; LA32R-NEXT:    slti $a1, $a6, 095; LA32R-NEXT:    sub.w $a1, $zero, $a196; LA32R-NEXT:    and $a1, $a1, $a597; LA32R-NEXT:    or $a1, $a3, $a198; LA32R-NEXT:    or $a0, $a4, $a099; LA32R-NEXT:    ret100;101; LA32S-LABEL: rotl_64:102; LA32S:       # %bb.0:103; LA32S-NEXT:    sll.w $a3, $a1, $a2104; LA32S-NEXT:    xori $a4, $a2, 31105; LA32S-NEXT:    srli.w $a5, $a0, 1106; LA32S-NEXT:    srl.w $a4, $a5, $a4107; LA32S-NEXT:    or $a3, $a3, $a4108; LA32S-NEXT:    addi.w $a4, $a2, -32109; LA32S-NEXT:    slti $a5, $a4, 0110; LA32S-NEXT:    maskeqz $a3, $a3, $a5111; LA32S-NEXT:    sll.w $a6, $a0, $a4112; LA32S-NEXT:    masknez $a5, $a6, $a5113; LA32S-NEXT:    or $a3, $a3, $a5114; LA32S-NEXT:    sll.w $a5, $a0, $a2115; LA32S-NEXT:    srai.w $a4, $a4, 31116; LA32S-NEXT:    and $a4, $a4, $a5117; LA32S-NEXT:    sub.w $a5, $zero, $a2118; LA32S-NEXT:    srl.w $a6, $a1, $a5119; LA32S-NEXT:    ori $a7, $zero, 32120; LA32S-NEXT:    sub.w $a7, $a7, $a2121; LA32S-NEXT:    slti $t0, $a7, 0122; LA32S-NEXT:    masknez $t1, $a6, $t0123; LA32S-NEXT:    srl.w $a0, $a0, $a5124; LA32S-NEXT:    ori $a5, $zero, 64125; LA32S-NEXT:    sub.w $a2, $a5, $a2126; LA32S-NEXT:    xori $a2, $a2, 31127; LA32S-NEXT:    slli.w $a1, $a1, 1128; LA32S-NEXT:    sll.w $a1, $a1, $a2129; LA32S-NEXT:    or $a0, $a0, $a1130; LA32S-NEXT:    maskeqz $a0, $a0, $t0131; LA32S-NEXT:    or $a0, $a0, $t1132; LA32S-NEXT:    srai.w $a1, $a7, 31133; LA32S-NEXT:    and $a1, $a1, $a6134; LA32S-NEXT:    or $a1, $a3, $a1135; LA32S-NEXT:    or $a0, $a4, $a0136; LA32S-NEXT:    ret137;138; LA64-LABEL: rotl_64:139; LA64:       # %bb.0:140; LA64-NEXT:    sub.d $a1, $zero, $a1141; LA64-NEXT:    rotr.d $a0, $a0, $a1142; LA64-NEXT:    ret143  %z = sub i64 64, %y144  %b = shl i64 %x, %y145  %c = lshr i64 %x, %z146  %d = or i64 %b, %c147  ret i64 %d148}149 150define i64 @rotr_64(i64 %x, i64 %y) nounwind {151; LA32R-LABEL: rotr_64:152; LA32R:       # %bb.0:153; LA32R-NEXT:    addi.w $a3, $a2, -32154; LA32R-NEXT:    slti $a4, $a3, 0155; LA32R-NEXT:    sub.w $a4, $zero, $a4156; LA32R-NEXT:    srl.w $a5, $a1, $a2157; LA32R-NEXT:    bltz $a3, .LBB3_2158; LA32R-NEXT:  # %bb.1:159; LA32R-NEXT:    srl.w $a3, $a1, $a3160; LA32R-NEXT:    b .LBB3_3161; LA32R-NEXT:  .LBB3_2:162; LA32R-NEXT:    srl.w $a3, $a0, $a2163; LA32R-NEXT:    xori $a6, $a2, 31164; LA32R-NEXT:    slli.w $a7, $a1, 1165; LA32R-NEXT:    sll.w $a6, $a7, $a6166; LA32R-NEXT:    or $a3, $a3, $a6167; LA32R-NEXT:  .LBB3_3:168; LA32R-NEXT:    and $a4, $a4, $a5169; LA32R-NEXT:    sub.w $a7, $zero, $a2170; LA32R-NEXT:    ori $a5, $zero, 32171; LA32R-NEXT:    sub.w $a6, $a5, $a2172; LA32R-NEXT:    sll.w $a5, $a0, $a7173; LA32R-NEXT:    bltz $a6, .LBB3_5174; LA32R-NEXT:  # %bb.4:175; LA32R-NEXT:    move $a1, $a5176; LA32R-NEXT:    b .LBB3_6177; LA32R-NEXT:  .LBB3_5:178; LA32R-NEXT:    sll.w $a1, $a1, $a7179; LA32R-NEXT:    ori $a7, $zero, 64180; LA32R-NEXT:    sub.w $a2, $a7, $a2181; LA32R-NEXT:    xori $a2, $a2, 31182; LA32R-NEXT:    srli.w $a0, $a0, 1183; LA32R-NEXT:    srl.w $a0, $a0, $a2184; LA32R-NEXT:    or $a1, $a1, $a0185; LA32R-NEXT:  .LBB3_6:186; LA32R-NEXT:    slti $a0, $a6, 0187; LA32R-NEXT:    sub.w $a0, $zero, $a0188; LA32R-NEXT:    and $a0, $a0, $a5189; LA32R-NEXT:    or $a0, $a3, $a0190; LA32R-NEXT:    or $a1, $a4, $a1191; LA32R-NEXT:    ret192;193; LA32S-LABEL: rotr_64:194; LA32S:       # %bb.0:195; LA32S-NEXT:    srl.w $a3, $a0, $a2196; LA32S-NEXT:    xori $a4, $a2, 31197; LA32S-NEXT:    slli.w $a5, $a1, 1198; LA32S-NEXT:    sll.w $a4, $a5, $a4199; LA32S-NEXT:    or $a3, $a3, $a4200; LA32S-NEXT:    addi.w $a4, $a2, -32201; LA32S-NEXT:    slti $a5, $a4, 0202; LA32S-NEXT:    maskeqz $a3, $a3, $a5203; LA32S-NEXT:    srl.w $a6, $a1, $a4204; LA32S-NEXT:    masknez $a5, $a6, $a5205; LA32S-NEXT:    or $a3, $a3, $a5206; LA32S-NEXT:    srl.w $a5, $a1, $a2207; LA32S-NEXT:    srai.w $a4, $a4, 31208; LA32S-NEXT:    and $a4, $a4, $a5209; LA32S-NEXT:    sub.w $a5, $zero, $a2210; LA32S-NEXT:    sll.w $a6, $a0, $a5211; LA32S-NEXT:    ori $a7, $zero, 32212; LA32S-NEXT:    sub.w $a7, $a7, $a2213; LA32S-NEXT:    slti $t0, $a7, 0214; LA32S-NEXT:    masknez $t1, $a6, $t0215; LA32S-NEXT:    sll.w $a1, $a1, $a5216; LA32S-NEXT:    ori $a5, $zero, 64217; LA32S-NEXT:    sub.w $a2, $a5, $a2218; LA32S-NEXT:    xori $a2, $a2, 31219; LA32S-NEXT:    srli.w $a0, $a0, 1220; LA32S-NEXT:    srl.w $a0, $a0, $a2221; LA32S-NEXT:    or $a0, $a1, $a0222; LA32S-NEXT:    maskeqz $a0, $a0, $t0223; LA32S-NEXT:    or $a1, $a0, $t1224; LA32S-NEXT:    srai.w $a0, $a7, 31225; LA32S-NEXT:    and $a0, $a0, $a6226; LA32S-NEXT:    or $a0, $a3, $a0227; LA32S-NEXT:    or $a1, $a4, $a1228; LA32S-NEXT:    ret229;230; LA64-LABEL: rotr_64:231; LA64:       # %bb.0:232; LA64-NEXT:    rotr.d $a0, $a0, $a1233; LA64-NEXT:    ret234  %z = sub i64 64, %y235  %b = lshr i64 %x, %y236  %c = shl i64 %x, %z237  %d = or i64 %b, %c238  ret i64 %d239}240 241define signext i32 @rotl_32_mask(i32 signext %x, i32 signext %y) nounwind {242; LA32R-LABEL: rotl_32_mask:243; LA32R:       # %bb.0:244; LA32R-NEXT:    sub.w $a2, $zero, $a1245; LA32R-NEXT:    sll.w $a1, $a0, $a1246; LA32R-NEXT:    srl.w $a0, $a0, $a2247; LA32R-NEXT:    or $a0, $a1, $a0248; LA32R-NEXT:    ret249;250; LA32S-LABEL: rotl_32_mask:251; LA32S:       # %bb.0:252; LA32S-NEXT:    sub.w $a1, $zero, $a1253; LA32S-NEXT:    rotr.w $a0, $a0, $a1254; LA32S-NEXT:    ret255;256; LA64-LABEL: rotl_32_mask:257; LA64:       # %bb.0:258; LA64-NEXT:    sub.d $a1, $zero, $a1259; LA64-NEXT:    rotr.w $a0, $a0, $a1260; LA64-NEXT:    ret261  %z = sub i32 0, %y262  %and = and i32 %z, 31263  %b = shl i32 %x, %y264  %c = lshr i32 %x, %and265  %d = or i32 %b, %c266  ret i32 %d267}268 269define signext i32 @rotl_32_mask_and_63_and_31(i32 signext %x, i32 signext %y) nounwind {270; LA32R-LABEL: rotl_32_mask_and_63_and_31:271; LA32R:       # %bb.0:272; LA32R-NEXT:    sll.w $a2, $a0, $a1273; LA32R-NEXT:    sub.w $a1, $zero, $a1274; LA32R-NEXT:    srl.w $a0, $a0, $a1275; LA32R-NEXT:    or $a0, $a2, $a0276; LA32R-NEXT:    ret277;278; LA32S-LABEL: rotl_32_mask_and_63_and_31:279; LA32S:       # %bb.0:280; LA32S-NEXT:    sub.w $a1, $zero, $a1281; LA32S-NEXT:    rotr.w $a0, $a0, $a1282; LA32S-NEXT:    ret283;284; LA64-LABEL: rotl_32_mask_and_63_and_31:285; LA64:       # %bb.0:286; LA64-NEXT:    sub.d $a1, $zero, $a1287; LA64-NEXT:    rotr.w $a0, $a0, $a1288; LA64-NEXT:    ret289  %a = and i32 %y, 63290  %b = shl i32 %x, %a291  %c = sub i32 0, %y292  %d = and i32 %c, 31293  %e = lshr i32 %x, %d294  %f = or i32 %b, %e295  ret i32 %f296}297 298define signext i32 @rotl_32_mask_or_64_or_32(i32 signext %x, i32 signext %y) nounwind {299; LA32R-LABEL: rotl_32_mask_or_64_or_32:300; LA32R:       # %bb.0:301; LA32R-NEXT:    move $a0, $zero302; LA32R-NEXT:    ret303;304; LA32S-LABEL: rotl_32_mask_or_64_or_32:305; LA32S:       # %bb.0:306; LA32S-NEXT:    sub.w $a1, $zero, $a1307; LA32S-NEXT:    rotr.w $a0, $a0, $a1308; LA32S-NEXT:    ret309;310; LA64-LABEL: rotl_32_mask_or_64_or_32:311; LA64:       # %bb.0:312; LA64-NEXT:    sub.d $a1, $zero, $a1313; LA64-NEXT:    rotr.w $a0, $a0, $a1314; LA64-NEXT:    ret315  %a = or i32 %y, 64316  %b = shl i32 %x, %a317  %c = sub i32 0, %y318  %d = or i32 %c, 32319  %e = lshr i32 %x, %d320  %f = or i32 %b, %e321  ret i32 %f322}323 324define signext i32 @rotr_32_mask(i32 signext %x, i32 signext %y) nounwind {325; LA32R-LABEL: rotr_32_mask:326; LA32R:       # %bb.0:327; LA32R-NEXT:    sub.w $a2, $zero, $a1328; LA32R-NEXT:    srl.w $a1, $a0, $a1329; LA32R-NEXT:    sll.w $a0, $a0, $a2330; LA32R-NEXT:    or $a0, $a1, $a0331; LA32R-NEXT:    ret332;333; LA32S-LABEL: rotr_32_mask:334; LA32S:       # %bb.0:335; LA32S-NEXT:    rotr.w $a0, $a0, $a1336; LA32S-NEXT:    ret337;338; LA64-LABEL: rotr_32_mask:339; LA64:       # %bb.0:340; LA64-NEXT:    rotr.w $a0, $a0, $a1341; LA64-NEXT:    ret342  %z = sub i32 0, %y343  %and = and i32 %z, 31344  %b = lshr i32 %x, %y345  %c = shl i32 %x, %and346  %d = or i32 %b, %c347  ret i32 %d348}349 350define signext i32 @rotr_32_mask_and_63_and_31(i32 signext %x, i32 signext %y) nounwind {351; LA32R-LABEL: rotr_32_mask_and_63_and_31:352; LA32R:       # %bb.0:353; LA32R-NEXT:    srl.w $a2, $a0, $a1354; LA32R-NEXT:    sub.w $a1, $zero, $a1355; LA32R-NEXT:    sll.w $a0, $a0, $a1356; LA32R-NEXT:    or $a0, $a2, $a0357; LA32R-NEXT:    ret358;359; LA32S-LABEL: rotr_32_mask_and_63_and_31:360; LA32S:       # %bb.0:361; LA32S-NEXT:    rotr.w $a0, $a0, $a1362; LA32S-NEXT:    ret363;364; LA64-LABEL: rotr_32_mask_and_63_and_31:365; LA64:       # %bb.0:366; LA64-NEXT:    rotr.w $a0, $a0, $a1367; LA64-NEXT:    ret368  %a = and i32 %y, 63369  %b = lshr i32 %x, %a370  %c = sub i32 0, %y371  %d = and i32 %c, 31372  %e = shl i32 %x, %d373  %f = or i32 %b, %e374  ret i32 %f375}376 377define signext i32 @rotr_32_mask_or_64_or_32(i32 signext %x, i32 signext %y) nounwind {378; LA32R-LABEL: rotr_32_mask_or_64_or_32:379; LA32R:       # %bb.0:380; LA32R-NEXT:    move $a0, $zero381; LA32R-NEXT:    ret382;383; LA32S-LABEL: rotr_32_mask_or_64_or_32:384; LA32S:       # %bb.0:385; LA32S-NEXT:    rotr.w $a0, $a0, $a1386; LA32S-NEXT:    ret387;388; LA64-LABEL: rotr_32_mask_or_64_or_32:389; LA64:       # %bb.0:390; LA64-NEXT:    rotr.w $a0, $a0, $a1391; LA64-NEXT:    ret392  %a = or i32 %y, 64393  %b = lshr i32 %x, %a394  %c = sub i32 0, %y395  %d = or i32 %c, 32396  %e = shl i32 %x, %d397  %f = or i32 %b, %e398  ret i32 %f399}400 401define i64 @rotl_64_mask(i64 %x, i64 %y) nounwind {402; LA32R-LABEL: rotl_64_mask:403; LA32R:       # %bb.0:404; LA32R-NEXT:    addi.w $a4, $a2, -32405; LA32R-NEXT:    bltz $a4, .LBB10_2406; LA32R-NEXT:  # %bb.1:407; LA32R-NEXT:    sll.w $a3, $a0, $a4408; LA32R-NEXT:    b .LBB10_3409; LA32R-NEXT:  .LBB10_2:410; LA32R-NEXT:    sll.w $a3, $a1, $a2411; LA32R-NEXT:    xori $a5, $a2, 31412; LA32R-NEXT:    srli.w $a6, $a0, 1413; LA32R-NEXT:    srl.w $a5, $a6, $a5414; LA32R-NEXT:    or $a3, $a3, $a5415; LA32R-NEXT:  .LBB10_3:416; LA32R-NEXT:    slti $a4, $a4, 0417; LA32R-NEXT:    sub.w $a4, $zero, $a4418; LA32R-NEXT:    sll.w $a5, $a0, $a2419; LA32R-NEXT:    and $a4, $a4, $a5420; LA32R-NEXT:    sub.w $a5, $zero, $a2421; LA32R-NEXT:    andi $a6, $a5, 63422; LA32R-NEXT:    addi.w $a7, $a6, -32423; LA32R-NEXT:    slti $a2, $a7, 0424; LA32R-NEXT:    sub.w $a2, $zero, $a2425; LA32R-NEXT:    srl.w $t0, $a1, $a5426; LA32R-NEXT:    and $a2, $a2, $t0427; LA32R-NEXT:    bltz $a7, .LBB10_5428; LA32R-NEXT:  # %bb.4:429; LA32R-NEXT:    srl.w $a0, $a1, $a7430; LA32R-NEXT:    b .LBB10_6431; LA32R-NEXT:  .LBB10_5:432; LA32R-NEXT:    srl.w $a0, $a0, $a5433; LA32R-NEXT:    xori $a5, $a6, 31434; LA32R-NEXT:    slli.w $a1, $a1, 1435; LA32R-NEXT:    sll.w $a1, $a1, $a5436; LA32R-NEXT:    or $a0, $a0, $a1437; LA32R-NEXT:  .LBB10_6:438; LA32R-NEXT:    or $a0, $a4, $a0439; LA32R-NEXT:    or $a1, $a3, $a2440; LA32R-NEXT:    ret441;442; LA32S-LABEL: rotl_64_mask:443; LA32S:       # %bb.0:444; LA32S-NEXT:    sll.w $a3, $a1, $a2445; LA32S-NEXT:    xori $a4, $a2, 31446; LA32S-NEXT:    srli.w $a5, $a0, 1447; LA32S-NEXT:    srl.w $a4, $a5, $a4448; LA32S-NEXT:    or $a3, $a3, $a4449; LA32S-NEXT:    addi.w $a4, $a2, -32450; LA32S-NEXT:    slti $a5, $a4, 0451; LA32S-NEXT:    maskeqz $a3, $a3, $a5452; LA32S-NEXT:    sll.w $a6, $a0, $a4453; LA32S-NEXT:    masknez $a5, $a6, $a5454; LA32S-NEXT:    or $a3, $a3, $a5455; LA32S-NEXT:    sll.w $a5, $a0, $a2456; LA32S-NEXT:    srai.w $a4, $a4, 31457; LA32S-NEXT:    and $a4, $a4, $a5458; LA32S-NEXT:    sub.w $a2, $zero, $a2459; LA32S-NEXT:    andi $a5, $a2, 63460; LA32S-NEXT:    addi.w $a6, $a5, -32461; LA32S-NEXT:    srl.w $a7, $a1, $a6462; LA32S-NEXT:    slti $t0, $a6, 0463; LA32S-NEXT:    masknez $a7, $a7, $t0464; LA32S-NEXT:    srl.w $a0, $a0, $a2465; LA32S-NEXT:    xori $a5, $a5, 31466; LA32S-NEXT:    slli.w $t1, $a1, 1467; LA32S-NEXT:    sll.w $a5, $t1, $a5468; LA32S-NEXT:    or $a0, $a0, $a5469; LA32S-NEXT:    maskeqz $a0, $a0, $t0470; LA32S-NEXT:    or $a0, $a0, $a7471; LA32S-NEXT:    srl.w $a1, $a1, $a2472; LA32S-NEXT:    srai.w $a2, $a6, 31473; LA32S-NEXT:    and $a1, $a2, $a1474; LA32S-NEXT:    or $a1, $a3, $a1475; LA32S-NEXT:    or $a0, $a4, $a0476; LA32S-NEXT:    ret477;478; LA64-LABEL: rotl_64_mask:479; LA64:       # %bb.0:480; LA64-NEXT:    sub.d $a1, $zero, $a1481; LA64-NEXT:    rotr.d $a0, $a0, $a1482; LA64-NEXT:    ret483  %z = sub i64 0, %y484  %and = and i64 %z, 63485  %b = shl i64 %x, %y486  %c = lshr i64 %x, %and487  %d = or i64 %b, %c488  ret i64 %d489}490 491define i64 @rotl_64_mask_and_127_and_63(i64 %x, i64 %y) nounwind {492; LA32R-LABEL: rotl_64_mask_and_127_and_63:493; LA32R:       # %bb.0:494; LA32R-NEXT:    andi $a3, $a2, 127495; LA32R-NEXT:    addi.w $a4, $a3, -32496; LA32R-NEXT:    bltz $a4, .LBB11_2497; LA32R-NEXT:  # %bb.1:498; LA32R-NEXT:    sll.w $a3, $a0, $a4499; LA32R-NEXT:    b .LBB11_3500; LA32R-NEXT:  .LBB11_2:501; LA32R-NEXT:    sll.w $a5, $a1, $a2502; LA32R-NEXT:    srli.w $a6, $a0, 1503; LA32R-NEXT:    xori $a3, $a3, 31504; LA32R-NEXT:    srl.w $a3, $a6, $a3505; LA32R-NEXT:    or $a3, $a5, $a3506; LA32R-NEXT:  .LBB11_3:507; LA32R-NEXT:    slti $a4, $a4, 0508; LA32R-NEXT:    sub.w $a4, $zero, $a4509; LA32R-NEXT:    sll.w $a5, $a0, $a2510; LA32R-NEXT:    and $a4, $a4, $a5511; LA32R-NEXT:    sub.w $a5, $zero, $a2512; LA32R-NEXT:    andi $a6, $a5, 63513; LA32R-NEXT:    addi.w $a7, $a6, -32514; LA32R-NEXT:    slti $a2, $a7, 0515; LA32R-NEXT:    sub.w $a2, $zero, $a2516; LA32R-NEXT:    srl.w $t0, $a1, $a5517; LA32R-NEXT:    and $a2, $a2, $t0518; LA32R-NEXT:    bltz $a7, .LBB11_5519; LA32R-NEXT:  # %bb.4:520; LA32R-NEXT:    srl.w $a0, $a1, $a7521; LA32R-NEXT:    b .LBB11_6522; LA32R-NEXT:  .LBB11_5:523; LA32R-NEXT:    srl.w $a0, $a0, $a5524; LA32R-NEXT:    xori $a5, $a6, 31525; LA32R-NEXT:    slli.w $a1, $a1, 1526; LA32R-NEXT:    sll.w $a1, $a1, $a5527; LA32R-NEXT:    or $a0, $a0, $a1528; LA32R-NEXT:  .LBB11_6:529; LA32R-NEXT:    or $a0, $a4, $a0530; LA32R-NEXT:    or $a1, $a3, $a2531; LA32R-NEXT:    ret532;533; LA32S-LABEL: rotl_64_mask_and_127_and_63:534; LA32S:       # %bb.0:535; LA32S-NEXT:    sll.w $a3, $a1, $a2536; LA32S-NEXT:    srli.w $a4, $a0, 1537; LA32S-NEXT:    andi $a5, $a2, 127538; LA32S-NEXT:    xori $a6, $a5, 31539; LA32S-NEXT:    srl.w $a4, $a4, $a6540; LA32S-NEXT:    or $a3, $a3, $a4541; LA32S-NEXT:    addi.w $a4, $a5, -32542; LA32S-NEXT:    slti $a5, $a4, 0543; LA32S-NEXT:    maskeqz $a3, $a3, $a5544; LA32S-NEXT:    sll.w $a6, $a0, $a4545; LA32S-NEXT:    masknez $a5, $a6, $a5546; LA32S-NEXT:    or $a3, $a3, $a5547; LA32S-NEXT:    sll.w $a5, $a0, $a2548; LA32S-NEXT:    srai.w $a4, $a4, 31549; LA32S-NEXT:    and $a4, $a4, $a5550; LA32S-NEXT:    sub.w $a2, $zero, $a2551; LA32S-NEXT:    andi $a5, $a2, 63552; LA32S-NEXT:    addi.w $a6, $a5, -32553; LA32S-NEXT:    srl.w $a7, $a1, $a6554; LA32S-NEXT:    slti $t0, $a6, 0555; LA32S-NEXT:    masknez $a7, $a7, $t0556; LA32S-NEXT:    srl.w $a0, $a0, $a2557; LA32S-NEXT:    xori $a5, $a5, 31558; LA32S-NEXT:    slli.w $t1, $a1, 1559; LA32S-NEXT:    sll.w $a5, $t1, $a5560; LA32S-NEXT:    or $a0, $a0, $a5561; LA32S-NEXT:    maskeqz $a0, $a0, $t0562; LA32S-NEXT:    or $a0, $a0, $a7563; LA32S-NEXT:    srl.w $a1, $a1, $a2564; LA32S-NEXT:    srai.w $a2, $a6, 31565; LA32S-NEXT:    and $a1, $a2, $a1566; LA32S-NEXT:    or $a1, $a3, $a1567; LA32S-NEXT:    or $a0, $a4, $a0568; LA32S-NEXT:    ret569;570; LA64-LABEL: rotl_64_mask_and_127_and_63:571; LA64:       # %bb.0:572; LA64-NEXT:    sub.d $a1, $zero, $a1573; LA64-NEXT:    rotr.d $a0, $a0, $a1574; LA64-NEXT:    ret575  %a = and i64 %y, 127576  %b = shl i64 %x, %a577  %c = sub i64 0, %y578  %d = and i64 %c, 63579  %e = lshr i64 %x, %d580  %f = or i64 %b, %e581  ret i64 %f582}583 584define i64 @rotl_64_mask_or_128_or_64(i64 %x, i64 %y) nounwind {585; LA32R-LABEL: rotl_64_mask_or_128_or_64:586; LA32R:       # %bb.0:587; LA32R-NEXT:    move $a0, $zero588; LA32R-NEXT:    move $a1, $zero589; LA32R-NEXT:    ret590;591; LA32S-LABEL: rotl_64_mask_or_128_or_64:592; LA32S:       # %bb.0:593; LA32S-NEXT:    move $a0, $zero594; LA32S-NEXT:    move $a1, $zero595; LA32S-NEXT:    ret596;597; LA64-LABEL: rotl_64_mask_or_128_or_64:598; LA64:       # %bb.0:599; LA64-NEXT:    sub.d $a1, $zero, $a1600; LA64-NEXT:    rotr.d $a0, $a0, $a1601; LA64-NEXT:    ret602  %a = or i64 %y, 128603  %b = shl i64 %x, %a604  %c = sub i64 0, %y605  %d = or i64 %c, 64606  %e = lshr i64 %x, %d607  %f = or i64 %b, %e608  ret i64 %f609}610 611define i64 @rotr_64_mask(i64 %x, i64 %y) nounwind {612; LA32R-LABEL: rotr_64_mask:613; LA32R:       # %bb.0:614; LA32R-NEXT:    addi.w $a3, $a2, -32615; LA32R-NEXT:    slti $a4, $a3, 0616; LA32R-NEXT:    sub.w $a4, $zero, $a4617; LA32R-NEXT:    srl.w $a6, $a1, $a2618; LA32R-NEXT:    bltz $a3, .LBB13_2619; LA32R-NEXT:  # %bb.1:620; LA32R-NEXT:    srl.w $a3, $a1, $a3621; LA32R-NEXT:    b .LBB13_3622; LA32R-NEXT:  .LBB13_2:623; LA32R-NEXT:    srl.w $a3, $a0, $a2624; LA32R-NEXT:    xori $a5, $a2, 31625; LA32R-NEXT:    slli.w $a7, $a1, 1626; LA32R-NEXT:    sll.w $a5, $a7, $a5627; LA32R-NEXT:    or $a3, $a3, $a5628; LA32R-NEXT:  .LBB13_3:629; LA32R-NEXT:    sub.w $a5, $zero, $a2630; LA32R-NEXT:    andi $t0, $a5, 63631; LA32R-NEXT:    addi.w $a7, $t0, -32632; LA32R-NEXT:    and $a2, $a4, $a6633; LA32R-NEXT:    bltz $a7, .LBB13_5634; LA32R-NEXT:  # %bb.4:635; LA32R-NEXT:    sll.w $a1, $a0, $a7636; LA32R-NEXT:    b .LBB13_6637; LA32R-NEXT:  .LBB13_5:638; LA32R-NEXT:    sll.w $a1, $a1, $a5639; LA32R-NEXT:    xori $a4, $t0, 31640; LA32R-NEXT:    srli.w $a6, $a0, 1641; LA32R-NEXT:    srl.w $a4, $a6, $a4642; LA32R-NEXT:    or $a1, $a1, $a4643; LA32R-NEXT:  .LBB13_6:644; LA32R-NEXT:    slti $a4, $a7, 0645; LA32R-NEXT:    sub.w $a4, $zero, $a4646; LA32R-NEXT:    sll.w $a0, $a0, $a5647; LA32R-NEXT:    and $a0, $a4, $a0648; LA32R-NEXT:    or $a0, $a3, $a0649; LA32R-NEXT:    or $a1, $a2, $a1650; LA32R-NEXT:    ret651;652; LA32S-LABEL: rotr_64_mask:653; LA32S:       # %bb.0:654; LA32S-NEXT:    srl.w $a3, $a0, $a2655; LA32S-NEXT:    xori $a4, $a2, 31656; LA32S-NEXT:    slli.w $a5, $a1, 1657; LA32S-NEXT:    sll.w $a4, $a5, $a4658; LA32S-NEXT:    or $a3, $a3, $a4659; LA32S-NEXT:    addi.w $a4, $a2, -32660; LA32S-NEXT:    slti $a5, $a4, 0661; LA32S-NEXT:    maskeqz $a3, $a3, $a5662; LA32S-NEXT:    srl.w $a6, $a1, $a4663; LA32S-NEXT:    masknez $a5, $a6, $a5664; LA32S-NEXT:    or $a3, $a3, $a5665; LA32S-NEXT:    srl.w $a5, $a1, $a2666; LA32S-NEXT:    srai.w $a4, $a4, 31667; LA32S-NEXT:    and $a4, $a4, $a5668; LA32S-NEXT:    sub.w $a2, $zero, $a2669; LA32S-NEXT:    andi $a5, $a2, 63670; LA32S-NEXT:    addi.w $a6, $a5, -32671; LA32S-NEXT:    sll.w $a7, $a0, $a6672; LA32S-NEXT:    slti $t0, $a6, 0673; LA32S-NEXT:    masknez $a7, $a7, $t0674; LA32S-NEXT:    sll.w $a1, $a1, $a2675; LA32S-NEXT:    xori $a5, $a5, 31676; LA32S-NEXT:    srli.w $t1, $a0, 1677; LA32S-NEXT:    srl.w $a5, $t1, $a5678; LA32S-NEXT:    or $a1, $a1, $a5679; LA32S-NEXT:    maskeqz $a1, $a1, $t0680; LA32S-NEXT:    or $a1, $a1, $a7681; LA32S-NEXT:    sll.w $a0, $a0, $a2682; LA32S-NEXT:    srai.w $a2, $a6, 31683; LA32S-NEXT:    and $a0, $a2, $a0684; LA32S-NEXT:    or $a0, $a3, $a0685; LA32S-NEXT:    or $a1, $a4, $a1686; LA32S-NEXT:    ret687;688; LA64-LABEL: rotr_64_mask:689; LA64:       # %bb.0:690; LA64-NEXT:    rotr.d $a0, $a0, $a1691; LA64-NEXT:    ret692  %z = sub i64 0, %y693  %and = and i64 %z, 63694  %b = lshr i64 %x, %y695  %c = shl i64 %x, %and696  %d = or i64 %b, %c697  ret i64 %d698}699 700define i64 @rotr_64_mask_and_127_and_63(i64 %x, i64 %y) nounwind {701; LA32R-LABEL: rotr_64_mask_and_127_and_63:702; LA32R:       # %bb.0:703; LA32R-NEXT:    andi $a3, $a2, 127704; LA32R-NEXT:    addi.w $a5, $a3, -32705; LA32R-NEXT:    slti $a4, $a5, 0706; LA32R-NEXT:    sub.w $a4, $zero, $a4707; LA32R-NEXT:    srl.w $a6, $a1, $a2708; LA32R-NEXT:    bltz $a5, .LBB14_2709; LA32R-NEXT:  # %bb.1:710; LA32R-NEXT:    srl.w $a3, $a1, $a5711; LA32R-NEXT:    b .LBB14_3712; LA32R-NEXT:  .LBB14_2:713; LA32R-NEXT:    srl.w $a5, $a0, $a2714; LA32R-NEXT:    slli.w $a7, $a1, 1715; LA32R-NEXT:    xori $a3, $a3, 31716; LA32R-NEXT:    sll.w $a3, $a7, $a3717; LA32R-NEXT:    or $a3, $a5, $a3718; LA32R-NEXT:  .LBB14_3:719; LA32R-NEXT:    sub.w $a5, $zero, $a2720; LA32R-NEXT:    andi $t0, $a5, 63721; LA32R-NEXT:    addi.w $a7, $t0, -32722; LA32R-NEXT:    and $a2, $a4, $a6723; LA32R-NEXT:    bltz $a7, .LBB14_5724; LA32R-NEXT:  # %bb.4:725; LA32R-NEXT:    sll.w $a1, $a0, $a7726; LA32R-NEXT:    b .LBB14_6727; LA32R-NEXT:  .LBB14_5:728; LA32R-NEXT:    sll.w $a1, $a1, $a5729; LA32R-NEXT:    xori $a4, $t0, 31730; LA32R-NEXT:    srli.w $a6, $a0, 1731; LA32R-NEXT:    srl.w $a4, $a6, $a4732; LA32R-NEXT:    or $a1, $a1, $a4733; LA32R-NEXT:  .LBB14_6:734; LA32R-NEXT:    slti $a4, $a7, 0735; LA32R-NEXT:    sub.w $a4, $zero, $a4736; LA32R-NEXT:    sll.w $a0, $a0, $a5737; LA32R-NEXT:    and $a0, $a4, $a0738; LA32R-NEXT:    or $a0, $a3, $a0739; LA32R-NEXT:    or $a1, $a2, $a1740; LA32R-NEXT:    ret741;742; LA32S-LABEL: rotr_64_mask_and_127_and_63:743; LA32S:       # %bb.0:744; LA32S-NEXT:    srl.w $a3, $a0, $a2745; LA32S-NEXT:    slli.w $a4, $a1, 1746; LA32S-NEXT:    andi $a5, $a2, 127747; LA32S-NEXT:    xori $a6, $a5, 31748; LA32S-NEXT:    sll.w $a4, $a4, $a6749; LA32S-NEXT:    or $a3, $a3, $a4750; LA32S-NEXT:    addi.w $a4, $a5, -32751; LA32S-NEXT:    slti $a5, $a4, 0752; LA32S-NEXT:    maskeqz $a3, $a3, $a5753; LA32S-NEXT:    srl.w $a6, $a1, $a4754; LA32S-NEXT:    masknez $a5, $a6, $a5755; LA32S-NEXT:    or $a3, $a3, $a5756; LA32S-NEXT:    srl.w $a5, $a1, $a2757; LA32S-NEXT:    srai.w $a4, $a4, 31758; LA32S-NEXT:    and $a4, $a4, $a5759; LA32S-NEXT:    sub.w $a2, $zero, $a2760; LA32S-NEXT:    andi $a5, $a2, 63761; LA32S-NEXT:    addi.w $a6, $a5, -32762; LA32S-NEXT:    sll.w $a7, $a0, $a6763; LA32S-NEXT:    slti $t0, $a6, 0764; LA32S-NEXT:    masknez $a7, $a7, $t0765; LA32S-NEXT:    sll.w $a1, $a1, $a2766; LA32S-NEXT:    xori $a5, $a5, 31767; LA32S-NEXT:    srli.w $t1, $a0, 1768; LA32S-NEXT:    srl.w $a5, $t1, $a5769; LA32S-NEXT:    or $a1, $a1, $a5770; LA32S-NEXT:    maskeqz $a1, $a1, $t0771; LA32S-NEXT:    or $a1, $a1, $a7772; LA32S-NEXT:    sll.w $a0, $a0, $a2773; LA32S-NEXT:    srai.w $a2, $a6, 31774; LA32S-NEXT:    and $a0, $a2, $a0775; LA32S-NEXT:    or $a0, $a3, $a0776; LA32S-NEXT:    or $a1, $a4, $a1777; LA32S-NEXT:    ret778;779; LA64-LABEL: rotr_64_mask_and_127_and_63:780; LA64:       # %bb.0:781; LA64-NEXT:    rotr.d $a0, $a0, $a1782; LA64-NEXT:    ret783  %a = and i64 %y, 127784  %b = lshr i64 %x, %a785  %c = sub i64 0, %y786  %d = and i64 %c, 63787  %e = shl i64 %x, %d788  %f = or i64 %b, %e789  ret i64 %f790}791 792define i64 @rotr_64_mask_or_128_or_64(i64 %x, i64 %y) nounwind {793; LA32R-LABEL: rotr_64_mask_or_128_or_64:794; LA32R:       # %bb.0:795; LA32R-NEXT:    move $a0, $zero796; LA32R-NEXT:    move $a1, $zero797; LA32R-NEXT:    ret798;799; LA32S-LABEL: rotr_64_mask_or_128_or_64:800; LA32S:       # %bb.0:801; LA32S-NEXT:    move $a0, $zero802; LA32S-NEXT:    move $a1, $zero803; LA32S-NEXT:    ret804;805; LA64-LABEL: rotr_64_mask_or_128_or_64:806; LA64:       # %bb.0:807; LA64-NEXT:    rotr.d $a0, $a0, $a1808; LA64-NEXT:    ret809  %a = or i64 %y, 128810  %b = lshr i64 %x, %a811  %c = sub i64 0, %y812  %d = or i64 %c, 64813  %e = shl i64 %x, %d814  %f = or i64 %b, %e815  ret i64 %f816}817 818define signext i32 @rotr_64_trunc_32(i64 %x, i64 %y) nounwind {819; LA32R-LABEL: rotr_64_trunc_32:820; LA32R:       # %bb.0:821; LA32R-NEXT:    addi.w $a3, $a2, -32822; LA32R-NEXT:    bltz $a3, .LBB16_2823; LA32R-NEXT:  # %bb.1:824; LA32R-NEXT:    srl.w $a1, $a1, $a3825; LA32R-NEXT:    b .LBB16_3826; LA32R-NEXT:  .LBB16_2:827; LA32R-NEXT:    srl.w $a3, $a0, $a2828; LA32R-NEXT:    xori $a4, $a2, 31829; LA32R-NEXT:    slli.w $a1, $a1, 1830; LA32R-NEXT:    sll.w $a1, $a1, $a4831; LA32R-NEXT:    or $a1, $a3, $a1832; LA32R-NEXT:  .LBB16_3:833; LA32R-NEXT:    ori $a3, $zero, 32834; LA32R-NEXT:    sub.w $a3, $a3, $a2835; LA32R-NEXT:    slti $a3, $a3, 0836; LA32R-NEXT:    sub.w $a3, $zero, $a3837; LA32R-NEXT:    sub.w $a2, $zero, $a2838; LA32R-NEXT:    sll.w $a0, $a0, $a2839; LA32R-NEXT:    and $a0, $a3, $a0840; LA32R-NEXT:    or $a0, $a1, $a0841; LA32R-NEXT:    ret842;843; LA32S-LABEL: rotr_64_trunc_32:844; LA32S:       # %bb.0:845; LA32S-NEXT:    srl.w $a3, $a0, $a2846; LA32S-NEXT:    xori $a4, $a2, 31847; LA32S-NEXT:    slli.w $a5, $a1, 1848; LA32S-NEXT:    sll.w $a4, $a5, $a4849; LA32S-NEXT:    or $a3, $a3, $a4850; LA32S-NEXT:    addi.w $a4, $a2, -32851; LA32S-NEXT:    slti $a5, $a4, 0852; LA32S-NEXT:    maskeqz $a3, $a3, $a5853; LA32S-NEXT:    srl.w $a1, $a1, $a4854; LA32S-NEXT:    masknez $a1, $a1, $a5855; LA32S-NEXT:    or $a1, $a3, $a1856; LA32S-NEXT:    sub.w $a3, $zero, $a2857; LA32S-NEXT:    sll.w $a0, $a0, $a3858; LA32S-NEXT:    ori $a3, $zero, 32859; LA32S-NEXT:    sub.w $a2, $a3, $a2860; LA32S-NEXT:    srai.w $a2, $a2, 31861; LA32S-NEXT:    and $a0, $a2, $a0862; LA32S-NEXT:    or $a0, $a1, $a0863; LA32S-NEXT:    ret864;865; LA64-LABEL: rotr_64_trunc_32:866; LA64:       # %bb.0:867; LA64-NEXT:    rotr.d $a0, $a0, $a1868; LA64-NEXT:    addi.w $a0, $a0, 0869; LA64-NEXT:    ret870  %z = sub i64 64, %y871  %b = lshr i64 %x, %y872  %c = shl i64 %x, %z873  %d = or i64 %b, %c874  %e = trunc i64 %d to i32875  ret i32 %e876}877 878define signext i32 @rotri_i32(i32 signext %a) nounwind {879; LA32R-LABEL: rotri_i32:880; LA32R:       # %bb.0:881; LA32R-NEXT:    srli.w $a1, $a0, 16882; LA32R-NEXT:    slli.w $a0, $a0, 16883; LA32R-NEXT:    or $a0, $a0, $a1884; LA32R-NEXT:    ret885;886; LA32S-LABEL: rotri_i32:887; LA32S:       # %bb.0:888; LA32S-NEXT:    rotri.w $a0, $a0, 16889; LA32S-NEXT:    ret890;891; LA64-LABEL: rotri_i32:892; LA64:       # %bb.0:893; LA64-NEXT:    rotri.w $a0, $a0, 16894; LA64-NEXT:    ret895  %shl = shl i32 %a, 16896  %shr = lshr i32 %a, 16897  %or = or i32 %shl, %shr898  ret i32 %or899}900 901define i64 @rotri_i64(i64 %a) nounwind {902; LA32R-LABEL: rotri_i64:903; LA32R:       # %bb.0:904; LA32R-NEXT:    move $a2, $a0905; LA32R-NEXT:    move $a0, $a1906; LA32R-NEXT:    move $a1, $a2907; LA32R-NEXT:    ret908;909; LA32S-LABEL: rotri_i64:910; LA32S:       # %bb.0:911; LA32S-NEXT:    move $a2, $a0912; LA32S-NEXT:    move $a0, $a1913; LA32S-NEXT:    move $a1, $a2914; LA32S-NEXT:    ret915;916; LA64-LABEL: rotri_i64:917; LA64:       # %bb.0:918; LA64-NEXT:    rotri.d $a0, $a0, 32919; LA64-NEXT:    ret920  %shl = shl i64 %a, 32921  %shr = lshr i64 %a, 32922  %or = or i64 %shl, %shr923  ret i64 %or924}925 926declare i32 @llvm.fshl.i32(i32, i32, i32)927declare i64 @llvm.fshl.i64(i64, i64, i64)928declare i32 @llvm.fshr.i32(i32, i32, i32)929declare i64 @llvm.fshr.i64(i64, i64, i64)930 931define signext i32 @rotl_i32_fshl(i32 signext %a) nounwind {932; LA32R-LABEL: rotl_i32_fshl:933; LA32R:       # %bb.0:934; LA32R-NEXT:    srli.w $a1, $a0, 20935; LA32R-NEXT:    slli.w $a0, $a0, 12936; LA32R-NEXT:    or $a0, $a0, $a1937; LA32R-NEXT:    ret938;939; LA32S-LABEL: rotl_i32_fshl:940; LA32S:       # %bb.0:941; LA32S-NEXT:    rotri.w $a0, $a0, 20942; LA32S-NEXT:    ret943;944; LA64-LABEL: rotl_i32_fshl:945; LA64:       # %bb.0:946; LA64-NEXT:    rotri.w $a0, $a0, 20947; LA64-NEXT:    ret948  %or = tail call i32 @llvm.fshl.i32(i32 %a, i32 %a, i32 12)949  ret i32 %or950}951 952define i64 @rotl_i64_fshl(i64 %a) nounwind {953; LA32R-LABEL: rotl_i64_fshl:954; LA32R:       # %bb.0:955; LA32R-NEXT:    srli.w $a2, $a1, 20956; LA32R-NEXT:    slli.w $a3, $a0, 12957; LA32R-NEXT:    or $a2, $a3, $a2958; LA32R-NEXT:    srli.w $a0, $a0, 20959; LA32R-NEXT:    slli.w $a1, $a1, 12960; LA32R-NEXT:    or $a1, $a1, $a0961; LA32R-NEXT:    move $a0, $a2962; LA32R-NEXT:    ret963;964; LA32S-LABEL: rotl_i64_fshl:965; LA32S:       # %bb.0:966; LA32S-NEXT:    srli.w $a2, $a1, 20967; LA32S-NEXT:    slli.w $a3, $a0, 12968; LA32S-NEXT:    or $a2, $a3, $a2969; LA32S-NEXT:    srli.w $a0, $a0, 20970; LA32S-NEXT:    slli.w $a1, $a1, 12971; LA32S-NEXT:    or $a1, $a1, $a0972; LA32S-NEXT:    move $a0, $a2973; LA32S-NEXT:    ret974;975; LA64-LABEL: rotl_i64_fshl:976; LA64:       # %bb.0:977; LA64-NEXT:    rotri.d $a0, $a0, 52978; LA64-NEXT:    ret979  %or = tail call i64 @llvm.fshl.i64(i64 %a, i64 %a, i64 12)980  ret i64 %or981}982 983define signext i32 @rotr_i32_fshr(i32 signext %a) nounwind {984; LA32R-LABEL: rotr_i32_fshr:985; LA32R:       # %bb.0:986; LA32R-NEXT:    slli.w $a1, $a0, 20987; LA32R-NEXT:    srli.w $a0, $a0, 12988; LA32R-NEXT:    or $a0, $a0, $a1989; LA32R-NEXT:    ret990;991; LA32S-LABEL: rotr_i32_fshr:992; LA32S:       # %bb.0:993; LA32S-NEXT:    rotri.w $a0, $a0, 12994; LA32S-NEXT:    ret995;996; LA64-LABEL: rotr_i32_fshr:997; LA64:       # %bb.0:998; LA64-NEXT:    rotri.w $a0, $a0, 12999; LA64-NEXT:    ret1000  %or = tail call i32 @llvm.fshr.i32(i32 %a, i32 %a, i32 12)1001  ret i32 %or1002}1003 1004define i64 @rotr_i64_fshr(i64 %a) nounwind {1005; LA32R-LABEL: rotr_i64_fshr:1006; LA32R:       # %bb.0:1007; LA32R-NEXT:    srli.w $a2, $a0, 121008; LA32R-NEXT:    slli.w $a3, $a1, 201009; LA32R-NEXT:    or $a2, $a3, $a21010; LA32R-NEXT:    srli.w $a1, $a1, 121011; LA32R-NEXT:    slli.w $a0, $a0, 201012; LA32R-NEXT:    or $a1, $a0, $a11013; LA32R-NEXT:    move $a0, $a21014; LA32R-NEXT:    ret1015;1016; LA32S-LABEL: rotr_i64_fshr:1017; LA32S:       # %bb.0:1018; LA32S-NEXT:    srli.w $a2, $a0, 121019; LA32S-NEXT:    slli.w $a3, $a1, 201020; LA32S-NEXT:    or $a2, $a3, $a21021; LA32S-NEXT:    srli.w $a1, $a1, 121022; LA32S-NEXT:    slli.w $a0, $a0, 201023; LA32S-NEXT:    or $a1, $a0, $a11024; LA32S-NEXT:    move $a0, $a21025; LA32S-NEXT:    ret1026;1027; LA64-LABEL: rotr_i64_fshr:1028; LA64:       # %bb.0:1029; LA64-NEXT:    rotri.d $a0, $a0, 121030; LA64-NEXT:    ret1031  %or = tail call i64 @llvm.fshr.i64(i64 %a, i64 %a, i64 12)1032  ret i64 %or1033}1034