This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

SH: remove -mbigtable option (PR c/4516)


Yesterday, I've sent PR c/4516.  For SH target, big switch statement
will be miscompiled with -O0.

Here's my attempt to solve the problem (against mainline).

Since there's no check if the range is valid, it's better to assume
bigtable.  When optimized, it can be smaller.

2001-10-11  NIIBE Yutaka  <gniibe@m17n.org>

	* doc/invoke.texi (Option Summary: SH Options): Remove -mbigtable.

	* config/sh/sh.md (*casesi_worker): Handle 0..65535.

	* config/sh/sh.h (BIGTABLE_BIT, TARGET_BIGTABLE): Removed.
	(TARGET_SWITCHES): Remove -mbigtable option.
	(CASE_VECTOR_MODE): Always SImode.
	(ASM_OUTPUT_ADDR_VEC_ELT): Always emit .long.
	(CASE_VECTOR_SHORTEN_MODE): Handle 0..65535.

Index: gcc/config/sh/sh.h
===================================================================
RCS file: /cvs/gcc/gcc/gcc/config/sh/sh.h,v
retrieving revision 1.117
diff -c -3 -p -r1.117 sh.h
*** gcc/config/sh/sh.h	2001/09/21 00:53:28	1.117
--- gcc/config/sh/sh.h	2001/10/11 08:32:29
*************** extern int target_flags;
*** 136,142 ****
  #define SH4_BIT	       	(1<<12)
  #define FMOVD_BIT	(1<<4)
  #define SPACE_BIT 	(1<<13)
- #define BIGTABLE_BIT  	(1<<14)
  #define RELAX_BIT	(1<<15)
  #define USERMODE_BIT	(1<<16)
  #define HITACHI_BIT     (1<<22)
--- 136,141 ----
*************** extern int target_flags;
*** 191,199 ****
  /* Nonzero if we should generate smaller code rather than faster code.  */
  #define TARGET_SMALLCODE   (target_flags & SPACE_BIT)
  
- /* Nonzero to use long jump tables.  */
- #define TARGET_BIGTABLE     (target_flags & BIGTABLE_BIT)
- 
  /* Nonzero to generate pseudo-ops needed by the assembler and linker
     to do function call relaxing.  */
  #define TARGET_RELAX (target_flags & RELAX_BIT)
--- 190,195 ----
*************** extern int target_flags;
*** 242,248 ****
    {"4",	        TARGET_NONE, "" },		\
    {"4",	        SH4_BIT|SH3E_BIT|SH3_BIT|SH2_BIT|SH1_BIT|HARD_SH4_BIT, "" }, \
    {"b",		-LITTLE_ENDIAN_BIT, "" },  	\
-   {"bigtable", 	BIGTABLE_BIT, "" },		\
    {"dalign",  	DALIGN_BIT, "" },		\
    {"fmovd",  	FMOVD_BIT, "" },		\
    {"hitachi",	HITACHI_BIT, "" },		\
--- 238,243 ----
*************** extern int current_function_anonymous_ar
*** 1629,1642 ****
  
  /* Specify the machine mode that this machine uses
     for the index in the tablejump instruction.  */
! #define CASE_VECTOR_MODE (TARGET_BIGTABLE ? SImode : HImode)
  
  #define CASE_VECTOR_SHORTEN_MODE(MIN_OFFSET, MAX_OFFSET, BODY) \
  ((MIN_OFFSET) >= 0 && (MAX_OFFSET) <= 127 \
   ? (ADDR_DIFF_VEC_FLAGS (BODY).offset_unsigned = 0, QImode) \
   : (MIN_OFFSET) >= 0 && (MAX_OFFSET) <= 255 \
   ? (ADDR_DIFF_VEC_FLAGS (BODY).offset_unsigned = 1, QImode) \
!  : (MIN_OFFSET) >= -32768 && (MAX_OFFSET) <= 32767 ? HImode \
   : SImode)
  
  /* Define as C expression which evaluates to nonzero if the tablejump
--- 1624,1640 ----
  
  /* Specify the machine mode that this machine uses
     for the index in the tablejump instruction.  */
