brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.2 KiB · e739bdd Raw
139 lines · plain
1; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z10 \2; RUN:   | FileCheck -check-prefix=CHECK -check-prefix=CHECK-SCALAR %s3; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z14 \4; RUN:   | FileCheck -check-prefix=CHECK -check-prefix=CHECK-VECTOR %s5 6declare half @llvm.fma.f16(half %f1, half %f2, half %f3)7declare float @llvm.fma.f32(float %f1, float %f2, float %f3)8 9define half @f0(half %f1, half %f2, half %acc) {10; CHECK-LABEL: f0:11; CHECK-NOT: brasl12; CHECK: lcdfr %f{{[0-9]+}}, %f413; CHECK: brasl %r14, __extendhfsf2@PLT14; CHECK: brasl %r14, __extendhfsf2@PLT15; CHECK: brasl %r14, __extendhfsf2@PLT16; CHECK-SCALAR: maebr %f0, %f8, %f1017; CHECK-VECTOR: wfmasb %f0, %f0, %f8, %f1018; CHECK: brasl %r14, __truncsfhf2@PLT19; CHECK: br %r1420  %negacc = fneg half %acc21  %res = call half @llvm.fma.f16 (half %f1, half %f2, half %negacc)22  ret half %res23}24 25define float @f1(float %f1, float %f2, float %acc) {26; CHECK-LABEL: f1:27; CHECK-SCALAR: msebr %f4, %f0, %f228; CHECK-SCALAR: ler %f0, %f429; CHECK-VECTOR: wfmssb %f0, %f0, %f2, %f430; CHECK: br %r1431  %negacc = fneg float %acc32  %res = call float @llvm.fma.f32 (float %f1, float %f2, float %negacc)33  ret float %res34}35 36define float @f2(float %f1, ptr %ptr, float %acc) {37; CHECK-LABEL: f2:38; CHECK: mseb %f2, %f0, 0(%r2)39; CHECK-SCALAR: ler %f0, %f240; CHECK-VECTOR: ldr %f0, %f241; CHECK: br %r1442  %f2 = load float, ptr %ptr43  %negacc = fneg float %acc44  %res = call float @llvm.fma.f32 (float %f1, float %f2, float %negacc)45  ret float %res46}47 48define float @f3(float %f1, ptr %base, float %acc) {49; CHECK-LABEL: f3:50; CHECK: mseb %f2, %f0, 4092(%r2)51; CHECK-SCALAR: ler %f0, %f252; CHECK-VECTOR: ldr %f0, %f253; CHECK: br %r1454  %ptr = getelementptr float, ptr %base, i64 102355  %f2 = load float, ptr %ptr56  %negacc = fneg float %acc57  %res = call float @llvm.fma.f32 (float %f1, float %f2, float %negacc)58  ret float %res59}60 61define float @f4(float %f1, ptr %base, float %acc) {62; The important thing here is that we don't generate an out-of-range63; displacement.  Other sequences besides this one would be OK.64;65; CHECK-LABEL: f4:66; CHECK: aghi %r2, 409667; CHECK: mseb %f2, %f0, 0(%r2)68; CHECK-SCALAR: ler %f0, %f269; CHECK-VECTOR: ldr %f0, %f270; CHECK: br %r1471  %ptr = getelementptr float, ptr %base, i64 102472  %f2 = load float, ptr %ptr73  %negacc = fneg float %acc74  %res = call float @llvm.fma.f32 (float %f1, float %f2, float %negacc)75  ret float %res76}77 78define float @f5(float %f1, ptr %base, float %acc) {79; Here too the important thing is that we don't generate an out-of-range80; displacement.  Other sequences besides this one would be OK.81;82; CHECK-LABEL: f5:83; CHECK: aghi %r2, -484; CHECK: mseb %f2, %f0, 0(%r2)85; CHECK-SCALAR: ler %f0, %f286; CHECK-VECTOR: ldr %f0, %f287; CHECK: br %r1488  %ptr = getelementptr float, ptr %base, i64 -189  %f2 = load float, ptr %ptr90  %negacc = fneg float %acc91  %res = call float @llvm.fma.f32 (float %f1, float %f2, float %negacc)92  ret float %res93}94 95define float @f6(float %f1, ptr %base, i64 %index, float %acc) {96; CHECK-LABEL: f6:97; CHECK: sllg %r1, %r3, 298; CHECK: mseb %f2, %f0, 0(%r1,%r2)99; CHECK-SCALAR: ler %f0, %f2100; CHECK-VECTOR: ldr %f0, %f2101; CHECK: br %r14102  %ptr = getelementptr float, ptr %base, i64 %index103  %f2 = load float, ptr %ptr104  %negacc = fneg float %acc105  %res = call float @llvm.fma.f32 (float %f1, float %f2, float %negacc)106  ret float %res107}108 109define float @f7(float %f1, ptr %base, i64 %index, float %acc) {110; CHECK-LABEL: f7:111; CHECK: sllg %r1, %r3, 2112; CHECK: mseb %f2, %f0, 4092({{%r1,%r2|%r2,%r1}})113; CHECK-SCALAR: ler %f0, %f2114; CHECK-VECTOR: ldr %f0, %f2115; CHECK: br %r14116  %index2 = add i64 %index, 1023117  %ptr = getelementptr float, ptr %base, i64 %index2118  %f2 = load float, ptr %ptr119  %negacc = fneg float %acc120  %res = call float @llvm.fma.f32 (float %f1, float %f2, float %negacc)121  ret float %res122}123 124define float @f8(float %f1, ptr %base, i64 %index, float %acc) {125; CHECK-LABEL: f8:126; CHECK: sllg %r1, %r3, 2127; CHECK: lay %r1, 4096({{%r1,%r2|%r2,%r1}})128; CHECK: mseb %f2, %f0, 0(%r1)129; CHECK-SCALAR: ler %f0, %f2130; CHECK-VECTOR: ldr %f0, %f2131; CHECK: br %r14132  %index2 = add i64 %index, 1024133  %ptr = getelementptr float, ptr %base, i64 %index2134  %f2 = load float, ptr %ptr135  %negacc = fneg float %acc136  %res = call float @llvm.fma.f32 (float %f1, float %f2, float %negacc)137  ret float %res138}139