Bug List: (This bug is not in your last search results)   Show last search results      Search page      Enter new bug
Bug#: 10153
Product:  
Component:  
Status: RESOLVED
Resolution: INVALID
Assigned To: Not yet assigned to anyone <unassigned@gcc.gnu.org>
Host:
Reported against  
Priority:  
Severity:  
Target Milestone:  
 
 
Target:
Reporter: etienne.lorrain@masroudeau.com
Add CC:
CC:
Remove selected CCs
Build:
URL:
Summary:
Keywords:
Known to work:
Known to fail:

Attachment Description Type Created Size Actions
Create a New Attachment (proposed patch, testcase, etc.) View All

Bug 10153 depends on: Show dependency tree
Show dependency graph
Bug 10153 blocks:

Additional Comments:






View Bug Activity   |   Format For Printing   |   Clone This Bug


Description:   Last confirmed: 2003-05-28 04:48 Opened: 2003-03-19 17:36
Just compile this, and look at the comment
"automatic size decision there"
(lots of comment removed and macro expanded...)
Works up to gcc-3.0.4, not after 3.1

etienne@fulbert:~/gcc/gujin$ gcc -v
Reading specs from /usr/lib/gcc-lib/i386-linux/3.2.3/specs
Configured with: ../src/configure -v --enable-languages=c,c++,java,f77,proto,pascal,objc,ada --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-gxx-include-dir=/usr/include/c++/3.2 --enable-shared --with-system-zlib --enable-nls --without-included-gettext --enable-__cxa_atexit --enable-clocale=gnu --enable-java-gc=boehm --enable-objc-gc i386-linux
Thread model: posix
gcc version 3.2.3 20030309 (Debian prerelease)
etienne@fulbert:~/gcc/gujin$
etienne@fulbert:~/gcc/gujin$ cat user.i
extern unsigned char VGA_valid_mode[];

extern inline unsigned
divrem8 (unsigned short oper, unsigned char *rem)
  {
  unsigned divider;

  asm (
"       aam     $8                      # operand in ax         \n"
"       movb    %%al,%%cl               # remainder             \n"
"       movzbl  %%ah,%%eax              # divider               \n"
        : "=a" (divider), "=c" (*rem) : "a" (oper) );
  return divider;
  }

extern inline void VIDEO_mode_invalidate (unsigned char mode)
  {

  unsigned char shift;
  unsigned index = divrem8 (mode, &shift);
  unsigned char tmp = ({
         typeof (VGA_valid_mode[index]) returned;
         asm volatile (
 "      # automatic size decision there:        \n"
 "      mov     %%cs:%a1,%0                     \n"
         : "=r" (returned) : "g" (&VGA_valid_mode[index]));
         returned; }) & ~(1 << shift);

  asm volatile (
 "      movb    %b0,%%cs:%a1            \n"
        : : "qi" (tmp), "r" (&VGA_valid_mode[index])
        );
  }

void VGA_init (void)
  {
  extern char tmpstatictable[15];
  unsigned i;

  for (i = 0; i <= 0x7F; i++) {
      unsigned char shift;
      unsigned short offset = divrem8 (i, &shift);

      if ((tmpstatictable[offset] & (1 << shift)) == 0)
          VIDEO_mode_invalidate (i);
      }
  }
