107 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 32; Test 32-bit subtraction in which the second operand is constant.3;4; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s5 6declare i32 @foo()7 8; Check subtraction of 1.9define zeroext i1 @f1(i32 %dummy, i32 %a, ptr %res) {10; CHECK-LABEL: f1:11; CHECK: # %bb.0:12; CHECK-NEXT: slfi %r3, 113; CHECK-NEXT: ipm %r014; CHECK-NEXT: afi %r0, -53687091215; CHECK-NEXT: risbg %r2, %r0, 63, 191, 3316; CHECK-NEXT: st %r3, 0(%r4)17; CHECK-NEXT: br %r1418 %t = call {i32, i1} @llvm.usub.with.overflow.i32(i32 %a, i32 1)19 %val = extractvalue {i32, i1} %t, 020 %obit = extractvalue {i32, i1} %t, 121 store i32 %val, ptr %res22 ret i1 %obit23}24 25; Check the high end of the SLFI range.26define zeroext i1 @f2(i32 %dummy, i32 %a, ptr %res) {27; CHECK-LABEL: f2:28; CHECK: # %bb.0:29; CHECK-NEXT: slfi %r3, 429496729530; CHECK-NEXT: ipm %r031; CHECK-NEXT: afi %r0, -53687091232; CHECK-NEXT: risbg %r2, %r0, 63, 191, 3333; CHECK-NEXT: st %r3, 0(%r4)34; CHECK-NEXT: br %r1435 %t = call {i32, i1} @llvm.usub.with.overflow.i32(i32 %a, i32 4294967295)36 %val = extractvalue {i32, i1} %t, 037 %obit = extractvalue {i32, i1} %t, 138 store i32 %val, ptr %res39 ret i1 %obit40}41 42; Check that negative values are treated as unsigned43define zeroext i1 @f3(i32 %dummy, i32 %a, ptr %res) {44; CHECK-LABEL: f3:45; CHECK: # %bb.0:46; CHECK-NEXT: slfi %r3, 429496729547; CHECK-NEXT: ipm %r048; CHECK-NEXT: afi %r0, -53687091249; CHECK-NEXT: risbg %r2, %r0, 63, 191, 3350; CHECK-NEXT: st %r3, 0(%r4)51; CHECK-NEXT: br %r1452 %t = call {i32, i1} @llvm.usub.with.overflow.i32(i32 %a, i32 -1)53 %val = extractvalue {i32, i1} %t, 054 %obit = extractvalue {i32, i1} %t, 155 store i32 %val, ptr %res56 ret i1 %obit57}58 59; Check using the overflow result for a branch.60define void @f4(i32 %dummy, i32 %a, ptr %res) {61; CHECK-LABEL: f4:62; CHECK: # %bb.0:63; CHECK-NEXT: slfi %r3, 164; CHECK-NEXT: st %r3, 0(%r4)65; CHECK-NEXT: jgle foo@PLT66; CHECK-NEXT: .LBB3_1: # %exit67; CHECK-NEXT: br %r1468 %t = call {i32, i1} @llvm.usub.with.overflow.i32(i32 %a, i32 1)69 %val = extractvalue {i32, i1} %t, 070 %obit = extractvalue {i32, i1} %t, 171 store i32 %val, ptr %res72 br i1 %obit, label %call, label %exit73 74call:75 tail call i32 @foo()76 br label %exit77 78exit:79 ret void80}81 82; ... and the same with the inverted direction.83define void @f5(i32 %dummy, i32 %a, ptr %res) {84; CHECK-LABEL: f5:85; CHECK: # %bb.0:86; CHECK-NEXT: slfi %r3, 187; CHECK-NEXT: st %r3, 0(%r4)88; CHECK-NEXT: jgnle foo@PLT89; CHECK-NEXT: .LBB4_1: # %exit90; CHECK-NEXT: br %r1491 %t = call {i32, i1} @llvm.usub.with.overflow.i32(i32 %a, i32 1)92 %val = extractvalue {i32, i1} %t, 093 %obit = extractvalue {i32, i1} %t, 194 store i32 %val, ptr %res95 br i1 %obit, label %exit, label %call96 97call:98 tail call i32 @foo()99 br label %exit100 101exit:102 ret void103}104 105declare {i32, i1} @llvm.usub.with.overflow.i32(i32, i32) nounwind readnone106 107