diff options
author | John David Anglin <dave@hiauly1.hia.nrc.ca> | 2001-07-11 18:36:38 +0000 |
---|---|---|
committer | John David Anglin <danglin@gcc.gnu.org> | 2001-07-11 18:36:38 +0000 |
commit | 9312aecc037c2f04b44be4c6e2239a7708e14c19 (patch) | |
tree | 70de8e19523b1a95028ffc5ddd40a9d49f9cc426 /gcc | |
parent | 4b9664e2764caf8afa4af0538392b3e4e0f12a3e (diff) | |
download | gcc-9312aecc037c2f04b44be4c6e2239a7708e14c19.zip gcc-9312aecc037c2f04b44be4c6e2239a7708e14c19.tar.gz gcc-9312aecc037c2f04b44be4c6e2239a7708e14c19.tar.bz2 |
stmt.c (emit_case_nodes): Widen high and low instead of new_bound and low to get correct sign extension...
* stmt.c (emit_case_nodes): Widen high and low instead of new_bound
and low to get correct sign extension in low+high test.
From-SVN: r43945
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/stmt.c | 31 |
2 files changed, 19 insertions, 17 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 86549cd..227d48c 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2001-07-11 John David Anglin <dave@hiauly1.hia.nrc.ca> + + * stmt.c (emit_case_nodes): Widen high and low instead of new_bound + and low to get correct sign extension in low+high test. + 2001-07-11 Janis Johnson <janis@us.ibm.com> * gcov.c (arcdata): Use gcov_type to fix branch percentage @@ -6370,26 +6370,23 @@ emit_case_nodes (index, node, default_label, index_type) } else if (!low_bound && !high_bound) { - /* Instead of doing two branches, emit - (index-low) <= (high-low). */ - tree new_bound = fold (build (MINUS_EXPR, index_type, node->high, - node->low)); - rtx new_index; - + /* Widen LOW and HIGH to the same width as INDEX. */ + tree type = type_for_mode (mode, unsignedp); + tree low = build1 (CONVERT_EXPR, type, node->low); + tree high = build1 (CONVERT_EXPR, type, node->high); + rtx new_index, new_bound; + + /* Instead of doing two branches, emit one unsigned branch for + (index-low) > (high-low). */ new_index = expand_binop (mode, sub_optab, index, - convert_modes (mode, imode, - expand_expr (node->low, NULL_RTX, - mode, 0), - unsignedp), + expand_expr (low, NULL_RTX, mode, 0), NULL_RTX, unsignedp, OPTAB_WIDEN); + new_bound = expand_expr (fold (build (MINUS_EXPR, type, + high, low)), + NULL_RTX, mode, 0); - emit_cmp_and_jump_insns (new_index, - convert_modes (mode, imode, - expand_expr (new_bound, NULL_RTX, - mode, 0), - unsignedp), - GT, NULL_RTX, mode, 1, 0, - default_label); + emit_cmp_and_jump_insns (new_index, new_bound, GT, NULL_RTX, + mode, 1, 0, default_label); } emit_jump (label_rtx (node->code_label)); |