etienne@fulbert:~/gcc/gujin$ gcc -Os user.i
/tmp/ccWPbdd5.s: Assembler messages:
/tmp/ccWPbdd5.s:35: Error: bad register name `%sil'

Release:
gcc version 3.2.3 20030309 (Debian prerelease)

Environment:
Linux Debian ia32

------- Comment #1 From Dara Hazeghi 2003-05-10 13:51 -------
From: Dara Hazeghi <dhazeghi@yahoo.com>
To: gcc-gnats@gcc.gnu.org, etienne.lorrain@masroudeau.com
Cc:  
Subject: Re: inline-asm/10153: selection of %dil or %sil on ia32 arch by valid C source
Date: Sat, 10 May 2003 13:51:39 -0700

 http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit- 
 trail&database=gcc&pr=10153
 
 Hello,
 
 on gcc 3.2.3 and 3.3 branch, I get the same error as mentioned in this  
 report, but on mainline (20030509), this code compiles and assembles  
 fine.
 
 Dara
 


------- Comment #2 From etienne.lorrain@masroudeau.com 2003-05-12 06:59 -------
From: etienne.lorrain@masroudeau.com
To: "Dara Hazeghi" <dhazeghi@yahoo.com>
Cc: gcc-gnats@gcc.gnu.org,etienne.lorrain@masroudeau.com
Subject: Re: inline-asm/10153: selection of %dil or %sil on ia32 arch by 
     valid C source
Date: Mon, 12 May 2003 06:59:00 +0100 (BST)

 > http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=10153
 >
 > Hello,
 >
 > on gcc 3.2.3 and 3.3 branch, I get the same error as mentioned in this
 > report, but on mainline (20030509), this code compiles and assembles
 > fine.
 >
 > Dara
 >
 
   Hello,
 
   I did this morning, in an empty directory:
 lynx http://prdownloads.sourceforge.net/gujin/gujin-0.7.tgz?download
 ncftpget
 ftp://sources.redhat.com/pub/binutils/releases/binutils-2.13.2.1.tar.gz
 ncftpget ftp://sources.redhat.com/pub/gcc/snapshots/gcc-3.3-20030508.tar.gz
 tar -xvzf gujin-0.7.tgz
 
 -------------------------------------------
   Here I had to modify gujin/Makefile :
 @@ -1564,7 +1564,7 @@
         cd $(notdir $(basename $(basename $(subst core-,,$(LAST_GCC))))) ; \
         mkdir build ;                                                   \
         cd build/ ;                                                     \
 -       ../configure --prefix=$(P_PWD)/toolchain --enable-languages=C ; \
 +       ../configure --prefix=$(P_PWD)/toolchain --enable-languages=c ; \
         make bootstrap-lean ;                                           \
         make install )
  endif
 -------------------
   Is that a philosophycal change, no more "C" language, only "c" ????
 -------------------------------------------
 
 cd gujin
 make toolchain
 make dep boot.exe
 
   (all of this is shown without their output - quite long)
   At some point I got:
 ....
 GCC: gcc (GCC) 3.3 20030509 (prerelease), Binutils: GNU ld version 2.13.2.1
 ....
 /home/etienne/prjgcc/toolchain/bin/gcc -fstrict-aliasing -falign-loops=1
 -falign-jumps=1 -falign-functions=2  -mno-align-double
 -mpreferred-stack-boundary=2 -fomit-frame-pointer -march=i386 -mrtd
 -fno-builtin -fno-schedule-insns2 -finline-limit=10000 -Os -Wall
 -Wno-format -Wno-main -Wstrict-prototypes -Wundef -Wpointer-arith
 -Wcast-align -Wwrite-strings -Wsign-compare -Wdisabled-optimization 
 -ffunction-sections -include code16.h -DDEBUG="(DEBUG_STACK)"
 -DUSER_SUPPORT="(VGA_SUPPORT|VGA_EXTENDED|VESA_WINDOW|VESA_WINFUNCTION|VESA_LINEAR|VESA_EDID|VESA_RECALC|VESA_2WINDOWS|VESA_HARDWINDOW|VESA_PMINFO|VESA_16BPP|VESA_32BPP|VESA_24BPP|VESA_4BPP_EGA|VESA_4BPP_TEXT|VESA_8BPP|SERIAL_VT100|SERIAL_VT420|BIOS_MOUSE_SUPPORT|SERIAL_MOUSE_SUPPORT|JOYSTICK_SUPPORT)"
 -DDISK_SUPPORT="(BIOS_SUPPORT|EBIOS_SUPPORT|IDE_SUPPORT|DOS_SUPPORT|E2FS_PROBE|FAT12_PROBE|FAT16_PROBE|FAT32_PROBE|BOOTSECT_PROBE)"
 -DSETUP="(APPLICATION|CODE_SEGMENT|EXTRA_SEGMENT|GC_SECTION|ASSEMBLY_CISC|UPDATE_BOOTPARAM|USE_INT1587|MINIDEBUG)"
 -DLANGUAGE=ENGLISH  -S -o user.S user.c
 In file included from user.c:43:
 ega.h: In function `_EGA_read_write_mode':
 ega.h:172: warning: dereferencing type-punned pointer will break
 strict-aliasing rules
 ega.h: In function `_EGA_setup':
 ega.h:178: warning: dereferencing type-punned pointer will break
 strict-aliasing rules
 sed '/.align 32/d' < user.S > user.s
 /home/etienne/prjgcc/toolchain/bin/as -acdhls=user.lis -o user.o user.s
 user.s: Assembler messages:
 user.s:2962: Error: bad register name `%dil'
 make: *** [user.o] Error 1
 rm user.S boot.s user.s boot.S
 
   So the bug is still present in this version.
   I do not know about my "reduced to the simplest source" bug report.
 
   I have to check about new warning "dereferencing type-punned".
 
 
   Regards,
   Etienne.

