This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
SH: remove -mbigtable option (PR c/4516)
- To: gcc-patches at gcc dot gnu dot org
- Subject: SH: remove -mbigtable option (PR c/4516)
- From: NIIBE Yutaka <gniibe at m17n dot org>
- Date: Thu, 11 Oct 2001 18:27:16 +0900 (JST)
- Cc: kaz Kojima <kkojima at rr dot iij4u dot or dot jp>
- Cc: rodrigc at gcc dot gnu dot org, aoliva at redhat dot com, amylaar at redhat dot com
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 ----