diff options
author | Torbjorn Granlund <tege@gnu.org> | 1996-10-21 22:18:56 +0000 |
---|---|---|
committer | Torbjorn Granlund <tege@gnu.org> | 1996-10-21 22:18:56 +0000 |
commit | 04a8ee2ff6a807f01302ae8539802d4f0df7f7ea (patch) | |
tree | 204ba1e05f08b39161251ee6c056fe481ea68ace | |
parent | 17964a96fae4be2704714f768b709d1eeffa6bb8 (diff) | |
download | gcc-04a8ee2ff6a807f01302ae8539802d4f0df7f7ea.zip gcc-04a8ee2ff6a807f01302ae8539802d4f0df7f7ea.tar.gz gcc-04a8ee2ff6a807f01302ae8539802d4f0df7f7ea.tar.bz2 |
(emit_store_flag_force): New function.
From-SVN: r12987
-rw-r--r-- | gcc/expmed.c | 37 |
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); |