brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.7 KiB · 4bdc65c Raw
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