diff mbox

[07/10] addr32: Use word_mode instead of Pmode in loop expand

Message ID CAMe9rOqmUqyVt-Risjyo3iQR_XeORkyXZ+HopHgL2OX0F9NH8Q@mail.gmail.com
State New
Headers show

Commit Message

H.J. Lu March 11, 2012, 1:06 a.m. UTC
On Thu, Mar 8, 2012 at 3:22 AM, Uros Bizjak <ubizjak@gmail.com> wrote:
> On Fri, Mar 2, 2012 at 10:02 PM, H.J. Lu <hongjiu.lu@intel.com> wrote:
>
>> This patches uses word_mode instead of Pmode in loop expand since
>> word_mode may have bigger size than Pmode.  OK for trunk?
>>
>> Thanks.
>>
>> H.J.
>> ---
>> 2012-03-02  H.J. Lu  <hongjiu.lu@intel.com>
>>
>>        * config/i386/i386.c (ix86_expand_movmem): Use word_mode instead
>>        of Pmode on loop.
>>        (ix86_expand_setmem): Likwise.
>
> Jan, can you please comment on the changes in this patch?
>

Here is a complete updated patch to use word_mode in ix86_expand_movmem
and ix86_expand_setmem.  It also fixes ix86_zero_extend_to_Pmode to handle
Pmode != DImode.  OK for trunk?

Thanks.

Comments

Uros Bizjak March 11, 2012, 2:30 p.m. UTC | #1
On Sun, Mar 11, 2012 at 2:06 AM, H.J. Lu <hjl.tools@gmail.com> wrote:
> On Thu, Mar 8, 2012 at 3:22 AM, Uros Bizjak <ubizjak@gmail.com> wrote:
>> On Fri, Mar 2, 2012 at 10:02 PM, H.J. Lu <hongjiu.lu@intel.com> wrote:
>>
>>> This patches uses word_mode instead of Pmode in loop expand since
>>> word_mode may have bigger size than Pmode.  OK for trunk?
>>>
>>> Thanks.
>>>
>>> H.J.
>>> ---
>>> 2012-03-02  H.J. Lu  <hongjiu.lu@intel.com>
>>>
>>>        * config/i386/i386.c (ix86_expand_movmem): Use word_mode instead
>>>        of Pmode on loop.
>>>        (ix86_expand_setmem): Likwise.
>>
>> Jan, can you please comment on the changes in this patch?
>>
>
> Here is a complete updated patch to use word_mode in ix86_expand_movmem
> and ix86_expand_setmem.  It also fixes ix86_zero_extend_to_Pmode to handle
> Pmode != DImode.  OK for trunk?

Please rewrite ix86_zero_extend_to_Pmode to something like:
  rtx tmp;
  if (GET_MODE (exp) != Pmode)
    tmp = convert_to_mode (Pmode, exp, 1);
  return force_reg (Pmode, tmp));

Uros.
Jan Hubicka March 12, 2012, 2:03 p.m. UTC | #2
> On Sun, Mar 11, 2012 at 2:06 AM, H.J. Lu <hjl.tools@gmail.com> wrote:
> > On Thu, Mar 8, 2012 at 3:22 AM, Uros Bizjak <ubizjak@gmail.com> wrote:
> >> On Fri, Mar 2, 2012 at 10:02 PM, H.J. Lu <hongjiu.lu@intel.com> wrote:
> >>
> >>> This patches uses word_mode instead of Pmode in loop expand since
> >>> word_mode may have bigger size than Pmode.  OK for trunk?
> >>>
> >>> Thanks.
> >>>
> >>> H.J.
> >>> ---
> >>> 2012-03-02  H.J. Lu  <hongjiu.lu@intel.com>
> >>>
> >>>        * config/i386/i386.c (ix86_expand_movmem): Use word_mode instead
> >>>        of Pmode on loop.
> >>>        (ix86_expand_setmem): Likwise.
> >>
> >> Jan, can you please comment on the changes in this patch?
> >>
> >
> > Here is a complete updated patch to use word_mode in ix86_expand_movmem
> > and ix86_expand_setmem.  It also fixes ix86_zero_extend_to_Pmode to handle
> > Pmode != DImode.  OK for trunk?
> 
> Please rewrite ix86_zero_extend_to_Pmode to something like:
>   rtx tmp;
>   if (GET_MODE (exp) != Pmode)
>     tmp = convert_to_mode (Pmode, exp, 1);
>   return force_reg (Pmode, tmp));

