aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Kenner <kenner@gcc.gnu.org>1994-11-15 18:35:35 -0500
committerRichard Kenner <kenner@gcc.gnu.org>1994-11-15 18:35:35 -0500
commit2e5ec6cf3b1256e2ded7f8f5f8376b5c79dbcd74 (patch)
tree60e9dda0a4b3d64df079186ba22da43ede456651
parent69f619018a585979500e0e80d3d106aaf3b62820 (diff)
downloadgcc-2e5ec6cf3b1256e2ded7f8f5f8376b5c79dbcd74.zip
gcc-2e5ec6cf3b1256e2ded7f8f5f8376b5c79dbcd74.tar.gz
gcc-2e5ec6cf3b1256e2ded7f8f5f8376b5c79dbcd74.tar.bz2
(do_jump_by_parts_greater_rtx): No longer static.
(expand_expr): Delete code for plain `abs'. From-SVN: r8443
-rw-r--r--gcc/expr.c70
1 files changed, 4 insertions, 66 deletions
diff --git a/gcc/expr.c b/gcc/expr.c
index de656b6..0e2f3a3 100644
--- a/gcc/expr.c
+++ b/gcc/expr.c
@@ -180,7 +180,7 @@ void bc_load_localaddr PROTO((rtx));
void bc_load_parmaddr PROTO((rtx));
static void preexpand_calls PROTO((tree));
static void do_jump_by_parts_greater PROTO((tree, int, rtx, rtx));
-static void do_jump_by_parts_greater_rtx PROTO((enum machine_mode, int, rtx, rtx, rtx, rtx));
+void do_jump_by_parts_greater_rtx PROTO((enum machine_mode, int, rtx, rtx, rtx, rtx));
static void do_jump_by_parts_equality PROTO((tree, rtx, rtx));
static void do_jump_by_parts_equality_rtx PROTO((rtx, rtx, rtx));
static void do_jump_for_compare PROTO((rtx, rtx, rtx));
@@ -5216,70 +5216,8 @@ expand_expr (exp, target, tmode, modifier)
if (TREE_UNSIGNED (type))
return op0;
- /* First try to do it with a special abs instruction. */
- temp = expand_unop (mode, abs_optab, op0, target, 0);
- if (temp != 0)
- return temp;
-
- /* If this machine has expensive jumps, we can do integer absolute
- value of X as (((signed) x >> (W-1)) ^ x) - ((signed) x >> (W-1)),
- where W is the width of MODE. */
-
- if (GET_MODE_CLASS (mode) == MODE_INT && BRANCH_COST >= 2)
- {
- rtx extended = expand_shift (RSHIFT_EXPR, mode, op0,
- size_int (GET_MODE_BITSIZE (mode) - 1),
- NULL_RTX, 0);
-
- temp = expand_binop (mode, xor_optab, extended, op0, target, 0,
- OPTAB_LIB_WIDEN);
- if (temp != 0)
- temp = expand_binop (mode, sub_optab, temp, extended, target, 0,
- OPTAB_LIB_WIDEN);
-
- if (temp != 0)
- return temp;
- }
-
- /* If that does not win, use conditional jump and negate. */
- target = original_target;
- op1 = gen_label_rtx ();
- if (target == 0 || ! safe_from_p (target, TREE_OPERAND (exp, 0))
- || GET_MODE (target) != mode
- || (GET_CODE (target) == MEM && MEM_VOLATILE_P (target))
- || (GET_CODE (target) == REG
- && REGNO (target) < FIRST_PSEUDO_REGISTER))
- target = gen_reg_rtx (mode);
-
- emit_move_insn (target, op0);
- NO_DEFER_POP;
-
- /* If this mode is an integer too wide to compare properly,
- compare word by word. Rely on CSE to optimize constant cases. */
- if (GET_MODE_CLASS (mode) == MODE_INT && ! can_compare_p (mode))
- do_jump_by_parts_greater_rtx (mode, 0, target, const0_rtx,
- NULL_RTX, op1);
- else
- {
- temp = compare_from_rtx (target, CONST0_RTX (mode), GE, 0, mode,
- NULL_RTX, 0);
- if (temp == const1_rtx)
- return target;
- else if (temp != const0_rtx)
- {
- if (bcc_gen_fctn[(int) GET_CODE (temp)] != 0)
- emit_jump_insn ((*bcc_gen_fctn[(int) GET_CODE (temp)]) (op1));
- else
- abort ();
- }
- }
-
- op0 = expand_unop (mode, neg_optab, target, target, 0);
- if (op0 != target)
- emit_move_insn (target, op0);
- emit_label (op1);
- OK_DEFER_POP;
- return target;
+ return expand_abs (mode, op0, target, unsignedp,
+ safe_from_p (target, TREE_OPERAND (exp, 0)));
case MAX_EXPR:
case MIN_EXPR:
@@ -9026,7 +8964,7 @@ do_jump_by_parts_greater (exp, swap, if_false_label, if_true_label)
UNSIGNEDP says to do unsigned comparison.
Jump to IF_TRUE_LABEL if OP0 is greater, IF_FALSE_LABEL otherwise. */
-static void
+void
do_jump_by_parts_greater_rtx (mode, unsignedp, op0, op1, if_false_label, if_true_label)
enum machine_mode mode;
int unsignedp;