brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.7 KiB · b3dadbb Raw
181 lines · plain
1; Test subtractions of a zero-extended i32 from an i64.2;3; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s4 5declare i64 @foo()6 7; Check SLGFR.8define i64 @f1(i64 %a, i32 %b) {9; CHECK-LABEL: f1:10; CHECK: slgfr %r2, %r311; CHECK: br %r1412  %bext = zext i32 %b to i6413  %sub = sub i64 %a, %bext14  ret i64 %sub15}16 17; Check SLGF with no displacement.18define i64 @f2(i64 %a, ptr %src) {19; CHECK-LABEL: f2:20; CHECK: slgf %r2, 0(%r3)21; CHECK: br %r1422  %b = load i32, ptr %src23  %bext = zext i32 %b to i6424  %sub = sub i64 %a, %bext25  ret i64 %sub26}27 28; Check the high end of the aligned SLGF range.29define i64 @f3(i64 %a, ptr %src) {30; CHECK-LABEL: f3:31; CHECK: slgf %r2, 524284(%r3)32; CHECK: br %r1433  %ptr = getelementptr i32, ptr %src, i64 13107134  %b = load i32, ptr %ptr35  %bext = zext 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: slgf %r2, 0(%r3)46; CHECK: br %r1447  %ptr = getelementptr i32, ptr %src, i64 13107248  %b = load i32, ptr %ptr49  %bext = zext i32 %b to i6450  %sub = sub i64 %a, %bext51  ret i64 %sub52}53 54; Check the high end of the negative aligned SLGF range.55define i64 @f5(i64 %a, ptr %src) {56; CHECK-LABEL: f5:57; CHECK: slgf %r2, -4(%r3)58; CHECK: br %r1459  %ptr = getelementptr i32, ptr %src, i64 -160  %b = load i32, ptr %ptr61  %bext = zext i32 %b to i6462  %sub = sub i64 %a, %bext63  ret i64 %sub64}65 66; Check the low end of the SLGF range.67define i64 @f6(i64 %a, ptr %src) {68; CHECK-LABEL: f6:69; CHECK: slgf %r2, -524288(%r3)70; CHECK: br %r1471  %ptr = getelementptr i32, ptr %src, i64 -13107272  %b = load i32, ptr %ptr73  %bext = zext 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: slgf %r2, 0(%r3)84; CHECK: br %r1485  %ptr = getelementptr i32, ptr %src, i64 -13107386  %b = load i32, ptr %ptr87  %bext = zext i32 %b to i6488  %sub = sub i64 %a, %bext89  ret i64 %sub90}91 92; Check that SLGF allows an index.93define i64 @f8(i64 %a, i64 %src, i64 %index) {94; CHECK-LABEL: f8:95; CHECK: slgf %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 = zext i32 %b to i64102  %sub = sub i64 %a, %bext103  ret i64 %sub104}105 106; Check that subtractions of spilled values can use SLGF rather than SLGFR.107define i64 @f9(ptr %ptr0) {108; CHECK-LABEL: f9:109; CHECK: brasl %r14, foo@PLT110; CHECK: slgf %r2, 16{{[04]}}(%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 = zext i32 %frob0 to i64158  %ext1 = zext i32 %frob1 to i64159  %ext2 = zext i32 %frob2 to i64160  %ext3 = zext i32 %frob3 to i64161  %ext4 = zext i32 %frob4 to i64162  %ext5 = zext i32 %frob5 to i64163  %ext6 = zext i32 %frob6 to i64164  %ext7 = zext i32 %frob7 to i64165  %ext8 = zext i32 %frob8 to i64166  %ext9 = zext 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