http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56479
Bug #: 56479
Summary: Register allocator can't allocate two 4-byte variables
into 8 registers for inline asm on avr-gcc
Classification: Unclassified
Product: gcc
Version: 4.7.2
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: inline-asm
AssignedTo: [email protected]
ReportedBy: [email protected]
Hi!
When I try to compile the following code with avr-gcc for atmega2560 cpu:
------------------------------------------------
#include <stdint.h>
uint64_t asmfoo(uint32_t x, uint32_t y);
int main(void)
{ return (int)asmfoo(1234, 5678); }
uint64_t asmfoo(uint32_t x, uint32_t y)
{
uint64_t z;
asm volatile (
"nop \n\t" //I'm going to make use of fmul instructions here
"nop \n\t" //which only accept r16-r23 registers
"nop \n\t"
: [Z]"=&r"(z) //"r" is any general register (r1-r32)
: [X]"a"(x), [Y]"a"(y) //"a" is a simple upper register (r16-r23)
);
return z;
}
-------------------------------------------------
I get the following error:
$ avr-gcc-4.7.2 -c test.c
test.c: In function 'asmfoo':
test.c:13: error: can't find a register in class 'SIMPLE_LD_REGS' while
reloading 'asm'
test.c:13: error: 'asm' operand has impossible constraints
I have tested it with 4.3.2 and 4.7.2 with different optimization levels.
On the other hand, the following code DOES compile:
-------------------------------------------------
#include <stdint.h>
uint64_t asmfoo(uint64_t x, uint32_t y);
int main(void)
{ return (int)asmfoo(1234, 5678); }
uint64_t asmfoo(uint64_t x, uint32_t y) // <-note the uint64_t
{
uint64_t z;
asm volatile (
"nop \n\t"
"nop \n\t"
"nop \n\t"
: [Z]"=&r"(z)
: [X]"a"(x) // <-note the absence of y
);
return z;
}
-------------------------------------------------