From 9905f68b9f900599c15ea2674537fca6dd021419 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Christian=20W=C3=BCrdig?= Date: Wed, 3 May 2006 11:56:02 +0000 Subject: [PATCH] fixed unknown handling --- ir/be/ia32/ia32_transform.c | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/ir/be/ia32/ia32_transform.c b/ir/be/ia32/ia32_transform.c index d0b9a4a99..97a420490 100644 --- a/ir/be/ia32/ia32_transform.c +++ b/ir/be/ia32/ia32_transform.c @@ -28,6 +28,7 @@ #include "../benode_t.h" #include "../besched.h" +#include "../beabi.h" #include "bearch_ia32_t.h" @@ -77,6 +78,23 @@ typedef enum { * ****************************************************************************************************/ +/** + * Returns the Proj representing the UNKNOWN register for given mode. + */ +static ir_node *be_get_unknown_for_mode(ia32_code_gen_t *cg, ir_mode *mode) { + be_abi_irg_t *babi = cg->birg->abi; + const arch_register_t *unknwn_reg = NULL; + + if (mode_is_float(mode)) { + unknwn_reg = USE_SSE2(cg) ? &ia32_xmm_regs[REG_XMM_UKNWN] : &ia32_vfp_regs[REG_VFP_UKNWN]; + } + else { + unknwn_reg = &ia32_gp_regs[REG_GP_UKNWN]; + } + + return be_abi_get_callee_save_irn(babi, unknwn_reg); +} + /** * Gets the Proj with number pn from irn. */ @@ -2343,10 +2361,17 @@ void ia32_transform_node(ir_node *node, void *env) { ia32_code_gen_t *cg = (ia32_code_gen_t *)env; ir_op *op = get_irn_op(node); ir_node *asm_node = NULL; + int i; if (is_Block(node)) return; + /* link arguments pointing to Unknown to the UNKNOWN Proj */ + for (i = get_irn_arity(node) - 1; i >= 0; i--) { + if (is_Unknown(get_irn_n(node, i))) + set_irn_n(node, i, be_get_unknown_for_mode(cg, get_irn_mode(get_irn_n(node, i)))); + } + DBG((cg->mod, LEVEL_1, "check %+F ... ", node)); if (op->ops.generic) { ia32_transform_env_t tenv; -- 2.20.1