79 lines · plain
1; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z14 | FileCheck %s2 3declare double @llvm.fma.f64(double %f1, double %f2, double %f3)4declare float @llvm.fma.f32(float %f1, float %f2, float %f3)5declare half @llvm.fma.f16(half %f1, half %f2, half %f3)6 7define double @f1(double %f1, double %f2, double %acc) {8; CHECK-LABEL: f1:9; CHECK: wfnmadb %f0, %f0, %f2, %f410; CHECK: br %r1411 %res = call double @llvm.fma.f64 (double %f1, double %f2, double %acc)12 %negres = fneg double %res13 ret double %negres14}15 16define double @f2(double %f1, double %f2, double %acc) {17; CHECK-LABEL: f2:18; CHECK: wfnmsdb %f0, %f0, %f2, %f419; CHECK: br %r1420 %negacc = fneg double %acc21 %res = call double @llvm.fma.f64 (double %f1, double %f2, double %negacc)22 %negres = fneg double %res23 ret double %negres24}25 26define half @f3_half(half %f1, half %f2, half %acc) {27; CHECK-LABEL: f3_half:28; CHECK: brasl %r14, __extendhfsf2@PLT29; CHECK: brasl %r14, __extendhfsf2@PLT30; CHECK: brasl %r14, __extendhfsf2@PLT31; CHECK: wfmasb %f0, %f0, %f8, %f1032; CHECK: brasl %r14, __truncsfhf2@PLT33; CHECK-NOT: brasl34; CHECK: lcdfr %f0, %f035; CHECK-NEXT: lmg36; CHECK-NEXT: br %r1437 %res = call half @llvm.fma.f16 (half %f1, half %f2, half %acc)38 %negres = fneg half %res39 ret half %negres40}41 42define float @f3(float %f1, float %f2, float %acc) {43; CHECK-LABEL: f3:44; CHECK: wfnmasb %f0, %f0, %f2, %f445; CHECK: br %r1446 %res = call float @llvm.fma.f32 (float %f1, float %f2, float %acc)47 %negres = fneg float %res48 ret float %negres49}50 51define half @f4_half(half %f1, half %f2, half %acc) {52; CHECK-LABEL: f4_half:53; CHECK-NOT: brasl54; CHECK: lcdfr %f0, %f455; CHECK: brasl %r14, __extendhfsf2@PLT56; CHECK: brasl %r14, __extendhfsf2@PLT57; CHECK: brasl %r14, __extendhfsf2@PLT58; CHECK: wfmasb %f0, %f0, %f8, %f1059; CHECK: brasl %r14, __truncsfhf2@PLT60; CHECK-NOT: brasl61; CHECK: lcdfr %f0, %f062; CHECK-NEXT: lmg63; CHECK-NEXT: br %r1464 %negacc = fneg half %acc65 %res = call half @llvm.fma.f16 (half %f1, half %f2, half %negacc)66 %negres = fneg half %res67 ret half %negres68}69 70define float @f4(float %f1, float %f2, float %acc) {71; CHECK-LABEL: f4:72; CHECK: wfnmssb %f0, %f0, %f2, %f473; CHECK: br %r1474 %negacc = fneg float %acc75 %res = call float @llvm.fma.f32 (float %f1, float %f2, float %negacc)76 %negres = fneg float %res77 ret float %negres78}79