379 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=riscv64 -mattr=+c,+m -verify-machineinstrs < %s \3; RUN: | FileCheck -check-prefixes=CHECK,NOSFB %s4; RUN: llc -mtriple=riscv64 -mcpu=sifive-u74 -verify-machineinstrs < %s \5; RUN: | FileCheck -check-prefixes=CHECK,SFB %s6 7define signext i32 @sdiv2_32(i32 signext %0) {8; NOSFB-LABEL: sdiv2_32:9; NOSFB: # %bb.0:10; NOSFB-NEXT: srliw a1, a0, 3111; NOSFB-NEXT: add a0, a0, a112; NOSFB-NEXT: sraiw a0, a0, 113; NOSFB-NEXT: ret14;15; SFB-LABEL: sdiv2_32:16; SFB: # %bb.0:17; SFB-NEXT: bgez a0, .LBB0_218; SFB-NEXT: # %bb.1:19; SFB-NEXT: addi a0, a0, 120; SFB-NEXT: .LBB0_2:21; SFB-NEXT: sraiw a0, a0, 122; SFB-NEXT: ret23 %res = sdiv i32 %0, 224 ret i32 %res25}26 27define signext i32 @sdivneg2_32(i32 signext %0) {28; NOSFB-LABEL: sdivneg2_32:29; NOSFB: # %bb.0:30; NOSFB-NEXT: srliw a1, a0, 3131; NOSFB-NEXT: add a0, a0, a132; NOSFB-NEXT: sraiw a0, a0, 133; NOSFB-NEXT: neg a0, a034; NOSFB-NEXT: ret35;36; SFB-LABEL: sdivneg2_32:37; SFB: # %bb.0:38; SFB-NEXT: bgez a0, .LBB1_239; SFB-NEXT: # %bb.1:40; SFB-NEXT: addi a0, a0, 141; SFB-NEXT: .LBB1_2:42; SFB-NEXT: sraiw a0, a0, 143; SFB-NEXT: neg a0, a044; SFB-NEXT: ret45 %res = sdiv i32 %0, -246 ret i32 %res47}48 49define i64 @sdiv2_64(i64 %0) {50; NOSFB-LABEL: sdiv2_64:51; NOSFB: # %bb.0:52; NOSFB-NEXT: srli a1, a0, 6353; NOSFB-NEXT: add a0, a0, a154; NOSFB-NEXT: srai a0, a0, 155; NOSFB-NEXT: ret56;57; SFB-LABEL: sdiv2_64:58; SFB: # %bb.0:59; SFB-NEXT: bgez a0, .LBB2_260; SFB-NEXT: # %bb.1:61; SFB-NEXT: addi a0, a0, 162; SFB-NEXT: .LBB2_2:63; SFB-NEXT: srai a0, a0, 164; SFB-NEXT: ret65 %res = sdiv i64 %0, 266 ret i64 %res67}68 69define i64 @sdivneg2_64(i64 %0) {70; NOSFB-LABEL: sdivneg2_64:71; NOSFB: # %bb.0:72; NOSFB-NEXT: srli a1, a0, 6373; NOSFB-NEXT: add a0, a0, a174; NOSFB-NEXT: srai a0, a0, 175; NOSFB-NEXT: neg a0, a076; NOSFB-NEXT: ret77;78; SFB-LABEL: sdivneg2_64:79; SFB: # %bb.0:80; SFB-NEXT: bgez a0, .LBB3_281; SFB-NEXT: # %bb.1:82; SFB-NEXT: addi a0, a0, 183; SFB-NEXT: .LBB3_2:84; SFB-NEXT: srai a0, a0, 185; SFB-NEXT: neg a0, a086; SFB-NEXT: ret87 %res = sdiv i64 %0, -288 ret i64 %res89}90 91define signext i32 @srem2_32(i32 signext %0) {92; NOSFB-LABEL: srem2_32:93; NOSFB: # %bb.0:94; NOSFB-NEXT: srliw a1, a0, 3195; NOSFB-NEXT: add a1, a1, a096; NOSFB-NEXT: andi a1, a1, -297; NOSFB-NEXT: subw a0, a0, a198; NOSFB-NEXT: ret99;100; SFB-LABEL: srem2_32:101; SFB: # %bb.0:102; SFB-NEXT: mv a1, a0103; SFB-NEXT: bgez a0, .LBB4_2104; SFB-NEXT: # %bb.1:105; SFB-NEXT: addi a1, a0, 1106; SFB-NEXT: .LBB4_2:107; SFB-NEXT: andi a1, a1, -2108; SFB-NEXT: subw a0, a0, a1109; SFB-NEXT: ret110 %res = srem i32 %0, 2111 ret i32 %res112}113 114define signext i32 @sremneg2_32(i32 signext %0) {115; NOSFB-LABEL: sremneg2_32:116; NOSFB: # %bb.0:117; NOSFB-NEXT: srliw a1, a0, 31118; NOSFB-NEXT: add a1, a1, a0119; NOSFB-NEXT: andi a1, a1, -2120; NOSFB-NEXT: subw a0, a0, a1121; NOSFB-NEXT: ret122;123; SFB-LABEL: sremneg2_32:124; SFB: # %bb.0:125; SFB-NEXT: mv a1, a0126; SFB-NEXT: bgez a0, .LBB5_2127; SFB-NEXT: # %bb.1:128; SFB-NEXT: addi a1, a0, 1129; SFB-NEXT: .LBB5_2:130; SFB-NEXT: andi a1, a1, -2131; SFB-NEXT: subw a0, a0, a1132; SFB-NEXT: ret133 %res = srem i32 %0, -2134 ret i32 %res135}136 137define i64 @srem2_64(i64 %0) {138; NOSFB-LABEL: srem2_64:139; NOSFB: # %bb.0:140; NOSFB-NEXT: srli a1, a0, 63141; NOSFB-NEXT: add a1, a1, a0142; NOSFB-NEXT: andi a1, a1, -2143; NOSFB-NEXT: sub a0, a0, a1144; NOSFB-NEXT: ret145;146; SFB-LABEL: srem2_64:147; SFB: # %bb.0:148; SFB-NEXT: mv a1, a0149; SFB-NEXT: bgez a0, .LBB6_2150; SFB-NEXT: # %bb.1:151; SFB-NEXT: addi a1, a0, 1152; SFB-NEXT: .LBB6_2:153; SFB-NEXT: andi a1, a1, -2154; SFB-NEXT: sub a0, a0, a1155; SFB-NEXT: ret156 %res = srem i64 %0, 2157 ret i64 %res158}159 160define i64 @sremneg2_64(i64 %0) {161; NOSFB-LABEL: sremneg2_64:162; NOSFB: # %bb.0:163; NOSFB-NEXT: srli a1, a0, 63164; NOSFB-NEXT: add a1, a1, a0165; NOSFB-NEXT: andi a1, a1, -2166; NOSFB-NEXT: sub a0, a0, a1167; NOSFB-NEXT: ret168;169; SFB-LABEL: sremneg2_64:170; SFB: # %bb.0:171; SFB-NEXT: mv a1, a0172; SFB-NEXT: bgez a0, .LBB7_2173; SFB-NEXT: # %bb.1:174; SFB-NEXT: addi a1, a0, 1175; SFB-NEXT: .LBB7_2:176; SFB-NEXT: andi a1, a1, -2177; SFB-NEXT: sub a0, a0, a1178; SFB-NEXT: ret179 %res = srem i64 %0, -2180 ret i64 %res181}182 183define signext i32 @sdiv8_32(i32 signext %0) {184; NOSFB-LABEL: sdiv8_32:185; NOSFB: # %bb.0:186; NOSFB-NEXT: slli a1, a0, 1187; NOSFB-NEXT: srli a1, a1, 61188; NOSFB-NEXT: add a0, a0, a1189; NOSFB-NEXT: sraiw a0, a0, 3190; NOSFB-NEXT: ret191;192; SFB-LABEL: sdiv8_32:193; SFB: # %bb.0:194; SFB-NEXT: bgez a0, .LBB8_2195; SFB-NEXT: # %bb.1:196; SFB-NEXT: addi a0, a0, 7197; SFB-NEXT: .LBB8_2:198; SFB-NEXT: sraiw a0, a0, 3199; SFB-NEXT: ret200 %res = sdiv i32 %0, 8201 ret i32 %res202}203 204define signext i32 @sdivneg8_32(i32 signext %0) {205; NOSFB-LABEL: sdivneg8_32:206; NOSFB: # %bb.0:207; NOSFB-NEXT: slli a1, a0, 1208; NOSFB-NEXT: srli a1, a1, 61209; NOSFB-NEXT: add a0, a0, a1210; NOSFB-NEXT: sraiw a0, a0, 3211; NOSFB-NEXT: neg a0, a0212; NOSFB-NEXT: ret213;214; SFB-LABEL: sdivneg8_32:215; SFB: # %bb.0:216; SFB-NEXT: bgez a0, .LBB9_2217; SFB-NEXT: # %bb.1:218; SFB-NEXT: addi a0, a0, 7219; SFB-NEXT: .LBB9_2:220; SFB-NEXT: sraiw a0, a0, 3221; SFB-NEXT: neg a0, a0222; SFB-NEXT: ret223 %res = sdiv i32 %0, -8224 ret i32 %res225}226 227define i64 @sdiv8_64(i64 %0) {228; NOSFB-LABEL: sdiv8_64:229; NOSFB: # %bb.0:230; NOSFB-NEXT: srai a1, a0, 63231; NOSFB-NEXT: srli a1, a1, 61232; NOSFB-NEXT: add a0, a0, a1233; NOSFB-NEXT: srai a0, a0, 3234; NOSFB-NEXT: ret235;236; SFB-LABEL: sdiv8_64:237; SFB: # %bb.0:238; SFB-NEXT: bgez a0, .LBB10_2239; SFB-NEXT: # %bb.1:240; SFB-NEXT: addi a0, a0, 7241; SFB-NEXT: .LBB10_2:242; SFB-NEXT: srai a0, a0, 3243; SFB-NEXT: ret244 %res = sdiv i64 %0, 8245 ret i64 %res246}247 248define i64 @sdivneg8_64(i64 %0) {249; NOSFB-LABEL: sdivneg8_64:250; NOSFB: # %bb.0:251; NOSFB-NEXT: srai a1, a0, 63252; NOSFB-NEXT: srli a1, a1, 61253; NOSFB-NEXT: add a0, a0, a1254; NOSFB-NEXT: srai a0, a0, 3255; NOSFB-NEXT: neg a0, a0256; NOSFB-NEXT: ret257;258; SFB-LABEL: sdivneg8_64:259; SFB: # %bb.0:260; SFB-NEXT: bgez a0, .LBB11_2261; SFB-NEXT: # %bb.1:262; SFB-NEXT: addi a0, a0, 7263; SFB-NEXT: .LBB11_2:264; SFB-NEXT: srai a0, a0, 3265; SFB-NEXT: neg a0, a0266; SFB-NEXT: ret267 %res = sdiv i64 %0, -8268 ret i64 %res269}270 271define signext i32 @srem8_32(i32 signext %0) {272; NOSFB-LABEL: srem8_32:273; NOSFB: # %bb.0:274; NOSFB-NEXT: slli a1, a0, 1275; NOSFB-NEXT: srli a1, a1, 61276; NOSFB-NEXT: add a1, a1, a0277; NOSFB-NEXT: andi a1, a1, -8278; NOSFB-NEXT: subw a0, a0, a1279; NOSFB-NEXT: ret280;281; SFB-LABEL: srem8_32:282; SFB: # %bb.0:283; SFB-NEXT: mv a1, a0284; SFB-NEXT: bgez a0, .LBB12_2285; SFB-NEXT: # %bb.1:286; SFB-NEXT: addi a1, a0, 7287; SFB-NEXT: .LBB12_2:288; SFB-NEXT: andi a1, a1, -8289; SFB-NEXT: subw a0, a0, a1290; SFB-NEXT: ret291 %res = srem i32 %0, 8292 ret i32 %res293}294 295define signext i32 @sremneg8_32(i32 signext %0) {296; NOSFB-LABEL: sremneg8_32:297; NOSFB: # %bb.0:298; NOSFB-NEXT: slli a1, a0, 1299; NOSFB-NEXT: srli a1, a1, 61300; NOSFB-NEXT: add a1, a1, a0301; NOSFB-NEXT: andi a1, a1, -8302; NOSFB-NEXT: subw a0, a0, a1303; NOSFB-NEXT: ret304;305; SFB-LABEL: sremneg8_32:306; SFB: # %bb.0:307; SFB-NEXT: mv a1, a0308; SFB-NEXT: bgez a0, .LBB13_2309; SFB-NEXT: # %bb.1:310; SFB-NEXT: addi a1, a0, 7311; SFB-NEXT: .LBB13_2:312; SFB-NEXT: andi a1, a1, -8313; SFB-NEXT: subw a0, a0, a1314; SFB-NEXT: ret315 %res = srem i32 %0, -8316 ret i32 %res317}318 319define i64 @srem8_64(i64 %0) {320; NOSFB-LABEL: srem8_64:321; NOSFB: # %bb.0:322; NOSFB-NEXT: srai a1, a0, 63323; NOSFB-NEXT: srli a1, a1, 61324; NOSFB-NEXT: add a1, a1, a0325; NOSFB-NEXT: andi a1, a1, -8326; NOSFB-NEXT: sub a0, a0, a1327; NOSFB-NEXT: ret328;329; SFB-LABEL: srem8_64:330; SFB: # %bb.0:331; SFB-NEXT: mv a1, a0332; SFB-NEXT: bgez a0, .LBB14_2333; SFB-NEXT: # %bb.1:334; SFB-NEXT: addi a1, a0, 7335; SFB-NEXT: .LBB14_2:336; SFB-NEXT: andi a1, a1, -8337; SFB-NEXT: sub a0, a0, a1338; SFB-NEXT: ret339 %res = srem i64 %0, 8340 ret i64 %res341}342 343define i64 @sremneg8_64(i64 %0) {344; NOSFB-LABEL: sremneg8_64:345; NOSFB: # %bb.0:346; NOSFB-NEXT: srai a1, a0, 63347; NOSFB-NEXT: srli a1, a1, 61348; NOSFB-NEXT: add a1, a1, a0349; NOSFB-NEXT: andi a1, a1, -8350; NOSFB-NEXT: sub a0, a0, a1351; NOSFB-NEXT: ret352;353; SFB-LABEL: sremneg8_64:354; SFB: # %bb.0:355; SFB-NEXT: mv a1, a0356; SFB-NEXT: bgez a0, .LBB15_2357; SFB-NEXT: # %bb.1:358; SFB-NEXT: addi a1, a0, 7359; SFB-NEXT: .LBB15_2:360; SFB-NEXT: andi a1, a1, -8361; SFB-NEXT: sub a0, a0, a1362; SFB-NEXT: ret363 %res = srem i64 %0, -8364 ret i64 %res365}366 367; Negative tests368define i64 @sdiv4096(i64 %0) {369; CHECK-LABEL: sdiv4096:370; CHECK: # %bb.0:371; CHECK-NEXT: srai a1, a0, 63372; CHECK-NEXT: srli a1, a1, 52373; CHECK-NEXT: add a0, a0, a1374; CHECK-NEXT: srai a0, a0, 12375; CHECK-NEXT: ret376 %res = sdiv i64 %0, 4096377 ret i64 %res378}379