brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.9 KiB · 6b285a4 Raw
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