Commit 265dab10 by Jan Hubicka Committed by Mark Mitchell

i386.c (ix86_comparison_operator, [...]): Handle CCRCmode.

        * i386.c (ix86_comparison_operator, put_condition_code,
        ix86_match_ccmode, ix86_cc_mode): Handle CCRCmode.
        (ix86_expand_strlensi_unroll_1): Use CCRCmode.
        * i386.h (EXTRA_CC_MODES): Add CCRCmode.
        * i386.md (adddi and negdi splitter): Use CCRCmode.
        (add?i_3, add?i_4, add?i_5): Use CCRCmode; swap operands
        (subsi3_carry): add '*'
        (addsi3_carry_rc, subsi3_carry_rc, x86_movsicc_0_m1_rc): New.
        (cmp to add peep2): Use CCRCmode; swap operands.

From-SVN: r36927
parent f27e6bb2
2000-10-18 Jan Hubikca <jh@suse.cz>
* i386.c (ix86_comparison_operator, put_condition_code,
ix86_match_ccmode, ix86_cc_mode): Handle CCRCmode.
(ix86_expand_strlensi_unroll_1): Use CCRCmode.
* i386.h (EXTRA_CC_MODES): Add CCRCmode.
* i386.md (adddi and negdi splitter): Use CCRCmode.
(add?i_3, add?i_4, add?i_5): Use CCRCmode; swap operands
(subsi3_carry): add '*'
(addsi3_carry_rc, subsi3_carry_rc, x86_movsicc_0_m1_rc): New.
(cmp to add peep2): Use CCRCmode; swap operands.
2000-10-18 Kazu Hirata <kazu@hxi.com>
* config/h8300/h8300.md: Remove an unnecessary sign_extend
......@@ -307,11 +319,9 @@ Tue Oct 17 20:05:51 2000 Martin Buchholz <martin@xemacs.org>
* gengenrtl.c (gendef): Don't include
ggc_p conditionals.
* ggc-callbacks.c (ggc_p): Remove.
*
ggc-none.c (ggc_p): Remove.
* ggc-none.c (ggc_p): Remove.
* ggc.h (ggc_p): Don't declare.
*
integrate.c (save_for_inline): Don't mess with obstacks.
* integrate.c (save_for_inline): Don't mess with obstacks.
(integrate_decl_tree): Likewise.
(output_inline_function): Likewise.
* lists.c
......
......@@ -1305,18 +1305,22 @@ ix86_comparison_operator (op, mode)
return 1;
case LT: case GE:
inmode = GET_MODE (XEXP (op, 0));
if (inmode == CCmode || inmode == CCGCmode
if (inmode == CCmode || inmode == CCGCmode || inmode == CCRCmode
|| inmode == CCGOCmode || inmode == CCNOmode)
return 1;
return 0;
case LTU: case GTU: case LEU: case ORDERED: case UNORDERED: case GEU:
case LTU: case GTU:
inmode = GET_MODE (XEXP (op, 0));
if (inmode == CCmode)
return inmode == CCmode;
case LEU: case ORDERED: case UNORDERED: case GEU:
inmode = GET_MODE (XEXP (op, 0));
if (inmode == CCmode || inmode == CCRCmode)
return 1;
return 0;
case GT: case LE:
inmode = GET_MODE (XEXP (op, 0));
if (inmode == CCmode || inmode == CCGCmode || inmode == CCNOmode)
if (inmode == CCmode || inmode == CCGCmode || inmode == CCNOmode
|| inmode == CCRCmode)
return 1;
return 0;
default:
......@@ -3108,21 +3112,22 @@ put_condition_code (code, mode, reverse, fp, file)
suffix = "ne";
break;
case GT:
if (mode != CCmode && mode != CCNOmode && mode != CCGCmode)
if (mode != CCmode && mode != CCNOmode && mode != CCGCmode
&& mode != CCRCmode)
abort ();
suffix = "g";
break;
case GTU:
/* ??? Use "nbe" instead of "a" for fcmov losage on some assemblers.
Those same assemblers have the same but opposite losage on cmov. */
if (mode != CCmode)
if (mode != CCmode && mode != CCRCmode)
abort ();
suffix = fp ? "nbe" : "a";
break;
case LT:
if (mode == CCNOmode || mode == CCGOCmode)
suffix = "s";
else if (mode == CCmode || mode == CCGCmode)
else if (mode == CCmode || mode == CCGCmode || mode == CCRCmode)
suffix = "l";
else
abort ();
......@@ -3135,26 +3140,33 @@ put_condition_code (code, mode, reverse, fp, file)
case GE:
if (mode == CCNOmode || mode == CCGOCmode)
suffix = "ns";
else if (mode == CCmode || mode == CCGCmode)
else if (mode == CCmode || mode == CCGCmode || mode == CCRCmode)
suffix = "ge";
else
abort ();
break;
case GEU:
/* ??? As above. */
if (mode != CCmode)
if (mode != CCmode && mode != CCRCmode)
abort ();
suffix = fp ? "nb" : "ae";
if (mode == CCRCmode)
suffix = "be";
else
suffix = fp ? "nb" : "ae";
break;
case LE:
if (mode != CCmode && mode != CCGCmode && mode != CCNOmode)
if (mode != CCmode && mode != CCGCmode && mode != CCNOmode
&& mode != CCRCmode)
abort ();
suffix = "le";
break;
case LEU:
if (mode != CCmode)
abort ();
suffix = "be";
if (mode == CCRCmode)
suffix = fp ? "nb" : "ae";
else
suffix = "be";
break;
case UNORDERED:
suffix = "p";
......@@ -4552,6 +4564,13 @@ ix86_match_ccmode (insn, req_mode)
return 0;
break;
case CCmode:
if (req_mode == CCRCmode)
return 0;
goto no_carry;
case CCRCmode:
if (req_mode == CCmode)
return 0;
no_carry:
if (req_mode == CCGCmode)
return 0;
/* FALLTHRU */
......@@ -4683,11 +4702,14 @@ ix86_cc_mode (code, op0, op1)
case NE: /* ZF!=0 */
return CCZmode;
/* Codes needing carry flag. */
case GEU: /* CF=0 */
case GTU: /* CF=0 & ZF=0 */
case LTU: /* CF=1 */
case LEU: /* CF=1 | ZF=1 */
return CCmode;
case GEU: /* CF=0 */
case GTU: /* CF=0 & ZF=0 */
if (GET_CODE (op1) == NEG)
return CCRCmode;
return CCmode;
/* Codes possibly doable only with sign flag when
comparing against zero. */
case GE: /* SF=OF or SF=0 */
......@@ -6145,8 +6167,8 @@ ix86_expand_strlensi_unroll_1 (out, align_rtx, scratch)
/* Avoid branch in fixing the byte. */
tmpreg = gen_lowpart (QImode, tmpreg);
emit_insn (gen_addqi3_cc (tmpreg, tmpreg, tmpreg));
emit_insn (gen_subsi3_carry (out, out, GEN_INT (3)));
emit_insn (gen_addqi3_ccrc (tmpreg, tmpreg, tmpreg));
emit_insn (gen_subsi3_carry_rc (out, out, GEN_INT (3)));
emit_label (end_0_label);
}
......
......@@ -2488,10 +2488,14 @@ while (0)
mode is used to simulate comparisons of (a-b) and (a+b)
against zero using sub/cmp/add operations.
Add CCZ to indicate that only the Zero flag is valid. */
Add CCZ to indicate that only the Zero flag is valid.
Add CCRC to indicate that carry flag is valid, but reversed.
*/
#define EXTRA_CC_MODES \
CC(CCGCmode, "CCGC") \
CC(CCRCmode, "CCRC") \
CC(CCGOCmode, "CCGOC") \
CC(CCNOmode, "CCNO") \
CC(CCZmode, "CCZ") \
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment