PATCH: PR target/59458: alternative 13 in *movsf_internal is mishandled

H.J. Lu hjl.tools@gmail.com
Tue Dec 10 23:29:00 GMT 2013


On Tue, Dec 10, 2013 at 3:19 PM, Uros Bizjak <ubizjak@gmail.com> wrote:
> On Tue, Dec 10, 2013 at 11:23 PM, H.J. Lu <hongjiu.lu@intel.com> wrote:
>> 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.lu@intel.com>
>>
>>         PR target/59458
>>         * config/i386/i386.md (*movsf_internal): Set mode to SI for
>>         alternative 13.
>
> OK for mainline and release branches.
>

Fixed ion trunk.  4.7 and 4.8 branches are OK:

(define_insn "*movsi_internal"
  [(set (match_operand:SI 0 "nonimmediate_operand"
                        "=r,m ,*y,*y,?rm,?*y,*x,*x,?r ,m ,?*Yi,*x")
        (match_operand:SI 1 "general_operand"
                        "g ,re,C ,*y,*y ,rm ,C ,*x,*Yi,*x,r   ,m "))]

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

-- 
H.J.



More information about the Gcc-patches mailing list