Hello,
Intel spec [1] states that there're almost all broadcasting
intructions variants available, except for (p. 2-4)
        vbroadcastsd %xmm, %xmm
It is safe to emit
        vpbroadcastq %xmm, %xmm
instead.

I was uable to extract a testcase, but if this insn is generated -
we'll got asm error.

[1] - 
https://software.intel.com/sites/default/files/managed/b4/3a/319433-024.pdf

Bootstrapped and regtested.

Richard,
is it ok to check in to main trunk?

gcc/
        * config/i386/sse.md: Use vpbroadcastq for broadcasting DF
        values to 128b regs.

--
Thanks, K

commit 72e85f1b936d61edc93603862c810a8b4817b8a7
Author: Kirill Yukhin <kirill.yuk...@intel.com>
Date:   Thu Mar 17 18:05:22 2016 +0300

    AVX-512. Use vpbroadcastq for broadcasting DF values to 128b regs.

diff --git a/gcc/config/i386/sse.md b/gcc/config/i386/sse.md
index 3c521b3..b25c246 100644
--- a/gcc/config/i386/sse.md
+++ b/gcc/config/i386/sse.md
@@ -17269,7 +17269,14 @@
            (match_operand:<ssexmmmode> 1 "nonimmediate_operand" "vm")
            (parallel [(const_int 0)]))))]
   "TARGET_AVX512F"
-  "v<sseintprefix>broadcast<bcstscalarsuff>\t{%1, 
%0<mask_operand2>|%0<mask_operand2>, %1}"
+{
+  /*  There is no DF broadcast (in AVX-512*) to 128b register.
+      Mimic it with integer variant.  */
+  if (<MODE>mode == V2DFmode)
+    return "vpbroadcastq\t{%1, %0<mask_operand2>|%0<mask_operand2>, %1}";
+  else
+    return "v<sseintprefix>broadcast<bcstscalarsuff>\t{%1, 
%0<mask_operand2>|%0<mask_operand2>, %1}";
+}
   [(set_attr "type" "ssemov")
    (set_attr "prefix" "evex")
    (set_attr "mode" "<sseinsnmode>")])

Reply via email to