998 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=riscv32 -verify-machineinstrs < %s \3; RUN: | FileCheck -check-prefixes=CHECK,RV32I %s4; RUN: llc -mtriple=riscv32 -mattr=+m -verify-machineinstrs < %s \5; RUN: | FileCheck -check-prefixes=CHECK,RV32IM %s6; RUN: llc -mtriple=riscv64 -verify-machineinstrs < %s \7; RUN: | FileCheck -check-prefixes=CHECK,RV64I %s8; RUN: llc -mtriple=riscv64 -mattr=+m -verify-machineinstrs < %s \9; RUN: | FileCheck -check-prefixes=CHECK,RV64IM %s10 11 12define <4 x i16> @fold_urem_vec_1(<4 x i16> %x) nounwind {13; RV32I-LABEL: fold_urem_vec_1:14; RV32I: # %bb.0:15; RV32I-NEXT: addi sp, sp, -3216; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill17; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill18; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill19; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill20; RV32I-NEXT: sw s3, 12(sp) # 4-byte Folded Spill21; RV32I-NEXT: sw s4, 8(sp) # 4-byte Folded Spill22; RV32I-NEXT: lhu a2, 0(a1)23; RV32I-NEXT: lhu s0, 4(a1)24; RV32I-NEXT: lhu s1, 8(a1)25; RV32I-NEXT: lhu s2, 12(a1)26; RV32I-NEXT: mv s3, a027; RV32I-NEXT: li a1, 9528; RV32I-NEXT: mv a0, a229; RV32I-NEXT: call __umodsi330; RV32I-NEXT: mv s4, a031; RV32I-NEXT: li a1, 12432; RV32I-NEXT: mv a0, s033; RV32I-NEXT: call __umodsi334; RV32I-NEXT: mv s0, a035; RV32I-NEXT: li a1, 9836; RV32I-NEXT: mv a0, s137; RV32I-NEXT: call __umodsi338; RV32I-NEXT: mv s1, a039; RV32I-NEXT: li a1, 100340; RV32I-NEXT: mv a0, s241; RV32I-NEXT: call __umodsi342; RV32I-NEXT: sh s4, 0(s3)43; RV32I-NEXT: sh s0, 2(s3)44; RV32I-NEXT: sh s1, 4(s3)45; RV32I-NEXT: sh a0, 6(s3)46; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload47; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload48; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload49; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload50; RV32I-NEXT: lw s3, 12(sp) # 4-byte Folded Reload51; RV32I-NEXT: lw s4, 8(sp) # 4-byte Folded Reload52; RV32I-NEXT: addi sp, sp, 3253; RV32I-NEXT: ret54;55; RV32IM-LABEL: fold_urem_vec_1:56; RV32IM: # %bb.0:57; RV32IM-NEXT: lhu a2, 0(a1)58; RV32IM-NEXT: lhu a3, 4(a1)59; RV32IM-NEXT: lhu a4, 8(a1)60; RV32IM-NEXT: lhu a1, 12(a1)61; RV32IM-NEXT: lui a5, 845662; RV32IM-NEXT: lui a6, 1103863; RV32IM-NEXT: li a7, 9564; RV32IM-NEXT: lui t0, 1070065; RV32IM-NEXT: li t1, 9866; RV32IM-NEXT: addi a6, a6, -146567; RV32IM-NEXT: mulhu a6, a2, a668; RV32IM-NEXT: mul a6, a6, a769; RV32IM-NEXT: lui a7, 104570; RV32IM-NEXT: addi t0, t0, -100371; RV32IM-NEXT: mulhu t0, a4, t072; RV32IM-NEXT: mul t0, t0, t173; RV32IM-NEXT: li t1, 100374; RV32IM-NEXT: addi a5, a5, 105875; RV32IM-NEXT: addi a7, a7, 180176; RV32IM-NEXT: mulhu a5, a3, a577; RV32IM-NEXT: mulhu a7, a1, a778; RV32IM-NEXT: mul a7, a7, t179; RV32IM-NEXT: slli t1, a5, 780; RV32IM-NEXT: slli a5, a5, 281; RV32IM-NEXT: sub a5, a5, t182; RV32IM-NEXT: sub a2, a2, a683; RV32IM-NEXT: sub a4, a4, t084; RV32IM-NEXT: sub a1, a1, a785; RV32IM-NEXT: add a3, a3, a586; RV32IM-NEXT: sh a2, 0(a0)87; RV32IM-NEXT: sh a3, 2(a0)88; RV32IM-NEXT: sh a4, 4(a0)89; RV32IM-NEXT: sh a1, 6(a0)90; RV32IM-NEXT: ret91;92; RV64I-LABEL: fold_urem_vec_1:93; RV64I: # %bb.0:94; RV64I-NEXT: addi sp, sp, -4895; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill96; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill97; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill98; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill99; RV64I-NEXT: sd s3, 8(sp) # 8-byte Folded Spill100; RV64I-NEXT: sd s4, 0(sp) # 8-byte Folded Spill101; RV64I-NEXT: lhu a2, 0(a1)102; RV64I-NEXT: lhu s0, 8(a1)103; RV64I-NEXT: lhu s1, 16(a1)104; RV64I-NEXT: lhu s2, 24(a1)105; RV64I-NEXT: mv s3, a0106; RV64I-NEXT: li a1, 95107; RV64I-NEXT: mv a0, a2108; RV64I-NEXT: call __umoddi3109; RV64I-NEXT: mv s4, a0110; RV64I-NEXT: li a1, 124111; RV64I-NEXT: mv a0, s0112; RV64I-NEXT: call __umoddi3113; RV64I-NEXT: mv s0, a0114; RV64I-NEXT: li a1, 98115; RV64I-NEXT: mv a0, s1116; RV64I-NEXT: call __umoddi3117; RV64I-NEXT: mv s1, a0118; RV64I-NEXT: li a1, 1003119; RV64I-NEXT: mv a0, s2120; RV64I-NEXT: call __umoddi3121; RV64I-NEXT: sh s4, 0(s3)122; RV64I-NEXT: sh s0, 2(s3)123; RV64I-NEXT: sh s1, 4(s3)124; RV64I-NEXT: sh a0, 6(s3)125; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload126; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload127; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload128; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload129; RV64I-NEXT: ld s3, 8(sp) # 8-byte Folded Reload130; RV64I-NEXT: ld s4, 0(sp) # 8-byte Folded Reload131; RV64I-NEXT: addi sp, sp, 48132; RV64I-NEXT: ret133;134; RV64IM-LABEL: fold_urem_vec_1:135; RV64IM: # %bb.0:136; RV64IM-NEXT: lhu a2, 0(a1)137; RV64IM-NEXT: lhu a3, 8(a1)138; RV64IM-NEXT: lhu a4, 16(a1)139; RV64IM-NEXT: lhu a1, 24(a1)140; RV64IM-NEXT: lui a5, %hi(.LCPI0_0)141; RV64IM-NEXT: lui a6, %hi(.LCPI0_1)142; RV64IM-NEXT: li a7, 95143; RV64IM-NEXT: ld a6, %lo(.LCPI0_1)(a6)144; RV64IM-NEXT: lui t0, %hi(.LCPI0_2)145; RV64IM-NEXT: li t1, 98146; RV64IM-NEXT: ld t0, %lo(.LCPI0_2)(t0)147; RV64IM-NEXT: mulhu a6, a2, a6148; RV64IM-NEXT: mul a6, a6, a7149; RV64IM-NEXT: lui a7, %hi(.LCPI0_3)150; RV64IM-NEXT: ld a5, %lo(.LCPI0_0)(a5)151; RV64IM-NEXT: ld a7, %lo(.LCPI0_3)(a7)152; RV64IM-NEXT: mulhu t0, a4, t0153; RV64IM-NEXT: mul t0, t0, t1154; RV64IM-NEXT: li t1, 1003155; RV64IM-NEXT: mulhu a5, a3, a5156; RV64IM-NEXT: mulhu a7, a1, a7157; RV64IM-NEXT: mul a7, a7, t1158; RV64IM-NEXT: slli t1, a5, 7159; RV64IM-NEXT: slli a5, a5, 2160; RV64IM-NEXT: sub a5, a5, t1161; RV64IM-NEXT: sub a2, a2, a6162; RV64IM-NEXT: sub a4, a4, t0163; RV64IM-NEXT: sub a1, a1, a7164; RV64IM-NEXT: add a3, a3, a5165; RV64IM-NEXT: sh a2, 0(a0)166; RV64IM-NEXT: sh a3, 2(a0)167; RV64IM-NEXT: sh a4, 4(a0)168; RV64IM-NEXT: sh a1, 6(a0)169; RV64IM-NEXT: ret170 %1 = urem <4 x i16> %x, <i16 95, i16 124, i16 98, i16 1003>171 ret <4 x i16> %1172}173 174define <4 x i16> @fold_urem_vec_2(<4 x i16> %x) nounwind {175; RV32I-LABEL: fold_urem_vec_2:176; RV32I: # %bb.0:177; RV32I-NEXT: addi sp, sp, -32178; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill179; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill180; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill181; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill182; RV32I-NEXT: sw s3, 12(sp) # 4-byte Folded Spill183; RV32I-NEXT: sw s4, 8(sp) # 4-byte Folded Spill184; RV32I-NEXT: lhu a2, 0(a1)185; RV32I-NEXT: lhu s0, 4(a1)186; RV32I-NEXT: lhu s1, 8(a1)187; RV32I-NEXT: lhu s2, 12(a1)188; RV32I-NEXT: mv s3, a0189; RV32I-NEXT: li a1, 95190; RV32I-NEXT: mv a0, a2191; RV32I-NEXT: call __umodsi3192; RV32I-NEXT: mv s4, a0193; RV32I-NEXT: li a1, 95194; RV32I-NEXT: mv a0, s0195; RV32I-NEXT: call __umodsi3196; RV32I-NEXT: mv s0, a0197; RV32I-NEXT: li a1, 95198; RV32I-NEXT: mv a0, s1199; RV32I-NEXT: call __umodsi3200; RV32I-NEXT: mv s1, a0201; RV32I-NEXT: li a1, 95202; RV32I-NEXT: mv a0, s2203; RV32I-NEXT: call __umodsi3204; RV32I-NEXT: sh s4, 0(s3)205; RV32I-NEXT: sh s0, 2(s3)206; RV32I-NEXT: sh s1, 4(s3)207; RV32I-NEXT: sh a0, 6(s3)208; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload209; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload210; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload211; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload212; RV32I-NEXT: lw s3, 12(sp) # 4-byte Folded Reload213; RV32I-NEXT: lw s4, 8(sp) # 4-byte Folded Reload214; RV32I-NEXT: addi sp, sp, 32215; RV32I-NEXT: ret216;217; RV32IM-LABEL: fold_urem_vec_2:218; RV32IM: # %bb.0:219; RV32IM-NEXT: lhu a2, 0(a1)220; RV32IM-NEXT: lhu a3, 4(a1)221; RV32IM-NEXT: lhu a4, 8(a1)222; RV32IM-NEXT: lhu a1, 12(a1)223; RV32IM-NEXT: lui a5, 11038224; RV32IM-NEXT: li a6, 95225; RV32IM-NEXT: addi a5, a5, -1465226; RV32IM-NEXT: mulhu a7, a2, a5227; RV32IM-NEXT: mulhu t0, a3, a5228; RV32IM-NEXT: mulhu t1, a4, a5229; RV32IM-NEXT: mulhu a5, a1, a5230; RV32IM-NEXT: mul a7, a7, a6231; RV32IM-NEXT: mul t0, t0, a6232; RV32IM-NEXT: mul t1, t1, a6233; RV32IM-NEXT: mul a5, a5, a6234; RV32IM-NEXT: sub a2, a2, a7235; RV32IM-NEXT: sub a3, a3, t0236; RV32IM-NEXT: sub a4, a4, t1237; RV32IM-NEXT: sub a1, a1, a5238; RV32IM-NEXT: sh a2, 0(a0)239; RV32IM-NEXT: sh a3, 2(a0)240; RV32IM-NEXT: sh a4, 4(a0)241; RV32IM-NEXT: sh a1, 6(a0)242; RV32IM-NEXT: ret243;244; RV64I-LABEL: fold_urem_vec_2:245; RV64I: # %bb.0:246; RV64I-NEXT: addi sp, sp, -48247; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill248; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill249; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill250; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill251; RV64I-NEXT: sd s3, 8(sp) # 8-byte Folded Spill252; RV64I-NEXT: sd s4, 0(sp) # 8-byte Folded Spill253; RV64I-NEXT: lhu a2, 0(a1)254; RV64I-NEXT: lhu s0, 8(a1)255; RV64I-NEXT: lhu s1, 16(a1)256; RV64I-NEXT: lhu s2, 24(a1)257; RV64I-NEXT: mv s3, a0258; RV64I-NEXT: li a1, 95259; RV64I-NEXT: mv a0, a2260; RV64I-NEXT: call __umoddi3261; RV64I-NEXT: mv s4, a0262; RV64I-NEXT: li a1, 95263; RV64I-NEXT: mv a0, s0264; RV64I-NEXT: call __umoddi3265; RV64I-NEXT: mv s0, a0266; RV64I-NEXT: li a1, 95267; RV64I-NEXT: mv a0, s1268; RV64I-NEXT: call __umoddi3269; RV64I-NEXT: mv s1, a0270; RV64I-NEXT: li a1, 95271; RV64I-NEXT: mv a0, s2272; RV64I-NEXT: call __umoddi3273; RV64I-NEXT: sh s4, 0(s3)274; RV64I-NEXT: sh s0, 2(s3)275; RV64I-NEXT: sh s1, 4(s3)276; RV64I-NEXT: sh a0, 6(s3)277; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload278; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload279; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload280; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload281; RV64I-NEXT: ld s3, 8(sp) # 8-byte Folded Reload282; RV64I-NEXT: ld s4, 0(sp) # 8-byte Folded Reload283; RV64I-NEXT: addi sp, sp, 48284; RV64I-NEXT: ret285;286; RV64IM-LABEL: fold_urem_vec_2:287; RV64IM: # %bb.0:288; RV64IM-NEXT: lui a2, %hi(.LCPI1_0)289; RV64IM-NEXT: ld a2, %lo(.LCPI1_0)(a2)290; RV64IM-NEXT: lhu a3, 0(a1)291; RV64IM-NEXT: lhu a4, 8(a1)292; RV64IM-NEXT: lhu a5, 16(a1)293; RV64IM-NEXT: lhu a1, 24(a1)294; RV64IM-NEXT: li a6, 95295; RV64IM-NEXT: mulhu a7, a3, a2296; RV64IM-NEXT: mulhu t0, a4, a2297; RV64IM-NEXT: mulhu t1, a5, a2298; RV64IM-NEXT: mulhu a2, a1, a2299; RV64IM-NEXT: mul a7, a7, a6300; RV64IM-NEXT: mul t0, t0, a6301; RV64IM-NEXT: mul t1, t1, a6302; RV64IM-NEXT: mul a2, a2, a6303; RV64IM-NEXT: sub a3, a3, a7304; RV64IM-NEXT: sub a4, a4, t0305; RV64IM-NEXT: sub a5, a5, t1306; RV64IM-NEXT: sub a1, a1, a2307; RV64IM-NEXT: sh a3, 0(a0)308; RV64IM-NEXT: sh a4, 2(a0)309; RV64IM-NEXT: sh a5, 4(a0)310; RV64IM-NEXT: sh a1, 6(a0)311; RV64IM-NEXT: ret312 %1 = urem <4 x i16> %x, <i16 95, i16 95, i16 95, i16 95>313 ret <4 x i16> %1314}315 316 317; Don't fold if we can combine urem with udiv.318define <4 x i16> @combine_urem_udiv(<4 x i16> %x) nounwind {319; RV32I-LABEL: combine_urem_udiv:320; RV32I: # %bb.0:321; RV32I-NEXT: addi sp, sp, -48322; RV32I-NEXT: sw ra, 44(sp) # 4-byte Folded Spill323; RV32I-NEXT: sw s0, 40(sp) # 4-byte Folded Spill324; RV32I-NEXT: sw s1, 36(sp) # 4-byte Folded Spill325; RV32I-NEXT: sw s2, 32(sp) # 4-byte Folded Spill326; RV32I-NEXT: sw s3, 28(sp) # 4-byte Folded Spill327; RV32I-NEXT: sw s4, 24(sp) # 4-byte Folded Spill328; RV32I-NEXT: sw s5, 20(sp) # 4-byte Folded Spill329; RV32I-NEXT: sw s6, 16(sp) # 4-byte Folded Spill330; RV32I-NEXT: sw s7, 12(sp) # 4-byte Folded Spill331; RV32I-NEXT: sw s8, 8(sp) # 4-byte Folded Spill332; RV32I-NEXT: lhu s1, 0(a1)333; RV32I-NEXT: lhu s2, 4(a1)334; RV32I-NEXT: lhu s3, 8(a1)335; RV32I-NEXT: lhu s4, 12(a1)336; RV32I-NEXT: mv s0, a0337; RV32I-NEXT: li a1, 95338; RV32I-NEXT: mv a0, s4339; RV32I-NEXT: call __umodsi3340; RV32I-NEXT: mv s5, a0341; RV32I-NEXT: li a1, 95342; RV32I-NEXT: mv a0, s3343; RV32I-NEXT: call __umodsi3344; RV32I-NEXT: mv s6, a0345; RV32I-NEXT: li a1, 95346; RV32I-NEXT: mv a0, s2347; RV32I-NEXT: call __umodsi3348; RV32I-NEXT: mv s7, a0349; RV32I-NEXT: li a1, 95350; RV32I-NEXT: mv a0, s1351; RV32I-NEXT: call __umodsi3352; RV32I-NEXT: mv s8, a0353; RV32I-NEXT: li a1, 95354; RV32I-NEXT: mv a0, s4355; RV32I-NEXT: call __udivsi3356; RV32I-NEXT: mv s4, a0357; RV32I-NEXT: li a1, 95358; RV32I-NEXT: mv a0, s3359; RV32I-NEXT: call __udivsi3360; RV32I-NEXT: mv s3, a0361; RV32I-NEXT: li a1, 95362; RV32I-NEXT: mv a0, s2363; RV32I-NEXT: call __udivsi3364; RV32I-NEXT: mv s2, a0365; RV32I-NEXT: li a1, 95366; RV32I-NEXT: mv a0, s1367; RV32I-NEXT: call __udivsi3368; RV32I-NEXT: add a0, s8, a0369; RV32I-NEXT: add s2, s7, s2370; RV32I-NEXT: add s3, s6, s3371; RV32I-NEXT: add s4, s5, s4372; RV32I-NEXT: sh a0, 0(s0)373; RV32I-NEXT: sh s2, 2(s0)374; RV32I-NEXT: sh s3, 4(s0)375; RV32I-NEXT: sh s4, 6(s0)376; RV32I-NEXT: lw ra, 44(sp) # 4-byte Folded Reload377; RV32I-NEXT: lw s0, 40(sp) # 4-byte Folded Reload378; RV32I-NEXT: lw s1, 36(sp) # 4-byte Folded Reload379; RV32I-NEXT: lw s2, 32(sp) # 4-byte Folded Reload380; RV32I-NEXT: lw s3, 28(sp) # 4-byte Folded Reload381; RV32I-NEXT: lw s4, 24(sp) # 4-byte Folded Reload382; RV32I-NEXT: lw s5, 20(sp) # 4-byte Folded Reload383; RV32I-NEXT: lw s6, 16(sp) # 4-byte Folded Reload384; RV32I-NEXT: lw s7, 12(sp) # 4-byte Folded Reload385; RV32I-NEXT: lw s8, 8(sp) # 4-byte Folded Reload386; RV32I-NEXT: addi sp, sp, 48387; RV32I-NEXT: ret388;389; RV32IM-LABEL: combine_urem_udiv:390; RV32IM: # %bb.0:391; RV32IM-NEXT: lhu a2, 0(a1)392; RV32IM-NEXT: lhu a3, 4(a1)393; RV32IM-NEXT: lhu a4, 8(a1)394; RV32IM-NEXT: lhu a1, 12(a1)395; RV32IM-NEXT: lui a5, 11038396; RV32IM-NEXT: li a6, 95397; RV32IM-NEXT: addi a5, a5, -1465398; RV32IM-NEXT: mulhu a7, a1, a5399; RV32IM-NEXT: mulhu t0, a4, a5400; RV32IM-NEXT: mulhu t1, a3, a5401; RV32IM-NEXT: mulhu a5, a2, a5402; RV32IM-NEXT: mul t2, a7, a6403; RV32IM-NEXT: mul t3, t0, a6404; RV32IM-NEXT: mul t4, t1, a6405; RV32IM-NEXT: mul a6, a5, a6406; RV32IM-NEXT: add a2, a2, a5407; RV32IM-NEXT: add a3, a3, t1408; RV32IM-NEXT: add a4, a4, t0409; RV32IM-NEXT: add a1, a1, a7410; RV32IM-NEXT: sub a2, a2, a6411; RV32IM-NEXT: sub a3, a3, t4412; RV32IM-NEXT: sub a4, a4, t3413; RV32IM-NEXT: sub a1, a1, t2414; RV32IM-NEXT: sh a2, 0(a0)415; RV32IM-NEXT: sh a3, 2(a0)416; RV32IM-NEXT: sh a4, 4(a0)417; RV32IM-NEXT: sh a1, 6(a0)418; RV32IM-NEXT: ret419;420; RV64I-LABEL: combine_urem_udiv:421; RV64I: # %bb.0:422; RV64I-NEXT: addi sp, sp, -80423; RV64I-NEXT: sd ra, 72(sp) # 8-byte Folded Spill424; RV64I-NEXT: sd s0, 64(sp) # 8-byte Folded Spill425; RV64I-NEXT: sd s1, 56(sp) # 8-byte Folded Spill426; RV64I-NEXT: sd s2, 48(sp) # 8-byte Folded Spill427; RV64I-NEXT: sd s3, 40(sp) # 8-byte Folded Spill428; RV64I-NEXT: sd s4, 32(sp) # 8-byte Folded Spill429; RV64I-NEXT: sd s5, 24(sp) # 8-byte Folded Spill430; RV64I-NEXT: sd s6, 16(sp) # 8-byte Folded Spill431; RV64I-NEXT: sd s7, 8(sp) # 8-byte Folded Spill432; RV64I-NEXT: sd s8, 0(sp) # 8-byte Folded Spill433; RV64I-NEXT: lhu s1, 0(a1)434; RV64I-NEXT: lhu s2, 8(a1)435; RV64I-NEXT: lhu s3, 16(a1)436; RV64I-NEXT: lhu s4, 24(a1)437; RV64I-NEXT: mv s0, a0438; RV64I-NEXT: li a1, 95439; RV64I-NEXT: mv a0, s4440; RV64I-NEXT: call __umoddi3441; RV64I-NEXT: mv s5, a0442; RV64I-NEXT: li a1, 95443; RV64I-NEXT: mv a0, s3444; RV64I-NEXT: call __umoddi3445; RV64I-NEXT: mv s6, a0446; RV64I-NEXT: li a1, 95447; RV64I-NEXT: mv a0, s2448; RV64I-NEXT: call __umoddi3449; RV64I-NEXT: mv s7, a0450; RV64I-NEXT: li a1, 95451; RV64I-NEXT: mv a0, s1452; RV64I-NEXT: call __umoddi3453; RV64I-NEXT: mv s8, a0454; RV64I-NEXT: li a1, 95455; RV64I-NEXT: mv a0, s4456; RV64I-NEXT: call __udivdi3457; RV64I-NEXT: mv s4, a0458; RV64I-NEXT: li a1, 95459; RV64I-NEXT: mv a0, s3460; RV64I-NEXT: call __udivdi3461; RV64I-NEXT: mv s3, a0462; RV64I-NEXT: li a1, 95463; RV64I-NEXT: mv a0, s2464; RV64I-NEXT: call __udivdi3465; RV64I-NEXT: mv s2, a0466; RV64I-NEXT: li a1, 95467; RV64I-NEXT: mv a0, s1468; RV64I-NEXT: call __udivdi3469; RV64I-NEXT: add a0, s8, a0470; RV64I-NEXT: add s2, s7, s2471; RV64I-NEXT: add s3, s6, s3472; RV64I-NEXT: add s4, s5, s4473; RV64I-NEXT: sh a0, 0(s0)474; RV64I-NEXT: sh s2, 2(s0)475; RV64I-NEXT: sh s3, 4(s0)476; RV64I-NEXT: sh s4, 6(s0)477; RV64I-NEXT: ld ra, 72(sp) # 8-byte Folded Reload478; RV64I-NEXT: ld s0, 64(sp) # 8-byte Folded Reload479; RV64I-NEXT: ld s1, 56(sp) # 8-byte Folded Reload480; RV64I-NEXT: ld s2, 48(sp) # 8-byte Folded Reload481; RV64I-NEXT: ld s3, 40(sp) # 8-byte Folded Reload482; RV64I-NEXT: ld s4, 32(sp) # 8-byte Folded Reload483; RV64I-NEXT: ld s5, 24(sp) # 8-byte Folded Reload484; RV64I-NEXT: ld s6, 16(sp) # 8-byte Folded Reload485; RV64I-NEXT: ld s7, 8(sp) # 8-byte Folded Reload486; RV64I-NEXT: ld s8, 0(sp) # 8-byte Folded Reload487; RV64I-NEXT: addi sp, sp, 80488; RV64I-NEXT: ret489;490; RV64IM-LABEL: combine_urem_udiv:491; RV64IM: # %bb.0:492; RV64IM-NEXT: lui a2, %hi(.LCPI2_0)493; RV64IM-NEXT: ld a2, %lo(.LCPI2_0)(a2)494; RV64IM-NEXT: lhu a3, 16(a1)495; RV64IM-NEXT: lhu a4, 24(a1)496; RV64IM-NEXT: lhu a5, 0(a1)497; RV64IM-NEXT: lhu a1, 8(a1)498; RV64IM-NEXT: li a6, 95499; RV64IM-NEXT: mulhu a7, a4, a2500; RV64IM-NEXT: mulhu t0, a3, a2501; RV64IM-NEXT: mulhu t1, a1, a2502; RV64IM-NEXT: mulhu a2, a5, a2503; RV64IM-NEXT: mul t2, a7, a6504; RV64IM-NEXT: mul t3, t0, a6505; RV64IM-NEXT: mul t4, t1, a6506; RV64IM-NEXT: mul a6, a2, a6507; RV64IM-NEXT: add a2, a5, a2508; RV64IM-NEXT: add a1, a1, t1509; RV64IM-NEXT: add a3, a3, t0510; RV64IM-NEXT: add a4, a4, a7511; RV64IM-NEXT: sub a2, a2, a6512; RV64IM-NEXT: sub a1, a1, t4513; RV64IM-NEXT: sub a3, a3, t3514; RV64IM-NEXT: sub a4, a4, t2515; RV64IM-NEXT: sh a2, 0(a0)516; RV64IM-NEXT: sh a1, 2(a0)517; RV64IM-NEXT: sh a3, 4(a0)518; RV64IM-NEXT: sh a4, 6(a0)519; RV64IM-NEXT: ret520 %1 = urem <4 x i16> %x, <i16 95, i16 95, i16 95, i16 95>521 %2 = udiv <4 x i16> %x, <i16 95, i16 95, i16 95, i16 95>522 %3 = add <4 x i16> %1, %2523 ret <4 x i16> %3524}525 526; Don't fold for divisors that are a power of two.527define <4 x i16> @dont_fold_urem_power_of_two(<4 x i16> %x) nounwind {528; RV32I-LABEL: dont_fold_urem_power_of_two:529; RV32I: # %bb.0:530; RV32I-NEXT: addi sp, sp, -32531; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill532; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill533; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill534; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill535; RV32I-NEXT: sw s3, 12(sp) # 4-byte Folded Spill536; RV32I-NEXT: lhu s1, 0(a1)537; RV32I-NEXT: lhu s2, 4(a1)538; RV32I-NEXT: lhu s3, 8(a1)539; RV32I-NEXT: lhu a2, 12(a1)540; RV32I-NEXT: mv s0, a0541; RV32I-NEXT: li a1, 95542; RV32I-NEXT: mv a0, a2543; RV32I-NEXT: call __umodsi3544; RV32I-NEXT: andi a1, s1, 63545; RV32I-NEXT: andi a2, s2, 31546; RV32I-NEXT: andi a3, s3, 7547; RV32I-NEXT: sh a1, 0(s0)548; RV32I-NEXT: sh a2, 2(s0)549; RV32I-NEXT: sh a3, 4(s0)550; RV32I-NEXT: sh a0, 6(s0)551; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload552; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload553; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload554; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload555; RV32I-NEXT: lw s3, 12(sp) # 4-byte Folded Reload556; RV32I-NEXT: addi sp, sp, 32557; RV32I-NEXT: ret558;559; RV32IM-LABEL: dont_fold_urem_power_of_two:560; RV32IM: # %bb.0:561; RV32IM-NEXT: lhu a2, 0(a1)562; RV32IM-NEXT: lhu a3, 4(a1)563; RV32IM-NEXT: lhu a4, 8(a1)564; RV32IM-NEXT: lhu a1, 12(a1)565; RV32IM-NEXT: lui a5, 11038566; RV32IM-NEXT: li a6, 95567; RV32IM-NEXT: addi a5, a5, -1465568; RV32IM-NEXT: mulhu a5, a1, a5569; RV32IM-NEXT: andi a2, a2, 63570; RV32IM-NEXT: andi a3, a3, 31571; RV32IM-NEXT: andi a4, a4, 7572; RV32IM-NEXT: mul a5, a5, a6573; RV32IM-NEXT: sub a1, a1, a5574; RV32IM-NEXT: sh a2, 0(a0)575; RV32IM-NEXT: sh a3, 2(a0)576; RV32IM-NEXT: sh a4, 4(a0)577; RV32IM-NEXT: sh a1, 6(a0)578; RV32IM-NEXT: ret579;580; RV64I-LABEL: dont_fold_urem_power_of_two:581; RV64I: # %bb.0:582; RV64I-NEXT: addi sp, sp, -48583; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill584; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill585; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill586; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill587; RV64I-NEXT: sd s3, 8(sp) # 8-byte Folded Spill588; RV64I-NEXT: lhu s1, 0(a1)589; RV64I-NEXT: lhu s2, 8(a1)590; RV64I-NEXT: lhu s3, 16(a1)591; RV64I-NEXT: lhu a2, 24(a1)592; RV64I-NEXT: mv s0, a0593; RV64I-NEXT: li a1, 95594; RV64I-NEXT: mv a0, a2595; RV64I-NEXT: call __umoddi3596; RV64I-NEXT: andi a1, s1, 63597; RV64I-NEXT: andi a2, s2, 31598; RV64I-NEXT: andi a3, s3, 7599; RV64I-NEXT: sh a1, 0(s0)600; RV64I-NEXT: sh a2, 2(s0)601; RV64I-NEXT: sh a3, 4(s0)602; RV64I-NEXT: sh a0, 6(s0)603; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload604; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload605; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload606; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload607; RV64I-NEXT: ld s3, 8(sp) # 8-byte Folded Reload608; RV64I-NEXT: addi sp, sp, 48609; RV64I-NEXT: ret610;611; RV64IM-LABEL: dont_fold_urem_power_of_two:612; RV64IM: # %bb.0:613; RV64IM-NEXT: lhu a2, 0(a1)614; RV64IM-NEXT: lhu a3, 8(a1)615; RV64IM-NEXT: lhu a4, 16(a1)616; RV64IM-NEXT: lhu a1, 24(a1)617; RV64IM-NEXT: lui a5, %hi(.LCPI3_0)618; RV64IM-NEXT: li a6, 95619; RV64IM-NEXT: ld a5, %lo(.LCPI3_0)(a5)620; RV64IM-NEXT: andi a2, a2, 63621; RV64IM-NEXT: andi a3, a3, 31622; RV64IM-NEXT: andi a4, a4, 7623; RV64IM-NEXT: mulhu a5, a1, a5624; RV64IM-NEXT: mul a5, a5, a6625; RV64IM-NEXT: sub a1, a1, a5626; RV64IM-NEXT: sh a2, 0(a0)627; RV64IM-NEXT: sh a3, 2(a0)628; RV64IM-NEXT: sh a4, 4(a0)629; RV64IM-NEXT: sh a1, 6(a0)630; RV64IM-NEXT: ret631 %1 = urem <4 x i16> %x, <i16 64, i16 32, i16 8, i16 95>632 ret <4 x i16> %1633}634 635; Don't fold if the divisor is one.636define <4 x i16> @dont_fold_urem_one(<4 x i16> %x) nounwind {637; RV32I-LABEL: dont_fold_urem_one:638; RV32I: # %bb.0:639; RV32I-NEXT: addi sp, sp, -32640; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill641; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill642; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill643; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill644; RV32I-NEXT: sw s3, 12(sp) # 4-byte Folded Spill645; RV32I-NEXT: lhu a2, 4(a1)646; RV32I-NEXT: lhu s0, 8(a1)647; RV32I-NEXT: lhu s1, 12(a1)648; RV32I-NEXT: mv s2, a0649; RV32I-NEXT: li a1, 654650; RV32I-NEXT: mv a0, a2651; RV32I-NEXT: call __umodsi3652; RV32I-NEXT: mv s3, a0653; RV32I-NEXT: li a1, 23654; RV32I-NEXT: mv a0, s0655; RV32I-NEXT: call __umodsi3656; RV32I-NEXT: mv s0, a0657; RV32I-NEXT: lui a1, 1658; RV32I-NEXT: addi a1, a1, 1327659; RV32I-NEXT: mv a0, s1660; RV32I-NEXT: call __umodsi3661; RV32I-NEXT: sh zero, 0(s2)662; RV32I-NEXT: sh s3, 2(s2)663; RV32I-NEXT: sh s0, 4(s2)664; RV32I-NEXT: sh a0, 6(s2)665; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload666; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload667; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload668; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload669; RV32I-NEXT: lw s3, 12(sp) # 4-byte Folded Reload670; RV32I-NEXT: addi sp, sp, 32671; RV32I-NEXT: ret672;673; RV32IM-LABEL: dont_fold_urem_one:674; RV32IM: # %bb.0:675; RV32IM-NEXT: lhu a2, 4(a1)676; RV32IM-NEXT: lhu a3, 8(a1)677; RV32IM-NEXT: lhu a1, 12(a1)678; RV32IM-NEXT: lui a4, 1603679; RV32IM-NEXT: li a5, 654680; RV32IM-NEXT: lui a6, 45590681; RV32IM-NEXT: li a7, 23682; RV32IM-NEXT: addi a4, a4, 1341683; RV32IM-NEXT: mulhu a4, a2, a4684; RV32IM-NEXT: mul a4, a4, a5685; RV32IM-NEXT: lui a5, 193686; RV32IM-NEXT: addi a6, a6, 1069687; RV32IM-NEXT: mulhu a6, a3, a6688; RV32IM-NEXT: mul a6, a6, a7689; RV32IM-NEXT: lui a7, 1690; RV32IM-NEXT: addi a5, a5, 1464691; RV32IM-NEXT: addi a7, a7, 1327692; RV32IM-NEXT: mulhu a5, a1, a5693; RV32IM-NEXT: mul a5, a5, a7694; RV32IM-NEXT: sub a2, a2, a4695; RV32IM-NEXT: sub a3, a3, a6696; RV32IM-NEXT: sub a1, a1, a5697; RV32IM-NEXT: sh zero, 0(a0)698; RV32IM-NEXT: sh a2, 2(a0)699; RV32IM-NEXT: sh a3, 4(a0)700; RV32IM-NEXT: sh a1, 6(a0)701; RV32IM-NEXT: ret702;703; RV64I-LABEL: dont_fold_urem_one:704; RV64I: # %bb.0:705; RV64I-NEXT: addi sp, sp, -48706; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill707; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill708; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill709; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill710; RV64I-NEXT: sd s3, 8(sp) # 8-byte Folded Spill711; RV64I-NEXT: lhu a2, 8(a1)712; RV64I-NEXT: lhu s0, 16(a1)713; RV64I-NEXT: lhu s1, 24(a1)714; RV64I-NEXT: mv s2, a0715; RV64I-NEXT: li a1, 654716; RV64I-NEXT: mv a0, a2717; RV64I-NEXT: call __umoddi3718; RV64I-NEXT: mv s3, a0719; RV64I-NEXT: li a1, 23720; RV64I-NEXT: mv a0, s0721; RV64I-NEXT: call __umoddi3722; RV64I-NEXT: mv s0, a0723; RV64I-NEXT: lui a1, 1724; RV64I-NEXT: addi a1, a1, 1327725; RV64I-NEXT: mv a0, s1726; RV64I-NEXT: call __umoddi3727; RV64I-NEXT: sh zero, 0(s2)728; RV64I-NEXT: sh s3, 2(s2)729; RV64I-NEXT: sh s0, 4(s2)730; RV64I-NEXT: sh a0, 6(s2)731; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload732; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload733; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload734; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload735; RV64I-NEXT: ld s3, 8(sp) # 8-byte Folded Reload736; RV64I-NEXT: addi sp, sp, 48737; RV64I-NEXT: ret738;739; RV64IM-LABEL: dont_fold_urem_one:740; RV64IM: # %bb.0:741; RV64IM-NEXT: lhu a2, 8(a1)742; RV64IM-NEXT: lhu a3, 16(a1)743; RV64IM-NEXT: lhu a1, 24(a1)744; RV64IM-NEXT: lui a4, %hi(.LCPI4_0)745; RV64IM-NEXT: li a5, 654746; RV64IM-NEXT: ld a4, %lo(.LCPI4_0)(a4)747; RV64IM-NEXT: lui a6, %hi(.LCPI4_1)748; RV64IM-NEXT: li a7, 23749; RV64IM-NEXT: ld a6, %lo(.LCPI4_1)(a6)750; RV64IM-NEXT: mulhu a4, a2, a4751; RV64IM-NEXT: mul a4, a4, a5752; RV64IM-NEXT: lui a5, %hi(.LCPI4_2)753; RV64IM-NEXT: ld a5, %lo(.LCPI4_2)(a5)754; RV64IM-NEXT: mulhu a6, a3, a6755; RV64IM-NEXT: mul a6, a6, a7756; RV64IM-NEXT: lui a7, 1757; RV64IM-NEXT: addi a7, a7, 1327758; RV64IM-NEXT: mulhu a5, a1, a5759; RV64IM-NEXT: mul a5, a5, a7760; RV64IM-NEXT: sub a2, a2, a4761; RV64IM-NEXT: sub a3, a3, a6762; RV64IM-NEXT: sub a1, a1, a5763; RV64IM-NEXT: sh zero, 0(a0)764; RV64IM-NEXT: sh a2, 2(a0)765; RV64IM-NEXT: sh a3, 4(a0)766; RV64IM-NEXT: sh a1, 6(a0)767; RV64IM-NEXT: ret768 %1 = urem <4 x i16> %x, <i16 1, i16 654, i16 23, i16 5423>769 ret <4 x i16> %1770}771 772; Don't fold if the divisor is 2^16.773define <4 x i16> @dont_fold_urem_i16_smax(<4 x i16> %x) nounwind {774; CHECK-LABEL: dont_fold_urem_i16_smax:775; CHECK: # %bb.0:776; CHECK-NEXT: ret777 %1 = urem <4 x i16> %x, <i16 1, i16 65536, i16 23, i16 5423>778 ret <4 x i16> %1779}780 781; Don't fold i64 urem.782define <4 x i64> @dont_fold_urem_i64(<4 x i64> %x) nounwind {783; RV32I-LABEL: dont_fold_urem_i64:784; RV32I: # %bb.0:785; RV32I-NEXT: addi sp, sp, -48786; RV32I-NEXT: sw ra, 44(sp) # 4-byte Folded Spill787; RV32I-NEXT: sw s0, 40(sp) # 4-byte Folded Spill788; RV32I-NEXT: sw s1, 36(sp) # 4-byte Folded Spill789; RV32I-NEXT: sw s2, 32(sp) # 4-byte Folded Spill790; RV32I-NEXT: sw s3, 28(sp) # 4-byte Folded Spill791; RV32I-NEXT: sw s4, 24(sp) # 4-byte Folded Spill792; RV32I-NEXT: sw s5, 20(sp) # 4-byte Folded Spill793; RV32I-NEXT: sw s6, 16(sp) # 4-byte Folded Spill794; RV32I-NEXT: sw s7, 12(sp) # 4-byte Folded Spill795; RV32I-NEXT: sw s8, 8(sp) # 4-byte Folded Spill796; RV32I-NEXT: lw s1, 16(a1)797; RV32I-NEXT: lw s2, 20(a1)798; RV32I-NEXT: lw s3, 24(a1)799; RV32I-NEXT: lw s4, 28(a1)800; RV32I-NEXT: lw a3, 0(a1)801; RV32I-NEXT: lw a4, 4(a1)802; RV32I-NEXT: lw s5, 8(a1)803; RV32I-NEXT: lw s6, 12(a1)804; RV32I-NEXT: mv s0, a0805; RV32I-NEXT: li a2, 1806; RV32I-NEXT: mv a0, a3807; RV32I-NEXT: mv a1, a4808; RV32I-NEXT: li a3, 0809; RV32I-NEXT: call __umoddi3810; RV32I-NEXT: mv s7, a0811; RV32I-NEXT: mv s8, a1812; RV32I-NEXT: li a2, 654813; RV32I-NEXT: mv a0, s5814; RV32I-NEXT: mv a1, s6815; RV32I-NEXT: li a3, 0816; RV32I-NEXT: call __umoddi3817; RV32I-NEXT: mv s5, a0818; RV32I-NEXT: mv s6, a1819; RV32I-NEXT: li a2, 23820; RV32I-NEXT: mv a0, s1821; RV32I-NEXT: mv a1, s2822; RV32I-NEXT: li a3, 0823; RV32I-NEXT: call __umoddi3824; RV32I-NEXT: mv s1, a0825; RV32I-NEXT: mv s2, a1826; RV32I-NEXT: lui a2, 1827; RV32I-NEXT: addi a2, a2, 1327828; RV32I-NEXT: mv a0, s3829; RV32I-NEXT: mv a1, s4830; RV32I-NEXT: li a3, 0831; RV32I-NEXT: call __umoddi3832; RV32I-NEXT: sw s1, 16(s0)833; RV32I-NEXT: sw s2, 20(s0)834; RV32I-NEXT: sw a0, 24(s0)835; RV32I-NEXT: sw a1, 28(s0)836; RV32I-NEXT: sw s7, 0(s0)837; RV32I-NEXT: sw s8, 4(s0)838; RV32I-NEXT: sw s5, 8(s0)839; RV32I-NEXT: sw s6, 12(s0)840; RV32I-NEXT: lw ra, 44(sp) # 4-byte Folded Reload841; RV32I-NEXT: lw s0, 40(sp) # 4-byte Folded Reload842; RV32I-NEXT: lw s1, 36(sp) # 4-byte Folded Reload843; RV32I-NEXT: lw s2, 32(sp) # 4-byte Folded Reload844; RV32I-NEXT: lw s3, 28(sp) # 4-byte Folded Reload845; RV32I-NEXT: lw s4, 24(sp) # 4-byte Folded Reload846; RV32I-NEXT: lw s5, 20(sp) # 4-byte Folded Reload847; RV32I-NEXT: lw s6, 16(sp) # 4-byte Folded Reload848; RV32I-NEXT: lw s7, 12(sp) # 4-byte Folded Reload849; RV32I-NEXT: lw s8, 8(sp) # 4-byte Folded Reload850; RV32I-NEXT: addi sp, sp, 48851; RV32I-NEXT: ret852;853; RV32IM-LABEL: dont_fold_urem_i64:854; RV32IM: # %bb.0:855; RV32IM-NEXT: addi sp, sp, -48856; RV32IM-NEXT: sw ra, 44(sp) # 4-byte Folded Spill857; RV32IM-NEXT: sw s0, 40(sp) # 4-byte Folded Spill858; RV32IM-NEXT: sw s1, 36(sp) # 4-byte Folded Spill859; RV32IM-NEXT: sw s2, 32(sp) # 4-byte Folded Spill860; RV32IM-NEXT: sw s3, 28(sp) # 4-byte Folded Spill861; RV32IM-NEXT: sw s4, 24(sp) # 4-byte Folded Spill862; RV32IM-NEXT: sw s5, 20(sp) # 4-byte Folded Spill863; RV32IM-NEXT: sw s6, 16(sp) # 4-byte Folded Spill864; RV32IM-NEXT: sw s7, 12(sp) # 4-byte Folded Spill865; RV32IM-NEXT: sw s8, 8(sp) # 4-byte Folded Spill866; RV32IM-NEXT: lw s1, 16(a1)867; RV32IM-NEXT: lw s2, 20(a1)868; RV32IM-NEXT: lw s3, 24(a1)869; RV32IM-NEXT: lw s4, 28(a1)870; RV32IM-NEXT: lw a3, 0(a1)871; RV32IM-NEXT: lw a4, 4(a1)872; RV32IM-NEXT: lw s5, 8(a1)873; RV32IM-NEXT: lw s6, 12(a1)874; RV32IM-NEXT: mv s0, a0875; RV32IM-NEXT: li a2, 1876; RV32IM-NEXT: mv a0, a3877; RV32IM-NEXT: mv a1, a4878; RV32IM-NEXT: li a3, 0879; RV32IM-NEXT: call __umoddi3880; RV32IM-NEXT: mv s7, a0881; RV32IM-NEXT: mv s8, a1882; RV32IM-NEXT: li a2, 654883; RV32IM-NEXT: mv a0, s5884; RV32IM-NEXT: mv a1, s6885; RV32IM-NEXT: li a3, 0886; RV32IM-NEXT: call __umoddi3887; RV32IM-NEXT: mv s5, a0888; RV32IM-NEXT: mv s6, a1889; RV32IM-NEXT: li a2, 23890; RV32IM-NEXT: mv a0, s1891; RV32IM-NEXT: mv a1, s2892; RV32IM-NEXT: li a3, 0893; RV32IM-NEXT: call __umoddi3894; RV32IM-NEXT: mv s1, a0895; RV32IM-NEXT: mv s2, a1896; RV32IM-NEXT: lui a2, 1897; RV32IM-NEXT: addi a2, a2, 1327898; RV32IM-NEXT: mv a0, s3899; RV32IM-NEXT: mv a1, s4900; RV32IM-NEXT: li a3, 0901; RV32IM-NEXT: call __umoddi3902; RV32IM-NEXT: sw s1, 16(s0)903; RV32IM-NEXT: sw s2, 20(s0)904; RV32IM-NEXT: sw a0, 24(s0)905; RV32IM-NEXT: sw a1, 28(s0)906; RV32IM-NEXT: sw s7, 0(s0)907; RV32IM-NEXT: sw s8, 4(s0)908; RV32IM-NEXT: sw s5, 8(s0)909; RV32IM-NEXT: sw s6, 12(s0)910; RV32IM-NEXT: lw ra, 44(sp) # 4-byte Folded Reload911; RV32IM-NEXT: lw s0, 40(sp) # 4-byte Folded Reload912; RV32IM-NEXT: lw s1, 36(sp) # 4-byte Folded Reload913; RV32IM-NEXT: lw s2, 32(sp) # 4-byte Folded Reload914; RV32IM-NEXT: lw s3, 28(sp) # 4-byte Folded Reload915; RV32IM-NEXT: lw s4, 24(sp) # 4-byte Folded Reload916; RV32IM-NEXT: lw s5, 20(sp) # 4-byte Folded Reload917; RV32IM-NEXT: lw s6, 16(sp) # 4-byte Folded Reload918; RV32IM-NEXT: lw s7, 12(sp) # 4-byte Folded Reload919; RV32IM-NEXT: lw s8, 8(sp) # 4-byte Folded Reload920; RV32IM-NEXT: addi sp, sp, 48921; RV32IM-NEXT: ret922;923; RV64I-LABEL: dont_fold_urem_i64:924; RV64I: # %bb.0:925; RV64I-NEXT: addi sp, sp, -48926; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill927; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill928; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill929; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill930; RV64I-NEXT: sd s3, 8(sp) # 8-byte Folded Spill931; RV64I-NEXT: ld a2, 8(a1)932; RV64I-NEXT: ld s0, 16(a1)933; RV64I-NEXT: ld s1, 24(a1)934; RV64I-NEXT: mv s2, a0935; RV64I-NEXT: li a1, 654936; RV64I-NEXT: mv a0, a2937; RV64I-NEXT: call __umoddi3938; RV64I-NEXT: mv s3, a0939; RV64I-NEXT: li a1, 23940; RV64I-NEXT: mv a0, s0941; RV64I-NEXT: call __umoddi3942; RV64I-NEXT: mv s0, a0943; RV64I-NEXT: lui a1, 1944; RV64I-NEXT: addi a1, a1, 1327945; RV64I-NEXT: mv a0, s1946; RV64I-NEXT: call __umoddi3947; RV64I-NEXT: sd zero, 0(s2)948; RV64I-NEXT: sd s3, 8(s2)949; RV64I-NEXT: sd s0, 16(s2)950; RV64I-NEXT: sd a0, 24(s2)951; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload952; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload953; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload954; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload955; RV64I-NEXT: ld s3, 8(sp) # 8-byte Folded Reload956; RV64I-NEXT: addi sp, sp, 48957; RV64I-NEXT: ret958;959; RV64IM-LABEL: dont_fold_urem_i64:960; RV64IM: # %bb.0:961; RV64IM-NEXT: ld a2, 8(a1)962; RV64IM-NEXT: ld a3, 16(a1)963; RV64IM-NEXT: ld a1, 24(a1)964; RV64IM-NEXT: lui a4, %hi(.LCPI6_1)965; RV64IM-NEXT: ld a4, %lo(.LCPI6_1)(a4)966; RV64IM-NEXT: lui a5, %hi(.LCPI6_0)967; RV64IM-NEXT: li a6, 654968; RV64IM-NEXT: srli a7, a2, 1969; RV64IM-NEXT: mulhu a4, a7, a4970; RV64IM-NEXT: lui a7, %hi(.LCPI6_2)971; RV64IM-NEXT: ld a5, %lo(.LCPI6_0)(a5)972; RV64IM-NEXT: ld a7, %lo(.LCPI6_2)(a7)973; RV64IM-NEXT: srli a4, a4, 7974; RV64IM-NEXT: mul a4, a4, a6975; RV64IM-NEXT: lui a6, 1976; RV64IM-NEXT: addi a6, a6, 1327977; RV64IM-NEXT: mulhu a5, a3, a5978; RV64IM-NEXT: mulhu a7, a1, a7979; RV64IM-NEXT: srli a7, a7, 12980; RV64IM-NEXT: mul a6, a7, a6981; RV64IM-NEXT: sub a7, a3, a5982; RV64IM-NEXT: srli a7, a7, 1983; RV64IM-NEXT: add a5, a7, a5984; RV64IM-NEXT: sub a2, a2, a4985; RV64IM-NEXT: sub a1, a1, a6986; RV64IM-NEXT: li a4, 23987; RV64IM-NEXT: srli a5, a5, 4988; RV64IM-NEXT: mul a4, a5, a4989; RV64IM-NEXT: sub a3, a3, a4990; RV64IM-NEXT: sd zero, 0(a0)991; RV64IM-NEXT: sd a2, 8(a0)992; RV64IM-NEXT: sd a3, 16(a0)993; RV64IM-NEXT: sd a1, 24(a0)994; RV64IM-NEXT: ret995 %1 = urem <4 x i64> %x, <i64 1, i64 654, i64 23, i64 5423>996 ret <4 x i64> %1997}998