aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTorbjorn Granlund <tege@gnu.org>1996-10-21 22:18:56 +0000
committerTorbjorn Granlund <tege@gnu.org>1996-10-21 22:18:56 +0000
commit04a8ee2ff6a807f01302ae8539802d4f0df7f7ea (patch)
tree204ba1e05f08b39161251ee6c056fe481ea68ace
parent17964a96fae4be2704714f768b709d1eeffa6bb8 (diff)
downloadgcc-04a8ee2ff6a807f01302ae8539802d4f0df7f7ea.zip
gcc-04a8ee2ff6a807f01302ae8539802d4f0df7f7ea.tar.gz
gcc-04a8ee2ff6a807f01302ae8539802d4f0df7f7ea.tar.bz2
(emit_store_flag_force): New function.
From-SVN: r12987
-rw-r--r--gcc/expmed.c37
1 files changed, 37 insertions, 0 deletions
diff --git a/gcc/expmed.c b/gcc/expmed.c
index ee55ddb..8bd8d3f 100644
--- a/gcc/expmed.c
+++ b/gcc/expmed.c
@@ -4260,6 +4260,43 @@ emit_store_flag (target, code, op0, op1, mode, unsignedp, normalizep)
return tem;
}
+
+/* Like emit_store_flag, but always succeeds. */
+
+rtx
+emit_store_flag_force (target, code, op0, op1, mode, unsignedp, normalizep)
+ rtx target;
+ enum rtx_code code;
+ rtx op0, op1;
+ enum machine_mode mode;
+ int unsignedp;
+ int normalizep;
+{
+ rtx tem, label;
+
+ /* First see if emit_store_flag can do the job. */
+ tem = emit_store_flag (target, code, op0, op1, mode, unsignedp, normalizep);
+ if (tem != 0)
+ return tem;
+
+ if (normalizep == 0)
+ normalizep = 1;
+
+ /* If this failed, we have to do this with set/compare/jump/set code. */
+
+ if (GET_CODE (target) != REG
+ || reg_mentioned_p (target, op0) || reg_mentioned_p (target, op1))
+ target = gen_reg_rtx (GET_MODE (target));
+
+ emit_move_insn (target, const0_rtx);
+ tem = compare_from_rtx (op0, op1, code, unsignedp, mode, NULL_RTX, 0);
+ if (GET_CODE (tem) == CONST_INT)
+ return tem;
+
+ label = gen_label_rtx ();
+ if (bcc_gen_fctn[(int) code] == 0)
+ abort ();
+
emit_jump_insn ((*bcc_gen_fctn[(int) code]) (label));
emit_move_insn (target, const1_rtx);
emit_label (label);