workaround for "error: more than 30 operands in 'asm'"?
Clem Taylor
clem.taylor@gmail.com
Fri Mar 14 01:10:00 GMT 2008
On Thu, Mar 13, 2008 at 1:56 AM, Ian Lance Taylor <iant@google.com> wrote:
> Since you mention the number of registers you are using, note that
> that only matters if they are inputs or outputs. If you need a
> temporary register, just pick one, and add it the clobber list. But
> if you really have that many inputs and outputs, then you are stuck.
I'm using input and outputs because I want the compiler to pick the
registers and I want to have named values. The inline block looks
something like:
asm (
"... bunch-o-vmx code ..."
: [rIn0] "=rv" (rIn0), [gIn0] "=rv" (gIn0), [bIn0] "=rv" (bIn0), ...
: [rpix] "r" (rpix), [gpix] "r" (gpix), [bpix] "r" (bpix), ...
: "memory" );
Writing this type of code using %0 %1 ... %n would be very painful and
unpleasant to maintain. If gcc 4.2.x did a sane jobs scheduling the C
intrinsic version of this code I wouldn't need to use inline assembly.
I wrote the C version in the order that shouldn't have any stalls. But
the compiler re-orders the code and takes offset constants and
recomputes them inside the loop [values like 0, 16, 32, ... 112]. With
all the write/read stalls and extra addi instructions, the C intrinsic
version runs at >5 cycles per instruction and overall the asm version
is ~10x faster, ouch.
--Clem
More information about the Gcc-help
mailing list