brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.3 KiB · c5e58e9 Raw
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