gcc-4.3.0/ppc32 inline assembly produces bad code
Till Straumann
strauman at slac.stanford.edu
Wed Mar 26 16:25:05 UTC 2008
As of gcc-4.3.0 one of my drivers stopped working.
I distilled the code down to a few lines (see below).
The output of
gcc-4.3.0 -S -O2 -c tst.c
and
gcc-4.2.3 -S -O2 -c tst.c
is attached. The code generated by gcc-4.2.3 is as expected.
However, gcc-4.3.0 does not produce a correct result.
Is my inline assembly wrong or is this a gcc bug ?
(If the memory input operand to the inline assembly
statement is omitted then everything is OK).
Please CC-me on any replies; I'm not subscribed to the gcc list.
WKR
-- Till
###########################################
Test case; C-code:
###########################################
/* Powerpc I/O barrier instruction */
#define EIEIO(pmem) do { asm volatile("eieio":"=m"(*pmem):"m"(*pmem)); }
while (0)
/*
* Reset a bit in a register and poll for it to be set by the hardware
*/
void
test(volatile unsigned *base)
{
volatile unsigned *reg_p = base + IEVENT_REG/sizeof(*base);
unsigned val;
/* Clear bit in register by writing a one */
*reg_p = IEVENT_GRSC;
EIEIO( reg_p );
/* Poll bit until set by hardware */
do {
val = *reg_p;
EIEIO( reg_p );
} while ( ! (val & IEVENT_GRSC) );
}
#############################################
Assembly code produced by gcc-4.3.0:
#############################################
.file "tst.c"
.gnu_attribute 4, 1
.gnu_attribute 8, 1
.section ".text"
.align 2
.globl test
.type test, @function
test:
li 0,256
mr 9,3
/*** ^^^^^^^^^ NOTE: base address copied into R9 ***/
stw 0,16(3)
# 21 "c.c" 1
eieio
# 0 "" 2
.L2:
lwz 0,0(9)
/*** ^^^^^^^^^ BAD: R0 = *base instead of *reg_p ***/
# 26 "c.c" 1
eieio
# 0 "" 2
andi. 11,0,256
beq+ 0,.L2
blr
.size test, .-test
###########################################
Assembly code produced by gcc-4.2.3:
###########################################
.file "tst.c"
.section ".text"
.align 2
.globl test
.type test, @function
test:
li 0,256
addi 9,3,16
/*** NOTE: R9 = base + <IEVENT_REG offset> ***/
stw 0,16(3)
eieio
.L2:
lwz 0,0(9)
/*** GOOD: R0 = *reg_p ***/
eieio
andi. 11,0,256
beq+ 0,.L2
blr
.size test, .-test
.ident "GCC: (GNU) 4.2.3"
More information about the users
mailing list