128 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: brasl %r14, __extendhfsf2@PLT12; CHECK: brasl %r14, __extendhfsf2@PLT13; CHECK: brasl %r14, __extendhfsf2@PLT14; CHECK-SCALAR: maebr %f0, %f9, %f1015; CHECK-VECTOR: wfmasb %f0, %f0, %f8, %f1016; CHECK: brasl %r14, __truncsfhf2@PLT17; CHECK: br %r1418 %res = call half @llvm.fma.f16 (half %f1, half %f2, half %acc)19 ret half %res20}21 22define float @f1(float %f1, float %f2, float %acc) {23; CHECK-LABEL: f1:24; CHECK-SCALAR: maebr %f4, %f0, %f225; CHECK-SCALAR: ler %f0, %f426; CHECK-VECTOR: wfmasb %f0, %f0, %f2, %f427; CHECK: br %r1428 %res = call float @llvm.fma.f32 (float %f1, float %f2, float %acc)29 ret float %res30}31 32define float @f2(float %f1, ptr %ptr, float %acc) {33; CHECK-LABEL: f2:34; CHECK: maeb %f2, %f0, 0(%r2)35; CHECK-SCALAR: ler %f0, %f236; CHECK-VECTOR: ldr %f0, %f237; CHECK: br %r1438 %f2 = load float, ptr %ptr39 %res = call float @llvm.fma.f32 (float %f1, float %f2, float %acc)40 ret float %res41}42 43define float @f3(float %f1, ptr %base, float %acc) {44; CHECK-LABEL: f3:45; CHECK: maeb %f2, %f0, 4092(%r2)46; CHECK-SCALAR: ler %f0, %f247; CHECK-VECTOR: ldr %f0, %f248; CHECK: br %r1449 %ptr = getelementptr float, ptr %base, i64 102350 %f2 = load float, ptr %ptr51 %res = call float @llvm.fma.f32 (float %f1, float %f2, float %acc)52 ret float %res53}54 55define float @f4(float %f1, ptr %base, float %acc) {56; The important thing here is that we don't generate an out-of-range57; displacement. Other sequences besides this one would be OK.58;59; CHECK-LABEL: f4:60; CHECK: aghi %r2, 409661; CHECK: maeb %f2, %f0, 0(%r2)62; CHECK-SCALAR: ler %f0, %f263; CHECK-VECTOR: ldr %f0, %f264; CHECK: br %r1465 %ptr = getelementptr float, ptr %base, i64 102466 %f2 = load float, ptr %ptr67 %res = call float @llvm.fma.f32 (float %f1, float %f2, float %acc)68 ret float %res69}70 71define float @f5(float %f1, ptr %base, float %acc) {72; Here too the important thing is that we don't generate an out-of-range73; displacement. Other sequences besides this one would be OK.74;75; CHECK-LABEL: f5:76; CHECK: aghi %r2, -477; CHECK: maeb %f2, %f0, 0(%r2)78; CHECK-SCALAR: ler %f0, %f279; CHECK-VECTOR: ldr %f0, %f280; CHECK: br %r1481 %ptr = getelementptr float, ptr %base, i64 -182 %f2 = load float, ptr %ptr83 %res = call float @llvm.fma.f32 (float %f1, float %f2, float %acc)84 ret float %res85}86 87define float @f6(float %f1, ptr %base, i64 %index, float %acc) {88; CHECK-LABEL: f6:89; CHECK: sllg %r1, %r3, 290; CHECK: maeb %f2, %f0, 0(%r1,%r2)91; CHECK-SCALAR: ler %f0, %f292; CHECK-VECTOR: ldr %f0, %f293; CHECK: br %r1494 %ptr = getelementptr float, ptr %base, i64 %index95 %f2 = load float, ptr %ptr96 %res = call float @llvm.fma.f32 (float %f1, float %f2, float %acc)97 ret float %res98}99 100define float @f7(float %f1, ptr %base, i64 %index, float %acc) {101; CHECK-LABEL: f7:102; CHECK: sllg %r1, %r3, 2103; CHECK: maeb %f2, %f0, 4092({{%r1,%r2|%r2,%r1}})104; CHECK-SCALAR: ler %f0, %f2105; CHECK-VECTOR: ldr %f0, %f2106; CHECK: br %r14107 %index2 = add i64 %index, 1023108 %ptr = getelementptr float, ptr %base, i64 %index2109 %f2 = load float, ptr %ptr110 %res = call float @llvm.fma.f32 (float %f1, float %f2, float %acc)111 ret float %res112}113 114define float @f8(float %f1, ptr %base, i64 %index, float %acc) {115; CHECK-LABEL: f8:116; CHECK: sllg %r1, %r3, 2117; CHECK: lay %r1, 4096({{%r1,%r2|%r2,%r1}})118; CHECK: maeb %f2, %f0, 0(%r1)119; CHECK-SCALAR: ler %f0, %f2120; CHECK-VECTOR: ldr %f0, %f2121; CHECK: br %r14122 %index2 = add i64 %index, 1024123 %ptr = getelementptr float, ptr %base, i64 %index2124 %f2 = load float, ptr %ptr125 %res = call float @llvm.fma.f32 (float %f1, float %f2, float %acc)126 ret float %res127}128