Re: [PATCH] [POWERPC] Improve (in|out)_beXX() asm code

From: Trent Piepho
Date: Wed May 21 2008 - 16:32:28 EST


On Wed, 21 May 2008, Andreas Schwab wrote:
Trent Piepho <tpiepho@xxxxxxxxxxxxx> writes:
On Wed, 21 May 2008, Andreas Schwab wrote:
Trent Piepho <tpiepho@xxxxxxxxxxxxx> writes:
It's the _le versions that have a problem, since we can't get gcc to just use
the register indexed mode. It seems like an obvious thing to have a
constraint for, but I guess there weren't enough instructions that only come
in 'x' versions to bother with it. There is a 'Z' constraint, "Memory operand
that is an indexed or indirect from a register", but I tried it and it can use
both "rb,ri" and "disp(rb)" forms. Actually, I'm not sure how 'Z' is any
different than "m"?

'Z' will never emit a non-zero constant displacement.

It's too bad gas doesn't appear to be smart enough to turn:
stwbrx 0, 0(3) -or- stwbr 0, 0(3)

Use the %y modifier when substituting the operand.

Of course, the undocumented y modifier! "Print AltiVec or SPE memory operand"
Why didn't I think of that?

That appears to work. I can get gcc to to emit 0,reg and reg,reg but not
disp(reg). It won't try to use an "update" address either, though it will
with an "m" constraint.

But, gcc 4.0.2 can't handle the 'Z' constraint. It looks like it's not
supported. Other than this, I can build a kernel with 4.0.2 that appears to
work. Is it ok to break compatibility with 4.0.2, or should I put in a gcc
version check?
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/