160 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 and in which3; three-operand forms are available.4;5; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z196 | FileCheck %s6 7declare i32 @foo()8 9; Check subtraction of 1.10define zeroext i1 @f1(i32 %dummy, i32 %a, ptr %res) {11; CHECK-LABEL: f1:12; CHECK: # %bb.0:13; CHECK-NEXT: alhsik %r0, %r3, -114; CHECK-NEXT: st %r0, 0(%r4)15; CHECK-NEXT: ipm %r116; CHECK-NEXT: afi %r1, -53687091217; CHECK-NEXT: risbg %r2, %r1, 63, 191, 3318; CHECK-NEXT: br %r1419 %t = call {i32, i1} @llvm.usub.with.overflow.i32(i32 %a, i32 1)20 %val = extractvalue {i32, i1} %t, 021 %obit = extractvalue {i32, i1} %t, 122 store i32 %val, ptr %res23 ret i1 %obit24}25 26; Check the high end of the ALHSIK range.27define zeroext i1 @f2(i32 %dummy, i32 %a, ptr %res) {28; CHECK-LABEL: f2:29; CHECK: # %bb.0:30; CHECK-NEXT: alhsik %r0, %r3, -3276831; CHECK-NEXT: st %r0, 0(%r4)32; CHECK-NEXT: ipm %r133; CHECK-NEXT: afi %r1, -53687091234; CHECK-NEXT: risbg %r2, %r1, 63, 191, 3335; CHECK-NEXT: br %r1436 %t = call {i32, i1} @llvm.usub.with.overflow.i32(i32 %a, i32 32768)37 %val = extractvalue {i32, i1} %t, 038 %obit = extractvalue {i32, i1} %t, 139 store i32 %val, ptr %res40 ret i1 %obit41}42 43; Check the next value down, which must use SLFI instead.44define zeroext i1 @f3(i32 %dummy, i32 %a, ptr %res) {45; CHECK-LABEL: f3:46; CHECK: # %bb.0:47; CHECK-NEXT: slfi %r3, 3276948; CHECK-NEXT: st %r3, 0(%r4)49; CHECK-NEXT: ipm %r050; CHECK-NEXT: afi %r0, -53687091251; CHECK-NEXT: risbg %r2, %r0, 63, 191, 3352; CHECK-NEXT: br %r1453 %t = call {i32, i1} @llvm.usub.with.overflow.i32(i32 %a, i32 32769)54 %val = extractvalue {i32, i1} %t, 055 %obit = extractvalue {i32, i1} %t, 156 store i32 %val, ptr %res57 ret i1 %obit58}59 60; Check the high end of the negative ALHSIK range.61define zeroext i1 @f4(i32 %dummy, i32 %a, ptr %res) {62; CHECK-LABEL: f4:63; CHECK: # %bb.0:64; CHECK-NEXT: alhsik %r0, %r3, 165; CHECK-NEXT: st %r0, 0(%r4)66; CHECK-NEXT: ipm %r167; CHECK-NEXT: afi %r1, -53687091268; CHECK-NEXT: risbg %r2, %r1, 63, 191, 3369; CHECK-NEXT: br %r1470 %t = call {i32, i1} @llvm.usub.with.overflow.i32(i32 %a, i32 -1)71 %val = extractvalue {i32, i1} %t, 072 %obit = extractvalue {i32, i1} %t, 173 store i32 %val, ptr %res74 ret i1 %obit75}76 77; Check the low end of the ALHSIK range.78define zeroext i1 @f5(i32 %dummy, i32 %a, ptr %res) {79; CHECK-LABEL: f5:80; CHECK: # %bb.0:81; CHECK-NEXT: alhsik %r0, %r3, 3276782; CHECK-NEXT: st %r0, 0(%r4)83; CHECK-NEXT: ipm %r184; CHECK-NEXT: afi %r1, -53687091285; CHECK-NEXT: risbg %r2, %r1, 63, 191, 3386; CHECK-NEXT: br %r1487 %t = call {i32, i1} @llvm.usub.with.overflow.i32(i32 %a, i32 -32767)88 %val = extractvalue {i32, i1} %t, 089 %obit = extractvalue {i32, i1} %t, 190 store i32 %val, ptr %res91 ret i1 %obit92}93 94; Check the next value down, which must use SLFI instead.95define zeroext i1 @f6(i32 %dummy, i32 %a, ptr %res) {96; CHECK-LABEL: f6:97; CHECK: # %bb.0:98; CHECK-NEXT: slfi %r3, 429493452899; CHECK-NEXT: st %r3, 0(%r4)100; CHECK-NEXT: ipm %r0101; CHECK-NEXT: afi %r0, -536870912102; CHECK-NEXT: risbg %r2, %r0, 63, 191, 33103; CHECK-NEXT: br %r14104 %t = call {i32, i1} @llvm.usub.with.overflow.i32(i32 %a, i32 -32768)105 %val = extractvalue {i32, i1} %t, 0106 %obit = extractvalue {i32, i1} %t, 1107 store i32 %val, ptr %res108 ret i1 %obit109}110 111; Check using the overflow result for a branch.112define void @f7(i32 %dummy, i32 %a, ptr %res) {113; CHECK-LABEL: f7:114; CHECK: # %bb.0:115; CHECK-NEXT: alhsik %r0, %r3, -1116; CHECK-NEXT: st %r0, 0(%r4)117; CHECK-NEXT: jgle foo@PLT118; CHECK-NEXT: .LBB6_1: # %exit119; CHECK-NEXT: br %r14120 %t = call {i32, i1} @llvm.usub.with.overflow.i32(i32 %a, i32 1)121 %val = extractvalue {i32, i1} %t, 0122 %obit = extractvalue {i32, i1} %t, 1123 store i32 %val, ptr %res124 br i1 %obit, label %call, label %exit125 126call:127 tail call i32 @foo()128 br label %exit129 130exit:131 ret void132}133 134; ... and the same with the inverted direction.135define void @f8(i32 %dummy, i32 %a, ptr %res) {136; CHECK-LABEL: f8:137; CHECK: # %bb.0:138; CHECK-NEXT: alhsik %r0, %r3, -1139; CHECK-NEXT: st %r0, 0(%r4)140; CHECK-NEXT: jgnle foo@PLT141; CHECK-NEXT: .LBB7_1: # %exit142; CHECK-NEXT: br %r14143 %t = call {i32, i1} @llvm.usub.with.overflow.i32(i32 %a, i32 1)144 %val = extractvalue {i32, i1} %t, 0145 %obit = extractvalue {i32, i1} %t, 1146 store i32 %val, ptr %res147 br i1 %obit, label %exit, label %call148 149call:150 tail call i32 @foo()151 br label %exit152 153exit:154 ret void155}156 157 158declare {i32, i1} @llvm.usub.with.overflow.i32(i32, i32) nounwind readnone159 160