1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mtriple=riscv64 -mattr=+c,+m -verify-machineinstrs < %s \ 3; RUN: | FileCheck -check-prefixes=CHECK,NOSFB %s 4; RUN: llc -mtriple=riscv64 -mcpu=sifive-u74 -verify-machineinstrs < %s \ 5; RUN: | FileCheck -check-prefixes=CHECK,SFB %s 6 7define signext i32 @sdiv2_32(i32 signext %0) { 8; NOSFB-LABEL: sdiv2_32: 9; NOSFB: # %bb.0: 10; NOSFB-NEXT: srliw a1, a0, 31 11; NOSFB-NEXT: add a0, a0, a1 12; NOSFB-NEXT: sraiw a0, a0, 1 13; NOSFB-NEXT: ret 14; 15; SFB-LABEL: sdiv2_32: 16; SFB: # %bb.0: 17; SFB-NEXT: bgez a0, .LBB0_2 18; SFB-NEXT: # %bb.1: 19; SFB-NEXT: addi a0, a0, 1 20; SFB-NEXT: .LBB0_2: 21; SFB-NEXT: sraiw a0, a0, 1 22; SFB-NEXT: ret 23 %res = sdiv i32 %0, 2 24 ret i32 %res 25} 26 27define signext i32 @sdivneg2_32(i32 signext %0) { 28; NOSFB-LABEL: sdivneg2_32: 29; NOSFB: # %bb.0: 30; NOSFB-NEXT: srliw a1, a0, 31 31; NOSFB-NEXT: add a0, a0, a1 32; NOSFB-NEXT: sraiw a0, a0, 1 33; NOSFB-NEXT: neg a0, a0 34; NOSFB-NEXT: ret 35; 36; SFB-LABEL: sdivneg2_32: 37; SFB: # %bb.0: 38; SFB-NEXT: bgez a0, .LBB1_2 39; SFB-NEXT: # %bb.1: 40; SFB-NEXT: addi a0, a0, 1 41; SFB-NEXT: .LBB1_2: 42; SFB-NEXT: sraiw a0, a0, 1 43; SFB-NEXT: neg a0, a0 44; SFB-NEXT: ret 45 %res = sdiv i32 %0, -2 46 ret i32 %res 47} 48 49define i64 @sdiv2_64(i64 %0) { 50; NOSFB-LABEL: sdiv2_64: 51; NOSFB: # %bb.0: 52; NOSFB-NEXT: srli a1, a0, 63 53; NOSFB-NEXT: add a0, a0, a1 54; NOSFB-NEXT: srai a0, a0, 1 55; NOSFB-NEXT: ret 56; 57; SFB-LABEL: sdiv2_64: 58; SFB: # %bb.0: 59; SFB-NEXT: bgez a0, .LBB2_2 60; SFB-NEXT: # %bb.1: 61; SFB-NEXT: addi a0, a0, 1 62; SFB-NEXT: .LBB2_2: 63; SFB-NEXT: srai a0, a0, 1 64; SFB-NEXT: ret 65 %res = sdiv i64 %0, 2 66 ret i64 %res 67} 68 69define i64 @sdivneg2_64(i64 %0) { 70; NOSFB-LABEL: sdivneg2_64: 71; NOSFB: # %bb.0: 72; NOSFB-NEXT: srli a1, a0, 63 73; NOSFB-NEXT: add a0, a0, a1 74; NOSFB-NEXT: srai a0, a0, 1 75; NOSFB-NEXT: neg a0, a0 76; NOSFB-NEXT: ret 77; 78; SFB-LABEL: sdivneg2_64: 79; SFB: # %bb.0: 80; SFB-NEXT: bgez a0, .LBB3_2 81; SFB-NEXT: # %bb.1: 82; SFB-NEXT: addi a0, a0, 1 83; SFB-NEXT: .LBB3_2: 84; SFB-NEXT: srai a0, a0, 1 85; SFB-NEXT: neg a0, a0 86; SFB-NEXT: ret 87 %res = sdiv i64 %0, -2 88 ret i64 %res 89} 90 91define signext i32 @srem2_32(i32 signext %0) { 92; NOSFB-LABEL: srem2_32: 93; NOSFB: # %bb.0: 94; NOSFB-NEXT: srliw a1, a0, 31 95; NOSFB-NEXT: add a1, a1, a0 96; NOSFB-NEXT: andi a1, a1, -2 97; NOSFB-NEXT: subw a0, a0, a1 98; NOSFB-NEXT: ret 99; 100; SFB-LABEL: srem2_32: 101; SFB: # %bb.0: 102; SFB-NEXT: mv a1, a0 103; SFB-NEXT: bgez a0, .LBB4_2 104; SFB-NEXT: # %bb.1: 105; SFB-NEXT: addi a1, a0, 1 106; SFB-NEXT: .LBB4_2: 107; SFB-NEXT: andi a1, a1, -2 108; SFB-NEXT: subw a0, a0, a1 109; SFB-NEXT: ret 110 %res = srem i32 %0, 2 111 ret i32 %res 112} 113 114define signext i32 @sremneg2_32(i32 signext %0) { 115; NOSFB-LABEL: sremneg2_32: 116; NOSFB: # %bb.0: 117; NOSFB-NEXT: srliw a1, a0, 31 118; NOSFB-NEXT: add a1, a1, a0 119; NOSFB-NEXT: andi a1, a1, -2 120; NOSFB-NEXT: subw a0, a0, a1 121; NOSFB-NEXT: ret 122; 123; SFB-LABEL: sremneg2_32: 124; SFB: # %bb.0: 125; SFB-NEXT: mv a1, a0 126; SFB-NEXT: bgez a0, .LBB5_2 127; SFB-NEXT: # %bb.1: 128; SFB-NEXT: addi a1, a0, 1 129; SFB-NEXT: .LBB5_2: 130; SFB-NEXT: andi a1, a1, -2 131; SFB-NEXT: subw a0, a0, a1 132; SFB-NEXT: ret 133 %res = srem i32 %0, -2 134 ret i32 %res 135} 136 137define i64 @srem2_64(i64 %0) { 138; NOSFB-LABEL: srem2_64: 139; NOSFB: # %bb.0: 140; NOSFB-NEXT: srli a1, a0, 63 141; NOSFB-NEXT: add a1, a1, a0 142; NOSFB-NEXT: andi a1, a1, -2 143; NOSFB-NEXT: sub a0, a0, a1 144; NOSFB-NEXT: ret 145; 146; SFB-LABEL: srem2_64: 147; SFB: # %bb.0: 148; SFB-NEXT: mv a1, a0 149; SFB-NEXT: bgez a0, .LBB6_2 150; SFB-NEXT: # %bb.1: 151; SFB-NEXT: addi a1, a0, 1 152; SFB-NEXT: .LBB6_2: 153; SFB-NEXT: andi a1, a1, -2 154; SFB-NEXT: sub a0, a0, a1 155; SFB-NEXT: ret 156 %res = srem i64 %0, 2 157 ret i64 %res 158} 159 160define i64 @sremneg2_64(i64 %0) { 161; NOSFB-LABEL: sremneg2_64: 162; NOSFB: # %bb.0: 163; NOSFB-NEXT: srli a1, a0, 63 164; NOSFB-NEXT: add a1, a1, a0 165; NOSFB-NEXT: andi a1, a1, -2 166; NOSFB-NEXT: sub a0, a0, a1 167; NOSFB-NEXT: ret 168; 169; SFB-LABEL: sremneg2_64: 170; SFB: # %bb.0: 171; SFB-NEXT: mv a1, a0 172; SFB-NEXT: bgez a0, .LBB7_2 173; SFB-NEXT: # %bb.1: 174; SFB-NEXT: addi a1, a0, 1 175; SFB-NEXT: .LBB7_2: 176; SFB-NEXT: andi a1, a1, -2 177; SFB-NEXT: sub a0, a0, a1 178; SFB-NEXT: ret 179 %res = srem i64 %0, -2 180 ret i64 %res 181} 182 183define signext i32 @sdiv8_32(i32 signext %0) { 184; NOSFB-LABEL: sdiv8_32: 185; NOSFB: # %bb.0: 186; NOSFB-NEXT: slli a1, a0, 1 187; NOSFB-NEXT: srli a1, a1, 61 188; NOSFB-NEXT: add a0, a0, a1 189; NOSFB-NEXT: sraiw a0, a0, 3 190; NOSFB-NEXT: ret 191; 192; SFB-LABEL: sdiv8_32: 193; SFB: # %bb.0: 194; SFB-NEXT: bgez a0, .LBB8_2 195; SFB-NEXT: # %bb.1: 196; SFB-NEXT: addi a0, a0, 7 197; SFB-NEXT: .LBB8_2: 198; SFB-NEXT: sraiw a0, a0, 3 199; SFB-NEXT: ret 200 %res = sdiv i32 %0, 8 201 ret i32 %res 202} 203 204define signext i32 @sdivneg8_32(i32 signext %0) { 205; NOSFB-LABEL: sdivneg8_32: 206; NOSFB: # %bb.0: 207; NOSFB-NEXT: slli a1, a0, 1 208; NOSFB-NEXT: srli a1, a1, 61 209; NOSFB-NEXT: add a0, a0, a1 210; NOSFB-NEXT: sraiw a0, a0, 3 211; NOSFB-NEXT: neg a0, a0 212; NOSFB-NEXT: ret 213; 214; SFB-LABEL: sdivneg8_32: 215; SFB: # %bb.0: 216; SFB-NEXT: bgez a0, .LBB9_2 217; SFB-NEXT: # %bb.1: 218; SFB-NEXT: addi a0, a0, 7 219; SFB-NEXT: .LBB9_2: 220; SFB-NEXT: sraiw a0, a0, 3 221; SFB-NEXT: neg a0, a0 222; SFB-NEXT: ret 223 %res = sdiv i32 %0, -8 224 ret i32 %res 225} 226 227define i64 @sdiv8_64(i64 %0) { 228; NOSFB-LABEL: sdiv8_64: 229; NOSFB: # %bb.0: 230; NOSFB-NEXT: srai a1, a0, 63 231; NOSFB-NEXT: srli a1, a1, 61 232; NOSFB-NEXT: add a0, a0, a1 233; NOSFB-NEXT: srai a0, a0, 3 234; NOSFB-NEXT: ret 235; 236; SFB-LABEL: sdiv8_64: 237; SFB: # %bb.0: 238; SFB-NEXT: bgez a0, .LBB10_2 239; SFB-NEXT: # %bb.1: 240; SFB-NEXT: addi a0, a0, 7 241; SFB-NEXT: .LBB10_2: 242; SFB-NEXT: srai a0, a0, 3 243; SFB-NEXT: ret 244 %res = sdiv i64 %0, 8 245 ret i64 %res 246} 247 248define i64 @sdivneg8_64(i64 %0) { 249; NOSFB-LABEL: sdivneg8_64: 250; NOSFB: # %bb.0: 251; NOSFB-NEXT: srai a1, a0, 63 252; NOSFB-NEXT: srli a1, a1, 61 253; NOSFB-NEXT: add a0, a0, a1 254; NOSFB-NEXT: srai a0, a0, 3 255; NOSFB-NEXT: neg a0, a0 256; NOSFB-NEXT: ret 257; 258; SFB-LABEL: sdivneg8_64: 259; SFB: # %bb.0: 260; SFB-NEXT: bgez a0, .LBB11_2 261; SFB-NEXT: # %bb.1: 262; SFB-NEXT: addi a0, a0, 7 263; SFB-NEXT: .LBB11_2: 264; SFB-NEXT: srai a0, a0, 3 265; SFB-NEXT: neg a0, a0 266; SFB-NEXT: ret 267 %res = sdiv i64 %0, -8 268 ret i64 %res 269} 270 271define signext i32 @srem8_32(i32 signext %0) { 272; NOSFB-LABEL: srem8_32: 273; NOSFB: # %bb.0: 274; NOSFB-NEXT: slli a1, a0, 1 275; NOSFB-NEXT: srli a1, a1, 61 276; NOSFB-NEXT: add a1, a1, a0 277; NOSFB-NEXT: andi a1, a1, -8 278; NOSFB-NEXT: subw a0, a0, a1 279; NOSFB-NEXT: ret 280; 281; SFB-LABEL: srem8_32: 282; SFB: # %bb.0: 283; SFB-NEXT: mv a1, a0 284; SFB-NEXT: bgez a0, .LBB12_2 285; SFB-NEXT: # %bb.1: 286; SFB-NEXT: addi a1, a0, 7 287; SFB-NEXT: .LBB12_2: 288; SFB-NEXT: andi a1, a1, -8 289; SFB-NEXT: subw a0, a0, a1 290; SFB-NEXT: ret 291 %res = srem i32 %0, 8 292 ret i32 %res 293} 294 295define signext i32 @sremneg8_32(i32 signext %0) { 296; NOSFB-LABEL: sremneg8_32: 297; NOSFB: # %bb.0: 298; NOSFB-NEXT: slli a1, a0, 1 299; NOSFB-NEXT: srli a1, a1, 61 300; NOSFB-NEXT: add a1, a1, a0 301; NOSFB-NEXT: andi a1, a1, -8 302; NOSFB-NEXT: subw a0, a0, a1 303; NOSFB-NEXT: ret 304; 305; SFB-LABEL: sremneg8_32: 306; SFB: # %bb.0: 307; SFB-NEXT: mv a1, a0 308; SFB-NEXT: bgez a0, .LBB13_2 309; SFB-NEXT: # %bb.1: 310; SFB-NEXT: addi a1, a0, 7 311; SFB-NEXT: .LBB13_2: 312; SFB-NEXT: andi a1, a1, -8 313; SFB-NEXT: subw a0, a0, a1 314; SFB-NEXT: ret 315 %res = srem i32 %0, -8 316 ret i32 %res 317} 318 319define i64 @srem8_64(i64 %0) { 320; NOSFB-LABEL: srem8_64: 321; NOSFB: # %bb.0: 322; NOSFB-NEXT: srai a1, a0, 63 323; NOSFB-NEXT: srli a1, a1, 61 324; NOSFB-NEXT: add a1, a1, a0 325; NOSFB-NEXT: andi a1, a1, -8 326; NOSFB-NEXT: sub a0, a0, a1 327; NOSFB-NEXT: ret 328; 329; SFB-LABEL: srem8_64: 330; SFB: # %bb.0: 331; SFB-NEXT: mv a1, a0 332; SFB-NEXT: bgez a0, .LBB14_2 333; SFB-NEXT: # %bb.1: 334; SFB-NEXT: addi a1, a0, 7 335; SFB-NEXT: .LBB14_2: 336; SFB-NEXT: andi a1, a1, -8 337; SFB-NEXT: sub a0, a0, a1 338; SFB-NEXT: ret 339 %res = srem i64 %0, 8 340 ret i64 %res 341} 342 343define i64 @sremneg8_64(i64 %0) { 344; NOSFB-LABEL: sremneg8_64: 345; NOSFB: # %bb.0: 346; NOSFB-NEXT: srai a1, a0, 63 347; NOSFB-NEXT: srli a1, a1, 61 348; NOSFB-NEXT: add a1, a1, a0 349; NOSFB-NEXT: andi a1, a1, -8 350; NOSFB-NEXT: sub a0, a0, a1 351; NOSFB-NEXT: ret 352; 353; SFB-LABEL: sremneg8_64: 354; SFB: # %bb.0: 355; SFB-NEXT: mv a1, a0 356; SFB-NEXT: bgez a0, .LBB15_2 357; SFB-NEXT: # %bb.1: 358; SFB-NEXT: addi a1, a0, 7 359; SFB-NEXT: .LBB15_2: 360; SFB-NEXT: andi a1, a1, -8 361; SFB-NEXT: sub a0, a0, a1 362; SFB-NEXT: ret 363 %res = srem i64 %0, -8 364 ret i64 %res 365} 366 367; Negative tests 368define i64 @sdiv4096(i64 %0) { 369; CHECK-LABEL: sdiv4096: 370; CHECK: # %bb.0: 371; CHECK-NEXT: srai a1, a0, 63 372; CHECK-NEXT: srli a1, a1, 52 373; CHECK-NEXT: add a0, a0, a1 374; CHECK-NEXT: srai a0, a0, 12 375; CHECK-NEXT: ret 376 %res = sdiv i64 %0, 4096 377 ret i64 %res 378} 379