bad register name `%sil'

YONETANI Tomokazu qhwt+dragonfly-bugs at
Sun Feb 1 15:11:28 PST 2004


On Sun, Feb 01, 2004 at 11:37:39AM -0800, Kip Macy wrote:
> My first guess would be that that is a binutils issue. In other
> words, the assembler might not be up to date with the compiler.

The weird thing, howerver, is that the instruction doesn't even
assemble on FreeBSD-CURRENT:

$ cat a.s
        addb %sil,2(%ebx)
$ gcc a.s
a.s: Assembler messages:
a.s:1: Error: bad register name `%sil'
$ gcc -v
Using built-in specs.
Configured with: FreeBSD/i386 system compiler
Thread model: posix
gcc version 3.3.3 [FreeBSD] 20031106
$ as --version | head -1
GNU assembler 2.13.2 [FreeBSD] 2002-11-27
$ type gcc as
gcc is /usr/bin/gcc
as is /usr/bin/as

FreeBSD-CURRENT version of gcc-3.3.3 does't seem to produce this operand
for the same .c file and the same command line arguments. Here's the
diff between the assembly codes from our gcc and FreeBSD-CURRENT's gcc:

--- p4.s	Mon Feb  2 08:06:23 2004
+++ p4-5.s	Mon Feb  2 08:06:33 2004
@@ -16,8 +16,9 @@
 	movl	8(%ebp), %eax
 	movl	(%eax,%edi,4), %ebx
+	movl	%esi, %edx
-	addb %sil,2(%ebx)
+	addb %dl,2(%ebx)
 	cmpw	$0, (%ebx)
 	ds ; je	.L4

Maybe we need to examine the FreeBSD-CURRENT's gcc to see if there's
local-hacks that we're missing.

> On Mon, 2 Feb 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_pageo
> > {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
> >
[snip the rest of the code]

More information about the Bugs mailing list