(这是"Getting GCC to optimize hand assembly")
的后续内容我一直试图让GCC(3.3.6-m68hc1x-20060122)使用索引寻址发出bset
和bclr
汇编指令,但我使用的约束集似乎没有用。
asm
:
#define bset(base, offset, mask) { \
volatile unsigned char *__base = base; \
const unsigned char __offset = offset; \
const char __mask = mask; \
asm volatile ("bset %0 %1" : "=o" (__base[__offset]) : "X" (__mask),
"x" (__base)); }
C:
inline void spi_init()
{
bset(_io_ports, M6811_DDRD, 0x38);
bset(_io_ports, M6811_PORTD, 0x20);
bset(_io_ports, M6811_SPCR, (M6811_SPE | M6811_DWOM | M6811_MSTR));
}
汇编代码结果:
spi_init:
ldx #_io_ports
; Begin inline assembler code
#APP
bset _io_ports+9 #56
bset _io_ports+8 #32
bset _io_ports+40 #112
; End of inline assembler code
#NO_APP
rts
现在这是真的,真的关闭。但不幸的是,完全无效。它必须如下:
spi_init:
ldx #_io_ports
; Begin inline assembler code
#APP
bset 9,x #56
bset 8,x #32
bset 40,x #112
; End of inline assembler code
#NO_APP
rts
为了指示GCC发出汇编代码,我必须使用哪些约束?
GCC 3.3.6 extended assembly documentation
GCC 3.3.6 constraint documentation