1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 3 2; Test 32-bit subtraction in which the second operand is constant and in which 3; three-operand forms are available. 4; 5; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z196 | FileCheck %s 6 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, -1 14; CHECK-NEXT: st %r0, 0(%r4) 15; CHECK-NEXT: ipm %r1 16; CHECK-NEXT: afi %r1, -536870912 17; CHECK-NEXT: risbg %r2, %r1, 63, 191, 33 18; CHECK-NEXT: br %r14 19 %t = call {i32, i1} @llvm.usub.with.overflow.i32(i32 %a, i32 1) 20 %val = extractvalue {i32, i1} %t, 0 21 %obit = extractvalue {i32, i1} %t, 1 22 store i32 %val, ptr %res 23 ret i1 %obit 24} 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, -32768 31; CHECK-NEXT: st %r0, 0(%r4) 32; CHECK-NEXT: ipm %r1 33; CHECK-NEXT: afi %r1, -536870912 34; CHECK-NEXT: risbg %r2, %r1, 63, 191, 33 35; CHECK-NEXT: br %r14 36 %t = call {i32, i1} @llvm.usub.with.overflow.i32(i32 %a, i32 32768) 37 %val = extractvalue {i32, i1} %t, 0 38 %obit = extractvalue {i32, i1} %t, 1 39 store i32 %val, ptr %res 40 ret i1 %obit 41} 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, 32769 48; CHECK-NEXT: st %r3, 0(%r4) 49; CHECK-NEXT: ipm %r0 50; CHECK-NEXT: afi %r0, -536870912 51; CHECK-NEXT: risbg %r2, %r0, 63, 191, 33 52; CHECK-NEXT: br %r14 53 %t = call {i32, i1} @llvm.usub.with.overflow.i32(i32 %a, i32 32769) 54 %val = extractvalue {i32, i1} %t, 0 55 %obit = extractvalue {i32, i1} %t, 1 56 store i32 %val, ptr %res 57 ret i1 %obit 58} 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, 1 65; CHECK-NEXT: st %r0, 0(%r4) 66; CHECK-NEXT: ipm %r1 67; CHECK-NEXT: afi %r1, -536870912 68; CHECK-NEXT: risbg %r2, %r1, 63, 191, 33 69; CHECK-NEXT: br %r14 70 %t = call {i32, i1} @llvm.usub.with.overflow.i32(i32 %a, i32 -1) 71 %val = extractvalue {i32, i1} %t, 0 72 %obit = extractvalue {i32, i1} %t, 1 73 store i32 %val, ptr %res 74 ret i1 %obit 75} 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, 32767 82; CHECK-NEXT: st %r0, 0(%r4) 83; CHECK-NEXT: ipm %r1 84; CHECK-NEXT: afi %r1, -536870912 85; CHECK-NEXT: risbg %r2, %r1, 63, 191, 33 86; CHECK-NEXT: br %r14 87 %t = call {i32, i1} @llvm.usub.with.overflow.i32(i32 %a, i32 -32767) 88 %val = extractvalue {i32, i1} %t, 0 89 %obit = extractvalue {i32, i1} %t, 1 90 store i32 %val, ptr %res 91 ret i1 %obit 92} 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, 4294934528 99; CHECK-NEXT: st %r3, 0(%r4) 100; CHECK-NEXT: ipm %r0 101; CHECK-NEXT: afi %r0, -536870912 102; CHECK-NEXT: risbg %r2, %r0, 63, 191, 33 103; CHECK-NEXT: br %r14 104 %t = call {i32, i1} @llvm.usub.with.overflow.i32(i32 %a, i32 -32768) 105 %val = extractvalue {i32, i1} %t, 0 106 %obit = extractvalue {i32, i1} %t, 1 107 store i32 %val, ptr %res 108 ret i1 %obit 109} 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, -1 116; CHECK-NEXT: st %r0, 0(%r4) 117; CHECK-NEXT: jgle foo@PLT 118; CHECK-NEXT: .LBB6_1: # %exit 119; CHECK-NEXT: br %r14 120 %t = call {i32, i1} @llvm.usub.with.overflow.i32(i32 %a, i32 1) 121 %val = extractvalue {i32, i1} %t, 0 122 %obit = extractvalue {i32, i1} %t, 1 123 store i32 %val, ptr %res 124 br i1 %obit, label %call, label %exit 125 126call: 127 tail call i32 @foo() 128 br label %exit 129 130exit: 131 ret void 132} 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, -1 139; CHECK-NEXT: st %r0, 0(%r4) 140; CHECK-NEXT: jgnle foo@PLT 141; CHECK-NEXT: .LBB7_1: # %exit 142; CHECK-NEXT: br %r14 143 %t = call {i32, i1} @llvm.usub.with.overflow.i32(i32 %a, i32 1) 144 %val = extractvalue {i32, i1} %t, 0 145 %obit = extractvalue {i32, i1} %t, 1 146 store i32 %val, ptr %res 147 br i1 %obit, label %exit, label %call 148 149call: 150 tail call i32 @foo() 151 br label %exit 152 153exit: 154 ret void 155} 156 157 158declare {i32, i1} @llvm.usub.with.overflow.i32(i32, i32) nounwind readnone 159 160