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

NIIBE Yutaka gniibe@m17n.org
Fri Oct 12 10:12:00 GMT 2001


Joern Rennecke wrote:
 > It's almost there.  Except I forgot to mention that the branch shortening
 > won't look at the length attribute a second time unless you explicitly
 > mention (pc) or (match_dup <num>) somewhere in it.

I see.  I use (match_dup 2) (it's dummy, its purpose is just the length
to be variable).

 > Please add a comment to describe the return value.  When I first looked at
 > this, I thought it was wrong, till I looked at the caller.

Done.

Here it is.

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

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

	* config/sh/sh.md (*casesi_worker): Handle 0..65535.  Set attribute
	"length" with shl_casesi_worker_length.

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

	* config/sh/sh.c (shl_casesi_worker_length): New function.
	* config/sh/sh-protos.h (shl_casesi_worker_length): New function.

Index: gcc/config/sh/sh-protos.h
===================================================================
RCS file: /cvs/gcc/gcc/gcc/config/sh/sh-protos.h,v
retrieving revision 1.21
diff -c -3 -p -r1.21 sh-protos.h
*** gcc/config/sh/sh-protos.h	2001/09/21 00:53:28	1.21
--- gcc/config/sh/sh-protos.h	2001/10/12 17:03:18
*************** extern int gen_shl_and PARAMS ((rtx, rtx
*** 73,78 ****
--- 73,79 ----
  extern int shl_sext_kind PARAMS ((rtx, rtx, int *));
  extern int shl_sext_length PARAMS ((rtx));
  extern int gen_shl_sext PARAMS ((rtx, rtx, rtx, rtx));
+ extern int shl_casesi_worker_length PARAMS ((rtx));
  extern int regs_used PARAMS ((rtx, int));
  extern void fixup_addr_diff_vecs PARAMS ((rtx));
  extern int get_dest_uid PARAMS ((rtx, int));
Index: gcc/config/sh/sh.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/config/sh/sh.c,v
retrieving revision 1.122
diff -c -3 -p -r1.122 sh.c
*** gcc/config/sh/sh.c	2001/09/21 01:27:05	1.122
--- gcc/config/sh/sh.c	2001/10/12 17:03:18
*************** gen_shl_sext (dest, left_rtx, size_rtx, 
*** 1907,1912 ****
--- 1907,1954 ----
      }
    return 0;
  }
+ 
+ /* Function to be used in the length attribute of the casesi_worker
+    instruction.  Returns number of instructions, which is half of the
+    length of bytes. */
+ 
+ int
+ shl_casesi_worker_length (insn)
+      rtx insn;
+ {
+   rtx set_src, label;
+   rtx diff_vec;
+ 
+   set_src = SET_SRC (XVECEXP (PATTERN (insn), 0, 0));
+   if (!(GET_CODE (set_src) == UNSPEC
+ 	&& XINT (set_src, 1) == UNSPEC_CASESI))
+     abort ();
+ 
+   label = XVECEXP (set_src, 0, 2);
+   if (GET_CODE (label) != LABEL_REF)
+     abort ();
+ 
+   diff_vec = PATTERN (next_real_insn (XEXP (label, 0)));
+ 
+   if (GET_CODE (diff_vec) != ADDR_DIFF_VEC)
+     abort ();
+ 
+   switch (GET_MODE (diff_vec))
+     {
+     case SImode:
+       return 2;
+     case HImode:
+       if (ADDR_DIFF_VEC_FLAGS (diff_vec).offset_unsigned)
+ 	return 3;
+       return 2;
+     case QImode:
+       if (ADDR_DIFF_VEC_FLAGS (diff_vec).offset_unsigned)
+ 	return 2;
+       return 1;
+     default:
+       abort ();
+     }
+ }
  
  /* The SH cannot load a large constant into a register, constants have to
     come from a pc relative load.  The reference of a pc relative load
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/12 17:03:18
*************** 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
*** 1627,1642 ****
      goto LABEL;								\
  }
  
  /* 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
--- 1622,1643 ----
      goto LABEL;								\
  }
  
+ extern int optimize; /* needed for gen_casesi.  */
+ extern int optimize_size;
+ 
  /* Specify the machine mode that this machine uses
     for the index in the tablejump instruction.  */
! #define CASE_VECTOR_MODE (optimize ? QImode : 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) \
!  : optimize_size && (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.  */
  
--- 2071,2077 ----
  /* 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.  */
  
*************** enum processor_type {
*** 2226,2233 ****
  
  #define sh_cpu_attr ((enum attr_cpu)sh_cpu)
  extern enum processor_type sh_cpu;
- 
- extern int optimize; /* needed for gen_casesi.  */
  
  enum mdep_reorg_phase_e
  {
--- 2224,2229 ----
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/12 17:03:18
***************
*** 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)
***************
*** 3950,3956 ****
        abort ();
      }
  }"
!   [(set_attr "length" "4")])
  
  (define_expand "return"
    [(return)]
--- 3952,3966 ----
        abort ();
      }
  }"
!   [(set (attr "length")
! 	(cond [(eq (symbol_ref "shl_casesi_worker_length (insn)") (const_int 1))
! 	       (const_string "2")
! 	       (eq (symbol_ref "shl_casesi_worker_length (insn)") (const_int 2))
! 	       (const_string "4")
! 	       ;; Put "match_dup" here so that insn_variable_length_p return 1.
! 	       (ne (match_dup 2) (match_dup 2))
! 	       (const_string "4")]
! 	      (const_string "6")))])
  
  (define_expand "return"
    [(return)]
Index: gcc/doc/invoke.texi
===================================================================
RCS file: /cvs/gcc/gcc/gcc/doc/invoke.texi,v
retrieving revision 1.61
diff -c -3 -p -r1.61 invoke.texi
*** gcc/doc/invoke.texi	2001/10/11 17:02:35	1.61
--- gcc/doc/invoke.texi	2001/10/12 17:03:18
*************** 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
*** 8650,8660 ****
  @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
--- 8650,8655 ----
-- 



More information about the Gcc-patches mailing list