workaround for "error: more than 30 operands in 'asm'"?

Andrew Haley aph@redhat.com
Fri Mar 14 10:11:00 GMT 2008


Ian Lance Taylor wrote:
> Andrew Haley <aph@redhat.com> writes:
> 
>> Ian Lance Taylor wrote:
>>> "Clem Taylor" <clem.taylor@gmail.com> writes:
>>>
>>>> I'm working on taking PowerPC VMX code that uses altivec intrinsics
>>>> and rescheduling it with inline assembly. gcc is making some fairly
>>>> bad scheduling choices in with the code, resulting in code that is
>>>> running 4x slower then I was hoping for. I have a simplified version
>>>> working, but with the real version gcc is failing with: "error: more
>>>> than 30 operands in 'asm'". The code is using 28 vector registers and
>>>> 6 serial registers.
>>>>
>>>> The code is a mixture of setup code in C and only the inner loop is in
>>>> assembly, so it wouldn't be convenient to write this directly in
>>>> assembly. Also, because the code is highly pipelined (to overcome the
>>>> latency of the VMX floating point unit) it is a mess to split this up
>>>> into multiple asm() statements. Beyond recompiling gcc with a larger
>>>> operand count, is there a workaround for this problem?
>>> Use fewer operands?  Otherwise, no.  It's a hard limit in gcc.
>>>
>>> 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.
>> Isn't this trivially fixed by changing:
>>
>>   /* Allow at least 30 operands for the sake of asm constructs.  */
>>   /* ??? We *really* ought to reorganize things such that there
>>      is no fixed upper bound.  */
>>   max_recog_operands = 29;  /* We will add 1 later.  */
>>   max_dup_operands = 1;
>>
>> in genconfig.c ?
> 
> Yes.  Sorry for being confusing, I was answering the question "beyond
> recompiling gcc...."

I wonder if we could do something more sensible than simply using the
constant 30.  Perhaps some function of FIRST_PSEUDO_REGISTER, like
FIRST_PSEUDO_REGISTER+20, or FIRST_PSEUDO_REGISTER*2 or even
MAX (FIRST_PSEUDO_REGISTER, 29).  This would at least solve the problem
here.

Andrew.



More information about the Gcc-help mailing list