brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.7 KiB · f4b043f Raw
181 lines · plain
1; Test multiplications between an i64 and a sign-extended i32.2;3; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s4 5declare i64 @foo()6 7; Check MSGFR.8define i64 @f1(i64 %a, i32 %b) {9; CHECK-LABEL: f1:10; CHECK: msgfr %r2, %r311; CHECK: br %r1412  %bext = sext i32 %b to i6413  %mul = mul i64 %a, %bext14  ret i64 %mul15}16 17; Check MSGF with no displacement.18define i64 @f2(i64 %a, ptr %src) {19; CHECK-LABEL: f2:20; CHECK: msgf %r2, 0(%r3)21; CHECK: br %r1422  %b = load i32, ptr %src23  %bext = sext i32 %b to i6424  %mul = mul i64 %a, %bext25  ret i64 %mul26}27 28; Check the high end of the aligned MSGF range.29define i64 @f3(i64 %a, ptr %src) {30; CHECK-LABEL: f3:31; CHECK: msgf %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  %mul = mul i64 %a, %bext37  ret i64 %mul38}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: msgf %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  %mul = mul i64 %a, %bext51  ret i64 %mul52}53 54; Check the high end of the negative aligned MSGF range.55define i64 @f5(i64 %a, ptr %src) {56; CHECK-LABEL: f5:57; CHECK: msgf %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  %mul = mul i64 %a, %bext63  ret i64 %mul64}65 66; Check the low end of the MSGF range.67define i64 @f6(i64 %a, ptr %src) {68; CHECK-LABEL: f6:69; CHECK: msgf %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  %mul = mul i64 %a, %bext75  ret i64 %mul76}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: msgf %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  %mul = mul i64 %a, %bext89  ret i64 %mul90}91 92; Check that MSGF allows an index.93define i64 @f8(i64 %a, i64 %src, i64 %index) {94; CHECK-LABEL: f8:95; CHECK: msgf %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  %mul = mul i64 %a, %bext103  ret i64 %mul104}105 106; Check that multiplications of spilled values can use MSGF rather than MSGFR.107define i64 @f9(ptr %ptr0) {108; CHECK-LABEL: f9:109; CHECK: brasl %r14, foo@PLT110; CHECK: msgf %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 = 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  %mul0 = mul i64 %ret, %ext0169  %mul1 = mul i64 %mul0, %ext1170  %mul2 = mul i64 %mul1, %ext2171  %mul3 = mul i64 %mul2, %ext3172  %mul4 = mul i64 %mul3, %ext4173  %mul5 = mul i64 %mul4, %ext5174  %mul6 = mul i64 %mul5, %ext6175  %mul7 = mul i64 %mul6, %ext7176  %mul8 = mul i64 %mul7, %ext8177  %mul9 = mul i64 %mul8, %ext9178 179  ret i64 %mul9180}181