[gnu.gcc.bug] problem with gcc 1.32 on the 3b1

andy@CSVAX.CALTECH.EDU (Andy Fyfe) (01/27/89)

I saw someone posted diffs earlier but a later message from rms suggested
that they not be applied.  To get a working compiler the following diffs
are at least required.  In the case of the tm-3b1.h file, the diffs add in
two missing ';' and a '\' for continuation of the if statement in the macro.
Anyway, with those applied, the compiler gets switch statements wrong.

First the diffs I've applied:

diff -c save/m68k.md ./m68k.md
*** save/m68k.md	Sat Dec 31 08:55:11 1988
--- ./m68k.md	Sat Dec 31 14:58:04 1988
***************
*** 679,685 ****
--- 679,689 ----
    "*
  {
    if (operands[1] == const0_rtx)
+ #ifdef MOTOROLA
+     return \"clr.l %0\";
+ #else
      return \"clrl %0\";
+ #endif
    return \"pea %a1\";
  }")
  
diff -c save/tm-3b1.h ./tm-3b1.h
*** save/tm-3b1.h	Sat Dec 31 08:56:25 1988
--- ./tm-3b1.h	Sat Dec 31 15:16:43 1988
***************
*** 27,33 ****
  
  #include "tm-hp9k320.h"
  
! /* See tm-m68k.h.  7 means 680[01]0 with no 68881.  */
  
  #undef TARGET_DEFAULT
  #define	TARGET_DEFAULT 0
--- 27,33 ----
  
  #include "tm-hp9k320.h"
  
! /* See tm-m68k.h.  0 means 680[01]0 with no 68881.  */
  
  #undef TARGET_DEFAULT
  #define	TARGET_DEFAULT 0
***************
*** 347,357 ****
  #define ASM_OUTPUT_CASE_LABEL(FILE,PREFIX,NUM,TABLE)			\
    if (RTX_INTEGRATED_P (TABLE))						\
      fprintf (FILE, "\tswbeg &%d\n%s%%%d:\n",				\
! 	     XVECLEN (PATTERN (TABLE), 1), (PREFIX), (NUM))
!   else
      fprintf (FILE, "\tswbeg &%d\n%s%%%d:\n\tshort %s%%%d-%s%%%d\n",	\
  	     XVECLEN (PATTERN (TABLE), 1) + 1, (PREFIX), (NUM),		\
! 	     (PREFIX), (NUM), (PREFIX), (NUM))
  
  /* At end of a switch table, define LD%n iff the symbol LI%n was defined.  */
  #define ASM_OUTPUT_CASE_END(FILE,NUM,TABLE)		\
--- 347,357 ----
  #define ASM_OUTPUT_CASE_LABEL(FILE,PREFIX,NUM,TABLE)			\
    if (RTX_INTEGRATED_P (TABLE))						\
      fprintf (FILE, "\tswbeg &%d\n%s%%%d:\n",				\
! 	     XVECLEN (PATTERN (TABLE), 1), (PREFIX), (NUM));		\
!   else									\
      fprintf (FILE, "\tswbeg &%d\n%s%%%d:\n\tshort %s%%%d-%s%%%d\n",	\
  	     XVECLEN (PATTERN (TABLE), 1) + 1, (PREFIX), (NUM),		\
! 	     (PREFIX), (NUM), (PREFIX), (NUM));
  
  /* At end of a switch table, define LD%n iff the symbol LI%n was defined.  */
  #define ASM_OUTPUT_CASE_END(FILE,NUM,TABLE)		\

And a typescript showing the problem:

$ cat test.c
foo(int x)
{
    switch(x)
    {
    case 0:
	return 5;
	break;
    case 1:
	return 6;
	break;
    case 2:
	return 4;
	break;
    case 3:
	return 8;
	break;
    }
}

main()
{
    printf("%d\n", foo(2));
}
$ gcc -S test.s
$ mv test.s test-31.s
$ gcc -o test-31 test-31.s
$ ./test-31
4
$ /usr/local/src/gcc/stage1/gcc -B/usr/local/src/gcc/stage1/ -S test.c
$ mv test.s test-32.s
$ gcc -o test-32 test-32.s
$ ./test-32
8
$ diff -c test-31.s test-32.s
*** test-31.s	Thu Jan 26 23:44:56 1989
--- test-32.s	Thu Jan 26 23:46:33 1989
***************
*** 13,21 ****
  LI%7:
  	mov.w LD%7(%pc,%d0.w),%d0
  	jmp 6(%pc,%d0.w)
! 	swbeg &5
  L%7:
- 	short L%7-L%7
  	short L%3-L%7
  	short L%4-L%7
  	short L%5-L%7
--- 13,20 ----
  LI%7:
  	mov.w LD%7(%pc,%d0.w),%d0
  	jmp 6(%pc,%d0.w)
! 	swbeg &4
  L%7:
  	short L%3-L%7
  	short L%4-L%7
  	short L%5-L%7
$ exit