This is the mail archive of the crossgcc@cygnus.com mailing list for the crossgcc project.


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

Re: asm constraints


>
>Hi
>
>I know little about using constraints with asm statements and so would
>like some clarification. With egcs-1.1b I now get bad code generated.
>This did not happen with egcs-1.0.2. The code is C++. 
>
>I use the following macro to access an 8bit device :
>
>#define WRITE_REGISTER_8(addr, data) \
>  asm volatile (" move.b  %0,%1@ " : : "g" (data), "a" (addr))
>
>The target is a cpu32 (68360) and the compiler is egcs-1.1b.
>
>The bad code is :
>
>tsi_cmds.s: Assembler messages:
>tsi_cmds.s:1117: Error: operands mismatch -- statement `move.b
>%a6,%a1@' ignored
>
>Can the 'g' constraint be used like this or is this some sort problem
>with the compiler which I should report to the egcs people ?
>
>I know I can use 'd' instead of 'g', how-ever 'd' generates register
>pressure when doing the following types of operations :
>
> WRITE_REGISTER_8(0xf000000, 1);
> WRITE_REGISTER_8(0xf000001, 2);
> WRITE_REGISTER_8(0xf000002, 3);
>
>The code is slower due to the need to load a 'd' register. The
>required pushing and poping from the stack on entry and exit to a
>function to free the 'd' registers slows the code even more. The 'g'
>constraint drops the overhead to about 2 instructions.

According to my m68k data books, move.b from an address register is
not allowed.  The g constraint is allowing the compiler to place data
in an address resgister which is not compatible with your chosen
instruction.  Why use the asm() macro?  Why not just cast the address
to (unsigned char *) and do the store from C++?  The compiler might
be able to generate a move.b #data,addr.

Art

________________________________________________
To get help for the crossgcc list, send mail to
crossgcc-request@cygnus.com with the text 'help'
(without the quotes) in the body of the message.