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_udiv_3(iXLen2 %x) nounwind { 8; RV32-LABEL: test_udiv_3: 9; RV32: # %bb.0: 10; RV32-NEXT: add a2, a0, a1 11; RV32-NEXT: lui a3, 699051 12; RV32-NEXT: sltu a4, a2, a0 13; RV32-NEXT: addi a5, a3, -1365 14; RV32-NEXT: addi a3, a3, -1366 15; RV32-NEXT: add a2, a2, a4 16; RV32-NEXT: mulhu a4, a2, a5 17; RV32-NEXT: srli a6, a4, 1 18; RV32-NEXT: andi a4, a4, -2 19; RV32-NEXT: add a4, a4, a6 20; RV32-NEXT: sub a2, a2, a4 21; RV32-NEXT: sub a4, a0, a2 22; RV32-NEXT: sltu a0, a0, a2 23; RV32-NEXT: mul a2, a4, a3 24; RV32-NEXT: mulhu a3, a4, a5 25; RV32-NEXT: sub a1, a1, a0 26; RV32-NEXT: add a2, a3, a2 27; RV32-NEXT: mul a1, a1, a5 28; RV32-NEXT: add a1, a2, a1 29; RV32-NEXT: mul a0, a4, a5 30; RV32-NEXT: ret 31; 32; RV64-LABEL: test_udiv_3: 33; RV64: # %bb.0: 34; RV64-NEXT: add a2, a0, a1 35; RV64-NEXT: lui a3, 699051 36; RV64-NEXT: lui a4, %hi(.LCPI0_0) 37; RV64-NEXT: sltu a5, a2, a0 38; RV64-NEXT: addiw a3, a3, -1365 39; RV64-NEXT: ld a4, %lo(.LCPI0_0)(a4) 40; RV64-NEXT: add a2, a2, a5 41; RV64-NEXT: slli a5, a3, 32 42; RV64-NEXT: add a3, a3, a5 43; RV64-NEXT: mulhu a5, a2, a3 44; RV64-NEXT: srli a6, a5, 1 45; RV64-NEXT: andi a5, a5, -2 46; RV64-NEXT: add a5, a5, a6 47; RV64-NEXT: sub a2, a2, a5 48; RV64-NEXT: sub a5, a0, a2 49; RV64-NEXT: sltu a0, a0, a2 50; RV64-NEXT: mul a2, a5, a4 51; RV64-NEXT: mulhu a4, a5, a3 52; RV64-NEXT: sub a1, a1, a0 53; RV64-NEXT: add a2, a4, a2 54; RV64-NEXT: mul a1, a1, a3 55; RV64-NEXT: add a1, a2, a1 56; RV64-NEXT: mul a0, a5, a3 57; RV64-NEXT: ret 58 %a = udiv iXLen2 %x, 3 59 ret iXLen2 %a 60} 61 62define iXLen2 @test_udiv_5(iXLen2 %x) nounwind { 63; RV32-LABEL: test_udiv_5: 64; RV32: # %bb.0: 65; RV32-NEXT: add a2, a0, a1 66; RV32-NEXT: lui a3, 838861 67; RV32-NEXT: sltu a4, a2, a0 68; RV32-NEXT: addi a5, a3, -819 69; RV32-NEXT: addi a3, a3, -820 70; RV32-NEXT: add a2, a2, a4 71; RV32-NEXT: mulhu a4, a2, a5 72; RV32-NEXT: srli a6, a4, 2 73; RV32-NEXT: andi a4, a4, -4 74; RV32-NEXT: add a4, a4, a6 75; RV32-NEXT: sub a2, a2, a4 76; RV32-NEXT: sub a4, a0, a2 77; RV32-NEXT: sltu a0, a0, a2 78; RV32-NEXT: mul a2, a4, a3 79; RV32-NEXT: mulhu a3, a4, a5 80; RV32-NEXT: sub a1, a1, a0 81; RV32-NEXT: add a2, a3, a2 82; RV32-NEXT: mul a1, a1, a5 83; RV32-NEXT: add a1, a2, a1 84; RV32-NEXT: mul a0, a4, a5 85; RV32-NEXT: ret 86; 87; RV64-LABEL: test_udiv_5: 88; RV64: # %bb.0: 89; RV64-NEXT: add a2, a0, a1 90; RV64-NEXT: lui a3, 838861 91; RV64-NEXT: lui a4, %hi(.LCPI1_0) 92; RV64-NEXT: sltu a5, a2, a0 93; RV64-NEXT: addiw a3, a3, -819 94; RV64-NEXT: ld a4, %lo(.LCPI1_0)(a4) 95; RV64-NEXT: add a2, a2, a5 96; RV64-NEXT: slli a5, a3, 32 97; RV64-NEXT: add a3, a3, a5 98; RV64-NEXT: mulhu a5, a2, a3 99; RV64-NEXT: srli a6, a5, 2 100; RV64-NEXT: andi a5, a5, -4 101; RV64-NEXT: add a5, a5, a6 102; RV64-NEXT: sub a2, a2, a5 103; RV64-NEXT: sub a5, a0, a2 104; RV64-NEXT: sltu a0, a0, a2 105; RV64-NEXT: mul a2, a5, a4 106; RV64-NEXT: mulhu a4, a5, a3 107; RV64-NEXT: sub a1, a1, a0 108; RV64-NEXT: add a2, a4, a2 109; RV64-NEXT: mul a1, a1, a3 110; RV64-NEXT: add a1, a2, a1 111; RV64-NEXT: mul a0, a5, a3 112; RV64-NEXT: ret 113 %a = udiv iXLen2 %x, 5 114 ret iXLen2 %a 115} 116 117define iXLen2 @test_udiv_7(iXLen2 %x) nounwind { 118; RV32-LABEL: test_udiv_7: 119; RV32: # %bb.0: 120; RV32-NEXT: addi sp, sp, -16 121; RV32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 122; RV32-NEXT: li a2, 7 123; RV32-NEXT: li a3, 0 124; RV32-NEXT: call __udivdi3 125; RV32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 126; RV32-NEXT: addi sp, sp, 16 127; RV32-NEXT: ret 128; 129; RV64-LABEL: test_udiv_7: 130; RV64: # %bb.0: 131; RV64-NEXT: addi sp, sp, -16 132; RV64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 133; RV64-NEXT: li a2, 7 134; RV64-NEXT: li a3, 0 135; RV64-NEXT: call __udivti3 136; RV64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 137; RV64-NEXT: addi sp, sp, 16 138; RV64-NEXT: ret 139 %a = udiv iXLen2 %x, 7 140 ret iXLen2 %a 141} 142 143define iXLen2 @test_udiv_9(iXLen2 %x) nounwind { 144; RV32-LABEL: test_udiv_9: 145; RV32: # %bb.0: 146; RV32-NEXT: addi sp, sp, -16 147; RV32-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 148; RV32-NEXT: li a2, 9 149; RV32-NEXT: li a3, 0 150; RV32-NEXT: call __udivdi3 151; RV32-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 152; RV32-NEXT: addi sp, sp, 16 153; RV32-NEXT: ret 154; 155; RV64-LABEL: test_udiv_9: 156; RV64: # %bb.0: 157; RV64-NEXT: addi sp, sp, -16 158; RV64-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 159; RV64-NEXT: li a2, 9 160; RV64-NEXT: li a3, 0 161; RV64-NEXT: call __udivti3 162; RV64-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 163; RV64-NEXT: addi sp, sp, 16 164; RV64-NEXT: ret 165 %a = udiv iXLen2 %x, 9 166 ret iXLen2 %a 167} 168 169define iXLen2 @test_udiv_15(iXLen2 %x) nounwind { 170; RV32-LABEL: test_udiv_15: 171; RV32: # %bb.0: 172; RV32-NEXT: add a2, a0, a1 173; RV32-NEXT: lui a3, 559241 174; RV32-NEXT: lui a4, 978671 175; RV32-NEXT: sltu a5, a2, a0 176; RV32-NEXT: addi a3, a3, -1911 177; RV32-NEXT: addi a6, a4, -274 178; RV32-NEXT: addi a4, a4, -273 179; RV32-NEXT: add a2, a2, a5 180; RV32-NEXT: mulhu a3, a2, a3 181; RV32-NEXT: srli a3, a3, 3 182; RV32-NEXT: slli a5, a3, 4 183; RV32-NEXT: sub a3, a3, a5 184; RV32-NEXT: add a2, a2, a3 185; RV32-NEXT: sub a3, a0, a2 186; RV32-NEXT: sltu a0, a0, a2 187; RV32-NEXT: mul a2, a3, a6 188; RV32-NEXT: mulhu a5, a3, a4 189; RV32-NEXT: sub a1, a1, a0 190; RV32-NEXT: add a2, a5, a2 191; RV32-NEXT: mul a1, a1, a4 192; RV32-NEXT: add a1, a2, a1 193; RV32-NEXT: mul a0, a3, a4 194; RV32-NEXT: ret 195; 196; RV64-LABEL: test_udiv_15: 197; RV64: # %bb.0: 198; RV64-NEXT: add a2, a0, a1 199; RV64-NEXT: lui a3, 559241 200; RV64-NEXT: lui a4, %hi(.LCPI4_0) 201; RV64-NEXT: lui a5, 978671 202; RV64-NEXT: sltu a6, a2, a0 203; RV64-NEXT: addiw a3, a3, -1911 204; RV64-NEXT: ld a4, %lo(.LCPI4_0)(a4) 205; RV64-NEXT: addiw a5, a5, -273 206; RV64-NEXT: add a2, a2, a6 207; RV64-NEXT: slli a6, a3, 32 208; RV64-NEXT: add a3, a3, a6 209; RV64-NEXT: slli a6, a5, 32 210; RV64-NEXT: add a5, a5, a6 211; RV64-NEXT: mulhu a3, a2, a3 212; RV64-NEXT: srli a3, a3, 3 213; RV64-NEXT: slli a6, a3, 4 214; RV64-NEXT: sub a3, a3, a6 215; RV64-NEXT: add a2, a2, a3 216; RV64-NEXT: sub a3, a0, a2 217; RV64-NEXT: sltu a0, a0, a2 218; RV64-NEXT: mul a2, a3, a4 219; RV64-NEXT: mulhu a4, a3, a5 220; RV64-NEXT: sub a1, a1, a0 221; RV64-NEXT: add a2, a4, a2 222; RV64-NEXT: mul a1, a1, a5 223; RV64-NEXT: add a1, a2, a1 224; RV64-NEXT: mul a0, a3, a5 225; RV64-NEXT: ret 226 %a = udiv iXLen2 %x, 15 227 ret iXLen2 %a 228} 229 230define iXLen2 @test_udiv_17(iXLen2 %x) nounwind { 231; RV32-LABEL: test_udiv_17: 232; RV32: # %bb.0: 233; RV32-NEXT: add a2, a0, a1 234; RV32-NEXT: lui a3, 986895 235; RV32-NEXT: sltu a4, a2, a0 236; RV32-NEXT: addi a5, a3, 241 237; RV32-NEXT: addi a3, a3, 240 238; RV32-NEXT: add a2, a2, a4 239; RV32-NEXT: mulhu a4, a2, a5 240; RV32-NEXT: srli a6, a4, 4 241; RV32-NEXT: andi a4, a4, -16 242; RV32-NEXT: add a4, a4, a6 243; RV32-NEXT: sub a2, a2, a4 244; RV32-NEXT: sub a4, a0, a2 245; RV32-NEXT: sltu a0, a0, a2 246; RV32-NEXT: mul a2, a4, a3 247; RV32-NEXT: mulhu a3, a4, a5 248; RV32-NEXT: sub a1, a1, a0 249; RV32-NEXT: add a2, a3, a2 250; RV32-NEXT: mul a1, a1, a5 251; RV32-NEXT: add a1, a2, a1 252; RV32-NEXT: mul a0, a4, a5 253; RV32-NEXT: ret 254; 255; RV64-LABEL: test_udiv_17: 256; RV64: # %bb.0: 257; RV64-NEXT: add a2, a0, a1 258; RV64-NEXT: lui a3, 986895 259; RV64-NEXT: lui a4, %hi(.LCPI5_0) 260; RV64-NEXT: sltu a5, a2, a0 261; RV64-NEXT: addiw a3, a3, 241 262; RV64-NEXT: ld a4, %lo(.LCPI5_0)(a4) 263; RV64-NEXT: add a2, a2, a5 264; RV64-NEXT: slli a5, a3, 32 265; RV64-NEXT: add a3, a3, a5 266; RV64-NEXT: mulhu a5, a2, a3 267; RV64-NEXT: srli a6, a5, 4 268; RV64-NEXT: andi a5, a5, -16 269; RV64-NEXT: add a5, a5, a6 270; RV64-NEXT: sub a2, a2, a5 271; RV64-NEXT: sub a5, a0, a2 272; RV64-NEXT: sltu a0, a0, a2 273; RV64-NEXT: mul a2, a5, a4 274; RV64-NEXT: mulhu a4, a5, a3 275; RV64-NEXT: sub a1, a1, a0 276; RV64-NEXT: add a2, a4, a2 277; RV64-NEXT: mul a1, a1, a3 278; RV64-NEXT: add a1, a2, a1 279; RV64-NEXT: mul a0, a5, a3 280; RV64-NEXT: ret 281 %a = udiv iXLen2 %x, 17 282 ret iXLen2 %a 283} 284 285define iXLen2 @test_udiv_255(iXLen2 %x) nounwind { 286; RV32-LABEL: test_udiv_255: 287; RV32: # %bb.0: 288; RV32-NEXT: add a2, a0, a1 289; RV32-NEXT: lui a3, 526344 290; RV32-NEXT: lui a4, 1044464 291; RV32-NEXT: sltu a5, a2, a0 292; RV32-NEXT: addi a3, a3, 129 293; RV32-NEXT: addi a6, a4, -258 294; RV32-NEXT: addi a4, a4, -257 295; RV32-NEXT: add a2, a2, a5 296; RV32-NEXT: mulhu a3, a2, a3 297; RV32-NEXT: srli a3, a3, 7 298; RV32-NEXT: slli a5, a3, 8 299; RV32-NEXT: sub a3, a3, a5 300; RV32-NEXT: add a2, a2, a3 301; RV32-NEXT: sub a3, a0, a2 302; RV32-NEXT: sltu a0, a0, a2 303; RV32-NEXT: mul a2, a3, a6 304; RV32-NEXT: mulhu a5, a3, a4 305; RV32-NEXT: sub a1, a1, a0 306; RV32-NEXT: add a2, a5, a2 307; RV32-NEXT: mul a1, a1, a4 308; RV32-NEXT: add a1, a2, a1 309; RV32-NEXT: mul a0, a3, a4 310; RV32-NEXT: ret 311; 312; RV64-LABEL: test_udiv_255: 313; RV64: # %bb.0: 314; RV64-NEXT: add a2, a0, a1 315; RV64-NEXT: lui a3, 526344 316; RV64-NEXT: lui a4, %hi(.LCPI6_0) 317; RV64-NEXT: lui a5, 1044464 318; RV64-NEXT: sltu a6, a2, a0 319; RV64-NEXT: addiw a3, a3, 129 320; RV64-NEXT: ld a4, %lo(.LCPI6_0)(a4) 321; RV64-NEXT: addiw a5, a5, -257 322; RV64-NEXT: add a2, a2, a6 323; RV64-NEXT: slli a6, a3, 32 324; RV64-NEXT: add a3, a3, a6 325; RV64-NEXT: slli a6, a5, 32 326; RV64-NEXT: add a5, a5, a6 327; RV64-NEXT: mulhu a3, a2, a3 328; RV64-NEXT: srli a3, a3, 7 329; RV64-NEXT: slli a6, a3, 8 330; RV64-NEXT: sub a3, a3, a6 331; RV64-NEXT: add a2, a2, a3 332; RV64-NEXT: sub a3, a0, a2 333; RV64-NEXT: sltu a0, a0, a2 334; RV64-NEXT: mul a2, a3, a4 335; RV64-NEXT: mulhu a4, a3, a5 336; RV64-NEXT: sub a1, a1, a0 337; RV64-NEXT: add a2, a4, a2 338; RV64-NEXT: mul a1, a1, a5 339; RV64-NEXT: add a1, a2, a1 340; RV64-NEXT: mul a0, a3, a5 341; RV64-NEXT: ret 342 %a = udiv iXLen2 %x, 255 343 ret iXLen2 %a 344} 345 346define iXLen2 @test_udiv_257(iXLen2 %x) nounwind { 347; RV32-LABEL: test_udiv_257: 348; RV32: # %bb.0: 349; RV32-NEXT: add a2, a0, a1 350; RV32-NEXT: lui a3, 1044496 351; RV32-NEXT: sltu a4, a2, a0 352; RV32-NEXT: addi a5, a3, -255 353; RV32-NEXT: addi a3, a3, -256 354; RV32-NEXT: add a2, a2, a4 355; RV32-NEXT: mulhu a4, a2, a5 356; RV32-NEXT: srli a6, a4, 8 357; RV32-NEXT: andi a4, a4, -256 358; RV32-NEXT: add a4, a4, a6 359; RV32-NEXT: sub a2, a2, a4 360; RV32-NEXT: sub a4, a0, a2 361; RV32-NEXT: sltu a0, a0, a2 362; RV32-NEXT: mul a2, a4, a3 363; RV32-NEXT: mulhu a3, a4, a5 364; RV32-NEXT: sub a1, a1, a0 365; RV32-NEXT: add a2, a3, a2 366; RV32-NEXT: mul a1, a1, a5 367; RV32-NEXT: add a1, a2, a1 368; RV32-NEXT: mul a0, a4, a5 369; RV32-NEXT: ret 370; 371; RV64-LABEL: test_udiv_257: 372; RV64: # %bb.0: 373; RV64-NEXT: add a2, a0, a1 374; RV64-NEXT: lui a3, 1044496 375; RV64-NEXT: lui a4, %hi(.LCPI7_0) 376; RV64-NEXT: sltu a5, a2, a0 377; RV64-NEXT: addiw a3, a3, -255 378; RV64-NEXT: ld a4, %lo(.LCPI7_0)(a4) 379; RV64-NEXT: add a2, a2, a5 380; RV64-NEXT: slli a5, a3, 32 381; RV64-NEXT: add a3, a3, a5 382; RV64-NEXT: mulhu a5, a2, a3 383; RV64-NEXT: srli a6, a5, 8 384; RV64-NEXT: andi a5, a5, -256 385; RV64-NEXT: add a5, a5, a6 386; RV64-NEXT: sub a2, a2, a5 387; RV64-NEXT: sub a5, a0, a2 388; RV64-NEXT: sltu a0, a0, a2 389; RV64-NEXT: mul a2, a5, a4 390; RV64-NEXT: mulhu a4, a5, a3 391; RV64-NEXT: sub a1, a1, a0 392; RV64-NEXT: add a2, a4, a2 393; RV64-NEXT: mul a1, a1, a3 394; RV64-NEXT: add a1, a2, a1 395; RV64-NEXT: mul a0, a5, a3 396; RV64-NEXT: ret 397 %a = udiv iXLen2 %x, 257 398 ret iXLen2 %a 399} 400 401define iXLen2 @test_udiv_65535(iXLen2 %x) nounwind { 402; RV32-LABEL: test_udiv_65535: 403; RV32: # %bb.0: 404; RV32-NEXT: add a2, a0, a1 405; RV32-NEXT: lui a3, 524296 406; RV32-NEXT: lui a4, 1048560 407; RV32-NEXT: sltu a5, a2, a0 408; RV32-NEXT: addi a3, a3, 1 409; RV32-NEXT: add a2, a2, a5 410; RV32-NEXT: mulhu a3, a2, a3 411; RV32-NEXT: srli a3, a3, 15 412; RV32-NEXT: slli a5, a3, 16 413; RV32-NEXT: sub a3, a3, a5 414; RV32-NEXT: addi a5, a4, -2 415; RV32-NEXT: addi a4, a4, -1 416; RV32-NEXT: add a2, a2, a3 417; RV32-NEXT: sub a3, a0, a2 418; RV32-NEXT: sltu a0, a0, a2 419; RV32-NEXT: mul a2, a3, a5 420; RV32-NEXT: mulhu a4, a3, a4 421; RV32-NEXT: sub a1, a1, a0 422; RV32-NEXT: slli a0, a3, 16 423; RV32-NEXT: neg a3, a3 424; RV32-NEXT: add a2, a4, a2 425; RV32-NEXT: slli a4, a1, 16 426; RV32-NEXT: add a1, a4, a1 427; RV32-NEXT: sub a1, a2, a1 428; RV32-NEXT: sub a0, a3, a0 429; RV32-NEXT: ret 430; 431; RV64-LABEL: test_udiv_65535: 432; RV64: # %bb.0: 433; RV64-NEXT: add a2, a0, a1 434; RV64-NEXT: lui a3, 524296 435; RV64-NEXT: lui a4, 983039 436; RV64-NEXT: lui a5, 1048560 437; RV64-NEXT: sltu a6, a2, a0 438; RV64-NEXT: addiw a3, a3, 1 439; RV64-NEXT: slli a4, a4, 4 440; RV64-NEXT: addiw a5, a5, -1 441; RV64-NEXT: add a2, a2, a6 442; RV64-NEXT: slli a6, a3, 32 443; RV64-NEXT: addi a4, a4, -1 444; RV64-NEXT: add a3, a3, a6 445; RV64-NEXT: slli a6, a5, 32 446; RV64-NEXT: slli a4, a4, 16 447; RV64-NEXT: add a5, a5, a6 448; RV64-NEXT: mulhu a3, a2, a3 449; RV64-NEXT: addi a4, a4, -2 450; RV64-NEXT: srli a3, a3, 15 451; RV64-NEXT: slli a6, a3, 16 452; RV64-NEXT: sub a3, a3, a6 453; RV64-NEXT: add a2, a2, a3 454; RV64-NEXT: sub a3, a0, a2 455; RV64-NEXT: sltu a0, a0, a2 456; RV64-NEXT: mul a2, a3, a4 457; RV64-NEXT: mulhu a4, a3, a5 458; RV64-NEXT: sub a1, a1, a0 459; RV64-NEXT: add a2, a4, a2 460; RV64-NEXT: mul a1, a1, a5 461; RV64-NEXT: add a1, a2, a1 462; RV64-NEXT: mul a0, a3, a5 463; RV64-NEXT: ret 464 %a = udiv iXLen2 %x, 65535 465 ret iXLen2 %a 466} 467 468define iXLen2 @test_udiv_65537(iXLen2 %x) nounwind { 469; RV32-LABEL: test_udiv_65537: 470; RV32: # %bb.0: 471; RV32-NEXT: add a2, a0, a1 472; RV32-NEXT: lui a3, 1048560 473; RV32-NEXT: sltu a4, a2, a0 474; RV32-NEXT: addi a5, a3, 1 475; RV32-NEXT: add a2, a2, a4 476; RV32-NEXT: mulhu a4, a2, a5 477; RV32-NEXT: and a3, a4, a3 478; RV32-NEXT: srli a4, a4, 16 479; RV32-NEXT: or a3, a3, a4 480; RV32-NEXT: sub a2, a2, a3 481; RV32-NEXT: sub a3, a0, a2 482; RV32-NEXT: sltu a0, a0, a2 483; RV32-NEXT: mulhu a2, a3, a5 484; RV32-NEXT: slli a4, a3, 16 485; RV32-NEXT: sub a1, a1, a0 486; RV32-NEXT: sub a2, a2, a4 487; RV32-NEXT: slli a0, a1, 16 488; RV32-NEXT: sub a1, a1, a0 489; RV32-NEXT: add a1, a2, a1 490; RV32-NEXT: sub a0, a3, a4 491; RV32-NEXT: ret 492; 493; RV64-LABEL: test_udiv_65537: 494; RV64: # %bb.0: 495; RV64-NEXT: add a2, a0, a1 496; RV64-NEXT: lui a3, 1048560 497; RV64-NEXT: lui a4, 983041 498; RV64-NEXT: sltu a5, a2, a0 499; RV64-NEXT: addiw a6, a3, 1 500; RV64-NEXT: slli a4, a4, 4 501; RV64-NEXT: add a2, a2, a5 502; RV64-NEXT: slli a5, a6, 32 503; RV64-NEXT: addi a4, a4, -1 504; RV64-NEXT: add a5, a6, a5 505; RV64-NEXT: slli a4, a4, 16 506; RV64-NEXT: mulhu a6, a2, a5 507; RV64-NEXT: and a3, a6, a3 508; RV64-NEXT: srli a6, a6, 16 509; RV64-NEXT: add a3, a3, a6 510; RV64-NEXT: sub a2, a2, a3 511; RV64-NEXT: sub a3, a0, a2 512; RV64-NEXT: sltu a0, a0, a2 513; RV64-NEXT: mul a2, a3, a4 514; RV64-NEXT: mulhu a4, a3, a5 515; RV64-NEXT: sub a1, a1, a0 516; RV64-NEXT: add a2, a4, a2 517; RV64-NEXT: mul a1, a1, a5 518; RV64-NEXT: add a1, a2, a1 519; RV64-NEXT: mul a0, a3, a5 520; RV64-NEXT: ret 521 %a = udiv iXLen2 %x, 65537 522 ret iXLen2 %a 523} 524 525define iXLen2 @test_udiv_12(iXLen2 %x) nounwind { 526; RV32-LABEL: test_udiv_12: 527; RV32: # %bb.0: 528; RV32-NEXT: slli a2, a1, 30 529; RV32-NEXT: srli a0, a0, 2 530; RV32-NEXT: srli a1, a1, 2 531; RV32-NEXT: lui a3, 699051 532; RV32-NEXT: or a0, a0, a2 533; RV32-NEXT: addi a2, a3, -1365 534; RV32-NEXT: addi a3, a3, -1366 535; RV32-NEXT: add a4, a0, a1 536; RV32-NEXT: sltu a5, a4, a0 537; RV32-NEXT: add a4, a4, a5 538; RV32-NEXT: mulhu a5, a4, a2 539; RV32-NEXT: srli a6, a5, 1 540; RV32-NEXT: andi a5, a5, -2 541; RV32-NEXT: add a5, a5, a6 542; RV32-NEXT: sub a4, a4, a5 543; RV32-NEXT: sub a5, a0, a4 544; RV32-NEXT: sltu a0, a0, a4 545; RV32-NEXT: mul a3, a5, a3 546; RV32-NEXT: mulhu a4, a5, a2 547; RV32-NEXT: sub a1, a1, a0 548; RV32-NEXT: add a3, a4, a3 549; RV32-NEXT: mul a1, a1, a2 550; RV32-NEXT: add a1, a3, a1 551; RV32-NEXT: mul a0, a5, a2 552; RV32-NEXT: ret 553; 554; RV64-LABEL: test_udiv_12: 555; RV64: # %bb.0: 556; RV64-NEXT: slli a2, a1, 62 557; RV64-NEXT: srli a0, a0, 2 558; RV64-NEXT: srli a1, a1, 2 559; RV64-NEXT: lui a3, 699051 560; RV64-NEXT: lui a4, %hi(.LCPI10_0) 561; RV64-NEXT: or a0, a0, a2 562; RV64-NEXT: addiw a2, a3, -1365 563; RV64-NEXT: ld a3, %lo(.LCPI10_0)(a4) 564; RV64-NEXT: add a4, a0, a1 565; RV64-NEXT: slli a5, a2, 32 566; RV64-NEXT: sltu a6, a4, a0 567; RV64-NEXT: add a2, a2, a5 568; RV64-NEXT: add a4, a4, a6 569; RV64-NEXT: mulhu a5, a4, a2 570; RV64-NEXT: srli a6, a5, 1 571; RV64-NEXT: andi a5, a5, -2 572; RV64-NEXT: add a5, a5, a6 573; RV64-NEXT: sub a4, a4, a5 574; RV64-NEXT: sub a5, a0, a4 575; RV64-NEXT: sltu a0, a0, a4 576; RV64-NEXT: mul a3, a5, a3 577; RV64-NEXT: mulhu a4, a5, a2 578; RV64-NEXT: sub a1, a1, a0 579; RV64-NEXT: add a3, a4, a3 580; RV64-NEXT: mul a1, a1, a2 581; RV64-NEXT: add a1, a3, a1 582; RV64-NEXT: mul a0, a5, a2 583; RV64-NEXT: ret 584 %a = udiv iXLen2 %x, 12 585 ret iXLen2 %a 586} 587