On Tue, Dec 13, 2005 at 09:25:45PM +0000, Joern RENNECKE wrote:
> >While we could use pushhi2 insn
> >(would need to use pre_modify rather than pre_dec etc.), it wouldn't
> >buy us anything.
> >
> Presumably, it would prevent a partial register stall.

Alternatively we could
subl $4, %esp
movw %ax, (%esp)
instead of
pushl %eax
Not sure how would that perform cycle wise though (on the testcase
there is actually not a partial register stall at all, since the QI->HI
zero extension is movzbl, so pushl %eax in this case is best).

BTW, I just noticed I posted an older incomplete version of the patch,
ix86_free_from_memory obviously needs corresponding adjustement.

2005-12-13  Jakub Jelinek  <[EMAIL PROTECTED]>

        PR debug/25023
        * config/i386/i386.c (ix86_force_to_memory): Always use
        SImode push for HImode in -m32.
        (ix86_free_from_memory): Likewise.

        * gcc.dg/pr25023.c: New test.

--- gcc/config/i386/i386.c.jj   2005-12-13 12:31:15.000000000 +0100
+++ gcc/config/i386/i386.c      2005-12-13 22:07:18.000000000 +0100
@@ -15790,9 +15790,8 @@ ix86_force_to_memory (enum machine_mode 
          }
          break;
        case HImode:
-         /* It is better to store HImodes as SImodes.  */
-         if (!TARGET_PARTIAL_REG_STALL)
-           operand = gen_lowpart (SImode, operand);
+         /* Store HImodes as SImodes.  */
+         operand = gen_lowpart (SImode, operand);
          /* FALLTHRU */
        case SImode:
          emit_insn (
@@ -15820,8 +15819,6 @@ ix86_free_from_memory (enum machine_mode
 
       if (mode == DImode || TARGET_64BIT)
        size = 8;
-      else if (mode == HImode && TARGET_PARTIAL_REG_STALL)
-       size = 2;
       else
        size = 4;
       /* Use LEA to deallocate stack space.  In peephole2 it will be converted
--- gcc/testsuite/gcc.dg/pr25023.c.jj   2005-12-13 22:11:38.000000000 +0100
+++ gcc/testsuite/gcc.dg/pr25023.c      2005-12-13 22:12:50.000000000 +0100
@@ -0,0 +1,12 @@
+/* PR debug/25023 */
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+/* { dg-options "-O2 -mtune=i686" { target { { i?86-*-* || x86_64-*-* } && 
ilp32 } } } */
+
+extern unsigned char v;
+
+float
+foo (void)
+{
+  return v;
+}

        Jakub

Reply via email to