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