aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Stallman <rms@gnu.org>1992-04-26 01:53:32 +0000
committerRichard Stallman <rms@gnu.org>1992-04-26 01:53:32 +0000
commit88d3b7f03d06f58d34f4b8fbaa25e469bec792c1 (patch)
tree919ab141dbbcbbd954000e303d409f80896ee530
parenta8481f2b7e0aaf2b3aa6cd334e56adbfea51144d (diff)
downloadgcc-88d3b7f03d06f58d34f4b8fbaa25e469bec792c1.zip
gcc-88d3b7f03d06f58d34f4b8fbaa25e469bec792c1.tar.gz
gcc-88d3b7f03d06f58d34f4b8fbaa25e469bec792c1.tar.bz2
*** empty log message ***
From-SVN: r835
-rw-r--r--gcc/expr.c19
1 files changed, 14 insertions, 5 deletions
diff --git a/gcc/expr.c b/gcc/expr.c
index 029ceb0..5629ba9 100644
--- a/gcc/expr.c
+++ b/gcc/expr.c
@@ -6490,7 +6490,7 @@ do_store_flag (exp, target, mode, only_cheap)
/* INDEX is the value being switched on, with the lowest value
in the table already subtracted.
- MODE is its expected mode (needed if INDEX is ever constant).
+ MODE is its expected mode (needed if INDEX is constant).
RANGE is the length of the jump table.
TABLE_LABEL is a CODE_LABEL rtx for the table itself.
@@ -6504,13 +6504,22 @@ do_tablejump (index, mode, range, table_label, default_label)
{
register rtx temp, vector;
- /* Code below assumes that MODE is Pmode,
- but I think that is a mistake. Let's see if that is true. */
- if (mode != Pmode)
- abort ();
+ /* Do an unsigned comparison (in the proper mode) between the index
+ expression and the value which represents the length of the range.
+ Since we just finished subtracting the lower bound of the range
+ from the index expression, this comparison allows us to simultaneously
+ check that the original index expression value is both greater than
+ or equal to the minimum value of the range and less than or equal to
+ the maximum value of the range. */
emit_cmp_insn (range, index, LTU, 0, mode, 0, 0);
emit_jump_insn (gen_bltu (default_label));
+
+ /* If index is in range, it must fit in Pmode.
+ Convert to Pmode so we can index with it. */
+ if (mode != Pmode)
+ index = convert_to_mode (Pmode, index, 1);
+
/* If flag_force_addr were to affect this address
it could interfere with the tricky assumptions made
about addresses that contain label-refs,