1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=x86_64-pc-win32 -mcpu=core-avx2 | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Workerattributes #0 = { nounwind } 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Workerdeclare <4 x float> @llvm.x86.fma.vfmadd.ss(<4 x float>, <4 x float>, <4 x float>) 6*9880d681SAndroid Build Coastguard Workerdeclare <4 x float> @llvm.x86.fma.vfmsub.ss(<4 x float>, <4 x float>, <4 x float>) 7*9880d681SAndroid Build Coastguard Workerdeclare <4 x float> @llvm.x86.fma.vfnmadd.ss(<4 x float>, <4 x float>, <4 x float>) 8*9880d681SAndroid Build Coastguard Workerdeclare <4 x float> @llvm.x86.fma.vfnmsub.ss(<4 x float>, <4 x float>, <4 x float>) 9*9880d681SAndroid Build Coastguard Worker 10*9880d681SAndroid Build Coastguard Workerdeclare <2 x double> @llvm.x86.fma.vfmadd.sd(<2 x double>, <2 x double>, <2 x double>) 11*9880d681SAndroid Build Coastguard Workerdeclare <2 x double> @llvm.x86.fma.vfmsub.sd(<2 x double>, <2 x double>, <2 x double>) 12*9880d681SAndroid Build Coastguard Workerdeclare <2 x double> @llvm.x86.fma.vfnmadd.sd(<2 x double>, <2 x double>, <2 x double>) 13*9880d681SAndroid Build Coastguard Workerdeclare <2 x double> @llvm.x86.fma.vfnmsub.sd(<2 x double>, <2 x double>, <2 x double>) 14*9880d681SAndroid Build Coastguard Worker 15*9880d681SAndroid Build Coastguard Workerdefine void @fmadd_aab_ss(float* %a, float* %b) #0 { 16*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fmadd_aab_ss: 17*9880d681SAndroid Build Coastguard Worker; CHECK: vmovss (%rcx), %[[XMM:xmm[0-9]+]] 18*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vfmadd213ss (%rdx), %[[XMM]], %[[XMM]] 19*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vmovss %[[XMM]], (%rcx) 20*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 21*9880d681SAndroid Build Coastguard Worker %a.val = load float, float* %a 22*9880d681SAndroid Build Coastguard Worker %av0 = insertelement <4 x float> undef, float %a.val, i32 0 23*9880d681SAndroid Build Coastguard Worker %av1 = insertelement <4 x float> %av0, float 0.000000e+00, i32 1 24*9880d681SAndroid Build Coastguard Worker %av2 = insertelement <4 x float> %av1, float 0.000000e+00, i32 2 25*9880d681SAndroid Build Coastguard Worker %av = insertelement <4 x float> %av2, float 0.000000e+00, i32 3 26*9880d681SAndroid Build Coastguard Worker 27*9880d681SAndroid Build Coastguard Worker %b.val = load float, float* %b 28*9880d681SAndroid Build Coastguard Worker %bv0 = insertelement <4 x float> undef, float %b.val, i32 0 29*9880d681SAndroid Build Coastguard Worker %bv1 = insertelement <4 x float> %bv0, float 0.000000e+00, i32 1 30*9880d681SAndroid Build Coastguard Worker %bv2 = insertelement <4 x float> %bv1, float 0.000000e+00, i32 2 31*9880d681SAndroid Build Coastguard Worker %bv = insertelement <4 x float> %bv2, float 0.000000e+00, i32 3 32*9880d681SAndroid Build Coastguard Worker 33*9880d681SAndroid Build Coastguard Worker %vr = call <4 x float> @llvm.x86.fma.vfmadd.ss(<4 x float> %av, <4 x float> %av, <4 x float> %bv) 34*9880d681SAndroid Build Coastguard Worker 35*9880d681SAndroid Build Coastguard Worker %sr = extractelement <4 x float> %vr, i32 0 36*9880d681SAndroid Build Coastguard Worker store float %sr, float* %a 37*9880d681SAndroid Build Coastguard Worker ret void 38*9880d681SAndroid Build Coastguard Worker} 39*9880d681SAndroid Build Coastguard Worker 40*9880d681SAndroid Build Coastguard Workerdefine void @fmadd_aba_ss(float* %a, float* %b) #0 { 41*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fmadd_aba_ss: 42*9880d681SAndroid Build Coastguard Worker; CHECK: vmovss (%rcx), %[[XMM:xmm[0-9]+]] 43*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vfmadd132ss (%rdx), %[[XMM]], %[[XMM]] 44*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vmovss %[[XMM]], (%rcx) 45*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 46*9880d681SAndroid Build Coastguard Worker %a.val = load float, float* %a 47*9880d681SAndroid Build Coastguard Worker %av0 = insertelement <4 x float> undef, float %a.val, i32 0 48*9880d681SAndroid Build Coastguard Worker %av1 = insertelement <4 x float> %av0, float 0.000000e+00, i32 1 49*9880d681SAndroid Build Coastguard Worker %av2 = insertelement <4 x float> %av1, float 0.000000e+00, i32 2 50*9880d681SAndroid Build Coastguard Worker %av = insertelement <4 x float> %av2, float 0.000000e+00, i32 3 51*9880d681SAndroid Build Coastguard Worker 52*9880d681SAndroid Build Coastguard Worker %b.val = load float, float* %b 53*9880d681SAndroid Build Coastguard Worker %bv0 = insertelement <4 x float> undef, float %b.val, i32 0 54*9880d681SAndroid Build Coastguard Worker %bv1 = insertelement <4 x float> %bv0, float 0.000000e+00, i32 1 55*9880d681SAndroid Build Coastguard Worker %bv2 = insertelement <4 x float> %bv1, float 0.000000e+00, i32 2 56*9880d681SAndroid Build Coastguard Worker %bv = insertelement <4 x float> %bv2, float 0.000000e+00, i32 3 57*9880d681SAndroid Build Coastguard Worker 58*9880d681SAndroid Build Coastguard Worker %vr = call <4 x float> @llvm.x86.fma.vfmadd.ss(<4 x float> %av, <4 x float> %bv, <4 x float> %av) 59*9880d681SAndroid Build Coastguard Worker 60*9880d681SAndroid Build Coastguard Worker %sr = extractelement <4 x float> %vr, i32 0 61*9880d681SAndroid Build Coastguard Worker store float %sr, float* %a 62*9880d681SAndroid Build Coastguard Worker ret void 63*9880d681SAndroid Build Coastguard Worker} 64*9880d681SAndroid Build Coastguard Worker 65*9880d681SAndroid Build Coastguard Workerdefine void @fmsub_aab_ss(float* %a, float* %b) #0 { 66*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fmsub_aab_ss: 67*9880d681SAndroid Build Coastguard Worker; CHECK: vmovss (%rcx), %[[XMM:xmm[0-9]+]] 68*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vfmsub213ss (%rdx), %[[XMM]], %[[XMM]] 69*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vmovss %[[XMM]], (%rcx) 70*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 71*9880d681SAndroid Build Coastguard Worker %a.val = load float, float* %a 72*9880d681SAndroid Build Coastguard Worker %av0 = insertelement <4 x float> undef, float %a.val, i32 0 73*9880d681SAndroid Build Coastguard Worker %av1 = insertelement <4 x float> %av0, float 0.000000e+00, i32 1 74*9880d681SAndroid Build Coastguard Worker %av2 = insertelement <4 x float> %av1, float 0.000000e+00, i32 2 75*9880d681SAndroid Build Coastguard Worker %av = insertelement <4 x float> %av2, float 0.000000e+00, i32 3 76*9880d681SAndroid Build Coastguard Worker 77*9880d681SAndroid Build Coastguard Worker %b.val = load float, float* %b 78*9880d681SAndroid Build Coastguard Worker %bv0 = insertelement <4 x float> undef, float %b.val, i32 0 79*9880d681SAndroid Build Coastguard Worker %bv1 = insertelement <4 x float> %bv0, float 0.000000e+00, i32 1 80*9880d681SAndroid Build Coastguard Worker %bv2 = insertelement <4 x float> %bv1, float 0.000000e+00, i32 2 81*9880d681SAndroid Build Coastguard Worker %bv = insertelement <4 x float> %bv2, float 0.000000e+00, i32 3 82*9880d681SAndroid Build Coastguard Worker 83*9880d681SAndroid Build Coastguard Worker %vr = call <4 x float> @llvm.x86.fma.vfmsub.ss(<4 x float> %av, <4 x float> %av, <4 x float> %bv) 84*9880d681SAndroid Build Coastguard Worker 85*9880d681SAndroid Build Coastguard Worker %sr = extractelement <4 x float> %vr, i32 0 86*9880d681SAndroid Build Coastguard Worker store float %sr, float* %a 87*9880d681SAndroid Build Coastguard Worker ret void 88*9880d681SAndroid Build Coastguard Worker} 89*9880d681SAndroid Build Coastguard Worker 90*9880d681SAndroid Build Coastguard Workerdefine void @fmsub_aba_ss(float* %a, float* %b) #0 { 91*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fmsub_aba_ss: 92*9880d681SAndroid Build Coastguard Worker; CHECK: vmovss (%rcx), %[[XMM:xmm[0-9]+]] 93*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vfmsub132ss (%rdx), %[[XMM]], %[[XMM]] 94*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vmovss %[[XMM]], (%rcx) 95*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 96*9880d681SAndroid Build Coastguard Worker %a.val = load float, float* %a 97*9880d681SAndroid Build Coastguard Worker %av0 = insertelement <4 x float> undef, float %a.val, i32 0 98*9880d681SAndroid Build Coastguard Worker %av1 = insertelement <4 x float> %av0, float 0.000000e+00, i32 1 99*9880d681SAndroid Build Coastguard Worker %av2 = insertelement <4 x float> %av1, float 0.000000e+00, i32 2 100*9880d681SAndroid Build Coastguard Worker %av = insertelement <4 x float> %av2, float 0.000000e+00, i32 3 101*9880d681SAndroid Build Coastguard Worker 102*9880d681SAndroid Build Coastguard Worker %b.val = load float, float* %b 103*9880d681SAndroid Build Coastguard Worker %bv0 = insertelement <4 x float> undef, float %b.val, i32 0 104*9880d681SAndroid Build Coastguard Worker %bv1 = insertelement <4 x float> %bv0, float 0.000000e+00, i32 1 105*9880d681SAndroid Build Coastguard Worker %bv2 = insertelement <4 x float> %bv1, float 0.000000e+00, i32 2 106*9880d681SAndroid Build Coastguard Worker %bv = insertelement <4 x float> %bv2, float 0.000000e+00, i32 3 107*9880d681SAndroid Build Coastguard Worker 108*9880d681SAndroid Build Coastguard Worker %vr = call <4 x float> @llvm.x86.fma.vfmsub.ss(<4 x float> %av, <4 x float> %bv, <4 x float> %av) 109*9880d681SAndroid Build Coastguard Worker 110*9880d681SAndroid Build Coastguard Worker %sr = extractelement <4 x float> %vr, i32 0 111*9880d681SAndroid Build Coastguard Worker store float %sr, float* %a 112*9880d681SAndroid Build Coastguard Worker ret void 113*9880d681SAndroid Build Coastguard Worker} 114*9880d681SAndroid Build Coastguard Worker 115*9880d681SAndroid Build Coastguard Workerdefine void @fnmadd_aab_ss(float* %a, float* %b) #0 { 116*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fnmadd_aab_ss: 117*9880d681SAndroid Build Coastguard Worker; CHECK: vmovss (%rcx), %[[XMM:xmm[0-9]+]] 118*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vfnmadd213ss (%rdx), %[[XMM]], %[[XMM]] 119*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vmovss %[[XMM]], (%rcx) 120*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 121*9880d681SAndroid Build Coastguard Worker %a.val = load float, float* %a 122*9880d681SAndroid Build Coastguard Worker %av0 = insertelement <4 x float> undef, float %a.val, i32 0 123*9880d681SAndroid Build Coastguard Worker %av1 = insertelement <4 x float> %av0, float 0.000000e+00, i32 1 124*9880d681SAndroid Build Coastguard Worker %av2 = insertelement <4 x float> %av1, float 0.000000e+00, i32 2 125*9880d681SAndroid Build Coastguard Worker %av = insertelement <4 x float> %av2, float 0.000000e+00, i32 3 126*9880d681SAndroid Build Coastguard Worker 127*9880d681SAndroid Build Coastguard Worker %b.val = load float, float* %b 128*9880d681SAndroid Build Coastguard Worker %bv0 = insertelement <4 x float> undef, float %b.val, i32 0 129*9880d681SAndroid Build Coastguard Worker %bv1 = insertelement <4 x float> %bv0, float 0.000000e+00, i32 1 130*9880d681SAndroid Build Coastguard Worker %bv2 = insertelement <4 x float> %bv1, float 0.000000e+00, i32 2 131*9880d681SAndroid Build Coastguard Worker %bv = insertelement <4 x float> %bv2, float 0.000000e+00, i32 3 132*9880d681SAndroid Build Coastguard Worker 133*9880d681SAndroid Build Coastguard Worker %vr = call <4 x float> @llvm.x86.fma.vfnmadd.ss(<4 x float> %av, <4 x float> %av, <4 x float> %bv) 134*9880d681SAndroid Build Coastguard Worker 135*9880d681SAndroid Build Coastguard Worker %sr = extractelement <4 x float> %vr, i32 0 136*9880d681SAndroid Build Coastguard Worker store float %sr, float* %a 137*9880d681SAndroid Build Coastguard Worker ret void 138*9880d681SAndroid Build Coastguard Worker} 139*9880d681SAndroid Build Coastguard Worker 140*9880d681SAndroid Build Coastguard Workerdefine void @fnmadd_aba_ss(float* %a, float* %b) #0 { 141*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fnmadd_aba_ss: 142*9880d681SAndroid Build Coastguard Worker; CHECK: vmovss (%rcx), %[[XMM:xmm[0-9]+]] 143*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vfnmadd132ss (%rdx), %[[XMM]], %[[XMM]] 144*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vmovss %[[XMM]], (%rcx) 145*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 146*9880d681SAndroid Build Coastguard Worker %a.val = load float, float* %a 147*9880d681SAndroid Build Coastguard Worker %av0 = insertelement <4 x float> undef, float %a.val, i32 0 148*9880d681SAndroid Build Coastguard Worker %av1 = insertelement <4 x float> %av0, float 0.000000e+00, i32 1 149*9880d681SAndroid Build Coastguard Worker %av2 = insertelement <4 x float> %av1, float 0.000000e+00, i32 2 150*9880d681SAndroid Build Coastguard Worker %av = insertelement <4 x float> %av2, float 0.000000e+00, i32 3 151*9880d681SAndroid Build Coastguard Worker 152*9880d681SAndroid Build Coastguard Worker %b.val = load float, float* %b 153*9880d681SAndroid Build Coastguard Worker %bv0 = insertelement <4 x float> undef, float %b.val, i32 0 154*9880d681SAndroid Build Coastguard Worker %bv1 = insertelement <4 x float> %bv0, float 0.000000e+00, i32 1 155*9880d681SAndroid Build Coastguard Worker %bv2 = insertelement <4 x float> %bv1, float 0.000000e+00, i32 2 156*9880d681SAndroid Build Coastguard Worker %bv = insertelement <4 x float> %bv2, float 0.000000e+00, i32 3 157*9880d681SAndroid Build Coastguard Worker 158*9880d681SAndroid Build Coastguard Worker %vr = call <4 x float> @llvm.x86.fma.vfnmadd.ss(<4 x float> %av, <4 x float> %bv, <4 x float> %av) 159*9880d681SAndroid Build Coastguard Worker 160*9880d681SAndroid Build Coastguard Worker %sr = extractelement <4 x float> %vr, i32 0 161*9880d681SAndroid Build Coastguard Worker store float %sr, float* %a 162*9880d681SAndroid Build Coastguard Worker ret void 163*9880d681SAndroid Build Coastguard Worker} 164*9880d681SAndroid Build Coastguard Worker 165*9880d681SAndroid Build Coastguard Workerdefine void @fnmsub_aab_ss(float* %a, float* %b) #0 { 166*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fnmsub_aab_ss: 167*9880d681SAndroid Build Coastguard Worker; CHECK: vmovss (%rcx), %[[XMM:xmm[0-9]+]] 168*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vfnmsub213ss (%rdx), %[[XMM]], %[[XMM]] 169*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vmovss %[[XMM]], (%rcx) 170*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 171*9880d681SAndroid Build Coastguard Worker %a.val = load float, float* %a 172*9880d681SAndroid Build Coastguard Worker %av0 = insertelement <4 x float> undef, float %a.val, i32 0 173*9880d681SAndroid Build Coastguard Worker %av1 = insertelement <4 x float> %av0, float 0.000000e+00, i32 1 174*9880d681SAndroid Build Coastguard Worker %av2 = insertelement <4 x float> %av1, float 0.000000e+00, i32 2 175*9880d681SAndroid Build Coastguard Worker %av = insertelement <4 x float> %av2, float 0.000000e+00, i32 3 176*9880d681SAndroid Build Coastguard Worker 177*9880d681SAndroid Build Coastguard Worker %b.val = load float, float* %b 178*9880d681SAndroid Build Coastguard Worker %bv0 = insertelement <4 x float> undef, float %b.val, i32 0 179*9880d681SAndroid Build Coastguard Worker %bv1 = insertelement <4 x float> %bv0, float 0.000000e+00, i32 1 180*9880d681SAndroid Build Coastguard Worker %bv2 = insertelement <4 x float> %bv1, float 0.000000e+00, i32 2 181*9880d681SAndroid Build Coastguard Worker %bv = insertelement <4 x float> %bv2, float 0.000000e+00, i32 3 182*9880d681SAndroid Build Coastguard Worker 183*9880d681SAndroid Build Coastguard Worker %vr = call <4 x float> @llvm.x86.fma.vfnmsub.ss(<4 x float> %av, <4 x float> %av, <4 x float> %bv) 184*9880d681SAndroid Build Coastguard Worker 185*9880d681SAndroid Build Coastguard Worker %sr = extractelement <4 x float> %vr, i32 0 186*9880d681SAndroid Build Coastguard Worker store float %sr, float* %a 187*9880d681SAndroid Build Coastguard Worker ret void 188*9880d681SAndroid Build Coastguard Worker} 189*9880d681SAndroid Build Coastguard Worker 190*9880d681SAndroid Build Coastguard Workerdefine void @fnmsub_aba_ss(float* %a, float* %b) #0 { 191*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fnmsub_aba_ss: 192*9880d681SAndroid Build Coastguard Worker; CHECK: vmovss (%rcx), %[[XMM:xmm[0-9]+]] 193*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vfnmsub132ss (%rdx), %[[XMM]], %[[XMM]] 194*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vmovss %[[XMM]], (%rcx) 195*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 196*9880d681SAndroid Build Coastguard Worker %a.val = load float, float* %a 197*9880d681SAndroid Build Coastguard Worker %av0 = insertelement <4 x float> undef, float %a.val, i32 0 198*9880d681SAndroid Build Coastguard Worker %av1 = insertelement <4 x float> %av0, float 0.000000e+00, i32 1 199*9880d681SAndroid Build Coastguard Worker %av2 = insertelement <4 x float> %av1, float 0.000000e+00, i32 2 200*9880d681SAndroid Build Coastguard Worker %av = insertelement <4 x float> %av2, float 0.000000e+00, i32 3 201*9880d681SAndroid Build Coastguard Worker 202*9880d681SAndroid Build Coastguard Worker %b.val = load float, float* %b 203*9880d681SAndroid Build Coastguard Worker %bv0 = insertelement <4 x float> undef, float %b.val, i32 0 204*9880d681SAndroid Build Coastguard Worker %bv1 = insertelement <4 x float> %bv0, float 0.000000e+00, i32 1 205*9880d681SAndroid Build Coastguard Worker %bv2 = insertelement <4 x float> %bv1, float 0.000000e+00, i32 2 206*9880d681SAndroid Build Coastguard Worker %bv = insertelement <4 x float> %bv2, float 0.000000e+00, i32 3 207*9880d681SAndroid Build Coastguard Worker 208*9880d681SAndroid Build Coastguard Worker %vr = call <4 x float> @llvm.x86.fma.vfnmsub.ss(<4 x float> %av, <4 x float> %bv, <4 x float> %av) 209*9880d681SAndroid Build Coastguard Worker 210*9880d681SAndroid Build Coastguard Worker %sr = extractelement <4 x float> %vr, i32 0 211*9880d681SAndroid Build Coastguard Worker store float %sr, float* %a 212*9880d681SAndroid Build Coastguard Worker ret void 213*9880d681SAndroid Build Coastguard Worker} 214*9880d681SAndroid Build Coastguard Worker 215*9880d681SAndroid Build Coastguard Workerdefine void @fmadd_aab_sd(double* %a, double* %b) #0 { 216*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fmadd_aab_sd: 217*9880d681SAndroid Build Coastguard Worker; CHECK: vmovsd (%rcx), %[[XMM:xmm[0-9]+]] 218*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vfmadd213sd (%rdx), %[[XMM]], %[[XMM]] 219*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vmovlpd %[[XMM]], (%rcx) 220*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 221*9880d681SAndroid Build Coastguard Worker %a.val = load double, double* %a 222*9880d681SAndroid Build Coastguard Worker %av0 = insertelement <2 x double> undef, double %a.val, i32 0 223*9880d681SAndroid Build Coastguard Worker %av = insertelement <2 x double> %av0, double 0.000000e+00, i32 1 224*9880d681SAndroid Build Coastguard Worker 225*9880d681SAndroid Build Coastguard Worker %b.val = load double, double* %b 226*9880d681SAndroid Build Coastguard Worker %bv0 = insertelement <2 x double> undef, double %b.val, i32 0 227*9880d681SAndroid Build Coastguard Worker %bv = insertelement <2 x double> %bv0, double 0.000000e+00, i32 1 228*9880d681SAndroid Build Coastguard Worker 229*9880d681SAndroid Build Coastguard Worker %vr = call <2 x double> @llvm.x86.fma.vfmadd.sd(<2 x double> %av, <2 x double> %av, <2 x double> %bv) 230*9880d681SAndroid Build Coastguard Worker 231*9880d681SAndroid Build Coastguard Worker %sr = extractelement <2 x double> %vr, i32 0 232*9880d681SAndroid Build Coastguard Worker store double %sr, double* %a 233*9880d681SAndroid Build Coastguard Worker ret void 234*9880d681SAndroid Build Coastguard Worker} 235*9880d681SAndroid Build Coastguard Worker 236*9880d681SAndroid Build Coastguard Workerdefine void @fmadd_aba_sd(double* %a, double* %b) #0 { 237*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fmadd_aba_sd: 238*9880d681SAndroid Build Coastguard Worker; CHECK: vmovsd (%rcx), %[[XMM:xmm[0-9]+]] 239*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vfmadd132sd (%rdx), %[[XMM]], %[[XMM]] 240*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vmovlpd %[[XMM]], (%rcx) 241*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 242*9880d681SAndroid Build Coastguard Worker %a.val = load double, double* %a 243*9880d681SAndroid Build Coastguard Worker %av0 = insertelement <2 x double> undef, double %a.val, i32 0 244*9880d681SAndroid Build Coastguard Worker %av = insertelement <2 x double> %av0, double 0.000000e+00, i32 1 245*9880d681SAndroid Build Coastguard Worker 246*9880d681SAndroid Build Coastguard Worker %b.val = load double, double* %b 247*9880d681SAndroid Build Coastguard Worker %bv0 = insertelement <2 x double> undef, double %b.val, i32 0 248*9880d681SAndroid Build Coastguard Worker %bv = insertelement <2 x double> %bv0, double 0.000000e+00, i32 1 249*9880d681SAndroid Build Coastguard Worker 250*9880d681SAndroid Build Coastguard Worker %vr = call <2 x double> @llvm.x86.fma.vfmadd.sd(<2 x double> %av, <2 x double> %bv, <2 x double> %av) 251*9880d681SAndroid Build Coastguard Worker 252*9880d681SAndroid Build Coastguard Worker %sr = extractelement <2 x double> %vr, i32 0 253*9880d681SAndroid Build Coastguard Worker store double %sr, double* %a 254*9880d681SAndroid Build Coastguard Worker ret void 255*9880d681SAndroid Build Coastguard Worker} 256*9880d681SAndroid Build Coastguard Worker 257*9880d681SAndroid Build Coastguard Workerdefine void @fmsub_aab_sd(double* %a, double* %b) #0 { 258*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fmsub_aab_sd: 259*9880d681SAndroid Build Coastguard Worker; CHECK: vmovsd (%rcx), %[[XMM:xmm[0-9]+]] 260*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vfmsub213sd (%rdx), %[[XMM]], %[[XMM]] 261*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vmovlpd %[[XMM]], (%rcx) 262*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 263*9880d681SAndroid Build Coastguard Worker %a.val = load double, double* %a 264*9880d681SAndroid Build Coastguard Worker %av0 = insertelement <2 x double> undef, double %a.val, i32 0 265*9880d681SAndroid Build Coastguard Worker %av = insertelement <2 x double> %av0, double 0.000000e+00, i32 1 266*9880d681SAndroid Build Coastguard Worker 267*9880d681SAndroid Build Coastguard Worker %b.val = load double, double* %b 268*9880d681SAndroid Build Coastguard Worker %bv0 = insertelement <2 x double> undef, double %b.val, i32 0 269*9880d681SAndroid Build Coastguard Worker %bv = insertelement <2 x double> %bv0, double 0.000000e+00, i32 1 270*9880d681SAndroid Build Coastguard Worker 271*9880d681SAndroid Build Coastguard Worker %vr = call <2 x double> @llvm.x86.fma.vfmsub.sd(<2 x double> %av, <2 x double> %av, <2 x double> %bv) 272*9880d681SAndroid Build Coastguard Worker 273*9880d681SAndroid Build Coastguard Worker %sr = extractelement <2 x double> %vr, i32 0 274*9880d681SAndroid Build Coastguard Worker store double %sr, double* %a 275*9880d681SAndroid Build Coastguard Worker ret void 276*9880d681SAndroid Build Coastguard Worker} 277*9880d681SAndroid Build Coastguard Worker 278*9880d681SAndroid Build Coastguard Workerdefine void @fmsub_aba_sd(double* %a, double* %b) #0 { 279*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fmsub_aba_sd: 280*9880d681SAndroid Build Coastguard Worker; CHECK: vmovsd (%rcx), %[[XMM:xmm[0-9]+]] 281*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vfmsub132sd (%rdx), %[[XMM]], %[[XMM]] 282*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vmovlpd %[[XMM]], (%rcx) 283*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 284*9880d681SAndroid Build Coastguard Worker %a.val = load double, double* %a 285*9880d681SAndroid Build Coastguard Worker %av0 = insertelement <2 x double> undef, double %a.val, i32 0 286*9880d681SAndroid Build Coastguard Worker %av = insertelement <2 x double> %av0, double 0.000000e+00, i32 1 287*9880d681SAndroid Build Coastguard Worker 288*9880d681SAndroid Build Coastguard Worker %b.val = load double, double* %b 289*9880d681SAndroid Build Coastguard Worker %bv0 = insertelement <2 x double> undef, double %b.val, i32 0 290*9880d681SAndroid Build Coastguard Worker %bv = insertelement <2 x double> %bv0, double 0.000000e+00, i32 1 291*9880d681SAndroid Build Coastguard Worker 292*9880d681SAndroid Build Coastguard Worker %vr = call <2 x double> @llvm.x86.fma.vfmsub.sd(<2 x double> %av, <2 x double> %bv, <2 x double> %av) 293*9880d681SAndroid Build Coastguard Worker 294*9880d681SAndroid Build Coastguard Worker %sr = extractelement <2 x double> %vr, i32 0 295*9880d681SAndroid Build Coastguard Worker store double %sr, double* %a 296*9880d681SAndroid Build Coastguard Worker ret void 297*9880d681SAndroid Build Coastguard Worker} 298*9880d681SAndroid Build Coastguard Worker 299*9880d681SAndroid Build Coastguard Workerdefine void @fnmadd_aab_sd(double* %a, double* %b) #0 { 300*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fnmadd_aab_sd: 301*9880d681SAndroid Build Coastguard Worker; CHECK: vmovsd (%rcx), %[[XMM:xmm[0-9]+]] 302*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vfnmadd213sd (%rdx), %[[XMM]], %[[XMM]] 303*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vmovlpd %[[XMM]], (%rcx) 304*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 305*9880d681SAndroid Build Coastguard Worker %a.val = load double, double* %a 306*9880d681SAndroid Build Coastguard Worker %av0 = insertelement <2 x double> undef, double %a.val, i32 0 307*9880d681SAndroid Build Coastguard Worker %av = insertelement <2 x double> %av0, double 0.000000e+00, i32 1 308*9880d681SAndroid Build Coastguard Worker 309*9880d681SAndroid Build Coastguard Worker %b.val = load double, double* %b 310*9880d681SAndroid Build Coastguard Worker %bv0 = insertelement <2 x double> undef, double %b.val, i32 0 311*9880d681SAndroid Build Coastguard Worker %bv = insertelement <2 x double> %bv0, double 0.000000e+00, i32 1 312*9880d681SAndroid Build Coastguard Worker 313*9880d681SAndroid Build Coastguard Worker %vr = call <2 x double> @llvm.x86.fma.vfnmadd.sd(<2 x double> %av, <2 x double> %av, <2 x double> %bv) 314*9880d681SAndroid Build Coastguard Worker 315*9880d681SAndroid Build Coastguard Worker %sr = extractelement <2 x double> %vr, i32 0 316*9880d681SAndroid Build Coastguard Worker store double %sr, double* %a 317*9880d681SAndroid Build Coastguard Worker ret void 318*9880d681SAndroid Build Coastguard Worker} 319*9880d681SAndroid Build Coastguard Worker 320*9880d681SAndroid Build Coastguard Workerdefine void @fnmadd_aba_sd(double* %a, double* %b) #0 { 321*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fnmadd_aba_sd: 322*9880d681SAndroid Build Coastguard Worker; CHECK: vmovsd (%rcx), %[[XMM:xmm[0-9]+]] 323*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vfnmadd132sd (%rdx), %[[XMM]], %[[XMM]] 324*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vmovlpd %[[XMM]], (%rcx) 325*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 326*9880d681SAndroid Build Coastguard Worker %a.val = load double, double* %a 327*9880d681SAndroid Build Coastguard Worker %av0 = insertelement <2 x double> undef, double %a.val, i32 0 328*9880d681SAndroid Build Coastguard Worker %av = insertelement <2 x double> %av0, double 0.000000e+00, i32 1 329*9880d681SAndroid Build Coastguard Worker 330*9880d681SAndroid Build Coastguard Worker %b.val = load double, double* %b 331*9880d681SAndroid Build Coastguard Worker %bv0 = insertelement <2 x double> undef, double %b.val, i32 0 332*9880d681SAndroid Build Coastguard Worker %bv = insertelement <2 x double> %bv0, double 0.000000e+00, i32 1 333*9880d681SAndroid Build Coastguard Worker 334*9880d681SAndroid Build Coastguard Worker %vr = call <2 x double> @llvm.x86.fma.vfnmadd.sd(<2 x double> %av, <2 x double> %bv, <2 x double> %av) 335*9880d681SAndroid Build Coastguard Worker 336*9880d681SAndroid Build Coastguard Worker %sr = extractelement <2 x double> %vr, i32 0 337*9880d681SAndroid Build Coastguard Worker store double %sr, double* %a 338*9880d681SAndroid Build Coastguard Worker ret void 339*9880d681SAndroid Build Coastguard Worker} 340*9880d681SAndroid Build Coastguard Worker 341*9880d681SAndroid Build Coastguard Workerdefine void @fnmsub_aab_sd(double* %a, double* %b) #0 { 342*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fnmsub_aab_sd: 343*9880d681SAndroid Build Coastguard Worker; CHECK: vmovsd (%rcx), %[[XMM:xmm[0-9]+]] 344*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vfnmsub213sd (%rdx), %[[XMM]], %[[XMM]] 345*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vmovlpd %[[XMM]], (%rcx) 346*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 347*9880d681SAndroid Build Coastguard Worker %a.val = load double, double* %a 348*9880d681SAndroid Build Coastguard Worker %av0 = insertelement <2 x double> undef, double %a.val, i32 0 349*9880d681SAndroid Build Coastguard Worker %av = insertelement <2 x double> %av0, double 0.000000e+00, i32 1 350*9880d681SAndroid Build Coastguard Worker 351*9880d681SAndroid Build Coastguard Worker %b.val = load double, double* %b 352*9880d681SAndroid Build Coastguard Worker %bv0 = insertelement <2 x double> undef, double %b.val, i32 0 353*9880d681SAndroid Build Coastguard Worker %bv = insertelement <2 x double> %bv0, double 0.000000e+00, i32 1 354*9880d681SAndroid Build Coastguard Worker 355*9880d681SAndroid Build Coastguard Worker %vr = call <2 x double> @llvm.x86.fma.vfnmsub.sd(<2 x double> %av, <2 x double> %av, <2 x double> %bv) 356*9880d681SAndroid Build Coastguard Worker 357*9880d681SAndroid Build Coastguard Worker %sr = extractelement <2 x double> %vr, i32 0 358*9880d681SAndroid Build Coastguard Worker store double %sr, double* %a 359*9880d681SAndroid Build Coastguard Worker ret void 360*9880d681SAndroid Build Coastguard Worker} 361*9880d681SAndroid Build Coastguard Worker 362*9880d681SAndroid Build Coastguard Workerdefine void @fnmsub_aba_sd(double* %a, double* %b) #0 { 363*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fnmsub_aba_sd: 364*9880d681SAndroid Build Coastguard Worker; CHECK: vmovsd (%rcx), %[[XMM:xmm[0-9]+]] 365*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vfnmsub132sd (%rdx), %[[XMM]], %[[XMM]] 366*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: vmovlpd %[[XMM]], (%rcx) 367*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 368*9880d681SAndroid Build Coastguard Worker %a.val = load double, double* %a 369*9880d681SAndroid Build Coastguard Worker %av0 = insertelement <2 x double> undef, double %a.val, i32 0 370*9880d681SAndroid Build Coastguard Worker %av = insertelement <2 x double> %av0, double 0.000000e+00, i32 1 371*9880d681SAndroid Build Coastguard Worker 372*9880d681SAndroid Build Coastguard Worker %b.val = load double, double* %b 373*9880d681SAndroid Build Coastguard Worker %bv0 = insertelement <2 x double> undef, double %b.val, i32 0 374*9880d681SAndroid Build Coastguard Worker %bv = insertelement <2 x double> %bv0, double 0.000000e+00, i32 1 375*9880d681SAndroid Build Coastguard Worker 376*9880d681SAndroid Build Coastguard Worker %vr = call <2 x double> @llvm.x86.fma.vfnmsub.sd(<2 x double> %av, <2 x double> %bv, <2 x double> %av) 377*9880d681SAndroid Build Coastguard Worker 378*9880d681SAndroid Build Coastguard Worker %sr = extractelement <2 x double> %vr, i32 0 379*9880d681SAndroid Build Coastguard Worker store double %sr, double* %a 380*9880d681SAndroid Build Coastguard Worker ret void 381*9880d681SAndroid Build Coastguard Worker} 382*9880d681SAndroid Build Coastguard Worker 383*9880d681SAndroid Build Coastguard Worker 384