bad register name `%sil'
Robert Garrett
rg70 at sbcglobal.net
Fri Feb 13 08:19:05 PST 2004
YONETANI Tomokazu wrote:
> Hello.
> Is our gcc3 known to produce a bad code when '-O -march=pentium4'
> are specified? This is from buildkernel(sorry, very long lines):
>
> cc -c -O -pipe -march=pentium4 -Wall -Wredundant-decls -Wnested-externs
> -Wstrict-prototypes -Wmissing-prototypes -Wpointer-arith -Winline
> -Wcast-qual -fformat-extensions -ansi -g -nostdinc -I.
> -I/home/source/dragonfly/src/sys
> -I/home/source/dragonfly/src/sys/../include
> -I/home/source/dragonfly/src/sys/contrib/dev/acpica
> -I/home/source/dragonfly/src/sys/contrib/ipfilter -D_KERNEL -include
> opt_global.h -mpreferred-stack-boundary=2 -ffreestanding
> /home/source/dragonfly/src/sys/vm/vm_pageout.c
> {standard input}: Assembler messages:
> {standard input}:751: Error: bad register name `%sil'
> *** Error code 1
>
> It always fails at vm_pageout.c, and the code in question is in the
> function vm_pageout_flush(). If I replace '-O' with '-O2', the reference
> to `%sil' disappears from the assembly code.
>
> The following is minimum code example to reproduce this.
>
> $ CCVER=gcc3 cc -S -o a.s -O -pipe -march=pentium4 -Wall -Wredundant-decls
> -Wnested-externs -Wstrict-prototypes -Wmissing-prototypes -Wpointer-arith
> -Winline -Wcast-qual -fformat-extensions -ansi -g -D_KERNEL
> -mpreferred-stack-boundary=2 -ffreestanding a.c $ cat ~/a.c
>
> #include <sys/param.h>
> #include <sys/systm.h>
>
> typedef struct {
> u_short flags, paging_in_progress;
> } *o_t;
>
> typedef struct {
> u_short flags;
> u_char busy;
> o_t object;
> } *p_t;
>
> void foo(o_t);
> void foo2(p_t);
> int baz(p_t *mc, int count, int flags);
>
> int
> baz(p_t *mc, int count, int flags)
> {
> o_t object;
> p_t mt;
> int i;
>
> for (i = 0; i < count; i++) {
> mt = mc[i];
> atomic_add_char(&mt->busy, 1);
> if (mt->flags) {
> foo2(mt);
> atomic_clear_short(&mt->flags, 0x10);
> }
> }
>
> object = mc[0]->object;
>
> for (i = 0; i < count; i++) {
> mt = mc[i];
> atomic_clear_short(&object->flags, 0x40);
> foo(object);
> atomic_subtract_char(&mt->busy, 1);
> }
> return 0;
> }
matt, how do you feel about this?
Rob
More information about the Bugs
mailing list