diff options
author | Torbjorn Granlund <tege@gnu.org> | 1994-07-13 20:55:07 +0000 |
---|---|---|
committer | Torbjorn Granlund <tege@gnu.org> | 1994-07-13 20:55:07 +0000 |
commit | 412381d963f02ce3c6dd00d7c4daac4676a02818 (patch) | |
tree | 2e8041a690962c31a68ac4ccefc2635f504b42f9 /gcc/expmed.c | |
parent | 24a13950ca6786c0bb338b760d5e6a0dcdaeebcf (diff) | |
download | gcc-412381d963f02ce3c6dd00d7c4daac4676a02818.zip gcc-412381d963f02ce3c6dd00d7c4daac4676a02818.tar.gz gcc-412381d963f02ce3c6dd00d7c4daac4676a02818.tar.bz2 |
(expand_divmod, case CEIL_DIV_EXPR): Handle emit_store_flag returning 0.
From-SVN: r7768
Diffstat (limited to 'gcc/expmed.c')
-rw-r--r-- | gcc/expmed.c | 20 |
1 files changed, 16 insertions, 4 deletions
diff --git a/gcc/expmed.c b/gcc/expmed.c index 5b2d61e..e2cba0d 100644 --- a/gcc/expmed.c +++ b/gcc/expmed.c @@ -3132,16 +3132,28 @@ expand_divmod (rem_flag, code, mode, op0, op1, target, unsignedp) unsigned HOST_WIDE_INT d = INTVAL (op1); t1 = expand_shift (RSHIFT_EXPR, compute_mode, op0, build_int_2 (floor_log2 (d), 0), - NULL_RTX, 1); + tquotient, 1); t2 = expand_binop (compute_mode, and_optab, op0, GEN_INT (d - 1), NULL_RTX, 1, OPTAB_LIB_WIDEN); t3 = gen_reg_rtx (compute_mode); t3 = emit_store_flag (t3, NE, t2, const0_rtx, compute_mode, 1, 1); - quotient = force_operand (gen_rtx (PLUS, compute_mode, - t1, t3), - tquotient); + if (t3 == 0) + { + rtx lab; + lab = gen_label_rtx (); + emit_cmp_insn (t2, const0_rtx, EQ, NULL_RTX, + compute_mode, 0, 0); + emit_jump_insn (gen_beq (lab)); + expand_inc (t1, const1_rtx); + emit_label (lab); + quotient = t1; + } + else + quotient = force_operand (gen_rtx (PLUS, compute_mode, + t1, t3), + tquotient); break; } |