Hi,
On Fri, 18 Jan 2008, Michael Matz wrote:
> On Fri, 18 Jan 2008, Johannes Schindelin wrote:
>
> > > > >+#if DATA_SIZE == 1 || DATA_SIZE == 2
> > > > >+ "q" (v),
> > > > >+#else
> > > > > "r" (v),
> > > > >+#endif
> > > > > "i" ((CPU_TLB_SIZE - 1) << CPU_TLB_ENTRY_BITS),
> > > > > "i" (TARGET_PAGE_BITS - CPU_TLB_ENTRY_BITS),
> > > > > "i" (TARGET_PAGE_MASK | (DATA_SIZE - 1)),
> > > > >-- snap --
> > > > >
> > > > >Michael, Alexander, what is this hunk supposed to do?
> > >
> > > This is required to generate valid assembler code. Without that hunk,
> > > the
> > > interesting parts of the asm look like so (for DATA_SIZE == 1):
> > >
> > > asm (" ... movzbl %b1, %%edx\n ... " : : "r" (blubb), "r" (bla) );
> >
> > Okay, but this only concerns gcc4, apparently.
>
> No, it's nothing to do with GCC.
But apparently it has! With gcc < 4 I did never get the error. Which
probably means that gcc < 4 did _not_ use ecx, and therefore it does not
have to be pushed and popped. Which -- judging from how commonly glue()
is called in op.c -- could mean a performance hit.
I am all for supporting gcc > 3, but please, please not at the cost of
having a performance hit for _existing_ users.
> > Can't we guard it with yet another "defined(GCC...)"?
>
> Only if you want to trust your luck. I fear I don't have gcc 3.4.2
> lying around anywhere, so I can't really help debugging this reload
> breakage in that GCC version. It might help to introduce a temporary to
> guide GCC through this problematic reload case by detaching the global
> register variable from the asm operand. For cases where it's no problem
> this should be optimized away, so doesn't inhibit a performance cost.
> What I mean is something like the below. If someone with gcc 3.4.2
> could test that ...
I do ask myself how gcc would optimise away instructions that are
explicitely written in the asm() statement. If it does so, I consider
this a serious bug in gcc.
Ciao,
Dscho