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: unassig...@gcc.gnu.org

        ReportedBy: shuly...@gmail.com





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;

}

-------------------------------------------------

Reply via email to