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

login
register
mail settings
Submitter Uros Bizjak
Date March 11, 2012, 3:53 p.m.
Message ID <CAFULd4ZPtz6X1=KjVz=A-b3UcaZJ-hYN+je6v2teOUheU6Lwyw@mail.gmail.com>
Download mbox | patch
Permalink /patch/145986/
State New
Headers show

Comments

Uros Bizjak - March 11, 2012, 3:53 p.m.
On Sun, Mar 11, 2012 at 3:30 PM, Uros Bizjak <ubizjak@gmail.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));

I am testing attached patch:

2012-03-11  Uros Bizjak  <ubizjak@gmail.com>

	* config/i386/i386.c (ix86_zero_extend_to_Pmode): Rewrite using
	convert_to_mode.
	(ix86_expand_call): Use force_reg istead of copy_to_mode_reg.

Uros.


> Uros.
H.J. Lu - March 11, 2012, 4:56 p.m.
On Sun, Mar 11, 2012 at 8:53 AM, Uros Bizjak <ubizjak@gmail.com> wrote:
> On Sun, Mar 11, 2012 at 3:30 PM, Uros Bizjak <ubizjak@gmail.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));
>
> I am testing attached patch:
>
> 2012-03-11  Uros Bizjak  <ubizjak@gmail.com>
>
>        * config/i386/i386.c (ix86_zero_extend_to_Pmode): Rewrite using
>        convert_to_mode.
>        (ix86_expand_call): Use force_reg istead of copy_to_mode_reg.
>

It passed all tests in GCC testsuite under Linux/x32 and glibc x32
tests.

Thanks.
Uros Bizjak - March 11, 2012, 6:23 p.m.
On Sun, Mar 11, 2012 at 5:56 PM, H.J. Lu <hjl.tools@gmail.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));
>>
>> I am testing attached patch:
>>
>> 2012-03-11  Uros Bizjak  <ubizjak@gmail.com>
>>
>>        * config/i386/i386.c (ix86_zero_extend_to_Pmode): Rewrite using
>>        convert_to_mode.
>>        (ix86_expand_call): Use force_reg istead of copy_to_mode_reg.
>>
>
> It passed all tests in GCC testsuite under Linux/x32 and glibc x32
> tests.

I have committed the patch without (ix86_expand_call) change. The
later change was wrong, since it allowed arg register in the call
pattern.

Please commit your loop expand patch.

Thanks,
Uros.

Patch

Index: i386.c
===================================================================
--- i386.c	(revision 185193)
+++ i386.c	(working copy)
@@ -21025,14 +21025,9 @@  ix86_adjust_counter (rtx countreg, HOST_WIDE_INT v
 rtx
 ix86_zero_extend_to_Pmode (rtx exp)
 {
-  rtx r;
-  if (GET_MODE (exp) == VOIDmode)
-    return force_reg (Pmode, 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));
-  return r;
+  if (GET_MODE (exp) != Pmode)
+    exp = convert_to_mode (Pmode, exp, 1);
+  return force_reg (Pmode, exp);
 }
 
 /* Divide COUNTREG by SCALE.  */
@@ -22996,7 +22991,7 @@  ix86_expand_call (rtx retval, rtx fnaddr, rtx call
       fnaddr = XEXP (fnaddr, 0);
       if (GET_MODE (fnaddr) != word_mode)
 	fnaddr = convert_to_mode (word_mode, fnaddr, 1);
-      fnaddr = gen_rtx_MEM (QImode, copy_to_mode_reg (word_mode, fnaddr));
+      fnaddr = gen_rtx_MEM (QImode, force_reg (word_mode, fnaddr));
     }
 
   vec_len = 0;