diff options
author | Richard Stallman <rms@gnu.org> | 1992-04-26 02:15:45 +0000 |
---|---|---|
committer | Richard Stallman <rms@gnu.org> | 1992-04-26 02:15:45 +0000 |
commit | af2682ef56012ce8df2dfefe0e9c98105e83e2c3 (patch) | |
tree | 82f925dac4b1e09aefdd08a3dee7e7f44344cb5e /gcc | |
parent | 88d3b7f03d06f58d34f4b8fbaa25e469bec792c1 (diff) | |
download | gcc-af2682ef56012ce8df2dfefe0e9c98105e83e2c3.zip gcc-af2682ef56012ce8df2dfefe0e9c98105e83e2c3.tar.gz gcc-af2682ef56012ce8df2dfefe0e9c98105e83e2c3.tar.bz2 |
*** empty log message ***
From-SVN: r836
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/stmt.c | 29 |
1 files changed, 19 insertions, 10 deletions
@@ -3657,7 +3657,6 @@ expand_end_case (orig_index) use_cost_table = (TREE_CODE (TREE_TYPE (orig_index)) != ENUMERAL_TYPE - && default_label != 0 && estimate_case_costs (thiscase->data.case_stmt.case_list)); balance_case_nodes (&thiscase->data.case_stmt.case_list, 0); emit_case_nodes (index, thiscase->data.case_stmt.case_list, @@ -3678,14 +3677,26 @@ expand_end_case (orig_index) if (GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (index_expr))) > GET_MODE_BITSIZE (index_mode)) { + enum machine_mode omode = TYPE_MODE (TREE_TYPE (index_expr)); + rtx rangertx = expand_expr (range, 0, VOIDmode, 0); + + /* We must handle the endpoints in the original mode. */ index_expr = build (MINUS_EXPR, TREE_TYPE (index_expr), index_expr, minval); minval = integer_zero_node; + index = expand_expr (index_expr, 0, VOIDmode, 0); + emit_cmp_insn (rangertx, index, LTU, 0, omode, 0, 0); + emit_jump_insn (gen_bltu (default_label)); + /* Now we can safely truncate. */ + index = convert_to_mode (index_mode, index, 0); + } + else + { + if (TYPE_MODE (TREE_TYPE (index_expr)) != index_mode) + index_expr = convert (type_for_size (index_bits, 0), + index_expr); + index = expand_expr (index_expr, 0, VOIDmode, 0); } - if (TYPE_MODE (TREE_TYPE (index_expr)) != index_mode) - index_expr = convert (type_for_size (index_bits, 0), - index_expr); - index = expand_expr (index_expr, 0, VOIDmode, 0); emit_queue (); index = protect_from_queue (index, 0); do_pending_stack_adjust (); @@ -3705,13 +3716,11 @@ expand_end_case (orig_index) index_expr, minval))); index = expand_expr (index_expr, 0, VOIDmode, 0); emit_queue (); - /* convert_to_mode calls protect_from_queue. */ - index = convert_to_mode (Pmode, index, 1); + index = protect_from_queue (index, 0); do_pending_stack_adjust (); - do_tablejump (index, Pmode, - gen_rtx (CONST_INT, VOIDmode, - TREE_INT_CST_LOW (range)), + do_tablejump (index, TYPE_MODE (TREE_TYPE (index_expr)), + expand_expr (range, 0, VOIDmode, 0), table_label, default_label); win = 1; } |