105 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mattr=fma4 | FileCheck %s3 4target triple = "x86_64-unknown-unknown"5 6declare <4 x float> @llvm.x86.fma4.vfmadd.ss(<4 x float>, <4 x float>, <4 x float>)7declare <2 x double> @llvm.x86.fma4.vfmadd.sd(<2 x double>, <2 x double>, <2 x double>)8 9define void @fmadd_aab_ss(ptr %a, ptr %b) {10; CHECK-LABEL: fmadd_aab_ss:11; CHECK: # %bb.0:12; CHECK-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero13; CHECK-NEXT: vfmaddss {{.*#+}} xmm0 = (xmm0 * xmm0) + mem14; CHECK-NEXT: vmovss %xmm0, (%rdi)15; CHECK-NEXT: retq16 %a.val = load float, ptr %a17 %av0 = insertelement <4 x float> undef, float %a.val, i32 018 %av1 = insertelement <4 x float> %av0, float 0.000000e+00, i32 119 %av2 = insertelement <4 x float> %av1, float 0.000000e+00, i32 220 %av = insertelement <4 x float> %av2, float 0.000000e+00, i32 321 22 %b.val = load float, ptr %b23 %bv0 = insertelement <4 x float> undef, float %b.val, i32 024 %bv1 = insertelement <4 x float> %bv0, float 0.000000e+00, i32 125 %bv2 = insertelement <4 x float> %bv1, float 0.000000e+00, i32 226 %bv = insertelement <4 x float> %bv2, float 0.000000e+00, i32 327 28 %vr = call <4 x float> @llvm.x86.fma4.vfmadd.ss(<4 x float> %av, <4 x float> %av, <4 x float> %bv)29 30 %sr = extractelement <4 x float> %vr, i32 031 store float %sr, ptr %a32 ret void33}34 35define void @fmadd_aba_ss(ptr %a, ptr %b) {36; CHECK-LABEL: fmadd_aba_ss:37; CHECK: # %bb.0:38; CHECK-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero39; CHECK-NEXT: vfmaddss {{.*#+}} xmm0 = (xmm0 * mem) + xmm040; CHECK-NEXT: vmovss %xmm0, (%rdi)41; CHECK-NEXT: retq42 %a.val = load float, ptr %a43 %av0 = insertelement <4 x float> undef, float %a.val, i32 044 %av1 = insertelement <4 x float> %av0, float 0.000000e+00, i32 145 %av2 = insertelement <4 x float> %av1, float 0.000000e+00, i32 246 %av = insertelement <4 x float> %av2, float 0.000000e+00, i32 347 48 %b.val = load float, ptr %b49 %bv0 = insertelement <4 x float> undef, float %b.val, i32 050 %bv1 = insertelement <4 x float> %bv0, float 0.000000e+00, i32 151 %bv2 = insertelement <4 x float> %bv1, float 0.000000e+00, i32 252 %bv = insertelement <4 x float> %bv2, float 0.000000e+00, i32 353 54 %vr = call <4 x float> @llvm.x86.fma4.vfmadd.ss(<4 x float> %av, <4 x float> %bv, <4 x float> %av)55 56 %sr = extractelement <4 x float> %vr, i32 057 store float %sr, ptr %a58 ret void59}60 61define void @fmadd_aab_sd(ptr %a, ptr %b) {62; CHECK-LABEL: fmadd_aab_sd:63; CHECK: # %bb.0:64; CHECK-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero65; CHECK-NEXT: vfmaddsd {{.*#+}} xmm0 = (xmm0 * xmm0) + mem66; CHECK-NEXT: vmovsd %xmm0, (%rdi)67; CHECK-NEXT: retq68 %a.val = load double, ptr %a69 %av0 = insertelement <2 x double> undef, double %a.val, i32 070 %av = insertelement <2 x double> %av0, double 0.000000e+00, i32 171 72 %b.val = load double, ptr %b73 %bv0 = insertelement <2 x double> undef, double %b.val, i32 074 %bv = insertelement <2 x double> %bv0, double 0.000000e+00, i32 175 76 %vr = call <2 x double> @llvm.x86.fma4.vfmadd.sd(<2 x double> %av, <2 x double> %av, <2 x double> %bv)77 78 %sr = extractelement <2 x double> %vr, i32 079 store double %sr, ptr %a80 ret void81}82 83define void @fmadd_aba_sd(ptr %a, ptr %b) {84; CHECK-LABEL: fmadd_aba_sd:85; CHECK: # %bb.0:86; CHECK-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero87; CHECK-NEXT: vfmaddsd {{.*#+}} xmm0 = (xmm0 * mem) + xmm088; CHECK-NEXT: vmovsd %xmm0, (%rdi)89; CHECK-NEXT: retq90 %a.val = load double, ptr %a91 %av0 = insertelement <2 x double> undef, double %a.val, i32 092 %av = insertelement <2 x double> %av0, double 0.000000e+00, i32 193 94 %b.val = load double, ptr %b95 %bv0 = insertelement <2 x double> undef, double %b.val, i32 096 %bv = insertelement <2 x double> %bv0, double 0.000000e+00, i32 197 98 %vr = call <2 x double> @llvm.x86.fma4.vfmadd.sd(<2 x double> %av, <2 x double> %bv, <2 x double> %av)99 100 %sr = extractelement <2 x double> %vr, i32 0101 store double %sr, ptr %a102 ret void103}104 105