161 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 32; Test 64-bit addition 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 i64 @foo()8 9; Check subtraction of 1.10define zeroext i1 @f1(i64 %dummy, i64 %a, ptr %res) {11; CHECK-LABEL: f1:12; CHECK: # %bb.0:13; CHECK-NEXT: alghsik %r0, %r3, -114; CHECK-NEXT: stg %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 {i64, i1} @llvm.usub.with.overflow.i64(i64 %a, i64 1)20 %val = extractvalue {i64, i1} %t, 021 %obit = extractvalue {i64, i1} %t, 122 store i64 %val, ptr %res23 ret i1 %obit24}25 26; Check the high end of the ALGHSIK range.27define zeroext i1 @f2(i64 %dummy, i64 %a, ptr %res) {28; CHECK-LABEL: f2:29; CHECK: # %bb.0:30; CHECK-NEXT: alghsik %r0, %r3, -3276831; CHECK-NEXT: stg %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 {i64, i1} @llvm.usub.with.overflow.i64(i64 %a, i64 32768)37 %val = extractvalue {i64, i1} %t, 038 %obit = extractvalue {i64, i1} %t, 139 store i64 %val, ptr %res40 ret i1 %obit41}42 43; Check the next value up, which must use SLGFI instead.44define zeroext i1 @f3(i64 %dummy, i64 %a, ptr %res) {45; CHECK-LABEL: f3:46; CHECK: # %bb.0:47; CHECK-NEXT: slgfi %r3, 3276948; CHECK-NEXT: stg %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 {i64, i1} @llvm.usub.with.overflow.i64(i64 %a, i64 32769)54 %val = extractvalue {i64, i1} %t, 055 %obit = extractvalue {i64, i1} %t, 156 store i64 %val, ptr %res57 ret i1 %obit58}59 60; Check the high end of the negative ALGHSIK range.61define zeroext i1 @f4(i64 %dummy, i64 %a, ptr %res) {62; CHECK-LABEL: f4:63; CHECK: # %bb.0:64; CHECK-NEXT: alghsik %r0, %r3, 165; CHECK-NEXT: stg %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 {i64, i1} @llvm.usub.with.overflow.i64(i64 %a, i64 -1)71 %val = extractvalue {i64, i1} %t, 072 %obit = extractvalue {i64, i1} %t, 173 store i64 %val, ptr %res74 ret i1 %obit75}76 77; Check the low end of the ALGHSIK range.78define zeroext i1 @f5(i64 %dummy, i64 %a, ptr %res) {79; CHECK-LABEL: f5:80; CHECK: # %bb.0:81; CHECK-NEXT: alghsik %r0, %r3, 3276782; CHECK-NEXT: stg %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 {i64, i1} @llvm.usub.with.overflow.i64(i64 %a, i64 -32767)88 %val = extractvalue {i64, i1} %t, 089 %obit = extractvalue {i64, i1} %t, 190 store i64 %val, ptr %res91 ret i1 %obit92}93 94; Test the next value down, which cannot use either ALGHSIK or SLGFI.95define zeroext i1 @f6(i64 %dummy, i64 %a, ptr %res) {96; CHECK-LABEL: f6:97; CHECK: # %bb.0:98; CHECK-NEXT: lghi %r0, -3276899; CHECK-NEXT: slgr %r3, %r0100; CHECK-NEXT: ipm %r0101; CHECK-NEXT: afi %r0, -536870912102; CHECK-NEXT: risbg %r2, %r0, 63, 191, 33103; CHECK-NEXT: stg %r3, 0(%r4)104; CHECK-NEXT: br %r14105 %t = call {i64, i1} @llvm.usub.with.overflow.i64(i64 %a, i64 -32768)106 %val = extractvalue {i64, i1} %t, 0107 %obit = extractvalue {i64, i1} %t, 1108 store i64 %val, ptr %res109 ret i1 %obit110}111 112; Check using the overflow result for a branch.113define void @f7(i64 %dummy, i64 %a, ptr %res) {114; CHECK-LABEL: f7:115; CHECK: # %bb.0:116; CHECK-NEXT: alghsik %r0, %r3, -1117; CHECK-NEXT: stg %r0, 0(%r4)118; CHECK-NEXT: jgle foo@PLT119; CHECK-NEXT: .LBB6_1: # %exit120; CHECK-NEXT: br %r14121 %t = call {i64, i1} @llvm.usub.with.overflow.i64(i64 %a, i64 1)122 %val = extractvalue {i64, i1} %t, 0123 %obit = extractvalue {i64, i1} %t, 1124 store i64 %val, ptr %res125 br i1 %obit, label %call, label %exit126 127call:128 tail call i64 @foo()129 br label %exit130 131exit:132 ret void133}134 135; ... and the same with the inverted direction.136define void @f8(i64 %dummy, i64 %a, ptr %res) {137; CHECK-LABEL: f8:138; CHECK: # %bb.0:139; CHECK-NEXT: alghsik %r0, %r3, -1140; CHECK-NEXT: stg %r0, 0(%r4)141; CHECK-NEXT: jgnle foo@PLT142; CHECK-NEXT: .LBB7_1: # %exit143; CHECK-NEXT: br %r14144 %t = call {i64, i1} @llvm.usub.with.overflow.i64(i64 %a, i64 1)145 %val = extractvalue {i64, i1} %t, 0146 %obit = extractvalue {i64, i1} %t, 1147 store i64 %val, ptr %res148 br i1 %obit, label %exit, label %call149 150call:151 tail call i64 @foo()152 br label %exit153 154exit:155 ret void156}157 158 159declare {i64, i1} @llvm.usub.with.overflow.i64(i64, i64) nounwind readnone160 161