From 0dc4d9d954782b0d43954cf49615d4c01e95a32a Mon Sep 17 00:00:00 2001 From: =?utf8?q?Christian=20W=C3=BCrdig?= Date: Thu, 17 Aug 2006 10:49:44 +0000 Subject: [PATCH] added code to avoid unordered fp compares --- ir/be/ia32/ia32_finish.c | 34 ++++++++++++++++++++++++++++++---- 1 file changed, 30 insertions(+), 4 deletions(-) diff --git a/ir/be/ia32/ia32_finish.c b/ir/be/ia32/ia32_finish.c index 0a3929383..c953b1ee2 100644 --- a/ir/be/ia32/ia32_finish.c +++ b/ir/be/ia32/ia32_finish.c @@ -299,10 +299,36 @@ insert_copy: } } - /* If we have a CondJmp/CmpSet/xCmpSet with immediate, we need to */ - /* check if it's the right operand, otherwise we have */ - /* to change it, as CMP doesn't support immediate as */ - /* left operands. */ + /* check xCmp: try to avoid unordered cmp */ + if ((is_ia32_xCmp(irn) || is_ia32_xCmpCMov(irn) || is_ia32_xCmpSet(irn)) && + op_tp == ia32_Normal && + ! is_ia32_ImmConst(irn) && ! is_ia32_ImmSymConst(irn)) + { + long pnc = get_ia32_pncode(irn); + + if (pnc & pn_Cmp_Uo) { + ir_node *tmp; + int idx1 = 2, idx2 = 3; + + if (is_ia32_xCmpCMov(irn)) { + idx1 = 0; + idx2 = 1; + } + + tmp = get_irn_n(irn, idx1); + set_irn_n(irn, idx1, get_irn_n(irn, idx2)); + set_irn_n(irn, idx2, tmp); + + set_ia32_pncode(irn, get_negated_pnc(pnc, mode_D)); + } + } + + /* + If we have a CondJmp/CmpSet/xCmpSet with immediate, + we need to check if it's the right operand, otherwise + we have to change it, as CMP doesn't support immediate + as left operands. + */ if ((is_ia32_CondJmp(irn) || is_ia32_CmpSet(irn) || is_ia32_xCmpSet(irn)) && (is_ia32_ImmConst(irn) || is_ia32_ImmSymConst(irn)) && op_tp == ia32_AddrModeS) -- 2.20.1