brintos

brintos / llvm-project-archived public Read only

0
0
Text · 25.8 KiB · e81d80a Raw
578 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -disable-peephole -mcpu=core-avx2 -show-mc-encoding | FileCheck %s --check-prefix=AVX23; RUN: llc < %s -disable-peephole -mcpu=skx -show-mc-encoding | FileCheck %s --check-prefix=AVX5124 5target triple = "x86_64-unknown-unknown"6 7declare <4 x float> @llvm.x86.fma.vfmadd.ss(<4 x float>, <4 x float>, <4 x float>)8declare <4 x float> @llvm.x86.fma.vfmsub.ss(<4 x float>, <4 x float>, <4 x float>)9declare <4 x float> @llvm.x86.fma.vfnmadd.ss(<4 x float>, <4 x float>, <4 x float>)10declare <4 x float> @llvm.x86.fma.vfnmsub.ss(<4 x float>, <4 x float>, <4 x float>)11 12declare <2 x double> @llvm.x86.fma.vfmadd.sd(<2 x double>, <2 x double>, <2 x double>)13declare <2 x double> @llvm.x86.fma.vfmsub.sd(<2 x double>, <2 x double>, <2 x double>)14declare <2 x double> @llvm.x86.fma.vfnmadd.sd(<2 x double>, <2 x double>, <2 x double>)15declare <2 x double> @llvm.x86.fma.vfnmsub.sd(<2 x double>, <2 x double>, <2 x double>)16 17define void @fmadd_aab_ss(ptr %a, ptr %b) {18; AVX2-LABEL: fmadd_aab_ss:19; AVX2:       # %bb.0:20; AVX2-NEXT:    vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero21; AVX2-NEXT:    # encoding: [0xc5,0xfa,0x10,0x07]22; AVX2-NEXT:    vfmadd213ss (%rsi), %xmm0, %xmm0 # encoding: [0xc4,0xe2,0x79,0xa9,0x06]23; AVX2-NEXT:    # xmm0 = (xmm0 * xmm0) + mem24; AVX2-NEXT:    vmovss %xmm0, (%rdi) # encoding: [0xc5,0xfa,0x11,0x07]25; AVX2-NEXT:    retq # encoding: [0xc3]26;27; AVX512-LABEL: fmadd_aab_ss:28; AVX512:       # %bb.0:29; AVX512-NEXT:    vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero30; AVX512-NEXT:    # EVEX TO VEX Compression encoding: [0xc5,0xfa,0x10,0x07]31; AVX512-NEXT:    vfmadd213ss (%rsi), %xmm0, %xmm0 # EVEX TO VEX Compression encoding: [0xc4,0xe2,0x79,0xa9,0x06]32; AVX512-NEXT:    # xmm0 = (xmm0 * xmm0) + mem33; AVX512-NEXT:    vmovss %xmm0, (%rdi) # EVEX TO VEX Compression encoding: [0xc5,0xfa,0x11,0x07]34; AVX512-NEXT:    retq # encoding: [0xc3]35  %a.val = load float, ptr %a36  %av0 = insertelement <4 x float> undef, float %a.val, i32 037  %av1 = insertelement <4 x float> %av0, float 0.000000e+00, i32 138  %av2 = insertelement <4 x float> %av1, float 0.000000e+00, i32 239  %av  = insertelement <4 x float> %av2, float 0.000000e+00, i32 340 41  %b.val = load float, ptr %b42  %bv0 = insertelement <4 x float> undef, float %b.val, i32 043  %bv1 = insertelement <4 x float> %bv0, float 0.000000e+00, i32 144  %bv2 = insertelement <4 x float> %bv1, float 0.000000e+00, i32 245  %bv  = insertelement <4 x float> %bv2, float 0.000000e+00, i32 346 47  %vr = call <4 x float> @llvm.x86.fma.vfmadd.ss(<4 x float> %av, <4 x float> %av, <4 x float> %bv)48 49  %sr = extractelement <4 x float> %vr, i32 050  store float %sr, ptr %a51  ret void52}53 54define void @fmadd_aba_ss(ptr %a, ptr %b) {55; AVX2-LABEL: fmadd_aba_ss:56; AVX2:       # %bb.0:57; AVX2-NEXT:    vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero58; AVX2-NEXT:    # encoding: [0xc5,0xfa,0x10,0x07]59; AVX2-NEXT:    vfmadd231ss (%rsi), %xmm0, %xmm0 # encoding: [0xc4,0xe2,0x79,0xb9,0x06]60; AVX2-NEXT:    # xmm0 = (xmm0 * mem) + xmm061; AVX2-NEXT:    vmovss %xmm0, (%rdi) # encoding: [0xc5,0xfa,0x11,0x07]62; AVX2-NEXT:    retq # encoding: [0xc3]63;64; AVX512-LABEL: fmadd_aba_ss:65; AVX512:       # %bb.0:66; AVX512-NEXT:    vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero67; AVX512-NEXT:    # EVEX TO VEX Compression encoding: [0xc5,0xfa,0x10,0x07]68; AVX512-NEXT:    vfmadd231ss (%rsi), %xmm0, %xmm0 # EVEX TO VEX Compression encoding: [0xc4,0xe2,0x79,0xb9,0x06]69; AVX512-NEXT:    # xmm0 = (xmm0 * mem) + xmm070; AVX512-NEXT:    vmovss %xmm0, (%rdi) # EVEX TO VEX Compression encoding: [0xc5,0xfa,0x11,0x07]71; AVX512-NEXT:    retq # encoding: [0xc3]72  %a.val = load float, ptr %a73  %av0 = insertelement <4 x float> undef, float %a.val, i32 074  %av1 = insertelement <4 x float> %av0, float 0.000000e+00, i32 175  %av2 = insertelement <4 x float> %av1, float 0.000000e+00, i32 276  %av  = insertelement <4 x float> %av2, float 0.000000e+00, i32 377 78  %b.val = load float, ptr %b79  %bv0 = insertelement <4 x float> undef, float %b.val, i32 080  %bv1 = insertelement <4 x float> %bv0, float 0.000000e+00, i32 181  %bv2 = insertelement <4 x float> %bv1, float 0.000000e+00, i32 282  %bv  = insertelement <4 x float> %bv2, float 0.000000e+00, i32 383 84  %vr = call <4 x float> @llvm.x86.fma.vfmadd.ss(<4 x float> %av, <4 x float> %bv, <4 x float> %av)85 86  %sr = extractelement <4 x float> %vr, i32 087  store float %sr, ptr %a88  ret void89}90 91define void @fmsub_aab_ss(ptr %a, ptr %b) {92; AVX2-LABEL: fmsub_aab_ss:93; AVX2:       # %bb.0:94; AVX2-NEXT:    vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero95; AVX2-NEXT:    # encoding: [0xc5,0xfa,0x10,0x07]96; AVX2-NEXT:    vfmsub213ss (%rsi), %xmm0, %xmm0 # encoding: [0xc4,0xe2,0x79,0xab,0x06]97; AVX2-NEXT:    # xmm0 = (xmm0 * xmm0) - mem98; AVX2-NEXT:    vmovss %xmm0, (%rdi) # encoding: [0xc5,0xfa,0x11,0x07]99; AVX2-NEXT:    retq # encoding: [0xc3]100;101; AVX512-LABEL: fmsub_aab_ss:102; AVX512:       # %bb.0:103; AVX512-NEXT:    vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero104; AVX512-NEXT:    # EVEX TO VEX Compression encoding: [0xc5,0xfa,0x10,0x07]105; AVX512-NEXT:    vfmsub213ss (%rsi), %xmm0, %xmm0 # EVEX TO VEX Compression encoding: [0xc4,0xe2,0x79,0xab,0x06]106; AVX512-NEXT:    # xmm0 = (xmm0 * xmm0) - mem107; AVX512-NEXT:    vmovss %xmm0, (%rdi) # EVEX TO VEX Compression encoding: [0xc5,0xfa,0x11,0x07]108; AVX512-NEXT:    retq # encoding: [0xc3]109  %a.val = load float, ptr %a110  %av0 = insertelement <4 x float> undef, float %a.val, i32 0111  %av1 = insertelement <4 x float> %av0, float 0.000000e+00, i32 1112  %av2 = insertelement <4 x float> %av1, float 0.000000e+00, i32 2113  %av  = insertelement <4 x float> %av2, float 0.000000e+00, i32 3114 115  %b.val = load float, ptr %b116  %bv0 = insertelement <4 x float> undef, float %b.val, i32 0117  %bv1 = insertelement <4 x float> %bv0, float 0.000000e+00, i32 1118  %bv2 = insertelement <4 x float> %bv1, float 0.000000e+00, i32 2119  %bv  = insertelement <4 x float> %bv2, float 0.000000e+00, i32 3120 121  %vr = call <4 x float> @llvm.x86.fma.vfmsub.ss(<4 x float> %av, <4 x float> %av, <4 x float> %bv)122 123  %sr = extractelement <4 x float> %vr, i32 0124  store float %sr, ptr %a125  ret void126}127 128define void @fmsub_aba_ss(ptr %a, ptr %b) {129; AVX2-LABEL: fmsub_aba_ss:130; AVX2:       # %bb.0:131; AVX2-NEXT:    vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero132; AVX2-NEXT:    # encoding: [0xc5,0xfa,0x10,0x07]133; AVX2-NEXT:    vfmsub231ss (%rsi), %xmm0, %xmm0 # encoding: [0xc4,0xe2,0x79,0xbb,0x06]134; AVX2-NEXT:    # xmm0 = (xmm0 * mem) - xmm0135; AVX2-NEXT:    vmovss %xmm0, (%rdi) # encoding: [0xc5,0xfa,0x11,0x07]136; AVX2-NEXT:    retq # encoding: [0xc3]137;138; AVX512-LABEL: fmsub_aba_ss:139; AVX512:       # %bb.0:140; AVX512-NEXT:    vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero141; AVX512-NEXT:    # EVEX TO VEX Compression encoding: [0xc5,0xfa,0x10,0x07]142; AVX512-NEXT:    vfmsub231ss (%rsi), %xmm0, %xmm0 # EVEX TO VEX Compression encoding: [0xc4,0xe2,0x79,0xbb,0x06]143; AVX512-NEXT:    # xmm0 = (xmm0 * mem) - xmm0144; AVX512-NEXT:    vmovss %xmm0, (%rdi) # EVEX TO VEX Compression encoding: [0xc5,0xfa,0x11,0x07]145; AVX512-NEXT:    retq # encoding: [0xc3]146  %a.val = load float, ptr %a147  %av0 = insertelement <4 x float> undef, float %a.val, i32 0148  %av1 = insertelement <4 x float> %av0, float 0.000000e+00, i32 1149  %av2 = insertelement <4 x float> %av1, float 0.000000e+00, i32 2150  %av  = insertelement <4 x float> %av2, float 0.000000e+00, i32 3151 152  %b.val = load float, ptr %b153  %bv0 = insertelement <4 x float> undef, float %b.val, i32 0154  %bv1 = insertelement <4 x float> %bv0, float 0.000000e+00, i32 1155  %bv2 = insertelement <4 x float> %bv1, float 0.000000e+00, i32 2156  %bv  = insertelement <4 x float> %bv2, float 0.000000e+00, i32 3157 158  %vr = call <4 x float> @llvm.x86.fma.vfmsub.ss(<4 x float> %av, <4 x float> %bv, <4 x float> %av)159 160  %sr = extractelement <4 x float> %vr, i32 0161  store float %sr, ptr %a162  ret void163}164 165define void @fnmadd_aab_ss(ptr %a, ptr %b) {166; AVX2-LABEL: fnmadd_aab_ss:167; AVX2:       # %bb.0:168; AVX2-NEXT:    vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero169; AVX2-NEXT:    # encoding: [0xc5,0xfa,0x10,0x07]170; AVX2-NEXT:    vfnmadd213ss (%rsi), %xmm0, %xmm0 # encoding: [0xc4,0xe2,0x79,0xad,0x06]171; AVX2-NEXT:    # xmm0 = -(xmm0 * xmm0) + mem172; AVX2-NEXT:    vmovss %xmm0, (%rdi) # encoding: [0xc5,0xfa,0x11,0x07]173; AVX2-NEXT:    retq # encoding: [0xc3]174;175; AVX512-LABEL: fnmadd_aab_ss:176; AVX512:       # %bb.0:177; AVX512-NEXT:    vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero178; AVX512-NEXT:    # EVEX TO VEX Compression encoding: [0xc5,0xfa,0x10,0x07]179; AVX512-NEXT:    vfnmadd213ss (%rsi), %xmm0, %xmm0 # EVEX TO VEX Compression encoding: [0xc4,0xe2,0x79,0xad,0x06]180; AVX512-NEXT:    # xmm0 = -(xmm0 * xmm0) + mem181; AVX512-NEXT:    vmovss %xmm0, (%rdi) # EVEX TO VEX Compression encoding: [0xc5,0xfa,0x11,0x07]182; AVX512-NEXT:    retq # encoding: [0xc3]183  %a.val = load float, ptr %a184  %av0 = insertelement <4 x float> undef, float %a.val, i32 0185  %av1 = insertelement <4 x float> %av0, float 0.000000e+00, i32 1186  %av2 = insertelement <4 x float> %av1, float 0.000000e+00, i32 2187  %av  = insertelement <4 x float> %av2, float 0.000000e+00, i32 3188 189  %b.val = load float, ptr %b190  %bv0 = insertelement <4 x float> undef, float %b.val, i32 0191  %bv1 = insertelement <4 x float> %bv0, float 0.000000e+00, i32 1192  %bv2 = insertelement <4 x float> %bv1, float 0.000000e+00, i32 2193  %bv  = insertelement <4 x float> %bv2, float 0.000000e+00, i32 3194 195  %vr = call <4 x float> @llvm.x86.fma.vfnmadd.ss(<4 x float> %av, <4 x float> %av, <4 x float> %bv)196 197  %sr = extractelement <4 x float> %vr, i32 0198  store float %sr, ptr %a199  ret void200}201 202define void @fnmadd_aba_ss(ptr %a, ptr %b) {203; AVX2-LABEL: fnmadd_aba_ss:204; AVX2:       # %bb.0:205; AVX2-NEXT:    vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero206; AVX2-NEXT:    # encoding: [0xc5,0xfa,0x10,0x07]207; AVX2-NEXT:    vfnmadd231ss (%rsi), %xmm0, %xmm0 # encoding: [0xc4,0xe2,0x79,0xbd,0x06]208; AVX2-NEXT:    # xmm0 = -(xmm0 * mem) + xmm0209; AVX2-NEXT:    vmovss %xmm0, (%rdi) # encoding: [0xc5,0xfa,0x11,0x07]210; AVX2-NEXT:    retq # encoding: [0xc3]211;212; AVX512-LABEL: fnmadd_aba_ss:213; AVX512:       # %bb.0:214; AVX512-NEXT:    vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero215; AVX512-NEXT:    # EVEX TO VEX Compression encoding: [0xc5,0xfa,0x10,0x07]216; AVX512-NEXT:    vfnmadd231ss (%rsi), %xmm0, %xmm0 # EVEX TO VEX Compression encoding: [0xc4,0xe2,0x79,0xbd,0x06]217; AVX512-NEXT:    # xmm0 = -(xmm0 * mem) + xmm0218; AVX512-NEXT:    vmovss %xmm0, (%rdi) # EVEX TO VEX Compression encoding: [0xc5,0xfa,0x11,0x07]219; AVX512-NEXT:    retq # encoding: [0xc3]220  %a.val = load float, ptr %a221  %av0 = insertelement <4 x float> undef, float %a.val, i32 0222  %av1 = insertelement <4 x float> %av0, float 0.000000e+00, i32 1223  %av2 = insertelement <4 x float> %av1, float 0.000000e+00, i32 2224  %av  = insertelement <4 x float> %av2, float 0.000000e+00, i32 3225 226  %b.val = load float, ptr %b227  %bv0 = insertelement <4 x float> undef, float %b.val, i32 0228  %bv1 = insertelement <4 x float> %bv0, float 0.000000e+00, i32 1229  %bv2 = insertelement <4 x float> %bv1, float 0.000000e+00, i32 2230  %bv  = insertelement <4 x float> %bv2, float 0.000000e+00, i32 3231 232  %vr = call <4 x float> @llvm.x86.fma.vfnmadd.ss(<4 x float> %av, <4 x float> %bv, <4 x float> %av)233 234  %sr = extractelement <4 x float> %vr, i32 0235  store float %sr, ptr %a236  ret void237}238 239define void @fnmsub_aab_ss(ptr %a, ptr %b) {240; AVX2-LABEL: fnmsub_aab_ss:241; AVX2:       # %bb.0:242; AVX2-NEXT:    vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero243; AVX2-NEXT:    # encoding: [0xc5,0xfa,0x10,0x07]244; AVX2-NEXT:    vfnmsub213ss (%rsi), %xmm0, %xmm0 # encoding: [0xc4,0xe2,0x79,0xaf,0x06]245; AVX2-NEXT:    # xmm0 = -(xmm0 * xmm0) - mem246; AVX2-NEXT:    vmovss %xmm0, (%rdi) # encoding: [0xc5,0xfa,0x11,0x07]247; AVX2-NEXT:    retq # encoding: [0xc3]248;249; AVX512-LABEL: fnmsub_aab_ss:250; AVX512:       # %bb.0:251; AVX512-NEXT:    vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero252; AVX512-NEXT:    # EVEX TO VEX Compression encoding: [0xc5,0xfa,0x10,0x07]253; AVX512-NEXT:    vfnmsub213ss (%rsi), %xmm0, %xmm0 # EVEX TO VEX Compression encoding: [0xc4,0xe2,0x79,0xaf,0x06]254; AVX512-NEXT:    # xmm0 = -(xmm0 * xmm0) - mem255; AVX512-NEXT:    vmovss %xmm0, (%rdi) # EVEX TO VEX Compression encoding: [0xc5,0xfa,0x11,0x07]256; AVX512-NEXT:    retq # encoding: [0xc3]257  %a.val = load float, ptr %a258  %av0 = insertelement <4 x float> undef, float %a.val, i32 0259  %av1 = insertelement <4 x float> %av0, float 0.000000e+00, i32 1260  %av2 = insertelement <4 x float> %av1, float 0.000000e+00, i32 2261  %av  = insertelement <4 x float> %av2, float 0.000000e+00, i32 3262 263  %b.val = load float, ptr %b264  %bv0 = insertelement <4 x float> undef, float %b.val, i32 0265  %bv1 = insertelement <4 x float> %bv0, float 0.000000e+00, i32 1266  %bv2 = insertelement <4 x float> %bv1, float 0.000000e+00, i32 2267  %bv  = insertelement <4 x float> %bv2, float 0.000000e+00, i32 3268 269  %vr = call <4 x float> @llvm.x86.fma.vfnmsub.ss(<4 x float> %av, <4 x float> %av, <4 x float> %bv)270 271  %sr = extractelement <4 x float> %vr, i32 0272  store float %sr, ptr %a273  ret void274}275 276define void @fnmsub_aba_ss(ptr %a, ptr %b) {277; AVX2-LABEL: fnmsub_aba_ss:278; AVX2:       # %bb.0:279; AVX2-NEXT:    vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero280; AVX2-NEXT:    # encoding: [0xc5,0xfa,0x10,0x07]281; AVX2-NEXT:    vfnmsub231ss (%rsi), %xmm0, %xmm0 # encoding: [0xc4,0xe2,0x79,0xbf,0x06]282; AVX2-NEXT:    # xmm0 = -(xmm0 * mem) - xmm0283; AVX2-NEXT:    vmovss %xmm0, (%rdi) # encoding: [0xc5,0xfa,0x11,0x07]284; AVX2-NEXT:    retq # encoding: [0xc3]285;286; AVX512-LABEL: fnmsub_aba_ss:287; AVX512:       # %bb.0:288; AVX512-NEXT:    vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero289; AVX512-NEXT:    # EVEX TO VEX Compression encoding: [0xc5,0xfa,0x10,0x07]290; AVX512-NEXT:    vfnmsub231ss (%rsi), %xmm0, %xmm0 # EVEX TO VEX Compression encoding: [0xc4,0xe2,0x79,0xbf,0x06]291; AVX512-NEXT:    # xmm0 = -(xmm0 * mem) - xmm0292; AVX512-NEXT:    vmovss %xmm0, (%rdi) # EVEX TO VEX Compression encoding: [0xc5,0xfa,0x11,0x07]293; AVX512-NEXT:    retq # encoding: [0xc3]294  %a.val = load float, ptr %a295  %av0 = insertelement <4 x float> undef, float %a.val, i32 0296  %av1 = insertelement <4 x float> %av0, float 0.000000e+00, i32 1297  %av2 = insertelement <4 x float> %av1, float 0.000000e+00, i32 2298  %av  = insertelement <4 x float> %av2, float 0.000000e+00, i32 3299 300  %b.val = load float, ptr %b301  %bv0 = insertelement <4 x float> undef, float %b.val, i32 0302  %bv1 = insertelement <4 x float> %bv0, float 0.000000e+00, i32 1303  %bv2 = insertelement <4 x float> %bv1, float 0.000000e+00, i32 2304  %bv  = insertelement <4 x float> %bv2, float 0.000000e+00, i32 3305 306  %vr = call <4 x float> @llvm.x86.fma.vfnmsub.ss(<4 x float> %av, <4 x float> %bv, <4 x float> %av)307 308  %sr = extractelement <4 x float> %vr, i32 0309  store float %sr, ptr %a310  ret void311}312 313define void @fmadd_aab_sd(ptr %a, ptr %b) {314; AVX2-LABEL: fmadd_aab_sd:315; AVX2:       # %bb.0:316; AVX2-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero317; AVX2-NEXT:    # encoding: [0xc5,0xfb,0x10,0x07]318; AVX2-NEXT:    vfmadd213sd (%rsi), %xmm0, %xmm0 # encoding: [0xc4,0xe2,0xf9,0xa9,0x06]319; AVX2-NEXT:    # xmm0 = (xmm0 * xmm0) + mem320; AVX2-NEXT:    vmovsd %xmm0, (%rdi) # encoding: [0xc5,0xfb,0x11,0x07]321; AVX2-NEXT:    retq # encoding: [0xc3]322;323; AVX512-LABEL: fmadd_aab_sd:324; AVX512:       # %bb.0:325; AVX512-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero326; AVX512-NEXT:    # EVEX TO VEX Compression encoding: [0xc5,0xfb,0x10,0x07]327; AVX512-NEXT:    vfmadd213sd (%rsi), %xmm0, %xmm0 # EVEX TO VEX Compression encoding: [0xc4,0xe2,0xf9,0xa9,0x06]328; AVX512-NEXT:    # xmm0 = (xmm0 * xmm0) + mem329; AVX512-NEXT:    vmovsd %xmm0, (%rdi) # EVEX TO VEX Compression encoding: [0xc5,0xfb,0x11,0x07]330; AVX512-NEXT:    retq # encoding: [0xc3]331  %a.val = load double, ptr %a332  %av0 = insertelement <2 x double> undef, double %a.val, i32 0333  %av  = insertelement <2 x double> %av0, double 0.000000e+00, i32 1334 335  %b.val = load double, ptr %b336  %bv0 = insertelement <2 x double> undef, double %b.val, i32 0337  %bv  = insertelement <2 x double> %bv0, double 0.000000e+00, i32 1338 339  %vr = call <2 x double> @llvm.x86.fma.vfmadd.sd(<2 x double> %av, <2 x double> %av, <2 x double> %bv)340 341  %sr = extractelement <2 x double> %vr, i32 0342  store double %sr, ptr %a343  ret void344}345 346define void @fmadd_aba_sd(ptr %a, ptr %b) {347; AVX2-LABEL: fmadd_aba_sd:348; AVX2:       # %bb.0:349; AVX2-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero350; AVX2-NEXT:    # encoding: [0xc5,0xfb,0x10,0x07]351; AVX2-NEXT:    vfmadd231sd (%rsi), %xmm0, %xmm0 # encoding: [0xc4,0xe2,0xf9,0xb9,0x06]352; AVX2-NEXT:    # xmm0 = (xmm0 * mem) + xmm0353; AVX2-NEXT:    vmovsd %xmm0, (%rdi) # encoding: [0xc5,0xfb,0x11,0x07]354; AVX2-NEXT:    retq # encoding: [0xc3]355;356; AVX512-LABEL: fmadd_aba_sd:357; AVX512:       # %bb.0:358; AVX512-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero359; AVX512-NEXT:    # EVEX TO VEX Compression encoding: [0xc5,0xfb,0x10,0x07]360; AVX512-NEXT:    vfmadd231sd (%rsi), %xmm0, %xmm0 # EVEX TO VEX Compression encoding: [0xc4,0xe2,0xf9,0xb9,0x06]361; AVX512-NEXT:    # xmm0 = (xmm0 * mem) + xmm0362; AVX512-NEXT:    vmovsd %xmm0, (%rdi) # EVEX TO VEX Compression encoding: [0xc5,0xfb,0x11,0x07]363; AVX512-NEXT:    retq # encoding: [0xc3]364  %a.val = load double, ptr %a365  %av0 = insertelement <2 x double> undef, double %a.val, i32 0366  %av  = insertelement <2 x double> %av0, double 0.000000e+00, i32 1367 368  %b.val = load double, ptr %b369  %bv0 = insertelement <2 x double> undef, double %b.val, i32 0370  %bv  = insertelement <2 x double> %bv0, double 0.000000e+00, i32 1371 372  %vr = call <2 x double> @llvm.x86.fma.vfmadd.sd(<2 x double> %av, <2 x double> %bv, <2 x double> %av)373 374  %sr = extractelement <2 x double> %vr, i32 0375  store double %sr, ptr %a376  ret void377}378 379define void @fmsub_aab_sd(ptr %a, ptr %b) {380; AVX2-LABEL: fmsub_aab_sd:381; AVX2:       # %bb.0:382; AVX2-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero383; AVX2-NEXT:    # encoding: [0xc5,0xfb,0x10,0x07]384; AVX2-NEXT:    vfmsub213sd (%rsi), %xmm0, %xmm0 # encoding: [0xc4,0xe2,0xf9,0xab,0x06]385; AVX2-NEXT:    # xmm0 = (xmm0 * xmm0) - mem386; AVX2-NEXT:    vmovsd %xmm0, (%rdi) # encoding: [0xc5,0xfb,0x11,0x07]387; AVX2-NEXT:    retq # encoding: [0xc3]388;389; AVX512-LABEL: fmsub_aab_sd:390; AVX512:       # %bb.0:391; AVX512-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero392; AVX512-NEXT:    # EVEX TO VEX Compression encoding: [0xc5,0xfb,0x10,0x07]393; AVX512-NEXT:    vfmsub213sd (%rsi), %xmm0, %xmm0 # EVEX TO VEX Compression encoding: [0xc4,0xe2,0xf9,0xab,0x06]394; AVX512-NEXT:    # xmm0 = (xmm0 * xmm0) - mem395; AVX512-NEXT:    vmovsd %xmm0, (%rdi) # EVEX TO VEX Compression encoding: [0xc5,0xfb,0x11,0x07]396; AVX512-NEXT:    retq # encoding: [0xc3]397  %a.val = load double, ptr %a398  %av0 = insertelement <2 x double> undef, double %a.val, i32 0399  %av  = insertelement <2 x double> %av0, double 0.000000e+00, i32 1400 401  %b.val = load double, ptr %b402  %bv0 = insertelement <2 x double> undef, double %b.val, i32 0403  %bv  = insertelement <2 x double> %bv0, double 0.000000e+00, i32 1404 405  %vr = call <2 x double> @llvm.x86.fma.vfmsub.sd(<2 x double> %av, <2 x double> %av, <2 x double> %bv)406 407  %sr = extractelement <2 x double> %vr, i32 0408  store double %sr, ptr %a409  ret void410}411 412define void @fmsub_aba_sd(ptr %a, ptr %b) {413; AVX2-LABEL: fmsub_aba_sd:414; AVX2:       # %bb.0:415; AVX2-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero416; AVX2-NEXT:    # encoding: [0xc5,0xfb,0x10,0x07]417; AVX2-NEXT:    vfmsub231sd (%rsi), %xmm0, %xmm0 # encoding: [0xc4,0xe2,0xf9,0xbb,0x06]418; AVX2-NEXT:    # xmm0 = (xmm0 * mem) - xmm0419; AVX2-NEXT:    vmovsd %xmm0, (%rdi) # encoding: [0xc5,0xfb,0x11,0x07]420; AVX2-NEXT:    retq # encoding: [0xc3]421;422; AVX512-LABEL: fmsub_aba_sd:423; AVX512:       # %bb.0:424; AVX512-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero425; AVX512-NEXT:    # EVEX TO VEX Compression encoding: [0xc5,0xfb,0x10,0x07]426; AVX512-NEXT:    vfmsub231sd (%rsi), %xmm0, %xmm0 # EVEX TO VEX Compression encoding: [0xc4,0xe2,0xf9,0xbb,0x06]427; AVX512-NEXT:    # xmm0 = (xmm0 * mem) - xmm0428; AVX512-NEXT:    vmovsd %xmm0, (%rdi) # EVEX TO VEX Compression encoding: [0xc5,0xfb,0x11,0x07]429; AVX512-NEXT:    retq # encoding: [0xc3]430  %a.val = load double, ptr %a431  %av0 = insertelement <2 x double> undef, double %a.val, i32 0432  %av  = insertelement <2 x double> %av0, double 0.000000e+00, i32 1433 434  %b.val = load double, ptr %b435  %bv0 = insertelement <2 x double> undef, double %b.val, i32 0436  %bv  = insertelement <2 x double> %bv0, double 0.000000e+00, i32 1437 438  %vr = call <2 x double> @llvm.x86.fma.vfmsub.sd(<2 x double> %av, <2 x double> %bv, <2 x double> %av)439 440  %sr = extractelement <2 x double> %vr, i32 0441  store double %sr, ptr %a442  ret void443}444 445define void @fnmadd_aab_sd(ptr %a, ptr %b) {446; AVX2-LABEL: fnmadd_aab_sd:447; AVX2:       # %bb.0:448; AVX2-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero449; AVX2-NEXT:    # encoding: [0xc5,0xfb,0x10,0x07]450; AVX2-NEXT:    vfnmadd213sd (%rsi), %xmm0, %xmm0 # encoding: [0xc4,0xe2,0xf9,0xad,0x06]451; AVX2-NEXT:    # xmm0 = -(xmm0 * xmm0) + mem452; AVX2-NEXT:    vmovsd %xmm0, (%rdi) # encoding: [0xc5,0xfb,0x11,0x07]453; AVX2-NEXT:    retq # encoding: [0xc3]454;455; AVX512-LABEL: fnmadd_aab_sd:456; AVX512:       # %bb.0:457; AVX512-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero458; AVX512-NEXT:    # EVEX TO VEX Compression encoding: [0xc5,0xfb,0x10,0x07]459; AVX512-NEXT:    vfnmadd213sd (%rsi), %xmm0, %xmm0 # EVEX TO VEX Compression encoding: [0xc4,0xe2,0xf9,0xad,0x06]460; AVX512-NEXT:    # xmm0 = -(xmm0 * xmm0) + mem461; AVX512-NEXT:    vmovsd %xmm0, (%rdi) # EVEX TO VEX Compression encoding: [0xc5,0xfb,0x11,0x07]462; AVX512-NEXT:    retq # encoding: [0xc3]463  %a.val = load double, ptr %a464  %av0 = insertelement <2 x double> undef, double %a.val, i32 0465  %av  = insertelement <2 x double> %av0, double 0.000000e+00, i32 1466 467  %b.val = load double, ptr %b468  %bv0 = insertelement <2 x double> undef, double %b.val, i32 0469  %bv  = insertelement <2 x double> %bv0, double 0.000000e+00, i32 1470 471  %vr = call <2 x double> @llvm.x86.fma.vfnmadd.sd(<2 x double> %av, <2 x double> %av, <2 x double> %bv)472 473  %sr = extractelement <2 x double> %vr, i32 0474  store double %sr, ptr %a475  ret void476}477 478define void @fnmadd_aba_sd(ptr %a, ptr %b) {479; AVX2-LABEL: fnmadd_aba_sd:480; AVX2:       # %bb.0:481; AVX2-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero482; AVX2-NEXT:    # encoding: [0xc5,0xfb,0x10,0x07]483; AVX2-NEXT:    vfnmadd231sd (%rsi), %xmm0, %xmm0 # encoding: [0xc4,0xe2,0xf9,0xbd,0x06]484; AVX2-NEXT:    # xmm0 = -(xmm0 * mem) + xmm0485; AVX2-NEXT:    vmovsd %xmm0, (%rdi) # encoding: [0xc5,0xfb,0x11,0x07]486; AVX2-NEXT:    retq # encoding: [0xc3]487;488; AVX512-LABEL: fnmadd_aba_sd:489; AVX512:       # %bb.0:490; AVX512-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero491; AVX512-NEXT:    # EVEX TO VEX Compression encoding: [0xc5,0xfb,0x10,0x07]492; AVX512-NEXT:    vfnmadd231sd (%rsi), %xmm0, %xmm0 # EVEX TO VEX Compression encoding: [0xc4,0xe2,0xf9,0xbd,0x06]493; AVX512-NEXT:    # xmm0 = -(xmm0 * mem) + xmm0494; AVX512-NEXT:    vmovsd %xmm0, (%rdi) # EVEX TO VEX Compression encoding: [0xc5,0xfb,0x11,0x07]495; AVX512-NEXT:    retq # encoding: [0xc3]496  %a.val = load double, ptr %a497  %av0 = insertelement <2 x double> undef, double %a.val, i32 0498  %av  = insertelement <2 x double> %av0, double 0.000000e+00, i32 1499 500  %b.val = load double, ptr %b501  %bv0 = insertelement <2 x double> undef, double %b.val, i32 0502  %bv  = insertelement <2 x double> %bv0, double 0.000000e+00, i32 1503 504  %vr = call <2 x double> @llvm.x86.fma.vfnmadd.sd(<2 x double> %av, <2 x double> %bv, <2 x double> %av)505 506  %sr = extractelement <2 x double> %vr, i32 0507  store double %sr, ptr %a508  ret void509}510 511define void @fnmsub_aab_sd(ptr %a, ptr %b) {512; AVX2-LABEL: fnmsub_aab_sd:513; AVX2:       # %bb.0:514; AVX2-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero515; AVX2-NEXT:    # encoding: [0xc5,0xfb,0x10,0x07]516; AVX2-NEXT:    vfnmsub213sd (%rsi), %xmm0, %xmm0 # encoding: [0xc4,0xe2,0xf9,0xaf,0x06]517; AVX2-NEXT:    # xmm0 = -(xmm0 * xmm0) - mem518; AVX2-NEXT:    vmovsd %xmm0, (%rdi) # encoding: [0xc5,0xfb,0x11,0x07]519; AVX2-NEXT:    retq # encoding: [0xc3]520;521; AVX512-LABEL: fnmsub_aab_sd:522; AVX512:       # %bb.0:523; AVX512-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero524; AVX512-NEXT:    # EVEX TO VEX Compression encoding: [0xc5,0xfb,0x10,0x07]525; AVX512-NEXT:    vfnmsub213sd (%rsi), %xmm0, %xmm0 # EVEX TO VEX Compression encoding: [0xc4,0xe2,0xf9,0xaf,0x06]526; AVX512-NEXT:    # xmm0 = -(xmm0 * xmm0) - mem527; AVX512-NEXT:    vmovsd %xmm0, (%rdi) # EVEX TO VEX Compression encoding: [0xc5,0xfb,0x11,0x07]528; AVX512-NEXT:    retq # encoding: [0xc3]529  %a.val = load double, ptr %a530  %av0 = insertelement <2 x double> undef, double %a.val, i32 0531  %av  = insertelement <2 x double> %av0, double 0.000000e+00, i32 1532 533  %b.val = load double, ptr %b534  %bv0 = insertelement <2 x double> undef, double %b.val, i32 0535  %bv  = insertelement <2 x double> %bv0, double 0.000000e+00, i32 1536 537  %vr = call <2 x double> @llvm.x86.fma.vfnmsub.sd(<2 x double> %av, <2 x double> %av, <2 x double> %bv)538 539  %sr = extractelement <2 x double> %vr, i32 0540  store double %sr, ptr %a541  ret void542}543 544define void @fnmsub_aba_sd(ptr %a, ptr %b) {545; AVX2-LABEL: fnmsub_aba_sd:546; AVX2:       # %bb.0:547; AVX2-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero548; AVX2-NEXT:    # encoding: [0xc5,0xfb,0x10,0x07]549; AVX2-NEXT:    vfnmsub231sd (%rsi), %xmm0, %xmm0 # encoding: [0xc4,0xe2,0xf9,0xbf,0x06]550; AVX2-NEXT:    # xmm0 = -(xmm0 * mem) - xmm0551; AVX2-NEXT:    vmovsd %xmm0, (%rdi) # encoding: [0xc5,0xfb,0x11,0x07]552; AVX2-NEXT:    retq # encoding: [0xc3]553;554; AVX512-LABEL: fnmsub_aba_sd:555; AVX512:       # %bb.0:556; AVX512-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero557; AVX512-NEXT:    # EVEX TO VEX Compression encoding: [0xc5,0xfb,0x10,0x07]558; AVX512-NEXT:    vfnmsub231sd (%rsi), %xmm0, %xmm0 # EVEX TO VEX Compression encoding: [0xc4,0xe2,0xf9,0xbf,0x06]559; AVX512-NEXT:    # xmm0 = -(xmm0 * mem) - xmm0560; AVX512-NEXT:    vmovsd %xmm0, (%rdi) # EVEX TO VEX Compression encoding: [0xc5,0xfb,0x11,0x07]561; AVX512-NEXT:    retq # encoding: [0xc3]562  %a.val = load double, ptr %a563  %av0 = insertelement <2 x double> undef, double %a.val, i32 0564  %av  = insertelement <2 x double> %av0, double 0.000000e+00, i32 1565 566  %b.val = load double, ptr %b567  %bv0 = insertelement <2 x double> undef, double %b.val, i32 0568  %bv  = insertelement <2 x double> %bv0, double 0.000000e+00, i32 1569 570  %vr = call <2 x double> @llvm.x86.fma.vfnmsub.sd(<2 x double> %av, <2 x double> %bv, <2 x double> %av)571 572  %sr = extractelement <2 x double> %vr, i32 0573  store double %sr, ptr %a574  ret void575}576 577 578