Yes, the patch looks OK with this change.

Thanks,
Honza
diff mbox

Patch

diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
index bc144a9..a51c6b4 100644
--- a/gcc/config/i386/i386.c
+++ b/gcc/config/i386/i386.c
@@ -21031,7 +21031,11 @@  ix86_zero_extend_to_Pmode (rtx exp)
   if (GET_MODE (exp) == Pmode)
     return copy_to_mode_reg (Pmode, exp);
   r = gen_reg_rtx (Pmode);
-  emit_insn (gen_zero_extendsidi2 (r, exp));
+  if (Pmode == DImode)
+    emit_insn (gen_zero_extendsidi2 (r, exp));
+  else
+    emit_move_insn (r,
+		    simplify_gen_subreg (Pmode, exp, GET_MODE (exp), 0));
   return r;
 }
 
@@ -22060,11 +22064,11 @@  ix86_expand_movmem (rtx dst, rtx src, rtx count_exp, rtx align_exp,
       gcc_unreachable ();
     case loop:
       need_zero_guard = true;
-      size_needed = GET_MODE_SIZE (Pmode);
+      size_needed = GET_MODE_SIZE (word_mode);
       break;
     case unrolled_loop:
       need_zero_guard = true;
-      size_needed = GET_MODE_SIZE (Pmode) * (TARGET_64BIT ? 4 : 2);
+      size_needed = GET_MODE_SIZE (word_mode) * (TARGET_64BIT ? 4 : 2);
       break;
     case rep_prefix_8_byte:
       size_needed = 8;
@@ -22230,13 +22234,13 @@  ix86_expand_movmem (rtx dst, rtx src, rtx count_exp, rtx align_exp,
       break;
     case loop:
       expand_set_or_movmem_via_loop (dst, src, destreg, srcreg, NULL,
-				     count_exp, Pmode, 1, expected_size);
+				     count_exp, word_mode, 1, expected_size);
       break;
     case unrolled_loop:
       /* Unroll only by factor of 2 in 32bit mode, since we don't have enough
 	 registers for 4 temporaries anyway.  */
       expand_set_or_movmem_via_loop (dst, src, destreg, srcreg, NULL,
-				     count_exp, Pmode, TARGET_64BIT ? 4 : 2,
+				     count_exp, word_mode, TARGET_64BIT ? 4 : 2,
 				     expected_size);
       break;
     case rep_prefix_8_byte:
@@ -22448,11 +22452,11 @@  ix86_expand_setmem (rtx dst, rtx count_exp, rtx val_exp, rtx align_exp,
       gcc_unreachable ();
     case loop:
       need_zero_guard = true;
-      size_needed = GET_MODE_SIZE (Pmode);
+      size_needed = GET_MODE_SIZE (word_mode);
       break;
     case unrolled_loop:
       need_zero_guard = true;
-      size_needed = GET_MODE_SIZE (Pmode) * 4;
+      size_needed = GET_MODE_SIZE (word_mode) * 4;
       break;
     case rep_prefix_8_byte:
       size_needed = 8;
@@ -22623,11 +22627,11 @@  ix86_expand_setmem (rtx dst, rtx count_exp, rtx val_exp, rtx align_exp,
       break;
     case loop:
       expand_set_or_movmem_via_loop (dst, NULL, destreg, NULL, promoted_val,
-				     count_exp, Pmode, 1, expected_size);
+				     count_exp, word_mode, 1, expected_size);
       break;
     case unrolled_loop:
       expand_set_or_movmem_via_loop (dst, NULL, destreg, NULL, promoted_val,
-				     count_exp, Pmode, 4, expected_size);
+				     count_exp, word_mode, 4, expected_size);
       break;
     case rep_prefix_8_byte:
       expand_setmem_via_rep_stos (dst, destreg, promoted_val, count_exp,