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