307 lines · plain
1; RUN: llc < %s -mtriple=ve-unknown-unknown | FileCheck %s2 3; Function Attrs: norecurse nounwind readnone4define i128 @remi128(i128 %a, i128 %b) {5; CHECK-LABEL: remi128:6; CHECK: .LBB{{[0-9]+}}_2:7; CHECK-NEXT: lea %s4, __modti3@lo8; CHECK-NEXT: and %s4, %s4, (32)09; CHECK-NEXT: lea.sl %s12, __modti3@hi(, %s4)10; CHECK-NEXT: bsic %s10, (, %s12)11; CHECK-NEXT: or %s11, 0, %s912 %r = srem i128 %a, %b13 ret i128 %r14}15 16; Function Attrs: norecurse nounwind readnone17define i64 @remi64(i64 %a, i64 %b) {18; CHECK-LABEL: remi64:19; CHECK: # %bb.0:20; CHECK-NEXT: divs.l %s2, %s0, %s121; CHECK-NEXT: muls.l %s1, %s2, %s122; CHECK-NEXT: subs.l %s0, %s0, %s123; CHECK-NEXT: b.l.t (, %s10)24 %r = srem i64 %a, %b25 ret i64 %r26}27 28; Function Attrs: norecurse nounwind readnone29define signext i32 @remi32(i32 signext %a, i32 signext %b) {30; CHECK-LABEL: remi32:31; CHECK: # %bb.0:32; CHECK-NEXT: divs.w.sx %s2, %s0, %s133; CHECK-NEXT: muls.w.sx %s1, %s2, %s134; CHECK-NEXT: subs.w.sx %s0, %s0, %s135; CHECK-NEXT: adds.w.sx %s0, %s0, (0)136; CHECK-NEXT: b.l.t (, %s10)37 %r = srem i32 %a, %b38 ret i32 %r39}40 41; Function Attrs: norecurse nounwind readnone42define i128 @remu128(i128 %a, i128 %b) {43; CHECK-LABEL: remu128:44; CHECK: .LBB{{[0-9]+}}_2:45; CHECK-NEXT: lea %s4, __umodti3@lo46; CHECK-NEXT: and %s4, %s4, (32)047; CHECK-NEXT: lea.sl %s12, __umodti3@hi(, %s4)48; CHECK-NEXT: bsic %s10, (, %s12)49; CHECK-NEXT: or %s11, 0, %s950 %r = urem i128 %a, %b51 ret i128 %r52}53 54; Function Attrs: norecurse nounwind readnone55define i64 @remu64(i64 %a, i64 %b) {56; CHECK-LABEL: remu64:57; CHECK: # %bb.0:58; CHECK-NEXT: divu.l %s2, %s0, %s159; CHECK-NEXT: muls.l %s1, %s2, %s160; CHECK-NEXT: subs.l %s0, %s0, %s161; CHECK-NEXT: b.l.t (, %s10)62 %r = urem i64 %a, %b63 ret i64 %r64}65 66; Function Attrs: norecurse nounwind readnone67define zeroext i32 @remu32(i32 zeroext %a, i32 zeroext %b) {68; CHECK-LABEL: remu32:69; CHECK: # %bb.0:70; CHECK-NEXT: divu.w %s2, %s0, %s171; CHECK-NEXT: muls.w.sx %s1, %s2, %s172; CHECK-NEXT: subs.w.sx %s0, %s0, %s173; CHECK-NEXT: adds.w.zx %s0, %s0, (0)174; CHECK-NEXT: b.l.t (, %s10)75 %r = urem i32 %a, %b76 ret i32 %r77}78 79; Function Attrs: norecurse nounwind readnone80define signext i16 @remi16(i16 signext %a, i16 signext %b) {81; CHECK-LABEL: remi16:82; CHECK: # %bb.0:83; CHECK-NEXT: divs.w.sx %s2, %s0, %s184; CHECK-NEXT: muls.w.sx %s1, %s2, %s185; CHECK-NEXT: subs.w.sx %s0, %s0, %s186; CHECK-NEXT: adds.w.sx %s0, %s0, (0)187; CHECK-NEXT: b.l.t (, %s10)88 %a32 = sext i16 %a to i3289 %b32 = sext i16 %b to i3290 %r32 = srem i32 %a32, %b3291 %r = trunc i32 %r32 to i1692 ret i16 %r93}94 95; Function Attrs: norecurse nounwind readnone96define zeroext i16 @remu16(i16 zeroext %a, i16 zeroext %b) {97; CHECK-LABEL: remu16:98; CHECK: # %bb.0:99; CHECK-NEXT: divu.w %s2, %s0, %s1100; CHECK-NEXT: muls.w.sx %s1, %s2, %s1101; CHECK-NEXT: subs.w.sx %s0, %s0, %s1102; CHECK-NEXT: adds.w.zx %s0, %s0, (0)1103; CHECK-NEXT: b.l.t (, %s10)104 %r = urem i16 %a, %b105 ret i16 %r106}107 108; Function Attrs: norecurse nounwind readnone109define signext i8 @remi8(i8 signext %a, i8 signext %b) {110; CHECK-LABEL: remi8:111; CHECK: # %bb.0:112; CHECK-NEXT: divs.w.sx %s2, %s0, %s1113; CHECK-NEXT: muls.w.sx %s1, %s2, %s1114; CHECK-NEXT: subs.w.sx %s0, %s0, %s1115; CHECK-NEXT: adds.w.sx %s0, %s0, (0)1116; CHECK-NEXT: b.l.t (, %s10)117 %a32 = sext i8 %a to i32118 %b32 = sext i8 %b to i32119 %r32 = srem i32 %a32, %b32120 %r = trunc i32 %r32 to i8121 ret i8 %r122}123 124; Function Attrs: norecurse nounwind readnone125define zeroext i8 @remu8(i8 zeroext %a, i8 zeroext %b) {126; CHECK-LABEL: remu8:127; CHECK: # %bb.0:128; CHECK-NEXT: divu.w %s2, %s0, %s1129; CHECK-NEXT: muls.w.sx %s1, %s2, %s1130; CHECK-NEXT: subs.w.sx %s0, %s0, %s1131; CHECK-NEXT: adds.w.zx %s0, %s0, (0)1132; CHECK-NEXT: b.l.t (, %s10)133 %r = urem i8 %a, %b134 ret i8 %r135}136 137; Function Attrs: norecurse nounwind readnone138define i128 @remi128ri(i128 %a) {139; CHECK-LABEL: remi128ri:140; CHECK: .LBB{{[0-9]+}}_2:141; CHECK-NEXT: lea %s2, __modti3@lo142; CHECK-NEXT: and %s2, %s2, (32)0143; CHECK-NEXT: lea.sl %s12, __modti3@hi(, %s2)144; CHECK-NEXT: or %s2, 3, (0)1145; CHECK-NEXT: or %s3, 0, (0)1146; CHECK-NEXT: bsic %s10, (, %s12)147; CHECK-NEXT: or %s11, 0, %s9148 %r = srem i128 %a, 3149 ret i128 %r150}151 152; Function Attrs: norecurse nounwind readnone153define i64 @remi64ri(i64 %a) {154; CHECK-LABEL: remi64ri:155; CHECK: # %bb.0:156; CHECK-NEXT: divs.l %s1, %s0, (62)0157; CHECK-NEXT: muls.l %s1, 3, %s1158; CHECK-NEXT: subs.l %s0, %s0, %s1159; CHECK-NEXT: b.l.t (, %s10)160 %r = srem i64 %a, 3161 ret i64 %r162}163 164; Function Attrs: norecurse nounwind readnone165define signext i32 @remi32ri(i32 signext %a) {166; CHECK-LABEL: remi32ri:167; CHECK: # %bb.0:168; CHECK-NEXT: lea %s1, 1431655766169; CHECK-NEXT: muls.l %s1, %s0, %s1170; CHECK-NEXT: srl %s2, %s1, 63171; CHECK-NEXT: srl %s1, %s1, 32172; CHECK-NEXT: adds.w.sx %s1, %s1, %s2173; CHECK-NEXT: muls.w.sx %s1, 3, %s1174; CHECK-NEXT: subs.w.sx %s0, %s0, %s1175; CHECK-NEXT: adds.w.sx %s0, %s0, (0)1176; CHECK-NEXT: b.l.t (, %s10)177 %r = srem i32 %a, 3178 ret i32 %r179}180 181; Function Attrs: norecurse nounwind readnone182define i128 @remu128ri(i128 %a) {183; CHECK-LABEL: remu128ri:184; CHECK: .LBB{{[0-9]+}}_2:185; CHECK-NEXT: lea %s2, __umodti3@lo186; CHECK-NEXT: and %s2, %s2, (32)0187; CHECK-NEXT: lea.sl %s12, __umodti3@hi(, %s2)188; CHECK-NEXT: or %s2, 11, (0)1189; CHECK-NEXT: or %s3, 0, (0)1190; CHECK-NEXT: bsic %s10, (, %s12)191; CHECK-NEXT: or %s11, 0, %s9192 %r = urem i128 %a, 11193 ret i128 %r194}195 196; Function Attrs: norecurse nounwind readnone197define i64 @remu64ri(i64 %a) {198; CHECK-LABEL: remu64ri:199; CHECK: # %bb.0:200; CHECK-NEXT: divu.l %s1, %s0, (62)0201; CHECK-NEXT: muls.l %s1, 3, %s1202; CHECK-NEXT: subs.l %s0, %s0, %s1203; CHECK-NEXT: b.l.t (, %s10)204 %r = urem i64 %a, 3205 ret i64 %r206}207 208; Function Attrs: norecurse nounwind readnone209define zeroext i32 @remu32ri(i32 zeroext %a) {210; CHECK-LABEL: remu32ri:211; CHECK: # %bb.0:212; CHECK-NEXT: lea %s1, -1431655765213; CHECK-NEXT: and %s1, %s1, (32)0214; CHECK-NEXT: muls.l %s1, %s0, %s1215; CHECK-NEXT: srl %s1, %s1, 33216; CHECK-NEXT: muls.w.sx %s1, 3, %s1217; CHECK-NEXT: subs.w.sx %s0, %s0, %s1218; CHECK-NEXT: adds.w.zx %s0, %s0, (0)1219; CHECK-NEXT: b.l.t (, %s10)220 %r = urem i32 %a, 3221 ret i32 %r222}223 224; Function Attrs: norecurse nounwind readnone225define i128 @remi128li(i128 %a) {226; CHECK-LABEL: remi128li:227; CHECK: .LBB{{[0-9]+}}_2:228; CHECK-NEXT: or %s3, 0, %s1229; CHECK-NEXT: or %s2, 0, %s0230; CHECK-NEXT: lea %s0, __modti3@lo231; CHECK-NEXT: and %s0, %s0, (32)0232; CHECK-NEXT: lea.sl %s12, __modti3@hi(, %s0)233; CHECK-NEXT: or %s0, 3, (0)1234; CHECK-NEXT: or %s1, 0, (0)1235; CHECK-NEXT: bsic %s10, (, %s12)236; CHECK-NEXT: or %s11, 0, %s9237 %r = srem i128 3, %a238 ret i128 %r239}240 241; Function Attrs: norecurse nounwind readnone242define i64 @remi64li(i64 %a, i64 %b) {243; CHECK-LABEL: remi64li:244; CHECK: # %bb.0:245; CHECK-NEXT: divs.l %s0, 3, %s1246; CHECK-NEXT: muls.l %s0, %s0, %s1247; CHECK-NEXT: subs.l %s0, 3, %s0248; CHECK-NEXT: b.l.t (, %s10)249 %r = srem i64 3, %b250 ret i64 %r251}252 253; Function Attrs: norecurse nounwind readnone254define signext i32 @remi32li(i32 signext %a, i32 signext %b) {255; CHECK-LABEL: remi32li:256; CHECK: # %bb.0:257; CHECK-NEXT: divs.w.sx %s0, 3, %s1258; CHECK-NEXT: muls.w.sx %s0, %s0, %s1259; CHECK-NEXT: subs.w.sx %s0, 3, %s0260; CHECK-NEXT: adds.w.zx %s0, %s0, (0)1261; CHECK-NEXT: b.l.t (, %s10)262 %r = srem i32 3, %b263 ret i32 %r264}265 266; Function Attrs: norecurse nounwind readnone267define i128 @remu128li(i128) {268; CHECK-LABEL: remu128li:269; CHECK: .LBB{{[0-9]+}}_2:270; CHECK-NEXT: or %s3, 0, %s1271; CHECK-NEXT: or %s2, 0, %s0272; CHECK-NEXT: lea %s0, __umodti3@lo273; CHECK-NEXT: and %s0, %s0, (32)0274; CHECK-NEXT: lea.sl %s12, __umodti3@hi(, %s0)275; CHECK-NEXT: or %s0, 3, (0)1276; CHECK-NEXT: or %s1, 0, (0)1277; CHECK-NEXT: bsic %s10, (, %s12)278; CHECK-NEXT: or %s11, 0, %s9279 %2 = urem i128 3, %0280 ret i128 %2281}282 283; Function Attrs: norecurse nounwind readnone284define i64 @remu64li(i64 %a, i64 %b) {285; CHECK-LABEL: remu64li:286; CHECK: # %bb.0:287; CHECK-NEXT: divu.l %s0, 3, %s1288; CHECK-NEXT: muls.l %s0, %s0, %s1289; CHECK-NEXT: subs.l %s0, 3, %s0290; CHECK-NEXT: b.l.t (, %s10)291 %r = urem i64 3, %b292 ret i64 %r293}294 295; Function Attrs: norecurse nounwind readnone296define zeroext i32 @remu32li(i32 zeroext %a, i32 zeroext %b) {297; CHECK-LABEL: remu32li:298; CHECK: # %bb.0:299; CHECK-NEXT: divu.w %s0, 3, %s1300; CHECK-NEXT: muls.w.sx %s0, %s0, %s1301; CHECK-NEXT: subs.w.sx %s0, 3, %s0302; CHECK-NEXT: adds.w.zx %s0, %s0, (0)1303; CHECK-NEXT: b.l.t (, %s10)304 %r = urem i32 3, %b305 ret i32 %r306}307