int uns = TYPE_UNSIGNED (TREE_TYPE (TREE_TYPE (lhs)));
lres = convert_modes (tgtmode, mode, res, uns);
gcc_assert (GET_MODE_PRECISION (tgtmode) < GET_MODE_PRECISION (mode));
- emit_cmp_and_jump_insns (res, convert_modes (mode, tgtmode, lres, uns),
- EQ, NULL_RTX, mode, false, done_label,
+ do_compare_rtx_and_jump (res, convert_modes (mode, tgtmode, lres, uns),
+ EQ, true, mode, NULL_RTX, NULL_RTX, done_label,
PROB_VERY_LIKELY);
write_complex_part (target, const1_rtx, true);
emit_label (done_label);
? (CONST_SCALAR_INT_P (op0) && REG_P (op1))
: CONST_SCALAR_INT_P (op1)))
tem = op1;
- emit_cmp_and_jump_insns (res, tem, code == PLUS_EXPR ? GEU : LEU,
- NULL_RTX, mode, false, done_label,
+ do_compare_rtx_and_jump (res, tem, code == PLUS_EXPR ? GEU : LEU,
+ true, mode, NULL_RTX, NULL_RTX, done_label,
PROB_VERY_LIKELY);
goto do_error_label;
}
rtx tem = expand_binop (mode, add_optab,
code == PLUS_EXPR ? res : op0, sgn,
NULL_RTX, false, OPTAB_LIB_WIDEN);
- emit_cmp_and_jump_insns (tem, op1, GEU, NULL_RTX, mode, false,
+ do_compare_rtx_and_jump (tem, op1, GEU, true, mode, NULL_RTX, NULL_RTX,
done_label, PROB_VERY_LIKELY);
goto do_error_label;
}
emit_jump (do_error);
else if (pos_neg == 3)
/* If ARG0 is not known to be always positive, check at runtime. */
- emit_cmp_and_jump_insns (op0, const0_rtx, LT, NULL_RTX, mode, false,
- do_error, PROB_VERY_UNLIKELY);
- emit_cmp_and_jump_insns (op1, op0, LEU, NULL_RTX, mode, false,
+ do_compare_rtx_and_jump (op0, const0_rtx, LT, false, mode, NULL_RTX,
+ NULL_RTX, do_error, PROB_VERY_UNLIKELY);
+ do_compare_rtx_and_jump (op1, op0, LEU, true, mode, NULL_RTX, NULL_RTX,
done_label, PROB_VERY_LIKELY);
goto do_error_label;
}
OPTAB_LIB_WIDEN);
rtx tem = expand_binop (mode, add_optab, op1, sgn, NULL_RTX, false,
OPTAB_LIB_WIDEN);
- emit_cmp_and_jump_insns (op0, tem, LTU, NULL_RTX, mode, false,
+ do_compare_rtx_and_jump (op0, tem, LTU, true, mode, NULL_RTX, NULL_RTX,
done_label, PROB_VERY_LIKELY);
goto do_error_label;
}
unsigned. */
res = expand_binop (mode, add_optab, op0, op1, NULL_RTX, false,
OPTAB_LIB_WIDEN);
- emit_cmp_and_jump_insns (res, const0_rtx, LT, NULL_RTX, mode, false,
- do_error, PROB_VERY_UNLIKELY);
+ do_compare_rtx_and_jump (res, const0_rtx, LT, false, mode, NULL_RTX,
+ NULL_RTX, do_error, PROB_VERY_UNLIKELY);
rtx tem = op1;
/* The operation is commutative, so we can pick operand to compare
against. For prec <= BITS_PER_WORD, I think preferring REG operand
? (CONST_SCALAR_INT_P (op1) && REG_P (op0))
: CONST_SCALAR_INT_P (op0))
tem = op0;
- emit_cmp_and_jump_insns (res, tem, GEU, NULL_RTX, mode, false,
+ do_compare_rtx_and_jump (res, tem, GEU, true, mode, NULL_RTX, NULL_RTX,
done_label, PROB_VERY_LIKELY);
goto do_error_label;
}
tem = expand_binop (mode, ((pos_neg == 1) ^ (code == MINUS_EXPR))
? and_optab : ior_optab,
op0, res, NULL_RTX, false, OPTAB_LIB_WIDEN);
- emit_cmp_and_jump_insns (tem, const0_rtx, GE, NULL_RTX, mode, false,
- done_label, PROB_VERY_LIKELY);
+ do_compare_rtx_and_jump (tem, const0_rtx, GE, false, mode, NULL_RTX,
+ NULL_RTX, done_label, PROB_VERY_LIKELY);
}
else
{
rtx_code_label *do_ior_label = gen_label_rtx ();
- emit_cmp_and_jump_insns (op1, const0_rtx,
- code == MINUS_EXPR ? GE : LT, NULL_RTX,
- mode, false, do_ior_label, PROB_EVEN);
+ do_compare_rtx_and_jump (op1, const0_rtx,
+ code == MINUS_EXPR ? GE : LT, false, mode,
+ NULL_RTX, NULL_RTX, do_ior_label,
+ PROB_EVEN);
tem = expand_binop (mode, and_optab, op0, res, NULL_RTX, false,
OPTAB_LIB_WIDEN);
- emit_cmp_and_jump_insns (tem, const0_rtx, GE, NULL_RTX, mode, false,
- done_label, PROB_VERY_LIKELY);
+ do_compare_rtx_and_jump (tem, const0_rtx, GE, false, mode, NULL_RTX,
+ NULL_RTX, done_label, PROB_VERY_LIKELY);
emit_jump (do_error);
emit_label (do_ior_label);
tem = expand_binop (mode, ior_optab, op0, res, NULL_RTX, false,
OPTAB_LIB_WIDEN);
- emit_cmp_and_jump_insns (tem, const0_rtx, GE, NULL_RTX, mode, false,
- done_label, PROB_VERY_LIKELY);
+ do_compare_rtx_and_jump (tem, const0_rtx, GE, false, mode, NULL_RTX,
+ NULL_RTX, done_label, PROB_VERY_LIKELY);
}
goto do_error_label;
}
res = expand_binop (mode, sub_optab, op0, op1, NULL_RTX, false,
OPTAB_LIB_WIDEN);
rtx_code_label *op0_geu_op1 = gen_label_rtx ();
- emit_cmp_and_jump_insns (op0, op1, GEU, NULL_RTX, mode, false,
+ do_compare_rtx_and_jump (op0, op1, GEU, true, mode, NULL_RTX, NULL_RTX,
op0_geu_op1, PROB_EVEN);
- emit_cmp_and_jump_insns (res, const0_rtx, LT, NULL_RTX, mode, false,
- done_label, PROB_VERY_LIKELY);
+ do_compare_rtx_and_jump (res, const0_rtx, LT, false, mode, NULL_RTX,
+ NULL_RTX, done_label, PROB_VERY_LIKELY);
emit_jump (do_error);
emit_label (op0_geu_op1);
- emit_cmp_and_jump_insns (res, const0_rtx, GE, NULL_RTX, mode, false,
- done_label, PROB_VERY_LIKELY);
+ do_compare_rtx_and_jump (res, const0_rtx, GE, false, mode, NULL_RTX,
+ NULL_RTX, done_label, PROB_VERY_LIKELY);
goto do_error_label;
}
and conditional jump instead of 2 at runtime, 3 present in the
emitted code. If one of the arguments is CONST_INT, all we
need is to make sure it is op1, then the first
- emit_cmp_and_jump_insns will be just folded. Otherwise try
+ do_compare_rtx_and_jump will be just folded. Otherwise try
to use range info if available. */
if (code == PLUS_EXPR && CONST_INT_P (op0))
{
/* If the op1 is negative, we have to use a different check. */
if (pos_neg == 3)
- emit_cmp_and_jump_insns (op1, const0_rtx, LT, NULL_RTX, mode,
- false, sub_check, PROB_EVEN);
+ do_compare_rtx_and_jump (op1, const0_rtx, LT, false, mode, NULL_RTX,
+ NULL_RTX, sub_check, PROB_EVEN);
/* Compare the result of the operation with one of the operands. */
if (pos_neg & 1)
- emit_cmp_and_jump_insns (res, op0, code == PLUS_EXPR ? GE : LE,
- NULL_RTX, mode, false, done_label,
+ do_compare_rtx_and_jump (res, op0, code == PLUS_EXPR ? GE : LE,
+ false, mode, NULL_RTX, NULL_RTX, done_label,
PROB_VERY_LIKELY);
/* If we get here, we have to print the error. */
/* We have k = a + b for b < 0 here. k <= a must hold. */
if (pos_neg & 2)
- emit_cmp_and_jump_insns (res, op0, code == PLUS_EXPR ? LE : GE,
- NULL_RTX, mode, false, done_label,
+ do_compare_rtx_and_jump (res, op0, code == PLUS_EXPR ? LE : GE,
+ false, mode, NULL_RTX, NULL_RTX, done_label,
PROB_VERY_LIKELY);
}
/* Compare the operand with the most negative value. */
rtx minv = expand_normal (TYPE_MIN_VALUE (TREE_TYPE (arg1)));
- emit_cmp_and_jump_insns (op1, minv, NE, NULL_RTX, mode, false,
+ do_compare_rtx_and_jump (op1, minv, NE, true, mode, NULL_RTX, NULL_RTX,
done_label, PROB_VERY_LIKELY);
}
ops.op2 = NULL_TREE;
ops.location = loc;
res = expand_expr_real_2 (&ops, NULL_RTX, mode, EXPAND_NORMAL);
- emit_cmp_and_jump_insns (op1, const0_rtx, EQ, NULL_RTX, mode,
- false, done_label, PROB_VERY_LIKELY);
+ do_compare_rtx_and_jump (op1, const0_rtx, EQ, true, mode, NULL_RTX,
+ NULL_RTX, done_label, PROB_VERY_LIKELY);
goto do_error_label;
case 3:
rtx_code_label *do_main_label;
do_main_label = gen_label_rtx ();
- emit_cmp_and_jump_insns (op0, const0_rtx, GE, NULL_RTX, mode,
- false, do_main_label, PROB_VERY_LIKELY);
- emit_cmp_and_jump_insns (op1, const0_rtx, EQ, NULL_RTX, mode,
- false, do_main_label, PROB_VERY_LIKELY);
+ do_compare_rtx_and_jump (op0, const0_rtx, GE, false, mode, NULL_RTX,
+ NULL_RTX, do_main_label, PROB_VERY_LIKELY);
+ do_compare_rtx_and_jump (op1, const0_rtx, EQ, true, mode, NULL_RTX,
+ NULL_RTX, do_main_label, PROB_VERY_LIKELY);
write_complex_part (target, const1_rtx, true);
emit_label (do_main_label);
goto do_main;
ops.op2 = NULL_TREE;
ops.location = loc;
res = expand_expr_real_2 (&ops, NULL_RTX, mode, EXPAND_NORMAL);
- emit_cmp_and_jump_insns (op0, const0_rtx, EQ, NULL_RTX, mode,
- false, done_label, PROB_VERY_LIKELY);
- emit_cmp_and_jump_insns (op0, constm1_rtx, NE, NULL_RTX, mode,
- false, do_error, PROB_VERY_UNLIKELY);
+ do_compare_rtx_and_jump (op0, const0_rtx, EQ, true, mode, NULL_RTX,
+ NULL_RTX, done_label, PROB_VERY_LIKELY);
+ do_compare_rtx_and_jump (op0, constm1_rtx, NE, true, mode, NULL_RTX,
+ NULL_RTX, do_error, PROB_VERY_UNLIKELY);
int prec;
prec = GET_MODE_PRECISION (mode);
rtx sgn;
sgn = immed_wide_int_const (wi::min_value (prec, SIGNED), mode);
- emit_cmp_and_jump_insns (op1, sgn, EQ, NULL_RTX, mode,
- false, done_label, PROB_VERY_LIKELY);
+ do_compare_rtx_and_jump (op1, sgn, EQ, true, mode, NULL_RTX,
+ NULL_RTX, done_label, PROB_VERY_LIKELY);
goto do_error_label;
case 3:
/* Rest of handling of this case after res is computed. */
res = expand_expr_real_2 (&ops, NULL_RTX, mode, EXPAND_NORMAL);
tem = expand_binop (mode, and_optab, op0, op1, NULL_RTX, false,
OPTAB_LIB_WIDEN);
- emit_cmp_and_jump_insns (tem, const0_rtx, EQ, NULL_RTX, mode,
- false, done_label, PROB_VERY_LIKELY);
+ do_compare_rtx_and_jump (tem, const0_rtx, EQ, true, mode,
+ NULL_RTX, NULL_RTX, done_label,
+ PROB_VERY_LIKELY);
goto do_error_label;
}
/* The general case, do all the needed comparisons at runtime. */
after_negate_label = gen_label_rtx ();
tem = expand_binop (mode, and_optab, op0, op1, NULL_RTX, false,
OPTAB_LIB_WIDEN);
- emit_cmp_and_jump_insns (tem, const0_rtx, GE, NULL_RTX, mode, false,
- after_negate_label, PROB_VERY_LIKELY);
+ do_compare_rtx_and_jump (tem, const0_rtx, GE, false, mode, NULL_RTX,
+ NULL_RTX, after_negate_label,
+ PROB_VERY_LIKELY);
/* Both arguments negative here, negate them and continue with
normal unsigned overflow checking multiplication. */
emit_move_insn (op0, expand_unop (mode, neg_optab, op0,
emit_label (after_negate_label);
tem2 = expand_binop (mode, xor_optab, op0, op1, NULL_RTX, false,
OPTAB_LIB_WIDEN);
- emit_cmp_and_jump_insns (tem2, const0_rtx, GE, NULL_RTX, mode, false,
- do_main_label, PROB_VERY_LIKELY);
+ do_compare_rtx_and_jump (tem2, const0_rtx, GE, false, mode, NULL_RTX,
+ NULL_RTX, do_main_label, PROB_VERY_LIKELY);
/* One argument is negative here, the other positive. This
overflows always, unless one of the arguments is 0. But
if e.g. s2 is 0, (U) s1 * 0 doesn't overflow, whatever s1
is, thus we can keep do_main code oring in overflow as is. */
- emit_cmp_and_jump_insns (tem, const0_rtx, EQ, NULL_RTX, mode, false,
- do_main_label, PROB_VERY_LIKELY);
+ do_compare_rtx_and_jump (tem, const0_rtx, EQ, true, mode, NULL_RTX,
+ NULL_RTX, do_main_label, PROB_VERY_LIKELY);
write_complex_part (target, const1_rtx, true);
emit_label (do_main_label);
goto do_main;
if (uns)
/* For the unsigned multiplication, there was overflow if
HIPART is non-zero. */
- emit_cmp_and_jump_insns (hipart, const0_rtx, EQ, NULL_RTX, mode,
- false, done_label, PROB_VERY_LIKELY);
+ do_compare_rtx_and_jump (hipart, const0_rtx, EQ, true, mode,
+ NULL_RTX, NULL_RTX, done_label,
+ PROB_VERY_LIKELY);
else
{
rtx signbit = expand_shift (RSHIFT_EXPR, mode, res, prec - 1,
/* RES is low half of the double width result, HIPART
the high half. There was overflow if
HIPART is different from RES < 0 ? -1 : 0. */
- emit_cmp_and_jump_insns (signbit, hipart, EQ, NULL_RTX, mode,
- false, done_label, PROB_VERY_LIKELY);
+ do_compare_rtx_and_jump (signbit, hipart, EQ, true, mode,
+ NULL_RTX, NULL_RTX, done_label,
+ PROB_VERY_LIKELY);
}
}
else if (hmode != BLKmode && 2 * GET_MODE_PRECISION (hmode) == prec)
}
if (!op0_small_p)
- emit_cmp_and_jump_insns (signbit0, hipart0, NE, NULL_RTX, hmode,
- false, large_op0, PROB_UNLIKELY);
+ do_compare_rtx_and_jump (signbit0, hipart0, NE, true, hmode,
+ NULL_RTX, NULL_RTX, large_op0,
+ PROB_UNLIKELY);
if (!op1_small_p)
- emit_cmp_and_jump_insns (signbit1, hipart1, NE, NULL_RTX, hmode,
- false, small_op0_large_op1,
+ do_compare_rtx_and_jump (signbit1, hipart1, NE, true, hmode,
+ NULL_RTX, NULL_RTX, small_op0_large_op1,
PROB_UNLIKELY);
/* If both op0 and op1 are sign (!uns) or zero (uns) extended from
emit_label (large_op0);
if (!op1_small_p)
- emit_cmp_and_jump_insns (signbit1, hipart1, NE, NULL_RTX, hmode,
- false, both_ops_large, PROB_UNLIKELY);
+ do_compare_rtx_and_jump (signbit1, hipart1, NE, true, hmode,
+ NULL_RTX, NULL_RTX, both_ops_large,
+ PROB_UNLIKELY);
/* If op1 is sign (!uns) or zero (uns) extended from hmode to mode,
but op0 is not, prepare larger, hipart and lopart pseudos and
if (larger_sign == 0)
emit_jump (after_hipart_neg);
else if (larger_sign != -1)
- emit_cmp_and_jump_insns (hipart, const0_rtx, GE, NULL_RTX,
- hmode, false, after_hipart_neg,
+ do_compare_rtx_and_jump (hipart, const0_rtx, GE, false, hmode,
+ NULL_RTX, NULL_RTX, after_hipart_neg,
PROB_EVEN);
tem = convert_modes (mode, hmode, lopart, 1);
if (smaller_sign == 0)
emit_jump (after_lopart_neg);
else if (smaller_sign != -1)
- emit_cmp_and_jump_insns (lopart, const0_rtx, GE, NULL_RTX,
- hmode, false, after_lopart_neg,
+ do_compare_rtx_and_jump (lopart, const0_rtx, GE, false, hmode,
+ NULL_RTX, NULL_RTX, after_lopart_neg,
PROB_EVEN);
tem = expand_simple_binop (mode, MINUS, loxhi, larger, NULL_RTX,
gen_lowpart (hmode, loxhi),
hprec - 1, NULL_RTX, 0);
- emit_cmp_and_jump_insns (signbitloxhi, hipartloxhi, NE, NULL_RTX,
- hmode, false, do_overflow,
+ do_compare_rtx_and_jump (signbitloxhi, hipartloxhi, NE, true, hmode,
+ NULL_RTX, NULL_RTX, do_overflow,
PROB_VERY_UNLIKELY);
/* res = (loxhi << (bitsize / 2)) | (hmode) lo0xlo1; */
{
tem = expand_simple_binop (hmode, PLUS, hipart0, const1_rtx,
NULL_RTX, 1, OPTAB_DIRECT);
- emit_cmp_and_jump_insns (tem, const1_rtx, GTU, NULL_RTX,
- hmode, true, do_error,
+ do_compare_rtx_and_jump (tem, const1_rtx, GTU, true, hmode,
+ NULL_RTX, NULL_RTX, do_error,
PROB_VERY_UNLIKELY);
}
{
tem = expand_simple_binop (hmode, PLUS, hipart1, const1_rtx,
NULL_RTX, 1, OPTAB_DIRECT);
- emit_cmp_and_jump_insns (tem, const1_rtx, GTU, NULL_RTX,
- hmode, true, do_error,
+ do_compare_rtx_and_jump (tem, const1_rtx, GTU, true, hmode,
+ NULL_RTX, NULL_RTX, do_error,
PROB_VERY_UNLIKELY);
}
if (op0_sign != 1 && op1_sign != 1 && op0_sign != op1_sign)
emit_jump (hipart_different);
else if (op0_sign == 1 || op1_sign == 1)
- emit_cmp_and_jump_insns (hipart0, hipart1, NE, NULL_RTX, hmode,
- true, hipart_different, PROB_EVEN);
+ do_compare_rtx_and_jump (hipart0, hipart1, NE, true, hmode,
+ NULL_RTX, NULL_RTX, hipart_different,
+ PROB_EVEN);
- emit_cmp_and_jump_insns (res, const0_rtx, LT, NULL_RTX, mode,
- false, do_error, PROB_VERY_UNLIKELY);
+ do_compare_rtx_and_jump (res, const0_rtx, LT, false, mode,
+ NULL_RTX, NULL_RTX, do_error,
+ PROB_VERY_UNLIKELY);
emit_jump (done_label);
emit_label (hipart_different);
- emit_cmp_and_jump_insns (res, const0_rtx, GE, NULL_RTX, mode,
- false, do_error, PROB_VERY_UNLIKELY);
+ do_compare_rtx_and_jump (res, const0_rtx, GE, false, mode,
+ NULL_RTX, NULL_RTX, do_error,
+ PROB_VERY_UNLIKELY);
emit_jump (done_label);
}
if (uns0_p && uns1_p && !unsr_p)
{
rtx_code_label *all_done_label = gen_label_rtx ();
- emit_cmp_and_jump_insns (res, const0_rtx, GE, NULL_RTX, mode,
- false, all_done_label, PROB_VERY_LIKELY);
+ do_compare_rtx_and_jump (res, const0_rtx, GE, false, mode, NULL_RTX,
+ NULL_RTX, all_done_label, PROB_VERY_LIKELY);
write_complex_part (target, const1_rtx, true);
emit_label (all_done_label);
}
{
rtx_code_label *all_done_label = gen_label_rtx ();
rtx_code_label *set_noovf = gen_label_rtx ();
- emit_cmp_and_jump_insns (op1, const0_rtx, GE, NULL_RTX, mode,
- false, all_done_label, PROB_VERY_LIKELY);
+ do_compare_rtx_and_jump (op1, const0_rtx, GE, false, mode, NULL_RTX,
+ NULL_RTX, all_done_label, PROB_VERY_LIKELY);
write_complex_part (target, const1_rtx, true);
- emit_cmp_and_jump_insns (op0, const0_rtx, EQ, NULL_RTX, mode,
- false, set_noovf, PROB_VERY_LIKELY);
- emit_cmp_and_jump_insns (op0, constm1_rtx, NE, NULL_RTX, mode,
- false, all_done_label, PROB_VERY_UNLIKELY);
- emit_cmp_and_jump_insns (op1, res, NE, NULL_RTX, mode,
- false, all_done_label, PROB_VERY_UNLIKELY);
+ do_compare_rtx_and_jump (op0, const0_rtx, EQ, true, mode, NULL_RTX,
+ NULL_RTX, set_noovf, PROB_VERY_LIKELY);
+ do_compare_rtx_and_jump (op0, constm1_rtx, NE, true, mode, NULL_RTX,
+ NULL_RTX, all_done_label, PROB_VERY_UNLIKELY);
+ do_compare_rtx_and_jump (op1, res, NE, true, mode, NULL_RTX, NULL_RTX,
+ all_done_label, PROB_VERY_UNLIKELY);
emit_label (set_noovf);
write_complex_part (target, const0_rtx, true);
emit_label (all_done_label);