brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.6 KiB · ff67440 Raw
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