181 lines · plain
1; Test subtractions of a sign-extended i32 from an i64.2;3; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s4 5declare i64 @foo()6 7; Check SGFR.8define i64 @f1(i64 %a, i32 %b) {9; CHECK-LABEL: f1:10; CHECK: sgfr %r2, %r311; CHECK: br %r1412 %bext = sext i32 %b to i6413 %sub = sub i64 %a, %bext14 ret i64 %sub15}16 17; Check SGF with no displacement.18define i64 @f2(i64 %a, ptr %src) {19; CHECK-LABEL: f2:20; CHECK: sgf %r2, 0(%r3)21; CHECK: br %r1422 %b = load i32, ptr %src23 %bext = sext i32 %b to i6424 %sub = sub i64 %a, %bext25 ret i64 %sub26}27 28; Check the high end of the aligned SGF range.29define i64 @f3(i64 %a, ptr %src) {30; CHECK-LABEL: f3:31; CHECK: sgf %r2, 524284(%r3)32; CHECK: br %r1433 %ptr = getelementptr i32, ptr %src, i64 13107134 %b = load i32, ptr %ptr35 %bext = sext i32 %b to i6436 %sub = sub i64 %a, %bext37 ret i64 %sub38}39 40; Check the next word up, which needs separate address logic.41; Other sequences besides this one would be OK.42define i64 @f4(i64 %a, ptr %src) {43; CHECK-LABEL: f4:44; CHECK: agfi %r3, 52428845; CHECK: sgf %r2, 0(%r3)46; CHECK: br %r1447 %ptr = getelementptr i32, ptr %src, i64 13107248 %b = load i32, ptr %ptr49 %bext = sext i32 %b to i6450 %sub = sub i64 %a, %bext51 ret i64 %sub52}53 54; Check the high end of the negative aligned SGF range.55define i64 @f5(i64 %a, ptr %src) {56; CHECK-LABEL: f5:57; CHECK: sgf %r2, -4(%r3)58; CHECK: br %r1459 %ptr = getelementptr i32, ptr %src, i64 -160 %b = load i32, ptr %ptr61 %bext = sext i32 %b to i6462 %sub = sub i64 %a, %bext63 ret i64 %sub64}65 66; Check the low end of the SGF range.67define i64 @f6(i64 %a, ptr %src) {68; CHECK-LABEL: f6:69; CHECK: sgf %r2, -524288(%r3)70; CHECK: br %r1471 %ptr = getelementptr i32, ptr %src, i64 -13107272 %b = load i32, ptr %ptr73 %bext = sext i32 %b to i6474 %sub = sub i64 %a, %bext75 ret i64 %sub76}77 78; Check the next word down, which needs separate address logic.79; Other sequences besides this one would be OK.80define i64 @f7(i64 %a, ptr %src) {81; CHECK-LABEL: f7:82; CHECK: agfi %r3, -52429283; CHECK: sgf %r2, 0(%r3)84; CHECK: br %r1485 %ptr = getelementptr i32, ptr %src, i64 -13107386 %b = load i32, ptr %ptr87 %bext = sext i32 %b to i6488 %sub = sub i64 %a, %bext89 ret i64 %sub90}91 92; Check that SGF allows an index.93define i64 @f8(i64 %a, i64 %src, i64 %index) {94; CHECK-LABEL: f8:95; CHECK: sgf %r2, 524284({{%r4,%r3|%r3,%r4}})96; CHECK: br %r1497 %add1 = add i64 %src, %index98 %add2 = add i64 %add1, 52428499 %ptr = inttoptr i64 %add2 to ptr100 %b = load i32, ptr %ptr101 %bext = sext i32 %b to i64102 %sub = sub i64 %a, %bext103 ret i64 %sub104}105 106; Check that subtractions of spilled values can use SGF rather than SGFR.107define i64 @f9(ptr %ptr0) {108; CHECK-LABEL: f9:109; CHECK: brasl %r14, foo@PLT110; CHECK: sgf %r2, 160(%r15)111; CHECK: br %r14112 %ptr1 = getelementptr i32, ptr %ptr0, i64 2113 %ptr2 = getelementptr i32, ptr %ptr0, i64 4114 %ptr3 = getelementptr i32, ptr %ptr0, i64 6115 %ptr4 = getelementptr i32, ptr %ptr0, i64 8116 %ptr5 = getelementptr i32, ptr %ptr0, i64 10117 %ptr6 = getelementptr i32, ptr %ptr0, i64 12118 %ptr7 = getelementptr i32, ptr %ptr0, i64 14119 %ptr8 = getelementptr i32, ptr %ptr0, i64 16120 %ptr9 = getelementptr i32, ptr %ptr0, i64 18121 122 %val0 = load i32, ptr %ptr0123 %val1 = load i32, ptr %ptr1124 %val2 = load i32, ptr %ptr2125 %val3 = load i32, ptr %ptr3126 %val4 = load i32, ptr %ptr4127 %val5 = load i32, ptr %ptr5128 %val6 = load i32, ptr %ptr6129 %val7 = load i32, ptr %ptr7130 %val8 = load i32, ptr %ptr8131 %val9 = load i32, ptr %ptr9132 133 %frob0 = add i32 %val0, 100134 %frob1 = add i32 %val1, 100135 %frob2 = add i32 %val2, 100136 %frob3 = add i32 %val3, 100137 %frob4 = add i32 %val4, 100138 %frob5 = add i32 %val5, 100139 %frob6 = add i32 %val6, 100140 %frob7 = add i32 %val7, 100141 %frob8 = add i32 %val8, 100142 %frob9 = add i32 %val9, 100143 144 store i32 %frob0, ptr %ptr0145 store i32 %frob1, ptr %ptr1146 store i32 %frob2, ptr %ptr2147 store i32 %frob3, ptr %ptr3148 store i32 %frob4, ptr %ptr4149 store i32 %frob5, ptr %ptr5150 store i32 %frob6, ptr %ptr6151 store i32 %frob7, ptr %ptr7152 store i32 %frob8, ptr %ptr8153 store i32 %frob9, ptr %ptr9154 155 %ret = call i64 @foo()156 157 %ext0 = sext i32 %frob0 to i64158 %ext1 = sext i32 %frob1 to i64159 %ext2 = sext i32 %frob2 to i64160 %ext3 = sext i32 %frob3 to i64161 %ext4 = sext i32 %frob4 to i64162 %ext5 = sext i32 %frob5 to i64163 %ext6 = sext i32 %frob6 to i64164 %ext7 = sext i32 %frob7 to i64165 %ext8 = sext i32 %frob8 to i64166 %ext9 = sext i32 %frob9 to i64167 168 %sub0 = sub i64 %ret, %ext0169 %sub1 = sub i64 %sub0, %ext1170 %sub2 = sub i64 %sub1, %ext2171 %sub3 = sub i64 %sub2, %ext3172 %sub4 = sub i64 %sub3, %ext4173 %sub5 = sub i64 %sub4, %ext5174 %sub6 = sub i64 %sub5, %ext6175 %sub7 = sub i64 %sub6, %ext7176 %sub8 = sub i64 %sub7, %ext8177 %sub9 = sub i64 %sub8, %ext9178 179 ret i64 %sub9180}181