aboutsummaryrefslogtreecommitdiff
path: root/gcc/expmed.c
diff options
context:
space:
mode:
authorTorbjorn Granlund <tege@gnu.org>1994-07-13 20:55:07 +0000
committerTorbjorn Granlund <tege@gnu.org>1994-07-13 20:55:07 +0000
commit412381d963f02ce3c6dd00d7c4daac4676a02818 (patch)
tree2e8041a690962c31a68ac4ccefc2635f504b42f9 /gcc/expmed.c
parent24a13950ca6786c0bb338b760d5e6a0dcdaeebcf (diff)
downloadgcc-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.c20
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;
}