276 lines · plain
1; RUN: llc < %s -mtriple=ve-unknown-unknown | FileCheck %s2 3; Function Attrs: norecurse nounwind readnone4define i128 @divi128(i128, i128) {5; CHECK-LABEL: divi128:6; CHECK: .LBB{{[0-9]+}}_2:7; CHECK-NEXT: lea %s4, __divti3@lo8; CHECK-NEXT: and %s4, %s4, (32)09; CHECK-NEXT: lea.sl %s12, __divti3@hi(, %s4)10; CHECK-NEXT: bsic %s10, (, %s12)11; CHECK-NEXT: or %s11, 0, %s912 %3 = sdiv i128 %0, %113 ret i128 %314}15 16; Function Attrs: norecurse nounwind readnone17define i64 @divi64(i64 %a, i64 %b) {18; CHECK-LABEL: divi64:19; CHECK: # %bb.0:20; CHECK-NEXT: divs.l %s0, %s0, %s121; CHECK-NEXT: b.l.t (, %s10)22 %r = sdiv i64 %a, %b23 ret i64 %r24}25 26; Function Attrs: norecurse nounwind readnone27define signext i32 @divi32(i32 signext %a, i32 signext %b) {28; CHECK-LABEL: divi32:29; CHECK: # %bb.0:30; CHECK-NEXT: divs.w.sx %s0, %s0, %s131; CHECK-NEXT: adds.w.sx %s0, %s0, (0)132; CHECK-NEXT: b.l.t (, %s10)33 %r = sdiv i32 %a, %b34 ret i32 %r35}36 37; Function Attrs: norecurse nounwind readnone38define i128 @divu128(i128, i128) {39; CHECK-LABEL: divu128:40; CHECK: .LBB{{[0-9]+}}_2:41; CHECK-NEXT: lea %s4, __udivti3@lo42; CHECK-NEXT: and %s4, %s4, (32)043; CHECK-NEXT: lea.sl %s12, __udivti3@hi(, %s4)44; CHECK-NEXT: bsic %s10, (, %s12)45; CHECK-NEXT: or %s11, 0, %s946 %3 = udiv i128 %0, %147 ret i128 %348}49 50; Function Attrs: norecurse nounwind readnone51define i64 @divu64(i64 %a, i64 %b) {52; CHECK-LABEL: divu64:53; CHECK: # %bb.0:54; CHECK-NEXT: divu.l %s0, %s0, %s155; CHECK-NEXT: b.l.t (, %s10)56 %r = udiv i64 %a, %b57 ret i64 %r58}59 60; Function Attrs: norecurse nounwind readnone61define zeroext i32 @divu32(i32 zeroext %a, i32 zeroext %b) {62; CHECK-LABEL: divu32:63; CHECK: # %bb.0:64; CHECK-NEXT: divu.w %s0, %s0, %s165; CHECK-NEXT: adds.w.zx %s0, %s0, (0)166; CHECK-NEXT: b.l.t (, %s10)67 %r = udiv i32 %a, %b68 ret i32 %r69}70 71; Function Attrs: norecurse nounwind readnone72define signext i16 @divi16(i16 signext %a, i16 signext %b) {73; CHECK-LABEL: divi16:74; CHECK: # %bb.0:75; CHECK-NEXT: divs.w.sx %s0, %s0, %s176; CHECK-NEXT: sll %s0, %s0, 4877; CHECK-NEXT: sra.l %s0, %s0, 4878; CHECK-NEXT: b.l.t (, %s10)79 %a32 = sext i16 %a to i3280 %b32 = sext i16 %b to i3281 %r32 = sdiv i32 %a32, %b3282 %r = trunc i32 %r32 to i1683 ret i16 %r84}85 86; Function Attrs: norecurse nounwind readnone87define zeroext i16 @divu16(i16 zeroext %a, i16 zeroext %b) {88; CHECK-LABEL: divu16:89; CHECK: # %bb.0:90; CHECK-NEXT: divu.w %s0, %s0, %s191; CHECK-NEXT: adds.w.zx %s0, %s0, (0)192; CHECK-NEXT: b.l.t (, %s10)93 %r = udiv i16 %a, %b94 ret i16 %r95}96 97; Function Attrs: norecurse nounwind readnone98define signext i8 @divi8(i8 signext %a, i8 signext %b) {99; CHECK-LABEL: divi8:100; CHECK: # %bb.0:101; CHECK-NEXT: divs.w.sx %s0, %s0, %s1102; CHECK-NEXT: sll %s0, %s0, 56103; CHECK-NEXT: sra.l %s0, %s0, 56104; CHECK-NEXT: b.l.t (, %s10)105 %a32 = sext i8 %a to i32106 %b32 = sext i8 %b to i32107 %r32 = sdiv i32 %a32, %b32108 %r = trunc i32 %r32 to i8109 ret i8 %r110}111 112; Function Attrs: norecurse nounwind readnone113define zeroext i8 @divu8(i8 zeroext %a, i8 zeroext %b) {114; CHECK-LABEL: divu8:115; CHECK: # %bb.0:116; CHECK-NEXT: divu.w %s0, %s0, %s1117; CHECK-NEXT: adds.w.zx %s0, %s0, (0)1118; CHECK-NEXT: b.l.t (, %s10)119 %r = udiv i8 %a, %b120 ret i8 %r121}122 123; Function Attrs: norecurse nounwind readnone124define i128 @divi128ri(i128) {125; CHECK-LABEL: divi128ri:126; CHECK: .LBB{{[0-9]+}}_2:127; CHECK-NEXT: lea %s2, __divti3@lo128; CHECK-NEXT: and %s2, %s2, (32)0129; CHECK-NEXT: lea.sl %s12, __divti3@hi(, %s2)130; CHECK-NEXT: or %s2, 3, (0)1131; CHECK-NEXT: or %s3, 0, (0)1132; CHECK-NEXT: bsic %s10, (, %s12)133; CHECK-NEXT: or %s11, 0, %s9134 %2 = sdiv i128 %0, 3135 ret i128 %2136}137 138; Function Attrs: norecurse nounwind readnone139define i64 @divi64ri(i64 %a, i64 %b) {140; CHECK-LABEL: divi64ri:141; CHECK: # %bb.0:142; CHECK-NEXT: divs.l %s0, %s0, (62)0143; CHECK-NEXT: b.l.t (, %s10)144 %r = sdiv i64 %a, 3145 ret i64 %r146}147 148; Function Attrs: norecurse nounwind readnone149define signext i32 @divi32ri(i32 signext %a, i32 signext %b) {150; CHECK-LABEL: divi32ri:151; CHECK: # %bb.0:152; CHECK-NEXT: lea %s1, 1431655766153; CHECK-NEXT: muls.l %s0, %s0, %s1154; CHECK-NEXT: srl %s1, %s0, 63155; CHECK-NEXT: srl %s0, %s0, 32156; CHECK-NEXT: adds.w.sx %s0, %s0, %s1157; CHECK-NEXT: adds.w.sx %s0, %s0, (0)1158; CHECK-NEXT: b.l.t (, %s10)159 %r = sdiv i32 %a, 3160 ret i32 %r161}162 163; Function Attrs: norecurse nounwind readnone164define i128 @divu128ri(i128) {165; CHECK-LABEL: divu128ri:166; CHECK: .LBB{{[0-9]+}}_2:167; CHECK-NEXT: lea %s2, __udivti3@lo168; CHECK-NEXT: and %s2, %s2, (32)0169; CHECK-NEXT: lea.sl %s12, __udivti3@hi(, %s2)170; CHECK-NEXT: or %s2, 3, (0)1171; CHECK-NEXT: or %s3, 0, (0)1172; CHECK-NEXT: bsic %s10, (, %s12)173; CHECK-NEXT: or %s11, 0, %s9174 %2 = udiv i128 %0, 3175 ret i128 %2176}177 178; Function Attrs: norecurse nounwind readnone179define i64 @divu64ri(i64 %a, i64 %b) {180; CHECK-LABEL: divu64ri:181; CHECK: # %bb.0:182; CHECK-NEXT: divu.l %s0, %s0, (62)0183; CHECK-NEXT: b.l.t (, %s10)184 %r = udiv i64 %a, 3185 ret i64 %r186}187 188; Function Attrs: norecurse nounwind readnone189define zeroext i32 @divu32ri(i32 zeroext %a, i32 zeroext %b) {190; CHECK-LABEL: divu32ri:191; CHECK: # %bb.0:192; CHECK-NEXT: lea %s1, -1431655765193; CHECK-NEXT: and %s1, %s1, (32)0194; CHECK-NEXT: muls.l %s0, %s0, %s1195; CHECK-NEXT: srl %s0, %s0, 33196; CHECK-NEXT: b.l.t (, %s10)197 %r = udiv i32 %a, 3198 ret i32 %r199}200 201; Function Attrs: norecurse nounwind readnone202define i128 @divi128li(i128) {203; CHECK-LABEL: divi128li:204; CHECK: .LBB{{[0-9]+}}_2:205; CHECK-NEXT: or %s3, 0, %s1206; CHECK-NEXT: or %s2, 0, %s0207; CHECK-NEXT: lea %s0, __divti3@lo208; CHECK-NEXT: and %s0, %s0, (32)0209; CHECK-NEXT: lea.sl %s12, __divti3@hi(, %s0)210; CHECK-NEXT: or %s0, 3, (0)1211; CHECK-NEXT: or %s1, 0, (0)1212; CHECK-NEXT: bsic %s10, (, %s12)213; CHECK-NEXT: or %s11, 0, %s9214 %2 = sdiv i128 3, %0215 ret i128 %2216}217 218; Function Attrs: norecurse nounwind readnone219define i64 @divi64li(i64 %a, i64 %b) {220; CHECK-LABEL: divi64li:221; CHECK: # %bb.0:222; CHECK-NEXT: divs.l %s0, 3, %s1223; CHECK-NEXT: b.l.t (, %s10)224 %r = sdiv i64 3, %b225 ret i64 %r226}227 228; Function Attrs: norecurse nounwind readnone229define signext i32 @divi32li(i32 signext %a, i32 signext %b) {230; CHECK-LABEL: divi32li:231; CHECK: # %bb.0:232; CHECK-NEXT: divs.w.sx %s0, 3, %s1233; CHECK-NEXT: adds.w.sx %s0, %s0, (0)1234; CHECK-NEXT: b.l.t (, %s10)235 %r = sdiv i32 3, %b236 ret i32 %r237}238 239; Function Attrs: norecurse nounwind readnone240define i128 @divu128li(i128) {241; CHECK-LABEL: divu128li:242; CHECK: .LBB{{[0-9]+}}_2:243; CHECK-NEXT: or %s3, 0, %s1244; CHECK-NEXT: or %s2, 0, %s0245; CHECK-NEXT: lea %s0, __udivti3@lo246; CHECK-NEXT: and %s0, %s0, (32)0247; CHECK-NEXT: lea.sl %s12, __udivti3@hi(, %s0)248; CHECK-NEXT: or %s0, 3, (0)1249; CHECK-NEXT: or %s1, 0, (0)1250; CHECK-NEXT: bsic %s10, (, %s12)251; CHECK-NEXT: or %s11, 0, %s9252 %2 = udiv i128 3, %0253 ret i128 %2254}255 256; Function Attrs: norecurse nounwind readnone257define i64 @divu64li(i64 %a, i64 %b) {258; CHECK-LABEL: divu64li:259; CHECK: # %bb.0:260; CHECK-NEXT: divu.l %s0, 3, %s1261; CHECK-NEXT: b.l.t (, %s10)262 %r = udiv i64 3, %b263 ret i64 %r264}265 266; Function Attrs: norecurse nounwind readnone267define zeroext i32 @divu32li(i32 zeroext %a, i32 zeroext %b) {268; CHECK-LABEL: divu32li:269; CHECK: # %bb.0:270; CHECK-NEXT: divu.w %s0, 3, %s1271; CHECK-NEXT: adds.w.zx %s0, %s0, (0)1272; CHECK-NEXT: b.l.t (, %s10)273 %r = udiv i32 3, %b274 ret i32 %r275}276