This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

gcc register allocation error when reloading an asm


Hello colleagues,

I've come across a suspicious error with inline asm and register allocation,
and am looking for a clarification of the rules.

What aspect of inline asm processing is preventing gcc from allocating
register eax to both %0 and %1's address in the following test case?

    gcc -m32 -S foo.c
    foo.c: In function 'foo':
    foo.c:20: error: can't find a register in class 'GENERAL_REGS' while reloading 'asm'

I could understand this error if val was an early clobber, "=&r" (val),
as the description of "&" says such operands cannot be assigned to the
same register as an input, or any register used in a memory address.
But since no ampersand is present, it seems eax is available here
for both operands.

int foo(int *ptr) {
    int val;

    __asm__ __volatile__("junk %0, %1"
                         : "=r" (val), "+m" (*ptr)
                         : : "memory" , "ebx" , "ecx" , "edx" , "esi" , "edi");
    return val;
}

Looking forward to an answer, thanks!

Mitch Bodart
Intel Corporation


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]