------- Comment #3 From Andrew Pinski 2003-05-28 04:48 -------
I can see the problem with the mainline (20030527) with `gcc -Os pr10153.i
-march=i386 
-c -save-temps', `gcc -Os pr10153.i -march=i486 -c -save-temps', `gcc -Os
pr10153.i -
march=i586 -c -save-temps'
I think Dara was getting lucky with i686.

I think sil and dil are both x86-64 registers which are not defined on ia32.

I think you were luck that gcc-3.0.4 works, but still it is a regression.

Since the "g" constrant is right here, but someone with more knowledge of the
ia32 
backend should look at it.

------- Comment #4 From Richard Henderson 2003-06-12 18:18 -------
I'm of the opinion that the source is invalid.  Using a "=q" constraint
instead of an "=r" constraint properly shows that the compiler must choose
one of the four "low byte" registers.

You might object that the compiler should "know" that it cannot place a
character object into %esi/%edi/%ebp, but that's not true at all -- we 
cannot store a character to memory from those registers, but we can hold
a character value in those registers.

------- Comment #5 From Andrew Pinski 2003-10-31 22:06 -------
*** Bug 12856 has been marked as a duplicate of this bug. ***

------- Comment #6 From dacut@neolinear.com 2004-02-13 15:13 -------
Richard -- agreed with your comment, but I think the larger issue is that GCC
is
choosing phantom registers (%sil/%dil).  Yonetani Tomokazu on the DragonFly BSD
lists has seen this issue compiling straight C code with "-march=pentium4 -O".

Any ideas where to look?  I'll try to get a sample of failing source (along
with
GCC versions and the other goodies) and see where it's dying.

------- Comment #7 From dacut@neolinear.com 2004-02-14 04:22 -------
After some further discussion on the DragonFly lists and further reading on my
part, I found out that %sil and %dil are the 8-bit equivalents of %al, %bl, etc.
 (Watch the light bulb undim in my head here :-)

It would be better if gcc were able to diagnose the problem code better (ensure
that the architecture is valid before emitting a %sil/%dil/%bpl/%spl register)
-- I'll see if I can't ponder on this and propose a small patch.

------- Comment #8 From Andrew Pinski 2005-02-15 19:10 -------
*** Bug 19979 has been marked as a duplicate of this bug. ***

------- Comment #9 From Andrew Pinski 2006-10-24 16:14 -------
*** Bug 29579 has been marked as a duplicate of this bug. ***

------- Comment #10 From Andreas Schwab 2007-10-06 07:50 -------
*** Bug 33674 has been marked as a duplicate of this bug. ***

Bug List: (This bug is not in your last search results)   Show last search results      Search page      Enter new bug