Hi,

We have

(define_insn "*movsf_internal"
  [(set (match_operand:SF 0 "nonimmediate_operand"
          "=Yf*f,m   ,Yf*f,?r ,?m,v,v,v,m,?r,?Yi,!*y,!*y,!m,!r ,!*Ym")
        (match_operand:SF 1 "general_operand"
          "Yf*fm,Yf*f,G   ,rmF,rF,C,v,m,v,Yj,r  ,*y ,m  ,*y,*Yn,r"))]

alternative 13 is MMXMOV instruction to store "*y" to "!m".  But
alternative 13 gets the default mode, SF.  But MMXMOV is

    case TYPE_MMXMOV:
      switch (get_attr_mode (insn))
        {
        case MODE_DI:
          return "movq\t{%1, %0|%0, %1}";
        case MODE_SI:
          return "movd\t{%1, %0|%0, %1}";

        default:
          gcc_unreachable ();
        }

MODE_SF gets gcc_unreachable.  This patch sets mode to SI for
alternative 13. Tested on Linux/x86-64.  OK to install?

Thanks.


H.J.
---
2013-12-10   H.J. Lu  <hongjiu...@intel.com>

        PR target/59458
        * config/i386/i386.md (*movsf_internal): Set mode to SI for
        alternative 13.

diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md
index 7138868..aa2664f 100644
--- a/gcc/config/i386/i386.md
+++ b/gcc/config/i386/i386.md
@@ -3126,7 +3140,7 @@
        (const_string "1")
        (const_string "*")))
    (set (attr "mode")
-        (cond [(eq_attr "alternative" "3,4,9,10,14,15")
+        (cond [(eq_attr "alternative" "3,4,9,10,13,14,15")
                 (const_string "SI")
               (eq_attr "alternative" "11")
                 (const_string "DI")

Reply via email to