From: Christoph Mallon Date: Sat, 8 May 2010 21:04:43 +0000 (+0000) Subject: Clarify the carry testing magic. X-Git-Url: http://nsz.repo.hu/git/?a=commitdiff_plain;h=7dc7d79b63f1787e087174ee6a7313b7658fe799;p=libfirm Clarify the carry testing magic. [r27516] --- diff --git a/ir/be/ia32/ia32_nodes_attr.h b/ir/be/ia32/ia32_nodes_attr.h index fc53e6d0f..9b4012370 100644 --- a/ir/be/ia32/ia32_nodes_attr.h +++ b/ir/be/ia32/ia32_nodes_attr.h @@ -32,9 +32,12 @@ #include "irnode_t.h" enum { - ia32_pn_Cmp_unsigned = 0x1000, - ia32_pn_Cmp_float = 0x2000, - ia32_pn_Cmp_parity = 0x4000 + ia32_pn_Cmp_unsigned = 0x1000, + ia32_pn_Cmp_float = 0x2000, + ia32_pn_Cmp_parity = 0x4000, + /* The unsigned Lt/Ge comparisons test the carry bit. */ + ia32_pn_Cmp_carry = pn_Cmp_Lt | ia32_pn_Cmp_unsigned + ia32_pn_Cmp_not_carry = pn_Cmp_Ge | ia32_pn_Cmp_unsigned, }; typedef enum { diff --git a/ir/be/ia32/ia32_optimize.c b/ir/be/ia32/ia32_optimize.c index 0334f34b0..801f8aa1b 100644 --- a/ir/be/ia32/ia32_optimize.c +++ b/ir/be/ia32/ia32_optimize.c @@ -265,8 +265,8 @@ static void peephole_ia32_Test(ir_node *node) int pnc = get_ia32_condcode(user); switch (pnc) { - case pn_Cmp_Eq: pnc = pn_Cmp_Ge | ia32_pn_Cmp_unsigned; break; - case pn_Cmp_Lg: pnc = pn_Cmp_Lt | ia32_pn_Cmp_unsigned; break; + case pn_Cmp_Eq: pnc = ia32_pn_Cmp_no_carry; break; + case pn_Cmp_Lg: pnc = ia32_pn_Cmp_carry; break; default: panic("unexpected pn"); } set_ia32_condcode(user, pnc);