DragonFly BSD
DragonFly bugs List (threaded) for 2004-02
[Date Prev][Date Next]  [Thread Prev][Thread Next]  [Date Index][Thread Index]

Re: bad register name `%sil'


From: Robert Garrett <rg70@xxxxxxxxxxxxx>
Date: Fri, 13 Feb 2004 10:19:05 -0600

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



[Date Prev][Date Next]  [Thread Prev][Thread Next]  [Date Index][Thread Index]