diff options
-rw-r--r-- | llvm/test/CodeGen/X86/avx2-fma-fneg-combine.ll | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/llvm/test/CodeGen/X86/avx2-fma-fneg-combine.ll b/llvm/test/CodeGen/X86/avx2-fma-fneg-combine.ll index df1248b725d..9ebc3b8941b 100644 --- a/llvm/test/CodeGen/X86/avx2-fma-fneg-combine.ll +++ b/llvm/test/CodeGen/X86/avx2-fma-fneg-combine.ll @@ -115,3 +115,31 @@ entry: declare <2 x double> @llvm.x86.fma.vfmadd.pd(<2 x double> %a, <2 x double> %b, <2 x double> %c) +define <8 x float> @test7(float %a, <8 x float> %b, <8 x float> %c) { +; X32-LABEL: test7: +; X32: # %bb.0: # %entry +; X32-NEXT: vmovss {{.*#+}} xmm2 = mem[0],zero,zero,zero +; X32-NEXT: vmovss {{.*#+}} xmm3 = mem[0],zero,zero,zero +; X32-NEXT: vsubps %ymm2, %ymm3, %ymm2 +; X32-NEXT: vbroadcastss %xmm2, %ymm2 +; X32-NEXT: vfmadd213ps {{.*#+}} ymm0 = (ymm2 * ymm0) + ymm1 +; X32-NEXT: retl +; +; X64-LABEL: test7: +; X64: # %bb.0: # %entry +; X64-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm0 +; X64-NEXT: vmovss {{.*#+}} xmm3 = mem[0],zero,zero,zero +; X64-NEXT: vsubps %ymm0, %ymm3, %ymm0 +; X64-NEXT: vbroadcastss %xmm0, %ymm0 +; X64-NEXT: vfmadd213ps {{.*#+}} ymm0 = (ymm1 * ymm0) + ymm2 +; X64-NEXT: retq +entry: + %0 = insertelement <8 x float> undef, float %a, i32 0 + %1 = fsub <8 x float> <float -0.000000e+00, float undef, float undef, float undef, float undef, float undef, float undef, float undef>, %0 + %2 = shufflevector <8 x float> %1, <8 x float> undef, <8 x i32> zeroinitializer + %3 = tail call <8 x float> @llvm.fma.v8f32(<8 x float> %2, <8 x float> %b, <8 x float> %c) + ret <8 x float> %3 + +} + +declare <8 x float> @llvm.fma.v8f32(<8 x float> %a, <8 x float> %b, <8 x float> %c) |