175 lines · plain
1; Test 32-bit multiplication in which the second operand is variable.2;3; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s4 5declare i32 @foo()6 7; Check MSR.8define i32 @f1(i32 %a, i32 %b) {9; CHECK-LABEL: f1:10; CHECK: msr %r2, %r311; CHECK: br %r1412 %mul = mul i32 %a, %b13 ret i32 %mul14}15 16; Check the low end of the MS range.17define i32 @f2(i32 %a, ptr %src) {18; CHECK-LABEL: f2:19; CHECK: ms %r2, 0(%r3)20; CHECK: br %r1421 %b = load i32, ptr %src22 %mul = mul i32 %a, %b23 ret i32 %mul24}25 26; Check the high end of the aligned MS range.27define i32 @f3(i32 %a, ptr %src) {28; CHECK-LABEL: f3:29; CHECK: ms %r2, 4092(%r3)30; CHECK: br %r1431 %ptr = getelementptr i32, ptr %src, i64 102332 %b = load i32, ptr %ptr33 %mul = mul i32 %a, %b34 ret i32 %mul35}36 37; Check the next word up, which should use MSY instead of MS.38define i32 @f4(i32 %a, ptr %src) {39; CHECK-LABEL: f4:40; CHECK: msy %r2, 4096(%r3)41; CHECK: br %r1442 %ptr = getelementptr i32, ptr %src, i64 102443 %b = load i32, ptr %ptr44 %mul = mul i32 %a, %b45 ret i32 %mul46}47 48; Check the high end of the aligned MSY range.49define i32 @f5(i32 %a, ptr %src) {50; CHECK-LABEL: f5:51; CHECK: msy %r2, 524284(%r3)52; CHECK: br %r1453 %ptr = getelementptr i32, ptr %src, i64 13107154 %b = load i32, ptr %ptr55 %mul = mul i32 %a, %b56 ret i32 %mul57}58 59; Check the next word up, which needs separate address logic.60; Other sequences besides this one would be OK.61define i32 @f6(i32 %a, ptr %src) {62; CHECK-LABEL: f6:63; CHECK: agfi %r3, 52428864; CHECK: ms %r2, 0(%r3)65; CHECK: br %r1466 %ptr = getelementptr i32, ptr %src, i64 13107267 %b = load i32, ptr %ptr68 %mul = mul i32 %a, %b69 ret i32 %mul70}71 72; Check the high end of the negative aligned MSY range.73define i32 @f7(i32 %a, ptr %src) {74; CHECK-LABEL: f7:75; CHECK: msy %r2, -4(%r3)76; CHECK: br %r1477 %ptr = getelementptr i32, ptr %src, i64 -178 %b = load i32, ptr %ptr79 %mul = mul i32 %a, %b80 ret i32 %mul81}82 83; Check the low end of the MSY range.84define i32 @f8(i32 %a, ptr %src) {85; CHECK-LABEL: f8:86; CHECK: msy %r2, -524288(%r3)87; CHECK: br %r1488 %ptr = getelementptr i32, ptr %src, i64 -13107289 %b = load i32, ptr %ptr90 %mul = mul i32 %a, %b91 ret i32 %mul92}93 94; Check the next word down, which needs separate address logic.95; Other sequences besides this one would be OK.96define i32 @f9(i32 %a, ptr %src) {97; CHECK-LABEL: f9:98; CHECK: agfi %r3, -52429299; CHECK: ms %r2, 0(%r3)100; CHECK: br %r14101 %ptr = getelementptr i32, ptr %src, i64 -131073102 %b = load i32, ptr %ptr103 %mul = mul i32 %a, %b104 ret i32 %mul105}106 107; Check that MS allows an index.108define i32 @f10(i32 %a, i64 %src, i64 %index) {109; CHECK-LABEL: f10:110; CHECK: ms %r2, 4092({{%r4,%r3|%r3,%r4}})111; CHECK: br %r14112 %add1 = add i64 %src, %index113 %add2 = add i64 %add1, 4092114 %ptr = inttoptr i64 %add2 to ptr115 %b = load i32, ptr %ptr116 %mul = mul i32 %a, %b117 ret i32 %mul118}119 120; Check that MSY allows an index.121define i32 @f11(i32 %a, i64 %src, i64 %index) {122; CHECK-LABEL: f11:123; CHECK: msy %r2, 4096({{%r4,%r3|%r3,%r4}})124; CHECK: br %r14125 %add1 = add i64 %src, %index126 %add2 = add i64 %add1, 4096127 %ptr = inttoptr i64 %add2 to ptr128 %b = load i32, ptr %ptr129 %mul = mul i32 %a, %b130 ret i32 %mul131}132 133; Check that multiplications of spilled values can use MS rather than MSR.134define i32 @f12(ptr %ptr0) {135; CHECK-LABEL: f12:136; CHECK: brasl %r14, foo@PLT137; CHECK: ms %r2, 16{{[04]}}(%r15)138; CHECK: br %r14139 %ptr1 = getelementptr i32, ptr %ptr0, i64 2140 %ptr2 = getelementptr i32, ptr %ptr0, i64 4141 %ptr3 = getelementptr i32, ptr %ptr0, i64 6142 %ptr4 = getelementptr i32, ptr %ptr0, i64 8143 %ptr5 = getelementptr i32, ptr %ptr0, i64 10144 %ptr6 = getelementptr i32, ptr %ptr0, i64 12145 %ptr7 = getelementptr i32, ptr %ptr0, i64 14146 %ptr8 = getelementptr i32, ptr %ptr0, i64 16147 %ptr9 = getelementptr i32, ptr %ptr0, i64 18148 149 %val0 = load i32, ptr %ptr0150 %val1 = load i32, ptr %ptr1151 %val2 = load i32, ptr %ptr2152 %val3 = load i32, ptr %ptr3153 %val4 = load i32, ptr %ptr4154 %val5 = load i32, ptr %ptr5155 %val6 = load i32, ptr %ptr6156 %val7 = load i32, ptr %ptr7157 %val8 = load i32, ptr %ptr8158 %val9 = load i32, ptr %ptr9159 160 %ret = call i32 @foo()161 162 %mul0 = mul i32 %ret, %val0163 %mul1 = mul i32 %mul0, %val1164 %mul2 = mul i32 %mul1, %val2165 %mul3 = mul i32 %mul2, %val3166 %mul4 = mul i32 %mul3, %val4167 %mul5 = mul i32 %mul4, %val5168 %mul6 = mul i32 %mul5, %val6169 %mul7 = mul i32 %mul6, %val7170 %mul8 = mul i32 %mul7, %val8171 %mul9 = mul i32 %mul8, %val9172 173 ret i32 %mul9174}175