126 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 32; Test 64-bit subtraction in which the second operand is constant.3;4; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s5 6declare i64 @foo()7 8; Check addition of 1.9define zeroext i1 @f1(i64 %dummy, i64 %a, ptr %res) {10; CHECK-LABEL: f1:11; CHECK: # %bb.0:12; CHECK-NEXT: slgfi %r3, 113; CHECK-NEXT: ipm %r014; CHECK-NEXT: afi %r0, -53687091215; CHECK-NEXT: risbg %r2, %r0, 63, 191, 3316; CHECK-NEXT: stg %r3, 0(%r4)17; CHECK-NEXT: br %r1418 %t = call {i64, i1} @llvm.usub.with.overflow.i64(i64 %a, i64 1)19 %val = extractvalue {i64, i1} %t, 020 %obit = extractvalue {i64, i1} %t, 121 store i64 %val, ptr %res22 ret i1 %obit23}24 25; Check the high end of the SLGFI range.26define zeroext i1 @f2(i64 %dummy, i64 %a, ptr %res) {27; CHECK-LABEL: f2:28; CHECK: # %bb.0:29; CHECK-NEXT: slgfi %r3, 429496729530; CHECK-NEXT: ipm %r031; CHECK-NEXT: afi %r0, -53687091232; CHECK-NEXT: risbg %r2, %r0, 63, 191, 3333; CHECK-NEXT: stg %r3, 0(%r4)34; CHECK-NEXT: br %r1435 %t = call {i64, i1} @llvm.usub.with.overflow.i64(i64 %a, i64 4294967295)36 %val = extractvalue {i64, i1} %t, 037 %obit = extractvalue {i64, i1} %t, 138 store i64 %val, ptr %res39 ret i1 %obit40}41 42; Check the next value up, which must be loaded into a register first.43define zeroext i1 @f3(i64 %dummy, i64 %a, ptr %res) {44; CHECK-LABEL: f3:45; CHECK: # %bb.0:46; CHECK-NEXT: llihl %r0, 147; CHECK-NEXT: slgr %r3, %r048; CHECK-NEXT: ipm %r049; CHECK-NEXT: afi %r0, -53687091250; CHECK-NEXT: risbg %r2, %r0, 63, 191, 3351; CHECK-NEXT: stg %r3, 0(%r4)52; CHECK-NEXT: br %r1453 %t = call {i64, i1} @llvm.usub.with.overflow.i64(i64 %a, i64 4294967296)54 %val = extractvalue {i64, i1} %t, 055 %obit = extractvalue {i64, i1} %t, 156 store i64 %val, ptr %res57 ret i1 %obit58}59 60; Likewise for negative values.61define zeroext i1 @f4(i64 %dummy, i64 %a, ptr %res) {62; CHECK-LABEL: f4:63; CHECK: # %bb.0:64; CHECK-NEXT: lghi %r0, -165; CHECK-NEXT: slgr %r3, %r066; CHECK-NEXT: ipm %r067; CHECK-NEXT: afi %r0, -53687091268; CHECK-NEXT: risbg %r2, %r0, 63, 191, 3369; CHECK-NEXT: stg %r3, 0(%r4)70; CHECK-NEXT: br %r1471 %t = call {i64, i1} @llvm.usub.with.overflow.i64(i64 %a, i64 -1)72 %val = extractvalue {i64, i1} %t, 073 %obit = extractvalue {i64, i1} %t, 174 store i64 %val, ptr %res75 ret i1 %obit76}77 78; Check using the overflow result for a branch.79define void @f5(i64 %dummy, i64 %a, ptr %res) {80; CHECK-LABEL: f5:81; CHECK: # %bb.0:82; CHECK-NEXT: slgfi %r3, 183; CHECK-NEXT: stg %r3, 0(%r4)84; CHECK-NEXT: jgle foo@PLT85; CHECK-NEXT: .LBB4_1: # %exit86; CHECK-NEXT: br %r1487 %t = call {i64, i1} @llvm.usub.with.overflow.i64(i64 %a, i64 1)88 %val = extractvalue {i64, i1} %t, 089 %obit = extractvalue {i64, i1} %t, 190 store i64 %val, ptr %res91 br i1 %obit, label %call, label %exit92 93call:94 tail call i64 @foo()95 br label %exit96 97exit:98 ret void99}100 101; ... and the same with the inverted direction.102define void @f6(i64 %dummy, i64 %a, ptr %res) {103; CHECK-LABEL: f6:104; CHECK: # %bb.0:105; CHECK-NEXT: slgfi %r3, 1106; CHECK-NEXT: stg %r3, 0(%r4)107; CHECK-NEXT: jgnle foo@PLT108; CHECK-NEXT: .LBB5_1: # %exit109; CHECK-NEXT: br %r14110 %t = call {i64, i1} @llvm.usub.with.overflow.i64(i64 %a, i64 1)111 %val = extractvalue {i64, i1} %t, 0112 %obit = extractvalue {i64, i1} %t, 1113 store i64 %val, ptr %res114 br i1 %obit, label %exit, label %call115 116call:117 tail call i64 @foo()118 br label %exit119 120exit:121 ret void122}123 124declare {i64, i1} @llvm.usub.with.overflow.i64(i64, i64) nounwind readnone125 126