! #define CASE_VECTOR_MODE SImode
  
  #define CASE_VECTOR_SHORTEN_MODE(MIN_OFFSET, MAX_OFFSET, BODY) \
  ((MIN_OFFSET) >= 0 && (MAX_OFFSET) <= 127 \
   ? (ADDR_DIFF_VEC_FLAGS (BODY).offset_unsigned = 0, QImode) \
   : (MIN_OFFSET) >= 0 && (MAX_OFFSET) <= 255 \
   ? (ADDR_DIFF_VEC_FLAGS (BODY).offset_unsigned = 1, QImode) \
!  : (MIN_OFFSET) >= -32768 && (MAX_OFFSET) <= 32767 \
!  ? (ADDR_DIFF_VEC_FLAGS (BODY).offset_unsigned = 0, HImode) \
!  : (MIN_OFFSET) >= 0 && (MAX_OFFSET) <= 65535 \
!  ? (ADDR_DIFF_VEC_FLAGS (BODY).offset_unsigned = 1, HImode) \
   : SImode)
  
  /* Define as C expression which evaluates to nonzero if the tablejump
*************** extern char fp_reg_names[][5];
*** 2070,2079 ****
  /* Output an absolute table element.  */
  
  #define ASM_OUTPUT_ADDR_VEC_ELT(STREAM,VALUE)  				\
!   if (TARGET_BIGTABLE) 							\
!     asm_fprintf ((STREAM), "\t.long\t%LL%d\n", (VALUE)); 			\
!   else									\
!     asm_fprintf ((STREAM), "\t.word\t%LL%d\n", (VALUE)); 			\
  
  /* Output various types of constants.  */
  
--- 2068,2074 ----
  /* Output an absolute table element.  */
  
  #define ASM_OUTPUT_ADDR_VEC_ELT(STREAM,VALUE)  				\
!     asm_fprintf ((STREAM), "\t.long\t%LL%d\n", (VALUE))
  
  /* Output various types of constants.  */
  
Index: gcc/config/sh/sh.md
===================================================================
RCS file: /cvs/gcc/gcc/gcc/config/sh/sh.md,v
retrieving revision 1.89
diff -c -3 -p -r1.89 sh.md
*** gcc/config/sh/sh.md	2001/08/18 00:53:20	1.89
--- gcc/config/sh/sh.md	2001/10/11 08:32:29
***************
*** 3941,3946 ****
--- 3941,3948 ----
      case SImode:
        return \"shll2	%1\;mov.l	@(r0,%1),%0\";
      case HImode:
+       if (ADDR_DIFF_VEC_FLAGS (diff_vec).offset_unsigned)
+ 	return \"add	%1,%1\;mov.w	@(r0,%1),%0\;extu.w	%0,%0\";
        return \"add	%1,%1\;mov.w	@(r0,%1),%0\";
      case QImode:
        if (ADDR_DIFF_VEC_FLAGS (diff_vec).offset_unsigned)
Index: gcc/doc/invoke.texi
===================================================================
RCS file: /cvs/gcc/gcc/gcc/doc/invoke.texi,v
retrieving revision 1.60
diff -c -3 -p -r1.60 invoke.texi
*** gcc/doc/invoke.texi	2001/10/09 06:03:13	1.60
--- gcc/doc/invoke.texi	2001/10/11 08:32:30
*************** in the following sections.
*** 526,532 ****
  -m1  -m2  -m3  -m3e @gol
  -m4-nofpu  -m4-single-only  -m4-single  -m4 @gol
  -mb  -ml  -mdalign  -mrelax @gol
! -mbigtable  -mfmovd  -mhitachi  -mnomacsave @gol
  -mieee  -misize  -mpadstruct  -mspace @gol
  -mprefergot  -musermode}
  
--- 526,532 ----
  -m1  -m2  -m3  -m3e @gol
  -m4-nofpu  -m4-single-only  -m4-single  -m4 @gol
  -mb  -ml  -mdalign  -mrelax @gol
! -mfmovd  -mhitachi  -mnomacsave @gol
  -mieee  -misize  -mpadstruct  -mspace @gol
  -mprefergot  -musermode}
  
*************** not work unless you recompile it first w
*** 8640,8650 ****
  @opindex mrelax
  Shorten some address references at link time, when possible; uses the
  linker option @option{-relax}.
- 
- @item -mbigtable
- @opindex mbigtable
- Use 32-bit offsets in @code{switch} tables.  The default is to use
- 16-bit offsets.
  
  @item -mfmovd
  @opindex mfmovd
--- 8640,8645 ----


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]