1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mtriple=riscv32 -verify-machineinstrs < %s \ 3; RUN: | FileCheck -check-prefix=RV32I %s 4; RUN: llc -mtriple=riscv32 -mattr=+m -verify-machineinstrs < %s \ 5; RUN: | FileCheck -check-prefix=RV32IM %s 6; RUN: llc -mtriple=riscv64 -verify-machineinstrs < %s \ 7; RUN: | FileCheck -check-prefix=RV64I %s 8; RUN: llc -mtriple=riscv64 -mattr=+m -verify-machineinstrs < %s \ 9; RUN: | FileCheck -check-prefix=RV64IM %s 10 11define <4 x i16> @fold_srem_vec_1(<4 x i16> %x) nounwind { 12; RV32I-LABEL: fold_srem_vec_1: 13; RV32I: # %bb.0: 14; RV32I-NEXT: addi sp, sp, -32 15; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 16; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 17; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 18; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 19; RV32I-NEXT: sw s3, 12(sp) # 4-byte Folded Spill 20; RV32I-NEXT: sw s4, 8(sp) # 4-byte Folded Spill 21; RV32I-NEXT: lh a2, 0(a1) 22; RV32I-NEXT: lh s0, 4(a1) 23; RV32I-NEXT: lh s1, 8(a1) 24; RV32I-NEXT: lh s2, 12(a1) 25; RV32I-NEXT: mv s3, a0 26; RV32I-NEXT: li a1, 95 27; RV32I-NEXT: mv a0, a2 28; RV32I-NEXT: call __modsi3 29; RV32I-NEXT: mv s4, a0 30; RV32I-NEXT: li a1, -124 31; RV32I-NEXT: mv a0, s0 32; RV32I-NEXT: call __modsi3 33; RV32I-NEXT: mv s0, a0 34; RV32I-NEXT: li a1, 98 35; RV32I-NEXT: mv a0, s1 36; RV32I-NEXT: call __modsi3 37; RV32I-NEXT: mv s1, a0 38; RV32I-NEXT: li a1, -1003 39; RV32I-NEXT: mv a0, s2 40; RV32I-NEXT: call __modsi3 41; RV32I-NEXT: sh s4, 0(s3) 42; RV32I-NEXT: sh s0, 2(s3) 43; RV32I-NEXT: sh s1, 4(s3) 44; RV32I-NEXT: sh a0, 6(s3) 45; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 46; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 47; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 48; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 49; RV32I-NEXT: lw s3, 12(sp) # 4-byte Folded Reload 50; RV32I-NEXT: lw s4, 8(sp) # 4-byte Folded Reload 51; RV32I-NEXT: addi sp, sp, 32 52; RV32I-NEXT: ret 53; 54; RV32IM-LABEL: fold_srem_vec_1: 55; RV32IM: # %bb.0: 56; RV32IM-NEXT: lh a3, 0(a1) 57; RV32IM-NEXT: lh a2, 4(a1) 58; RV32IM-NEXT: lh a4, 8(a1) 59; RV32IM-NEXT: lh a1, 12(a1) 60; RV32IM-NEXT: lui a5, 706409 61; RV32IM-NEXT: lui a6, 507375 62; RV32IM-NEXT: lui a7, 342392 63; RV32IM-NEXT: lui t0, 780943 64; RV32IM-NEXT: addi a5, a5, 389 65; RV32IM-NEXT: addi a6, a6, 1981 66; RV32IM-NEXT: addi a7, a7, 669 67; RV32IM-NEXT: addi t0, t0, 1809 68; RV32IM-NEXT: mulh a5, a3, a5 69; RV32IM-NEXT: mulh a6, a2, a6 70; RV32IM-NEXT: mulh a7, a4, a7 71; RV32IM-NEXT: mulh t0, a1, t0 72; RV32IM-NEXT: add a5, a5, a3 73; RV32IM-NEXT: sub a6, a6, a2 74; RV32IM-NEXT: srli t1, a7, 31 75; RV32IM-NEXT: srli a7, a7, 5 76; RV32IM-NEXT: add a7, a7, t1 77; RV32IM-NEXT: srli t1, t0, 31 78; RV32IM-NEXT: srli t0, t0, 8 79; RV32IM-NEXT: add t0, t0, t1 80; RV32IM-NEXT: srli t1, a5, 31 81; RV32IM-NEXT: srli a5, a5, 6 82; RV32IM-NEXT: add a5, a5, t1 83; RV32IM-NEXT: srli t1, a6, 31 84; RV32IM-NEXT: srli a6, a6, 6 85; RV32IM-NEXT: add a6, a6, t1 86; RV32IM-NEXT: li t1, 98 87; RV32IM-NEXT: mul a7, a7, t1 88; RV32IM-NEXT: li t1, -1003 89; RV32IM-NEXT: mul t0, t0, t1 90; RV32IM-NEXT: li t1, 95 91; RV32IM-NEXT: mul a5, a5, t1 92; RV32IM-NEXT: li t1, -124 93; RV32IM-NEXT: mul a6, a6, t1 94; RV32IM-NEXT: sub a4, a4, a7 95; RV32IM-NEXT: sub a1, a1, t0 96; RV32IM-NEXT: sub a3, a3, a5 97; RV32IM-NEXT: sub a2, a2, a6 98; RV32IM-NEXT: sh a3, 0(a0) 99; RV32IM-NEXT: sh a2, 2(a0) 100; RV32IM-NEXT: sh a4, 4(a0) 101; RV32IM-NEXT: sh a1, 6(a0) 102; RV32IM-NEXT: ret 103; 104; RV64I-LABEL: fold_srem_vec_1: 105; RV64I: # %bb.0: 106; RV64I-NEXT: addi sp, sp, -48 107; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 108; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 109; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 110; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 111; RV64I-NEXT: sd s3, 8(sp) # 8-byte Folded Spill 112; RV64I-NEXT: sd s4, 0(sp) # 8-byte Folded Spill 113; RV64I-NEXT: lh a2, 0(a1) 114; RV64I-NEXT: lh s0, 8(a1) 115; RV64I-NEXT: lh s1, 16(a1) 116; RV64I-NEXT: lh s2, 24(a1) 117; RV64I-NEXT: mv s3, a0 118; RV64I-NEXT: li a1, 95 119; RV64I-NEXT: mv a0, a2 120; RV64I-NEXT: call __moddi3 121; RV64I-NEXT: mv s4, a0 122; RV64I-NEXT: li a1, -124 123; RV64I-NEXT: mv a0, s0 124; RV64I-NEXT: call __moddi3 125; RV64I-NEXT: mv s0, a0 126; RV64I-NEXT: li a1, 98 127; RV64I-NEXT: mv a0, s1 128; RV64I-NEXT: call __moddi3 129; RV64I-NEXT: mv s1, a0 130; RV64I-NEXT: li a1, -1003 131; RV64I-NEXT: mv a0, s2 132; RV64I-NEXT: call __moddi3 133; RV64I-NEXT: sh s4, 0(s3) 134; RV64I-NEXT: sh s0, 2(s3) 135; RV64I-NEXT: sh s1, 4(s3) 136; RV64I-NEXT: sh a0, 6(s3) 137; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 138; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 139; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 140; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 141; RV64I-NEXT: ld s3, 8(sp) # 8-byte Folded Reload 142; RV64I-NEXT: ld s4, 0(sp) # 8-byte Folded Reload 143; RV64I-NEXT: addi sp, sp, 48 144; RV64I-NEXT: ret 145; 146; RV64IM-LABEL: fold_srem_vec_1: 147; RV64IM: # %bb.0: 148; RV64IM-NEXT: lh a3, 0(a1) 149; RV64IM-NEXT: lh a2, 8(a1) 150; RV64IM-NEXT: lh a4, 16(a1) 151; RV64IM-NEXT: lh a1, 24(a1) 152; RV64IM-NEXT: lui a5, %hi(.LCPI0_0) 153; RV64IM-NEXT: lui a6, %hi(.LCPI0_1) 154; RV64IM-NEXT: lui a7, %hi(.LCPI0_2) 155; RV64IM-NEXT: lui t0, %hi(.LCPI0_3) 156; RV64IM-NEXT: ld a5, %lo(.LCPI0_0)(a5) 157; RV64IM-NEXT: ld a6, %lo(.LCPI0_1)(a6) 158; RV64IM-NEXT: ld a7, %lo(.LCPI0_2)(a7) 159; RV64IM-NEXT: ld t0, %lo(.LCPI0_3)(t0) 160; RV64IM-NEXT: mulh a5, a3, a5 161; RV64IM-NEXT: mulh a6, a2, a6 162; RV64IM-NEXT: mulh a7, a4, a7 163; RV64IM-NEXT: mulh t0, a1, t0 164; RV64IM-NEXT: add a5, a5, a3 165; RV64IM-NEXT: sub a6, a6, a2 166; RV64IM-NEXT: srli t1, a7, 63 167; RV64IM-NEXT: srli a7, a7, 5 168; RV64IM-NEXT: add a7, a7, t1 169; RV64IM-NEXT: srli t1, t0, 63 170; RV64IM-NEXT: srli t0, t0, 7 171; RV64IM-NEXT: add t0, t0, t1 172; RV64IM-NEXT: srli t1, a5, 63 173; RV64IM-NEXT: srli a5, a5, 6 174; RV64IM-NEXT: add a5, a5, t1 175; RV64IM-NEXT: srli t1, a6, 63 176; RV64IM-NEXT: srli a6, a6, 6 177; RV64IM-NEXT: add a6, a6, t1 178; RV64IM-NEXT: li t1, 98 179; RV64IM-NEXT: mul a7, a7, t1 180; RV64IM-NEXT: li t1, -1003 181; RV64IM-NEXT: mul t0, t0, t1 182; RV64IM-NEXT: li t1, 95 183; RV64IM-NEXT: mul a5, a5, t1 184; RV64IM-NEXT: li t1, -124 185; RV64IM-NEXT: mul a6, a6, t1 186; RV64IM-NEXT: subw a4, a4, a7 187; RV64IM-NEXT: subw a1, a1, t0 188; RV64IM-NEXT: subw a3, a3, a5 189; RV64IM-NEXT: subw a2, a2, a6 190; RV64IM-NEXT: sh a3, 0(a0) 191; RV64IM-NEXT: sh a2, 2(a0) 192; RV64IM-NEXT: sh a4, 4(a0) 193; RV64IM-NEXT: sh a1, 6(a0) 194; RV64IM-NEXT: ret 195 %1 = srem <4 x i16> %x, <i16 95, i16 -124, i16 98, i16 -1003> 196 ret <4 x i16> %1 197} 198 199define <4 x i16> @fold_srem_vec_2(<4 x i16> %x) nounwind { 200; RV32I-LABEL: fold_srem_vec_2: 201; RV32I: # %bb.0: 202; RV32I-NEXT: addi sp, sp, -32 203; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 204; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 205; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 206; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 207; RV32I-NEXT: sw s3, 12(sp) # 4-byte Folded Spill 208; RV32I-NEXT: sw s4, 8(sp) # 4-byte Folded Spill 209; RV32I-NEXT: lh a2, 0(a1) 210; RV32I-NEXT: lh s0, 4(a1) 211; RV32I-NEXT: lh s1, 8(a1) 212; RV32I-NEXT: lh s2, 12(a1) 213; RV32I-NEXT: mv s3, a0 214; RV32I-NEXT: li a1, 95 215; RV32I-NEXT: mv a0, a2 216; RV32I-NEXT: call __modsi3 217; RV32I-NEXT: mv s4, a0 218; RV32I-NEXT: li a1, 95 219; RV32I-NEXT: mv a0, s0 220; RV32I-NEXT: call __modsi3 221; RV32I-NEXT: mv s0, a0 222; RV32I-NEXT: li a1, 95 223; RV32I-NEXT: mv a0, s1 224; RV32I-NEXT: call __modsi3 225; RV32I-NEXT: mv s1, a0 226; RV32I-NEXT: li a1, 95 227; RV32I-NEXT: mv a0, s2 228; RV32I-NEXT: call __modsi3 229; RV32I-NEXT: sh s4, 0(s3) 230; RV32I-NEXT: sh s0, 2(s3) 231; RV32I-NEXT: sh s1, 4(s3) 232; RV32I-NEXT: sh a0, 6(s3) 233; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 234; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 235; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 236; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 237; RV32I-NEXT: lw s3, 12(sp) # 4-byte Folded Reload 238; RV32I-NEXT: lw s4, 8(sp) # 4-byte Folded Reload 239; RV32I-NEXT: addi sp, sp, 32 240; RV32I-NEXT: ret 241; 242; RV32IM-LABEL: fold_srem_vec_2: 243; RV32IM: # %bb.0: 244; RV32IM-NEXT: lh a2, 0(a1) 245; RV32IM-NEXT: lh a3, 4(a1) 246; RV32IM-NEXT: lh a4, 8(a1) 247; RV32IM-NEXT: lh a1, 12(a1) 248; RV32IM-NEXT: lui a5, 706409 249; RV32IM-NEXT: addi a5, a5, 389 250; RV32IM-NEXT: mulh a6, a2, a5 251; RV32IM-NEXT: mulh a7, a3, a5 252; RV32IM-NEXT: mulh t0, a4, a5 253; RV32IM-NEXT: mulh a5, a1, a5 254; RV32IM-NEXT: add a6, a6, a2 255; RV32IM-NEXT: add a7, a7, a3 256; RV32IM-NEXT: add t0, t0, a4 257; RV32IM-NEXT: add a5, a5, a1 258; RV32IM-NEXT: srli t1, a6, 31 259; RV32IM-NEXT: srli a6, a6, 6 260; RV32IM-NEXT: add a6, a6, t1 261; RV32IM-NEXT: srli t1, a7, 31 262; RV32IM-NEXT: srli a7, a7, 6 263; RV32IM-NEXT: add a7, a7, t1 264; RV32IM-NEXT: srli t1, t0, 31 265; RV32IM-NEXT: srli t0, t0, 6 266; RV32IM-NEXT: add t0, t0, t1 267; RV32IM-NEXT: srli t1, a5, 31 268; RV32IM-NEXT: srli a5, a5, 6 269; RV32IM-NEXT: add a5, a5, t1 270; RV32IM-NEXT: li t1, 95 271; RV32IM-NEXT: mul a6, a6, t1 272; RV32IM-NEXT: mul a7, a7, t1 273; RV32IM-NEXT: mul t0, t0, t1 274; RV32IM-NEXT: mul a5, a5, t1 275; RV32IM-NEXT: sub a2, a2, a6 276; RV32IM-NEXT: sub a3, a3, a7 277; RV32IM-NEXT: sub a4, a4, t0 278; RV32IM-NEXT: sub a1, a1, a5 279; RV32IM-NEXT: sh a2, 0(a0) 280; RV32IM-NEXT: sh a3, 2(a0) 281; RV32IM-NEXT: sh a4, 4(a0) 282; RV32IM-NEXT: sh a1, 6(a0) 283; RV32IM-NEXT: ret 284; 285; RV64I-LABEL: fold_srem_vec_2: 286; RV64I: # %bb.0: 287; RV64I-NEXT: addi sp, sp, -48 288; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 289; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 290; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 291; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 292; RV64I-NEXT: sd s3, 8(sp) # 8-byte Folded Spill 293; RV64I-NEXT: sd s4, 0(sp) # 8-byte Folded Spill 294; RV64I-NEXT: lh a2, 0(a1) 295; RV64I-NEXT: lh s0, 8(a1) 296; RV64I-NEXT: lh s1, 16(a1) 297; RV64I-NEXT: lh s2, 24(a1) 298; RV64I-NEXT: mv s3, a0 299; RV64I-NEXT: li a1, 95 300; RV64I-NEXT: mv a0, a2 301; RV64I-NEXT: call __moddi3 302; RV64I-NEXT: mv s4, a0 303; RV64I-NEXT: li a1, 95 304; RV64I-NEXT: mv a0, s0 305; RV64I-NEXT: call __moddi3 306; RV64I-NEXT: mv s0, a0 307; RV64I-NEXT: li a1, 95 308; RV64I-NEXT: mv a0, s1 309; RV64I-NEXT: call __moddi3 310; RV64I-NEXT: mv s1, a0 311; RV64I-NEXT: li a1, 95 312; RV64I-NEXT: mv a0, s2 313; RV64I-NEXT: call __moddi3 314; RV64I-NEXT: sh s4, 0(s3) 315; RV64I-NEXT: sh s0, 2(s3) 316; RV64I-NEXT: sh s1, 4(s3) 317; RV64I-NEXT: sh a0, 6(s3) 318; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 319; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 320; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 321; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 322; RV64I-NEXT: ld s3, 8(sp) # 8-byte Folded Reload 323; RV64I-NEXT: ld s4, 0(sp) # 8-byte Folded Reload 324; RV64I-NEXT: addi sp, sp, 48 325; RV64I-NEXT: ret 326; 327; RV64IM-LABEL: fold_srem_vec_2: 328; RV64IM: # %bb.0: 329; RV64IM-NEXT: lui a2, %hi(.LCPI1_0) 330; RV64IM-NEXT: ld a2, %lo(.LCPI1_0)(a2) 331; RV64IM-NEXT: lh a3, 0(a1) 332; RV64IM-NEXT: lh a4, 8(a1) 333; RV64IM-NEXT: lh a5, 16(a1) 334; RV64IM-NEXT: lh a1, 24(a1) 335; RV64IM-NEXT: mulh a6, a3, a2 336; RV64IM-NEXT: mulh a7, a4, a2 337; RV64IM-NEXT: mulh t0, a5, a2 338; RV64IM-NEXT: mulh a2, a1, a2 339; RV64IM-NEXT: add a6, a6, a3 340; RV64IM-NEXT: add a7, a7, a4 341; RV64IM-NEXT: add t0, t0, a5 342; RV64IM-NEXT: add a2, a2, a1 343; RV64IM-NEXT: srli t1, a6, 63 344; RV64IM-NEXT: srli a6, a6, 6 345; RV64IM-NEXT: add a6, a6, t1 346; RV64IM-NEXT: srli t1, a7, 63 347; RV64IM-NEXT: srli a7, a7, 6 348; RV64IM-NEXT: add a7, a7, t1 349; RV64IM-NEXT: srli t1, t0, 63 350; RV64IM-NEXT: srli t0, t0, 6 351; RV64IM-NEXT: add t0, t0, t1 352; RV64IM-NEXT: srli t1, a2, 63 353; RV64IM-NEXT: srli a2, a2, 6 354; RV64IM-NEXT: add a2, a2, t1 355; RV64IM-NEXT: li t1, 95 356; RV64IM-NEXT: mul a6, a6, t1 357; RV64IM-NEXT: mul a7, a7, t1 358; RV64IM-NEXT: mul t0, t0, t1 359; RV64IM-NEXT: mul a2, a2, t1 360; RV64IM-NEXT: subw a3, a3, a6 361; RV64IM-NEXT: subw a4, a4, a7 362; RV64IM-NEXT: subw a5, a5, t0 363; RV64IM-NEXT: subw a1, a1, a2 364; RV64IM-NEXT: sh a3, 0(a0) 365; RV64IM-NEXT: sh a4, 2(a0) 366; RV64IM-NEXT: sh a5, 4(a0) 367; RV64IM-NEXT: sh a1, 6(a0) 368; RV64IM-NEXT: ret 369 %1 = srem <4 x i16> %x, <i16 95, i16 95, i16 95, i16 95> 370 ret <4 x i16> %1 371} 372 373 374; Don't fold if we can combine srem with sdiv. 375define <4 x i16> @combine_srem_sdiv(<4 x i16> %x) nounwind { 376; RV32I-LABEL: combine_srem_sdiv: 377; RV32I: # %bb.0: 378; RV32I-NEXT: addi sp, sp, -48 379; RV32I-NEXT: sw ra, 44(sp) # 4-byte Folded Spill 380; RV32I-NEXT: sw s0, 40(sp) # 4-byte Folded Spill 381; RV32I-NEXT: sw s1, 36(sp) # 4-byte Folded Spill 382; RV32I-NEXT: sw s2, 32(sp) # 4-byte Folded Spill 383; RV32I-NEXT: sw s3, 28(sp) # 4-byte Folded Spill 384; RV32I-NEXT: sw s4, 24(sp) # 4-byte Folded Spill 385; RV32I-NEXT: sw s5, 20(sp) # 4-byte Folded Spill 386; RV32I-NEXT: sw s6, 16(sp) # 4-byte Folded Spill 387; RV32I-NEXT: sw s7, 12(sp) # 4-byte Folded Spill 388; RV32I-NEXT: sw s8, 8(sp) # 4-byte Folded Spill 389; RV32I-NEXT: lh s1, 0(a1) 390; RV32I-NEXT: lh s2, 4(a1) 391; RV32I-NEXT: lh s3, 8(a1) 392; RV32I-NEXT: lh s4, 12(a1) 393; RV32I-NEXT: mv s0, a0 394; RV32I-NEXT: li a1, 95 395; RV32I-NEXT: mv a0, s4 396; RV32I-NEXT: call __modsi3 397; RV32I-NEXT: mv s5, a0 398; RV32I-NEXT: li a1, 95 399; RV32I-NEXT: mv a0, s3 400; RV32I-NEXT: call __modsi3 401; RV32I-NEXT: mv s6, a0 402; RV32I-NEXT: li a1, 95 403; RV32I-NEXT: mv a0, s2 404; RV32I-NEXT: call __modsi3 405; RV32I-NEXT: mv s7, a0 406; RV32I-NEXT: li a1, 95 407; RV32I-NEXT: mv a0, s1 408; RV32I-NEXT: call __modsi3 409; RV32I-NEXT: mv s8, a0 410; RV32I-NEXT: li a1, 95 411; RV32I-NEXT: mv a0, s4 412; RV32I-NEXT: call __divsi3 413; RV32I-NEXT: mv s4, a0 414; RV32I-NEXT: li a1, 95 415; RV32I-NEXT: mv a0, s3 416; RV32I-NEXT: call __divsi3 417; RV32I-NEXT: mv s3, a0 418; RV32I-NEXT: li a1, 95 419; RV32I-NEXT: mv a0, s2 420; RV32I-NEXT: call __divsi3 421; RV32I-NEXT: mv s2, a0 422; RV32I-NEXT: li a1, 95 423; RV32I-NEXT: mv a0, s1 424; RV32I-NEXT: call __divsi3 425; RV32I-NEXT: add a0, s8, a0 426; RV32I-NEXT: add s2, s7, s2 427; RV32I-NEXT: add s3, s6, s3 428; RV32I-NEXT: add s4, s5, s4 429; RV32I-NEXT: sh a0, 0(s0) 430; RV32I-NEXT: sh s2, 2(s0) 431; RV32I-NEXT: sh s3, 4(s0) 432; RV32I-NEXT: sh s4, 6(s0) 433; RV32I-NEXT: lw ra, 44(sp) # 4-byte Folded Reload 434; RV32I-NEXT: lw s0, 40(sp) # 4-byte Folded Reload 435; RV32I-NEXT: lw s1, 36(sp) # 4-byte Folded Reload 436; RV32I-NEXT: lw s2, 32(sp) # 4-byte Folded Reload 437; RV32I-NEXT: lw s3, 28(sp) # 4-byte Folded Reload 438; RV32I-NEXT: lw s4, 24(sp) # 4-byte Folded Reload 439; RV32I-NEXT: lw s5, 20(sp) # 4-byte Folded Reload 440; RV32I-NEXT: lw s6, 16(sp) # 4-byte Folded Reload 441; RV32I-NEXT: lw s7, 12(sp) # 4-byte Folded Reload 442; RV32I-NEXT: lw s8, 8(sp) # 4-byte Folded Reload 443; RV32I-NEXT: addi sp, sp, 48 444; RV32I-NEXT: ret 445; 446; RV32IM-LABEL: combine_srem_sdiv: 447; RV32IM: # %bb.0: 448; RV32IM-NEXT: lh a2, 0(a1) 449; RV32IM-NEXT: lh a3, 4(a1) 450; RV32IM-NEXT: lh a4, 8(a1) 451; RV32IM-NEXT: lh a1, 12(a1) 452; RV32IM-NEXT: lui a5, 706409 453; RV32IM-NEXT: li a6, 95 454; RV32IM-NEXT: addi a5, a5, 389 455; RV32IM-NEXT: mulh a7, a1, a5 456; RV32IM-NEXT: mulh t0, a4, a5 457; RV32IM-NEXT: mulh t1, a3, a5 458; RV32IM-NEXT: mulh a5, a2, a5 459; RV32IM-NEXT: add a7, a7, a1 460; RV32IM-NEXT: add t0, t0, a4 461; RV32IM-NEXT: add t1, t1, a3 462; RV32IM-NEXT: add a5, a5, a2 463; RV32IM-NEXT: srli t2, a7, 31 464; RV32IM-NEXT: srai a7, a7, 6 465; RV32IM-NEXT: srli t3, t0, 31 466; RV32IM-NEXT: srai t0, t0, 6 467; RV32IM-NEXT: srli t4, t1, 31 468; RV32IM-NEXT: srai t1, t1, 6 469; RV32IM-NEXT: srli t5, a5, 31 470; RV32IM-NEXT: srai a5, a5, 6 471; RV32IM-NEXT: add a7, a7, t2 472; RV32IM-NEXT: add t0, t0, t3 473; RV32IM-NEXT: add t1, t1, t4 474; RV32IM-NEXT: add a5, a5, t5 475; RV32IM-NEXT: mul t2, a7, a6 476; RV32IM-NEXT: mul t3, t0, a6 477; RV32IM-NEXT: mul t4, t1, a6 478; RV32IM-NEXT: mul a6, a5, a6 479; RV32IM-NEXT: add a2, a2, a5 480; RV32IM-NEXT: add a3, a3, t1 481; RV32IM-NEXT: add a4, a4, t0 482; RV32IM-NEXT: add a1, a1, a7 483; RV32IM-NEXT: sub a2, a2, a6 484; RV32IM-NEXT: sub a3, a3, t4 485; RV32IM-NEXT: sub a4, a4, t3 486; RV32IM-NEXT: sub a1, a1, t2 487; RV32IM-NEXT: sh a2, 0(a0) 488; RV32IM-NEXT: sh a3, 2(a0) 489; RV32IM-NEXT: sh a4, 4(a0) 490; RV32IM-NEXT: sh a1, 6(a0) 491; RV32IM-NEXT: ret 492; 493; RV64I-LABEL: combine_srem_sdiv: 494; RV64I: # %bb.0: 495; RV64I-NEXT: addi sp, sp, -80 496; RV64I-NEXT: sd ra, 72(sp) # 8-byte Folded Spill 497; RV64I-NEXT: sd s0, 64(sp) # 8-byte Folded Spill 498; RV64I-NEXT: sd s1, 56(sp) # 8-byte Folded Spill 499; RV64I-NEXT: sd s2, 48(sp) # 8-byte Folded Spill 500; RV64I-NEXT: sd s3, 40(sp) # 8-byte Folded Spill 501; RV64I-NEXT: sd s4, 32(sp) # 8-byte Folded Spill 502; RV64I-NEXT: sd s5, 24(sp) # 8-byte Folded Spill 503; RV64I-NEXT: sd s6, 16(sp) # 8-byte Folded Spill 504; RV64I-NEXT: sd s7, 8(sp) # 8-byte Folded Spill 505; RV64I-NEXT: sd s8, 0(sp) # 8-byte Folded Spill 506; RV64I-NEXT: lh s1, 0(a1) 507; RV64I-NEXT: lh s2, 8(a1) 508; RV64I-NEXT: lh s3, 16(a1) 509; RV64I-NEXT: lh s4, 24(a1) 510; RV64I-NEXT: mv s0, a0 511; RV64I-NEXT: li a1, 95 512; RV64I-NEXT: mv a0, s4 513; RV64I-NEXT: call __moddi3 514; RV64I-NEXT: mv s5, a0 515; RV64I-NEXT: li a1, 95 516; RV64I-NEXT: mv a0, s3 517; RV64I-NEXT: call __moddi3 518; RV64I-NEXT: mv s6, a0 519; RV64I-NEXT: li a1, 95 520; RV64I-NEXT: mv a0, s2 521; RV64I-NEXT: call __moddi3 522; RV64I-NEXT: mv s7, a0 523; RV64I-NEXT: li a1, 95 524; RV64I-NEXT: mv a0, s1 525; RV64I-NEXT: call __moddi3 526; RV64I-NEXT: mv s8, a0 527; RV64I-NEXT: li a1, 95 528; RV64I-NEXT: mv a0, s4 529; RV64I-NEXT: call __divdi3 530; RV64I-NEXT: mv s4, a0 531; RV64I-NEXT: li a1, 95 532; RV64I-NEXT: mv a0, s3 533; RV64I-NEXT: call __divdi3 534; RV64I-NEXT: mv s3, a0 535; RV64I-NEXT: li a1, 95 536; RV64I-NEXT: mv a0, s2 537; RV64I-NEXT: call __divdi3 538; RV64I-NEXT: mv s2, a0 539; RV64I-NEXT: li a1, 95 540; RV64I-NEXT: mv a0, s1 541; RV64I-NEXT: call __divdi3 542; RV64I-NEXT: add a0, s8, a0 543; RV64I-NEXT: add s2, s7, s2 544; RV64I-NEXT: add s3, s6, s3 545; RV64I-NEXT: add s4, s5, s4 546; RV64I-NEXT: sh a0, 0(s0) 547; RV64I-NEXT: sh s2, 2(s0) 548; RV64I-NEXT: sh s3, 4(s0) 549; RV64I-NEXT: sh s4, 6(s0) 550; RV64I-NEXT: ld ra, 72(sp) # 8-byte Folded Reload 551; RV64I-NEXT: ld s0, 64(sp) # 8-byte Folded Reload 552; RV64I-NEXT: ld s1, 56(sp) # 8-byte Folded Reload 553; RV64I-NEXT: ld s2, 48(sp) # 8-byte Folded Reload 554; RV64I-NEXT: ld s3, 40(sp) # 8-byte Folded Reload 555; RV64I-NEXT: ld s4, 32(sp) # 8-byte Folded Reload 556; RV64I-NEXT: ld s5, 24(sp) # 8-byte Folded Reload 557; RV64I-NEXT: ld s6, 16(sp) # 8-byte Folded Reload 558; RV64I-NEXT: ld s7, 8(sp) # 8-byte Folded Reload 559; RV64I-NEXT: ld s8, 0(sp) # 8-byte Folded Reload 560; RV64I-NEXT: addi sp, sp, 80 561; RV64I-NEXT: ret 562; 563; RV64IM-LABEL: combine_srem_sdiv: 564; RV64IM: # %bb.0: 565; RV64IM-NEXT: lh a2, 16(a1) 566; RV64IM-NEXT: lh a3, 24(a1) 567; RV64IM-NEXT: lui a4, %hi(.LCPI2_0) 568; RV64IM-NEXT: ld a4, %lo(.LCPI2_0)(a4) 569; RV64IM-NEXT: lh a5, 0(a1) 570; RV64IM-NEXT: lh a1, 8(a1) 571; RV64IM-NEXT: li a6, 95 572; RV64IM-NEXT: mulh a7, a3, a4 573; RV64IM-NEXT: mulh t0, a2, a4 574; RV64IM-NEXT: mulh t1, a1, a4 575; RV64IM-NEXT: mulh a4, a5, a4 576; RV64IM-NEXT: add a7, a7, a3 577; RV64IM-NEXT: add t0, t0, a2 578; RV64IM-NEXT: add t1, t1, a1 579; RV64IM-NEXT: add a4, a4, a5 580; RV64IM-NEXT: srli t2, a7, 63 581; RV64IM-NEXT: srai a7, a7, 6 582; RV64IM-NEXT: srli t3, t0, 63 583; RV64IM-NEXT: srai t0, t0, 6 584; RV64IM-NEXT: srli t4, t1, 63 585; RV64IM-NEXT: srai t1, t1, 6 586; RV64IM-NEXT: srli t5, a4, 63 587; RV64IM-NEXT: srai a4, a4, 6 588; RV64IM-NEXT: add a7, a7, t2 589; RV64IM-NEXT: add t0, t0, t3 590; RV64IM-NEXT: add t1, t1, t4 591; RV64IM-NEXT: add a4, a4, t5 592; RV64IM-NEXT: mul t2, a7, a6 593; RV64IM-NEXT: mul t3, t0, a6 594; RV64IM-NEXT: mul t4, t1, a6 595; RV64IM-NEXT: mul a6, a4, a6 596; RV64IM-NEXT: add a4, a5, a4 597; RV64IM-NEXT: add a1, a1, t1 598; RV64IM-NEXT: add a2, a2, t0 599; RV64IM-NEXT: add a3, a3, a7 600; RV64IM-NEXT: subw a4, a4, a6 601; RV64IM-NEXT: subw a1, a1, t4 602; RV64IM-NEXT: subw a2, a2, t3 603; RV64IM-NEXT: subw a3, a3, t2 604; RV64IM-NEXT: sh a4, 0(a0) 605; RV64IM-NEXT: sh a1, 2(a0) 606; RV64IM-NEXT: sh a2, 4(a0) 607; RV64IM-NEXT: sh a3, 6(a0) 608; RV64IM-NEXT: ret 609 %1 = srem <4 x i16> %x, <i16 95, i16 95, i16 95, i16 95> 610 %2 = sdiv <4 x i16> %x, <i16 95, i16 95, i16 95, i16 95> 611 %3 = add <4 x i16> %1, %2 612 ret <4 x i16> %3 613} 614 615; Don't fold for divisors that are a power of two. 616define <4 x i16> @dont_fold_srem_power_of_two(<4 x i16> %x) nounwind { 617; RV32I-LABEL: dont_fold_srem_power_of_two: 618; RV32I: # %bb.0: 619; RV32I-NEXT: addi sp, sp, -32 620; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 621; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 622; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 623; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 624; RV32I-NEXT: sw s3, 12(sp) # 4-byte Folded Spill 625; RV32I-NEXT: mv s0, a0 626; RV32I-NEXT: lh a2, 0(a1) 627; RV32I-NEXT: lh a3, 4(a1) 628; RV32I-NEXT: lh a4, 8(a1) 629; RV32I-NEXT: lh a0, 12(a1) 630; RV32I-NEXT: srli a1, a2, 26 631; RV32I-NEXT: add a1, a2, a1 632; RV32I-NEXT: andi a1, a1, -64 633; RV32I-NEXT: sub s1, a2, a1 634; RV32I-NEXT: srli a1, a3, 27 635; RV32I-NEXT: add a1, a3, a1 636; RV32I-NEXT: andi a1, a1, -32 637; RV32I-NEXT: sub s2, a3, a1 638; RV32I-NEXT: srli a1, a4, 29 639; RV32I-NEXT: add a1, a4, a1 640; RV32I-NEXT: andi a1, a1, -8 641; RV32I-NEXT: sub s3, a4, a1 642; RV32I-NEXT: li a1, 95 643; RV32I-NEXT: call __modsi3 644; RV32I-NEXT: sh s1, 0(s0) 645; RV32I-NEXT: sh s2, 2(s0) 646; RV32I-NEXT: sh s3, 4(s0) 647; RV32I-NEXT: sh a0, 6(s0) 648; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 649; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 650; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 651; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 652; RV32I-NEXT: lw s3, 12(sp) # 4-byte Folded Reload 653; RV32I-NEXT: addi sp, sp, 32 654; RV32I-NEXT: ret 655; 656; RV32IM-LABEL: dont_fold_srem_power_of_two: 657; RV32IM: # %bb.0: 658; RV32IM-NEXT: lh a2, 4(a1) 659; RV32IM-NEXT: lh a3, 8(a1) 660; RV32IM-NEXT: lh a4, 12(a1) 661; RV32IM-NEXT: lh a1, 0(a1) 662; RV32IM-NEXT: lui a5, 706409 663; RV32IM-NEXT: addi a5, a5, 389 664; RV32IM-NEXT: mulh a5, a4, a5 665; RV32IM-NEXT: add a5, a5, a4 666; RV32IM-NEXT: srli a6, a5, 31 667; RV32IM-NEXT: srli a5, a5, 6 668; RV32IM-NEXT: add a5, a5, a6 669; RV32IM-NEXT: srli a6, a1, 26 670; RV32IM-NEXT: add a6, a1, a6 671; RV32IM-NEXT: andi a6, a6, -64 672; RV32IM-NEXT: sub a1, a1, a6 673; RV32IM-NEXT: srli a6, a2, 27 674; RV32IM-NEXT: add a6, a2, a6 675; RV32IM-NEXT: andi a6, a6, -32 676; RV32IM-NEXT: sub a2, a2, a6 677; RV32IM-NEXT: srli a6, a3, 29 678; RV32IM-NEXT: add a6, a3, a6 679; RV32IM-NEXT: andi a6, a6, -8 680; RV32IM-NEXT: sub a3, a3, a6 681; RV32IM-NEXT: li a6, 95 682; RV32IM-NEXT: mul a5, a5, a6 683; RV32IM-NEXT: sub a4, a4, a5 684; RV32IM-NEXT: sh a1, 0(a0) 685; RV32IM-NEXT: sh a2, 2(a0) 686; RV32IM-NEXT: sh a3, 4(a0) 687; RV32IM-NEXT: sh a4, 6(a0) 688; RV32IM-NEXT: ret 689; 690; RV64I-LABEL: dont_fold_srem_power_of_two: 691; RV64I: # %bb.0: 692; RV64I-NEXT: addi sp, sp, -48 693; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 694; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 695; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 696; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 697; RV64I-NEXT: sd s3, 8(sp) # 8-byte Folded Spill 698; RV64I-NEXT: mv s0, a0 699; RV64I-NEXT: lh a2, 0(a1) 700; RV64I-NEXT: lh a3, 8(a1) 701; RV64I-NEXT: lh a4, 16(a1) 702; RV64I-NEXT: lh a0, 24(a1) 703; RV64I-NEXT: srli a1, a2, 58 704; RV64I-NEXT: add a1, a2, a1 705; RV64I-NEXT: andi a1, a1, -64 706; RV64I-NEXT: subw s1, a2, a1 707; RV64I-NEXT: srli a1, a3, 59 708; RV64I-NEXT: add a1, a3, a1 709; RV64I-NEXT: andi a1, a1, -32 710; RV64I-NEXT: subw s2, a3, a1 711; RV64I-NEXT: srli a1, a4, 61 712; RV64I-NEXT: add a1, a4, a1 713; RV64I-NEXT: andi a1, a1, -8 714; RV64I-NEXT: subw s3, a4, a1 715; RV64I-NEXT: li a1, 95 716; RV64I-NEXT: call __moddi3 717; RV64I-NEXT: sh s1, 0(s0) 718; RV64I-NEXT: sh s2, 2(s0) 719; RV64I-NEXT: sh s3, 4(s0) 720; RV64I-NEXT: sh a0, 6(s0) 721; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 722; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 723; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 724; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 725; RV64I-NEXT: ld s3, 8(sp) # 8-byte Folded Reload 726; RV64I-NEXT: addi sp, sp, 48 727; RV64I-NEXT: ret 728; 729; RV64IM-LABEL: dont_fold_srem_power_of_two: 730; RV64IM: # %bb.0: 731; RV64IM-NEXT: lh a2, 0(a1) 732; RV64IM-NEXT: lh a3, 8(a1) 733; RV64IM-NEXT: lh a4, 16(a1) 734; RV64IM-NEXT: lh a1, 24(a1) 735; RV64IM-NEXT: lui a5, %hi(.LCPI3_0) 736; RV64IM-NEXT: ld a5, %lo(.LCPI3_0)(a5) 737; RV64IM-NEXT: srli a6, a2, 58 738; RV64IM-NEXT: add a6, a2, a6 739; RV64IM-NEXT: andi a6, a6, -64 740; RV64IM-NEXT: subw a2, a2, a6 741; RV64IM-NEXT: srli a6, a3, 59 742; RV64IM-NEXT: add a6, a3, a6 743; RV64IM-NEXT: andi a6, a6, -32 744; RV64IM-NEXT: subw a3, a3, a6 745; RV64IM-NEXT: srli a6, a4, 61 746; RV64IM-NEXT: mulh a5, a1, a5 747; RV64IM-NEXT: add a6, a4, a6 748; RV64IM-NEXT: add a5, a5, a1 749; RV64IM-NEXT: andi a6, a6, -8 750; RV64IM-NEXT: subw a4, a4, a6 751; RV64IM-NEXT: srli a6, a5, 63 752; RV64IM-NEXT: srli a5, a5, 6 753; RV64IM-NEXT: add a5, a5, a6 754; RV64IM-NEXT: li a6, 95 755; RV64IM-NEXT: mul a5, a5, a6 756; RV64IM-NEXT: subw a1, a1, a5 757; RV64IM-NEXT: sh a2, 0(a0) 758; RV64IM-NEXT: sh a3, 2(a0) 759; RV64IM-NEXT: sh a4, 4(a0) 760; RV64IM-NEXT: sh a1, 6(a0) 761; RV64IM-NEXT: ret 762 %1 = srem <4 x i16> %x, <i16 64, i16 32, i16 8, i16 95> 763 ret <4 x i16> %1 764} 765 766; Don't fold if the divisor is one. 767define <4 x i16> @dont_fold_srem_one(<4 x i16> %x) nounwind { 768; RV32I-LABEL: dont_fold_srem_one: 769; RV32I: # %bb.0: 770; RV32I-NEXT: addi sp, sp, -32 771; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 772; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 773; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 774; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 775; RV32I-NEXT: sw s3, 12(sp) # 4-byte Folded Spill 776; RV32I-NEXT: lh a2, 4(a1) 777; RV32I-NEXT: lh s0, 8(a1) 778; RV32I-NEXT: lh s1, 12(a1) 779; RV32I-NEXT: mv s2, a0 780; RV32I-NEXT: li a1, 654 781; RV32I-NEXT: mv a0, a2 782; RV32I-NEXT: call __modsi3 783; RV32I-NEXT: mv s3, a0 784; RV32I-NEXT: li a1, 23 785; RV32I-NEXT: mv a0, s0 786; RV32I-NEXT: call __modsi3 787; RV32I-NEXT: mv s0, a0 788; RV32I-NEXT: lui a0, 1 789; RV32I-NEXT: addi a1, a0, 1327 790; RV32I-NEXT: mv a0, s1 791; RV32I-NEXT: call __modsi3 792; RV32I-NEXT: sh zero, 0(s2) 793; RV32I-NEXT: sh s3, 2(s2) 794; RV32I-NEXT: sh s0, 4(s2) 795; RV32I-NEXT: sh a0, 6(s2) 796; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 797; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 798; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 799; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 800; RV32I-NEXT: lw s3, 12(sp) # 4-byte Folded Reload 801; RV32I-NEXT: addi sp, sp, 32 802; RV32I-NEXT: ret 803; 804; RV32IM-LABEL: dont_fold_srem_one: 805; RV32IM: # %bb.0: 806; RV32IM-NEXT: lh a2, 4(a1) 807; RV32IM-NEXT: lh a3, 8(a1) 808; RV32IM-NEXT: lh a1, 12(a1) 809; RV32IM-NEXT: lui a4, 820904 810; RV32IM-NEXT: lui a5, 729444 811; RV32IM-NEXT: lui a6, 395996 812; RV32IM-NEXT: addi a4, a4, -1903 813; RV32IM-NEXT: addi a5, a5, 713 814; RV32IM-NEXT: addi a6, a6, -2009 815; RV32IM-NEXT: mulh a4, a2, a4 816; RV32IM-NEXT: mulh a5, a3, a5 817; RV32IM-NEXT: mulh a6, a1, a6 818; RV32IM-NEXT: add a4, a4, a2 819; RV32IM-NEXT: add a5, a5, a3 820; RV32IM-NEXT: srli a7, a6, 31 821; RV32IM-NEXT: srli a6, a6, 11 822; RV32IM-NEXT: add a6, a6, a7 823; RV32IM-NEXT: srli a7, a4, 31 824; RV32IM-NEXT: srli a4, a4, 9 825; RV32IM-NEXT: add a4, a4, a7 826; RV32IM-NEXT: srli a7, a5, 31 827; RV32IM-NEXT: srli a5, a5, 4 828; RV32IM-NEXT: add a5, a5, a7 829; RV32IM-NEXT: lui a7, 1 830; RV32IM-NEXT: addi a7, a7, 1327 831; RV32IM-NEXT: mul a6, a6, a7 832; RV32IM-NEXT: li a7, 654 833; RV32IM-NEXT: mul a4, a4, a7 834; RV32IM-NEXT: li a7, 23 835; RV32IM-NEXT: mul a5, a5, a7 836; RV32IM-NEXT: sub a1, a1, a6 837; RV32IM-NEXT: sub a2, a2, a4 838; RV32IM-NEXT: sub a3, a3, a5 839; RV32IM-NEXT: sh zero, 0(a0) 840; RV32IM-NEXT: sh a2, 2(a0) 841; RV32IM-NEXT: sh a3, 4(a0) 842; RV32IM-NEXT: sh a1, 6(a0) 843; RV32IM-NEXT: ret 844; 845; RV64I-LABEL: dont_fold_srem_one: 846; RV64I: # %bb.0: 847; RV64I-NEXT: addi sp, sp, -48 848; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 849; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 850; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 851; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 852; RV64I-NEXT: sd s3, 8(sp) # 8-byte Folded Spill 853; RV64I-NEXT: lh a2, 8(a1) 854; RV64I-NEXT: lh s0, 16(a1) 855; RV64I-NEXT: lh s1, 24(a1) 856; RV64I-NEXT: mv s2, a0 857; RV64I-NEXT: li a1, 654 858; RV64I-NEXT: mv a0, a2 859; RV64I-NEXT: call __moddi3 860; RV64I-NEXT: mv s3, a0 861; RV64I-NEXT: li a1, 23 862; RV64I-NEXT: mv a0, s0 863; RV64I-NEXT: call __moddi3 864; RV64I-NEXT: mv s0, a0 865; RV64I-NEXT: lui a0, 1 866; RV64I-NEXT: addiw a1, a0, 1327 867; RV64I-NEXT: mv a0, s1 868; RV64I-NEXT: call __moddi3 869; RV64I-NEXT: sh zero, 0(s2) 870; RV64I-NEXT: sh s3, 2(s2) 871; RV64I-NEXT: sh s0, 4(s2) 872; RV64I-NEXT: sh a0, 6(s2) 873; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 874; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 875; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 876; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 877; RV64I-NEXT: ld s3, 8(sp) # 8-byte Folded Reload 878; RV64I-NEXT: addi sp, sp, 48 879; RV64I-NEXT: ret 880; 881; RV64IM-LABEL: dont_fold_srem_one: 882; RV64IM: # %bb.0: 883; RV64IM-NEXT: lh a2, 8(a1) 884; RV64IM-NEXT: lh a3, 16(a1) 885; RV64IM-NEXT: lh a1, 24(a1) 886; RV64IM-NEXT: lui a4, %hi(.LCPI4_0) 887; RV64IM-NEXT: lui a5, %hi(.LCPI4_1) 888; RV64IM-NEXT: lui a6, %hi(.LCPI4_2) 889; RV64IM-NEXT: ld a4, %lo(.LCPI4_0)(a4) 890; RV64IM-NEXT: ld a5, %lo(.LCPI4_1)(a5) 891; RV64IM-NEXT: ld a6, %lo(.LCPI4_2)(a6) 892; RV64IM-NEXT: mulh a4, a3, a4 893; RV64IM-NEXT: mulh a5, a2, a5 894; RV64IM-NEXT: mulh a6, a1, a6 895; RV64IM-NEXT: add a4, a4, a3 896; RV64IM-NEXT: srli a7, a5, 63 897; RV64IM-NEXT: srli a5, a5, 8 898; RV64IM-NEXT: add a5, a5, a7 899; RV64IM-NEXT: srli a7, a6, 63 900; RV64IM-NEXT: srli a6, a6, 11 901; RV64IM-NEXT: add a6, a6, a7 902; RV64IM-NEXT: srli a7, a4, 63 903; RV64IM-NEXT: srli a4, a4, 4 904; RV64IM-NEXT: add a4, a4, a7 905; RV64IM-NEXT: li a7, 654 906; RV64IM-NEXT: mul a5, a5, a7 907; RV64IM-NEXT: lui a7, 1 908; RV64IM-NEXT: addi a7, a7, 1327 909; RV64IM-NEXT: mul a6, a6, a7 910; RV64IM-NEXT: li a7, 23 911; RV64IM-NEXT: mul a4, a4, a7 912; RV64IM-NEXT: subw a2, a2, a5 913; RV64IM-NEXT: subw a1, a1, a6 914; RV64IM-NEXT: subw a3, a3, a4 915; RV64IM-NEXT: sh zero, 0(a0) 916; RV64IM-NEXT: sh a2, 2(a0) 917; RV64IM-NEXT: sh a3, 4(a0) 918; RV64IM-NEXT: sh a1, 6(a0) 919; RV64IM-NEXT: ret 920 %1 = srem <4 x i16> %x, <i16 1, i16 654, i16 23, i16 5423> 921 ret <4 x i16> %1 922} 923 924; Don't fold if the divisor is 2^15. 925define <4 x i16> @dont_fold_urem_i16_smax(<4 x i16> %x) nounwind { 926; RV32I-LABEL: dont_fold_urem_i16_smax: 927; RV32I: # %bb.0: 928; RV32I-NEXT: addi sp, sp, -32 929; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 930; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 931; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill 932; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill 933; RV32I-NEXT: sw s3, 12(sp) # 4-byte Folded Spill 934; RV32I-NEXT: mv s0, a0 935; RV32I-NEXT: lh a2, 4(a1) 936; RV32I-NEXT: lh a0, 8(a1) 937; RV32I-NEXT: lh s1, 12(a1) 938; RV32I-NEXT: srli a1, a2, 17 939; RV32I-NEXT: add a1, a2, a1 940; RV32I-NEXT: lui a3, 8 941; RV32I-NEXT: and a1, a1, a3 942; RV32I-NEXT: sub s3, a2, a1 943; RV32I-NEXT: li a1, 23 944; RV32I-NEXT: call __modsi3 945; RV32I-NEXT: mv s2, a0 946; RV32I-NEXT: lui a0, 1 947; RV32I-NEXT: addi a1, a0, 1327 948; RV32I-NEXT: mv a0, s1 949; RV32I-NEXT: call __modsi3 950; RV32I-NEXT: sh zero, 0(s0) 951; RV32I-NEXT: sh s3, 2(s0) 952; RV32I-NEXT: sh s2, 4(s0) 953; RV32I-NEXT: sh a0, 6(s0) 954; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 955; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 956; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload 957; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload 958; RV32I-NEXT: lw s3, 12(sp) # 4-byte Folded Reload 959; RV32I-NEXT: addi sp, sp, 32 960; RV32I-NEXT: ret 961; 962; RV32IM-LABEL: dont_fold_urem_i16_smax: 963; RV32IM: # %bb.0: 964; RV32IM-NEXT: lh a2, 4(a1) 965; RV32IM-NEXT: lh a3, 8(a1) 966; RV32IM-NEXT: lh a1, 12(a1) 967; RV32IM-NEXT: lui a4, 729444 968; RV32IM-NEXT: lui a5, 395996 969; RV32IM-NEXT: lui a6, 8 970; RV32IM-NEXT: addi a4, a4, 713 971; RV32IM-NEXT: addi a5, a5, -2009 972; RV32IM-NEXT: mulh a4, a3, a4 973; RV32IM-NEXT: mulh a5, a1, a5 974; RV32IM-NEXT: srli a7, a5, 31 975; RV32IM-NEXT: srli a5, a5, 11 976; RV32IM-NEXT: add a5, a5, a7 977; RV32IM-NEXT: srli a7, a2, 17 978; RV32IM-NEXT: add a4, a4, a3 979; RV32IM-NEXT: add a7, a2, a7 980; RV32IM-NEXT: and a6, a7, a6 981; RV32IM-NEXT: srli a7, a4, 31 982; RV32IM-NEXT: srli a4, a4, 4 983; RV32IM-NEXT: add a4, a4, a7 984; RV32IM-NEXT: lui a7, 1 985; RV32IM-NEXT: addi a7, a7, 1327 986; RV32IM-NEXT: mul a5, a5, a7 987; RV32IM-NEXT: sub a2, a2, a6 988; RV32IM-NEXT: li a6, 23 989; RV32IM-NEXT: mul a4, a4, a6 990; RV32IM-NEXT: sub a1, a1, a5 991; RV32IM-NEXT: sub a3, a3, a4 992; RV32IM-NEXT: sh zero, 0(a0) 993; RV32IM-NEXT: sh a2, 2(a0) 994; RV32IM-NEXT: sh a3, 4(a0) 995; RV32IM-NEXT: sh a1, 6(a0) 996; RV32IM-NEXT: ret 997; 998; RV64I-LABEL: dont_fold_urem_i16_smax: 999; RV64I: # %bb.0: 1000; RV64I-NEXT: addi sp, sp, -48 1001; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 1002; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 1003; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 1004; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 1005; RV64I-NEXT: sd s3, 8(sp) # 8-byte Folded Spill 1006; RV64I-NEXT: mv s0, a0 1007; RV64I-NEXT: lh a2, 8(a1) 1008; RV64I-NEXT: lh a0, 16(a1) 1009; RV64I-NEXT: lh s1, 24(a1) 1010; RV64I-NEXT: srli a1, a2, 49 1011; RV64I-NEXT: add a1, a2, a1 1012; RV64I-NEXT: lui a3, 8 1013; RV64I-NEXT: and a1, a1, a3 1014; RV64I-NEXT: subw s3, a2, a1 1015; RV64I-NEXT: li a1, 23 1016; RV64I-NEXT: call __moddi3 1017; RV64I-NEXT: mv s2, a0 1018; RV64I-NEXT: lui a0, 1 1019; RV64I-NEXT: addiw a1, a0, 1327 1020; RV64I-NEXT: mv a0, s1 1021; RV64I-NEXT: call __moddi3 1022; RV64I-NEXT: sh zero, 0(s0) 1023; RV64I-NEXT: sh s3, 2(s0) 1024; RV64I-NEXT: sh s2, 4(s0) 1025; RV64I-NEXT: sh a0, 6(s0) 1026; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 1027; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 1028; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 1029; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 1030; RV64I-NEXT: ld s3, 8(sp) # 8-byte Folded Reload 1031; RV64I-NEXT: addi sp, sp, 48 1032; RV64I-NEXT: ret 1033; 1034; RV64IM-LABEL: dont_fold_urem_i16_smax: 1035; RV64IM: # %bb.0: 1036; RV64IM-NEXT: lh a2, 8(a1) 1037; RV64IM-NEXT: lh a3, 16(a1) 1038; RV64IM-NEXT: lh a1, 24(a1) 1039; RV64IM-NEXT: lui a4, %hi(.LCPI5_0) 1040; RV64IM-NEXT: lui a5, %hi(.LCPI5_1) 1041; RV64IM-NEXT: ld a5, %lo(.LCPI5_1)(a5) 1042; RV64IM-NEXT: lui a6, 8 1043; RV64IM-NEXT: ld a4, %lo(.LCPI5_0)(a4) 1044; RV64IM-NEXT: srli a7, a2, 49 1045; RV64IM-NEXT: mulh a5, a1, a5 1046; RV64IM-NEXT: add a7, a2, a7 1047; RV64IM-NEXT: and a6, a7, a6 1048; RV64IM-NEXT: srli a7, a5, 63 1049; RV64IM-NEXT: srli a5, a5, 11 1050; RV64IM-NEXT: add a5, a5, a7 1051; RV64IM-NEXT: mulh a4, a3, a4 1052; RV64IM-NEXT: add a4, a4, a3 1053; RV64IM-NEXT: subw a2, a2, a6 1054; RV64IM-NEXT: srli a6, a4, 63 1055; RV64IM-NEXT: srli a4, a4, 4 1056; RV64IM-NEXT: add a4, a4, a6 1057; RV64IM-NEXT: lui a6, 1 1058; RV64IM-NEXT: addi a6, a6, 1327 1059; RV64IM-NEXT: mul a5, a5, a6 1060; RV64IM-NEXT: li a6, 23 1061; RV64IM-NEXT: mul a4, a4, a6 1062; RV64IM-NEXT: subw a1, a1, a5 1063; RV64IM-NEXT: subw a3, a3, a4 1064; RV64IM-NEXT: sh zero, 0(a0) 1065; RV64IM-NEXT: sh a2, 2(a0) 1066; RV64IM-NEXT: sh a3, 4(a0) 1067; RV64IM-NEXT: sh a1, 6(a0) 1068; RV64IM-NEXT: ret 1069 %1 = srem <4 x i16> %x, <i16 1, i16 32768, i16 23, i16 5423> 1070 ret <4 x i16> %1 1071} 1072 1073; Don't fold i64 srem. 1074define <4 x i64> @dont_fold_srem_i64(<4 x i64> %x) nounwind { 1075; RV32I-LABEL: dont_fold_srem_i64: 1076; RV32I: # %bb.0: 1077; RV32I-NEXT: addi sp, sp, -48 1078; RV32I-NEXT: sw ra, 44(sp) # 4-byte Folded Spill 1079; RV32I-NEXT: sw s0, 40(sp) # 4-byte Folded Spill 1080; RV32I-NEXT: sw s1, 36(sp) # 4-byte Folded Spill 1081; RV32I-NEXT: sw s2, 32(sp) # 4-byte Folded Spill 1082; RV32I-NEXT: sw s3, 28(sp) # 4-byte Folded Spill 1083; RV32I-NEXT: sw s4, 24(sp) # 4-byte Folded Spill 1084; RV32I-NEXT: sw s5, 20(sp) # 4-byte Folded Spill 1085; RV32I-NEXT: sw s6, 16(sp) # 4-byte Folded Spill 1086; RV32I-NEXT: sw s7, 12(sp) # 4-byte Folded Spill 1087; RV32I-NEXT: sw s8, 8(sp) # 4-byte Folded Spill 1088; RV32I-NEXT: lw s1, 16(a1) 1089; RV32I-NEXT: lw s2, 20(a1) 1090; RV32I-NEXT: lw s3, 24(a1) 1091; RV32I-NEXT: lw s4, 28(a1) 1092; RV32I-NEXT: lw a3, 0(a1) 1093; RV32I-NEXT: lw a4, 4(a1) 1094; RV32I-NEXT: lw s5, 8(a1) 1095; RV32I-NEXT: lw s6, 12(a1) 1096; RV32I-NEXT: mv s0, a0 1097; RV32I-NEXT: li a2, 1 1098; RV32I-NEXT: mv a0, a3 1099; RV32I-NEXT: mv a1, a4 1100; RV32I-NEXT: li a3, 0 1101; RV32I-NEXT: call __moddi3 1102; RV32I-NEXT: mv s7, a0 1103; RV32I-NEXT: mv s8, a1 1104; RV32I-NEXT: li a2, 654 1105; RV32I-NEXT: mv a0, s5 1106; RV32I-NEXT: mv a1, s6 1107; RV32I-NEXT: li a3, 0 1108; RV32I-NEXT: call __moddi3 1109; RV32I-NEXT: mv s5, a0 1110; RV32I-NEXT: mv s6, a1 1111; RV32I-NEXT: li a2, 23 1112; RV32I-NEXT: mv a0, s1 1113; RV32I-NEXT: mv a1, s2 1114; RV32I-NEXT: li a3, 0 1115; RV32I-NEXT: call __moddi3 1116; RV32I-NEXT: mv s1, a0 1117; RV32I-NEXT: mv s2, a1 1118; RV32I-NEXT: lui a0, 1 1119; RV32I-NEXT: addi a2, a0, 1327 1120; RV32I-NEXT: mv a0, s3 1121; RV32I-NEXT: mv a1, s4 1122; RV32I-NEXT: li a3, 0 1123; RV32I-NEXT: call __moddi3 1124; RV32I-NEXT: sw s1, 16(s0) 1125; RV32I-NEXT: sw s2, 20(s0) 1126; RV32I-NEXT: sw a0, 24(s0) 1127; RV32I-NEXT: sw a1, 28(s0) 1128; RV32I-NEXT: sw s7, 0(s0) 1129; RV32I-NEXT: sw s8, 4(s0) 1130; RV32I-NEXT: sw s5, 8(s0) 1131; RV32I-NEXT: sw s6, 12(s0) 1132; RV32I-NEXT: lw ra, 44(sp) # 4-byte Folded Reload 1133; RV32I-NEXT: lw s0, 40(sp) # 4-byte Folded Reload 1134; RV32I-NEXT: lw s1, 36(sp) # 4-byte Folded Reload 1135; RV32I-NEXT: lw s2, 32(sp) # 4-byte Folded Reload 1136; RV32I-NEXT: lw s3, 28(sp) # 4-byte Folded Reload 1137; RV32I-NEXT: lw s4, 24(sp) # 4-byte Folded Reload 1138; RV32I-NEXT: lw s5, 20(sp) # 4-byte Folded Reload 1139; RV32I-NEXT: lw s6, 16(sp) # 4-byte Folded Reload 1140; RV32I-NEXT: lw s7, 12(sp) # 4-byte Folded Reload 1141; RV32I-NEXT: lw s8, 8(sp) # 4-byte Folded Reload 1142; RV32I-NEXT: addi sp, sp, 48 1143; RV32I-NEXT: ret 1144; 1145; RV32IM-LABEL: dont_fold_srem_i64: 1146; RV32IM: # %bb.0: 1147; RV32IM-NEXT: addi sp, sp, -48 1148; RV32IM-NEXT: sw ra, 44(sp) # 4-byte Folded Spill 1149; RV32IM-NEXT: sw s0, 40(sp) # 4-byte Folded Spill 1150; RV32IM-NEXT: sw s1, 36(sp) # 4-byte Folded Spill 1151; RV32IM-NEXT: sw s2, 32(sp) # 4-byte Folded Spill 1152; RV32IM-NEXT: sw s3, 28(sp) # 4-byte Folded Spill 1153; RV32IM-NEXT: sw s4, 24(sp) # 4-byte Folded Spill 1154; RV32IM-NEXT: sw s5, 20(sp) # 4-byte Folded Spill 1155; RV32IM-NEXT: sw s6, 16(sp) # 4-byte Folded Spill 1156; RV32IM-NEXT: sw s7, 12(sp) # 4-byte Folded Spill 1157; RV32IM-NEXT: sw s8, 8(sp) # 4-byte Folded Spill 1158; RV32IM-NEXT: lw s1, 16(a1) 1159; RV32IM-NEXT: lw s2, 20(a1) 1160; RV32IM-NEXT: lw s3, 24(a1) 1161; RV32IM-NEXT: lw s4, 28(a1) 1162; RV32IM-NEXT: lw a3, 0(a1) 1163; RV32IM-NEXT: lw a4, 4(a1) 1164; RV32IM-NEXT: lw s5, 8(a1) 1165; RV32IM-NEXT: lw s6, 12(a1) 1166; RV32IM-NEXT: mv s0, a0 1167; RV32IM-NEXT: li a2, 1 1168; RV32IM-NEXT: mv a0, a3 1169; RV32IM-NEXT: mv a1, a4 1170; RV32IM-NEXT: li a3, 0 1171; RV32IM-NEXT: call __moddi3 1172; RV32IM-NEXT: mv s7, a0 1173; RV32IM-NEXT: mv s8, a1 1174; RV32IM-NEXT: li a2, 654 1175; RV32IM-NEXT: mv a0, s5 1176; RV32IM-NEXT: mv a1, s6 1177; RV32IM-NEXT: li a3, 0 1178; RV32IM-NEXT: call __moddi3 1179; RV32IM-NEXT: mv s5, a0 1180; RV32IM-NEXT: mv s6, a1 1181; RV32IM-NEXT: li a2, 23 1182; RV32IM-NEXT: mv a0, s1 1183; RV32IM-NEXT: mv a1, s2 1184; RV32IM-NEXT: li a3, 0 1185; RV32IM-NEXT: call __moddi3 1186; RV32IM-NEXT: mv s1, a0 1187; RV32IM-NEXT: mv s2, a1 1188; RV32IM-NEXT: lui a0, 1 1189; RV32IM-NEXT: addi a2, a0, 1327 1190; RV32IM-NEXT: mv a0, s3 1191; RV32IM-NEXT: mv a1, s4 1192; RV32IM-NEXT: li a3, 0 1193; RV32IM-NEXT: call __moddi3 1194; RV32IM-NEXT: sw s1, 16(s0) 1195; RV32IM-NEXT: sw s2, 20(s0) 1196; RV32IM-NEXT: sw a0, 24(s0) 1197; RV32IM-NEXT: sw a1, 28(s0) 1198; RV32IM-NEXT: sw s7, 0(s0) 1199; RV32IM-NEXT: sw s8, 4(s0) 1200; RV32IM-NEXT: sw s5, 8(s0) 1201; RV32IM-NEXT: sw s6, 12(s0) 1202; RV32IM-NEXT: lw ra, 44(sp) # 4-byte Folded Reload 1203; RV32IM-NEXT: lw s0, 40(sp) # 4-byte Folded Reload 1204; RV32IM-NEXT: lw s1, 36(sp) # 4-byte Folded Reload 1205; RV32IM-NEXT: lw s2, 32(sp) # 4-byte Folded Reload 1206; RV32IM-NEXT: lw s3, 28(sp) # 4-byte Folded Reload 1207; RV32IM-NEXT: lw s4, 24(sp) # 4-byte Folded Reload 1208; RV32IM-NEXT: lw s5, 20(sp) # 4-byte Folded Reload 1209; RV32IM-NEXT: lw s6, 16(sp) # 4-byte Folded Reload 1210; RV32IM-NEXT: lw s7, 12(sp) # 4-byte Folded Reload 1211; RV32IM-NEXT: lw s8, 8(sp) # 4-byte Folded Reload 1212; RV32IM-NEXT: addi sp, sp, 48 1213; RV32IM-NEXT: ret 1214; 1215; RV64I-LABEL: dont_fold_srem_i64: 1216; RV64I: # %bb.0: 1217; RV64I-NEXT: addi sp, sp, -48 1218; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill 1219; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill 1220; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill 1221; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill 1222; RV64I-NEXT: sd s3, 8(sp) # 8-byte Folded Spill 1223; RV64I-NEXT: ld a2, 8(a1) 1224; RV64I-NEXT: ld s0, 16(a1) 1225; RV64I-NEXT: ld s1, 24(a1) 1226; RV64I-NEXT: mv s2, a0 1227; RV64I-NEXT: li a1, 654 1228; RV64I-NEXT: mv a0, a2 1229; RV64I-NEXT: call __moddi3 1230; RV64I-NEXT: mv s3, a0 1231; RV64I-NEXT: li a1, 23 1232; RV64I-NEXT: mv a0, s0 1233; RV64I-NEXT: call __moddi3 1234; RV64I-NEXT: mv s0, a0 1235; RV64I-NEXT: lui a0, 1 1236; RV64I-NEXT: addiw a1, a0, 1327 1237; RV64I-NEXT: mv a0, s1 1238; RV64I-NEXT: call __moddi3 1239; RV64I-NEXT: sd zero, 0(s2) 1240; RV64I-NEXT: sd s3, 8(s2) 1241; RV64I-NEXT: sd s0, 16(s2) 1242; RV64I-NEXT: sd a0, 24(s2) 1243; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload 1244; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload 1245; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload 1246; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload 1247; RV64I-NEXT: ld s3, 8(sp) # 8-byte Folded Reload 1248; RV64I-NEXT: addi sp, sp, 48 1249; RV64I-NEXT: ret 1250; 1251; RV64IM-LABEL: dont_fold_srem_i64: 1252; RV64IM: # %bb.0: 1253; RV64IM-NEXT: ld a2, 8(a1) 1254; RV64IM-NEXT: ld a3, 16(a1) 1255; RV64IM-NEXT: ld a1, 24(a1) 1256; RV64IM-NEXT: lui a4, %hi(.LCPI6_0) 1257; RV64IM-NEXT: lui a5, %hi(.LCPI6_1) 1258; RV64IM-NEXT: lui a6, %hi(.LCPI6_2) 1259; RV64IM-NEXT: ld a4, %lo(.LCPI6_0)(a4) 1260; RV64IM-NEXT: ld a5, %lo(.LCPI6_1)(a5) 1261; RV64IM-NEXT: ld a6, %lo(.LCPI6_2)(a6) 1262; RV64IM-NEXT: mulh a4, a3, a4 1263; RV64IM-NEXT: mulh a5, a2, a5 1264; RV64IM-NEXT: mulh a6, a1, a6 1265; RV64IM-NEXT: add a4, a4, a3 1266; RV64IM-NEXT: srli a7, a5, 63 1267; RV64IM-NEXT: srai a5, a5, 8 1268; RV64IM-NEXT: add a5, a5, a7 1269; RV64IM-NEXT: srli a7, a6, 63 1270; RV64IM-NEXT: srai a6, a6, 11 1271; RV64IM-NEXT: add a6, a6, a7 1272; RV64IM-NEXT: srli a7, a4, 63 1273; RV64IM-NEXT: srai a4, a4, 4 1274; RV64IM-NEXT: add a4, a4, a7 1275; RV64IM-NEXT: li a7, 654 1276; RV64IM-NEXT: mul a5, a5, a7 1277; RV64IM-NEXT: lui a7, 1 1278; RV64IM-NEXT: addiw a7, a7, 1327 1279; RV64IM-NEXT: mul a6, a6, a7 1280; RV64IM-NEXT: li a7, 23 1281; RV64IM-NEXT: mul a4, a4, a7 1282; RV64IM-NEXT: sub a2, a2, a5 1283; RV64IM-NEXT: sub a1, a1, a6 1284; RV64IM-NEXT: sub a3, a3, a4 1285; RV64IM-NEXT: sd zero, 0(a0) 1286; RV64IM-NEXT: sd a2, 8(a0) 1287; RV64IM-NEXT: sd a3, 16(a0) 1288; RV64IM-NEXT: sd a1, 24(a0) 1289; RV64IM-NEXT: ret 1290 %1 = srem <4 x i64> %x, <i64 1, i64 654, i64 23, i64 5423> 1291 ret <4 x i64> %1 1292} 1293