1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: sed 's/iXLen2/i64/g' %s | llc -mtriple=riscv32 -mattr=+m | \ 3; RUN: FileCheck %s --check-prefix=RV32 4; RUN: sed 's/iXLen2/i128/g' %s | llc -mtriple=riscv64 -mattr=+m | \ 5; RUN: FileCheck %s --check-prefix=RV64 6 7define iXLen2 @test_urem_3(iXLen2 %x) nounwind { 8; RV32-LABEL: test_urem_3: 9; RV32: # %bb.0: 10; RV32-NEXT: add a1, a0, a1 11; RV32-NEXT: lui a2, 699051 12; RV32-NEXT: sltu a0, a1, a0 13; RV32-NEXT: addi a2, a2, -1365 14; RV32-NEXT: add a0, a1, a0 15; RV32-NEXT: mulhu a1, a0, a2 16; RV32-NEXT: srli a2, a1, 1 17; RV32-NEXT: andi a1, a1, -2 18; RV32-NEXT: add a1, a1, a2 19; RV32-NEXT: sub a0, a0, a1 20; RV32-NEXT: li a1, 0 21; RV32-NEXT: ret 22; 23; RV64-LABEL: test_urem_3: 24; RV64: # %bb.0: 25; RV64-NEXT: add a1, a0, a1 26; RV64-NEXT: lui a2, 699051 27; RV64-NEXT: sltu a0, a1, a0 28; RV64-NEXT: addiw a2, a2, -1365 29; RV64-NEXT: add a0, a1, a0 30; RV64-NEXT: slli a1, a2, 32 31; RV64-NEXT: add a1, a2, a1 32; RV64-NEXT: mulhu a1, a0, a1 33; RV64-NEXT: srli a2, a1, 1 34; RV64-NEXT: andi a1, a1, -2 35; RV64-NEXT: add a1, a1, a2 36; RV64-NEXT: sub a0, a0, a1 37; RV64-NEXT: li a1, 0 38; RV64-NEXT: ret 39 %a = urem iXLen2 %x, 3 40 ret iXLen2 %a 41} 42 43define iXLen2 @test_urem_5(iXLen2 %x) nounwind { 44; RV32-LABEL: test_urem_5: 45; RV32: # %bb.0: 46; RV32-NEXT: add a1, a0, a1 47; RV32-NEXT: lui a2, 838861 48; RV32-NEXT: sltu a0, a1, a0 49; RV32-NEXT: addi a2, a2, -819 50; RV32-NEXT: add a0, a1, a0 51; RV32-NEXT: mulhu a1, a0, a2 52; RV32-NEXT: srli a2, a1, 2 53; RV32-NEXT: andi a1, a1, -4 54; RV32-NEXT: add a1, a1, a2 55; RV32-NEXT: sub a0, a0, a1 56; RV32-NEXT: li a1, 0 57; RV32-NEXT: ret 58; 59; RV64-LABEL: test_urem_5: 60; RV64: # %bb.0: 61; RV64-NEXT: add a1, a0, a1 62; RV64-NEXT: lui a2, 838861 63; RV64-NEXT: sltu a0, a1, a0 64; RV64-NEXT: addiw a2, a2, -819 65; RV64-NEXT: add a0, a1, a0 66; RV64-NEXT: slli a1, a2, 32 67; RV64-NEXT: add a1, a2, a1 68; RV64-NEXT: mulhu a1, a0, a1 69; RV64-NEXT: srli a2, a1, 2 70; RV64-NEXT: andi a1, a1, -4 71; RV64-NEXT: add a1, a1, a2 72; RV64-NEXT: sub a0, a0, a1 73; RV64-NEXT: li a1, 0 74; RV64-NEXT: ret 75 %a = urem iXLen2 %x, 5 76 ret iXLen2 %a 77} 78 79define iXLen2 @test_urem_7(iXLen2 %x) nounwind { 80; RV32-LABEL: test_urem_7: 81; RV32: # %bb.0: 82; RV32-NEXT: addi sp, sp, -16 83; RV32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 84; RV32-NEXT: li a2, 7 85; RV32-NEXT: li a3, 0 86; RV32-NEXT: call __umoddi3 87; RV32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 88; RV32-NEXT: addi sp, sp, 16 89; RV32-NEXT: ret 90; 91; RV64-LABEL: test_urem_7: 92; RV64: # %bb.0: 93; RV64-NEXT: addi sp, sp, -16 94; RV64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 95; RV64-NEXT: li a2, 7 96; RV64-NEXT: li a3, 0 97; RV64-NEXT: call __umodti3 98; RV64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 99; RV64-NEXT: addi sp, sp, 16 100; RV64-NEXT: ret 101 %a = urem iXLen2 %x, 7 102 ret iXLen2 %a 103} 104 105define iXLen2 @test_urem_9(iXLen2 %x) nounwind { 106; RV32-LABEL: test_urem_9: 107; RV32: # %bb.0: 108; RV32-NEXT: addi sp, sp, -16 109; RV32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 110; RV32-NEXT: li a2, 9 111; RV32-NEXT: li a3, 0 112; RV32-NEXT: call __umoddi3 113; RV32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 114; RV32-NEXT: addi sp, sp, 16 115; RV32-NEXT: ret 116; 117; RV64-LABEL: test_urem_9: 118; RV64: # %bb.0: 119; RV64-NEXT: addi sp, sp, -16 120; RV64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 121; RV64-NEXT: li a2, 9 122; RV64-NEXT: li a3, 0 123; RV64-NEXT: call __umodti3 124; RV64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 125; RV64-NEXT: addi sp, sp, 16 126; RV64-NEXT: ret 127 %a = urem iXLen2 %x, 9 128 ret iXLen2 %a 129} 130 131define iXLen2 @test_urem_15(iXLen2 %x) nounwind { 132; RV32-LABEL: test_urem_15: 133; RV32: # %bb.0: 134; RV32-NEXT: add a1, a0, a1 135; RV32-NEXT: lui a2, 559241 136; RV32-NEXT: sltu a0, a1, a0 137; RV32-NEXT: add a0, a1, a0 138; RV32-NEXT: addi a1, a2, -1911 139; RV32-NEXT: mulhu a1, a0, a1 140; RV32-NEXT: srli a1, a1, 3 141; RV32-NEXT: slli a2, a1, 4 142; RV32-NEXT: sub a1, a1, a2 143; RV32-NEXT: add a0, a0, a1 144; RV32-NEXT: li a1, 0 145; RV32-NEXT: ret 146; 147; RV64-LABEL: test_urem_15: 148; RV64: # %bb.0: 149; RV64-NEXT: add a1, a0, a1 150; RV64-NEXT: lui a2, 559241 151; RV64-NEXT: sltu a0, a1, a0 152; RV64-NEXT: addiw a2, a2, -1911 153; RV64-NEXT: add a0, a1, a0 154; RV64-NEXT: slli a1, a2, 32 155; RV64-NEXT: add a1, a2, a1 156; RV64-NEXT: mulhu a1, a0, a1 157; RV64-NEXT: srli a1, a1, 3 158; RV64-NEXT: slli a2, a1, 4 159; RV64-NEXT: sub a1, a1, a2 160; RV64-NEXT: add a0, a0, a1 161; RV64-NEXT: li a1, 0 162; RV64-NEXT: ret 163 %a = urem iXLen2 %x, 15 164 ret iXLen2 %a 165} 166 167define iXLen2 @test_urem_17(iXLen2 %x) nounwind { 168; RV32-LABEL: test_urem_17: 169; RV32: # %bb.0: 170; RV32-NEXT: add a1, a0, a1 171; RV32-NEXT: lui a2, 986895 172; RV32-NEXT: sltu a0, a1, a0 173; RV32-NEXT: addi a2, a2, 241 174; RV32-NEXT: add a0, a1, a0 175; RV32-NEXT: mulhu a1, a0, a2 176; RV32-NEXT: srli a2, a1, 4 177; RV32-NEXT: andi a1, a1, -16 178; RV32-NEXT: add a1, a1, a2 179; RV32-NEXT: sub a0, a0, a1 180; RV32-NEXT: li a1, 0 181; RV32-NEXT: ret 182; 183; RV64-LABEL: test_urem_17: 184; RV64: # %bb.0: 185; RV64-NEXT: add a1, a0, a1 186; RV64-NEXT: lui a2, 986895 187; RV64-NEXT: sltu a0, a1, a0 188; RV64-NEXT: addiw a2, a2, 241 189; RV64-NEXT: add a0, a1, a0 190; RV64-NEXT: slli a1, a2, 32 191; RV64-NEXT: add a1, a2, a1 192; RV64-NEXT: mulhu a1, a0, a1 193; RV64-NEXT: srli a2, a1, 4 194; RV64-NEXT: andi a1, a1, -16 195; RV64-NEXT: add a1, a1, a2 196; RV64-NEXT: sub a0, a0, a1 197; RV64-NEXT: li a1, 0 198; RV64-NEXT: ret 199 %a = urem iXLen2 %x, 17 200 ret iXLen2 %a 201} 202 203define iXLen2 @test_urem_255(iXLen2 %x) nounwind { 204; RV32-LABEL: test_urem_255: 205; RV32: # %bb.0: 206; RV32-NEXT: add a1, a0, a1 207; RV32-NEXT: lui a2, 526344 208; RV32-NEXT: sltu a0, a1, a0 209; RV32-NEXT: add a0, a1, a0 210; RV32-NEXT: addi a1, a2, 129 211; RV32-NEXT: mulhu a1, a0, a1 212; RV32-NEXT: srli a1, a1, 7 213; RV32-NEXT: slli a2, a1, 8 214; RV32-NEXT: sub a1, a1, a2 215; RV32-NEXT: add a0, a0, a1 216; RV32-NEXT: li a1, 0 217; RV32-NEXT: ret 218; 219; RV64-LABEL: test_urem_255: 220; RV64: # %bb.0: 221; RV64-NEXT: add a1, a0, a1 222; RV64-NEXT: lui a2, 526344 223; RV64-NEXT: sltu a0, a1, a0 224; RV64-NEXT: addiw a2, a2, 129 225; RV64-NEXT: add a0, a1, a0 226; RV64-NEXT: slli a1, a2, 32 227; RV64-NEXT: add a1, a2, a1 228; RV64-NEXT: mulhu a1, a0, a1 229; RV64-NEXT: srli a1, a1, 7 230; RV64-NEXT: slli a2, a1, 8 231; RV64-NEXT: sub a1, a1, a2 232; RV64-NEXT: add a0, a0, a1 233; RV64-NEXT: li a1, 0 234; RV64-NEXT: ret 235 %a = urem iXLen2 %x, 255 236 ret iXLen2 %a 237} 238 239define iXLen2 @test_urem_257(iXLen2 %x) nounwind { 240; RV32-LABEL: test_urem_257: 241; RV32: # %bb.0: 242; RV32-NEXT: add a1, a0, a1 243; RV32-NEXT: lui a2, 1044496 244; RV32-NEXT: sltu a0, a1, a0 245; RV32-NEXT: addi a2, a2, -255 246; RV32-NEXT: add a0, a1, a0 247; RV32-NEXT: mulhu a1, a0, a2 248; RV32-NEXT: srli a2, a1, 8 249; RV32-NEXT: andi a1, a1, -256 250; RV32-NEXT: add a1, a1, a2 251; RV32-NEXT: sub a0, a0, a1 252; RV32-NEXT: li a1, 0 253; RV32-NEXT: ret 254; 255; RV64-LABEL: test_urem_257: 256; RV64: # %bb.0: 257; RV64-NEXT: add a1, a0, a1 258; RV64-NEXT: lui a2, 1044496 259; RV64-NEXT: sltu a0, a1, a0 260; RV64-NEXT: addiw a2, a2, -255 261; RV64-NEXT: add a0, a1, a0 262; RV64-NEXT: slli a1, a2, 32 263; RV64-NEXT: add a1, a2, a1 264; RV64-NEXT: mulhu a1, a0, a1 265; RV64-NEXT: srli a2, a1, 8 266; RV64-NEXT: andi a1, a1, -256 267; RV64-NEXT: add a1, a1, a2 268; RV64-NEXT: sub a0, a0, a1 269; RV64-NEXT: li a1, 0 270; RV64-NEXT: ret 271 %a = urem iXLen2 %x, 257 272 ret iXLen2 %a 273} 274 275define iXLen2 @test_urem_65535(iXLen2 %x) nounwind { 276; RV32-LABEL: test_urem_65535: 277; RV32: # %bb.0: 278; RV32-NEXT: add a1, a0, a1 279; RV32-NEXT: lui a2, 524296 280; RV32-NEXT: sltu a0, a1, a0 281; RV32-NEXT: add a0, a1, a0 282; RV32-NEXT: addi a2, a2, 1 283; RV32-NEXT: mulhu a1, a0, a2 284; RV32-NEXT: srli a1, a1, 15 285; RV32-NEXT: slli a2, a1, 16 286; RV32-NEXT: sub a1, a1, a2 287; RV32-NEXT: add a0, a0, a1 288; RV32-NEXT: li a1, 0 289; RV32-NEXT: ret 290; 291; RV64-LABEL: test_urem_65535: 292; RV64: # %bb.0: 293; RV64-NEXT: add a1, a0, a1 294; RV64-NEXT: lui a2, 524296 295; RV64-NEXT: sltu a0, a1, a0 296; RV64-NEXT: addiw a2, a2, 1 297; RV64-NEXT: add a0, a1, a0 298; RV64-NEXT: slli a1, a2, 32 299; RV64-NEXT: add a1, a2, a1 300; RV64-NEXT: mulhu a1, a0, a1 301; RV64-NEXT: srli a1, a1, 15 302; RV64-NEXT: slli a2, a1, 16 303; RV64-NEXT: sub a1, a1, a2 304; RV64-NEXT: add a0, a0, a1 305; RV64-NEXT: li a1, 0 306; RV64-NEXT: ret 307 %a = urem iXLen2 %x, 65535 308 ret iXLen2 %a 309} 310 311define iXLen2 @test_urem_65537(iXLen2 %x) nounwind { 312; RV32-LABEL: test_urem_65537: 313; RV32: # %bb.0: 314; RV32-NEXT: add a1, a0, a1 315; RV32-NEXT: lui a2, 1048560 316; RV32-NEXT: sltu a0, a1, a0 317; RV32-NEXT: add a0, a1, a0 318; RV32-NEXT: addi a1, a2, 1 319; RV32-NEXT: mulhu a1, a0, a1 320; RV32-NEXT: and a2, a1, a2 321; RV32-NEXT: srli a1, a1, 16 322; RV32-NEXT: or a1, a2, a1 323; RV32-NEXT: sub a0, a0, a1 324; RV32-NEXT: li a1, 0 325; RV32-NEXT: ret 326; 327; RV64-LABEL: test_urem_65537: 328; RV64: # %bb.0: 329; RV64-NEXT: add a1, a0, a1 330; RV64-NEXT: lui a2, 1048560 331; RV64-NEXT: sltu a0, a1, a0 332; RV64-NEXT: addiw a3, a2, 1 333; RV64-NEXT: add a0, a1, a0 334; RV64-NEXT: slli a1, a3, 32 335; RV64-NEXT: add a1, a3, a1 336; RV64-NEXT: mulhu a1, a0, a1 337; RV64-NEXT: and a2, a1, a2 338; RV64-NEXT: srli a1, a1, 16 339; RV64-NEXT: add a1, a2, a1 340; RV64-NEXT: sub a0, a0, a1 341; RV64-NEXT: li a1, 0 342; RV64-NEXT: ret 343 %a = urem iXLen2 %x, 65537 344 ret iXLen2 %a 345} 346 347define iXLen2 @test_urem_12(iXLen2 %x) nounwind { 348; RV32-LABEL: test_urem_12: 349; RV32: # %bb.0: 350; RV32-NEXT: slli a2, a1, 30 351; RV32-NEXT: srli a3, a0, 2 352; RV32-NEXT: srli a1, a1, 2 353; RV32-NEXT: or a2, a3, a2 354; RV32-NEXT: lui a3, 699051 355; RV32-NEXT: addi a3, a3, -1365 356; RV32-NEXT: add a1, a2, a1 357; RV32-NEXT: sltu a2, a1, a2 358; RV32-NEXT: add a1, a1, a2 359; RV32-NEXT: mulhu a2, a1, a3 360; RV32-NEXT: srli a3, a2, 1 361; RV32-NEXT: andi a2, a2, -2 362; RV32-NEXT: add a2, a2, a3 363; RV32-NEXT: sub a1, a1, a2 364; RV32-NEXT: slli a1, a1, 2 365; RV32-NEXT: andi a0, a0, 3 366; RV32-NEXT: or a0, a1, a0 367; RV32-NEXT: li a1, 0 368; RV32-NEXT: ret 369; 370; RV64-LABEL: test_urem_12: 371; RV64: # %bb.0: 372; RV64-NEXT: slli a2, a1, 62 373; RV64-NEXT: srli a3, a0, 2 374; RV64-NEXT: lui a4, 699051 375; RV64-NEXT: or a2, a3, a2 376; RV64-NEXT: addiw a3, a4, -1365 377; RV64-NEXT: slli a4, a3, 32 378; RV64-NEXT: add a3, a3, a4 379; RV64-NEXT: srli a1, a1, 2 380; RV64-NEXT: add a1, a2, a1 381; RV64-NEXT: sltu a2, a1, a2 382; RV64-NEXT: add a1, a1, a2 383; RV64-NEXT: mulhu a2, a1, a3 384; RV64-NEXT: srli a3, a2, 1 385; RV64-NEXT: andi a2, a2, -2 386; RV64-NEXT: add a2, a2, a3 387; RV64-NEXT: sub a1, a1, a2 388; RV64-NEXT: slli a1, a1, 2 389; RV64-NEXT: andi a0, a0, 3 390; RV64-NEXT: or a0, a1, a0 391; RV64-NEXT: li a1, 0 392; RV64-NEXT: ret 393 %a = urem iXLen2 %x, 12 394 ret iXLen2 %a 395} 396