From 3e2bae8a1261d5bd509f51e7fbca7f6ea1532695 Mon Sep 17 00:00:00 2001 From: Christoph Mallon Date: Thu, 21 Jun 2007 11:43:11 +0000 Subject: [PATCH] Fix r14677, i.e. revert most of it. [r14678] --- ir/be/ia32/ia32_transform.c | 213 ++++++++++++++++++++---------------- 1 file changed, 121 insertions(+), 92 deletions(-) diff --git a/ir/be/ia32/ia32_transform.c b/ir/be/ia32/ia32_transform.c index a61c536c5..a35755161 100644 --- a/ir/be/ia32/ia32_transform.c +++ b/ir/be/ia32/ia32_transform.c @@ -95,10 +95,6 @@ typedef ir_node *construct_binop_func(dbg_info *db, ir_graph *irg, ir_node *block, ir_node *base, ir_node *index, ir_node *op1, ir_node *op2, ir_node *mem); -typedef ir_node *construct_binop_float_func(dbg_info *db, ir_graph *irg, - ir_node *block, ir_node *base, ir_node *index, ir_node *op1, - ir_node *op2, ir_node *mem, ir_node *fpcw); - typedef ir_node *construct_unop_func(dbg_info *db, ir_graph *irg, ir_node *block, ir_node *base, ir_node *index, ir_node *op, ir_node *mem); @@ -288,6 +284,7 @@ static ir_node *gen_Const(ir_node *node) { floatent = get_entity_for_tv(env_cg, node); load = new_rd_ia32_vfld(dbgi, irg, block, noreg, noreg, nomem, mode); + set_ia32_am_support(load, ia32_am_Source); set_ia32_op_type(load, ia32_AddrModeS); set_ia32_am_flavour(load, ia32_am_N); set_ia32_am_sc(load, floatent); @@ -298,6 +295,7 @@ static ir_node *gen_Const(ir_node *node) { floatent = get_entity_for_tv(env_cg, node); load = new_rd_ia32_xLoad(dbgi, irg, block, noreg, noreg, nomem); + set_ia32_am_support(load, ia32_am_Source); set_ia32_op_type(load, ia32_AddrModeS); set_ia32_am_flavour(load, ia32_am_N); set_ia32_am_sc(load, floatent); @@ -371,6 +369,49 @@ static ir_node *gen_SymConst(ir_node *node) { return cnst; } +#if 0 +/** + * SSE convert of an integer node into a floating point node. + */ +static ir_node *gen_sse_conv_int2float(ia32_code_gen_t *cg, dbg_info *dbgi, + ir_graph *irg, ir_node *block, + ir_node *in, ir_node *old_node, ir_mode *tgt_mode) +{ + ir_node *noreg = ia32_new_NoReg_gp(cg); + ir_node *nomem = new_rd_NoMem(irg); + ir_node *old_pred = get_Cmp_left(old_node); + ir_mode *in_mode = get_irn_mode(old_pred); + int in_bits = get_mode_size_bits(in_mode); + ir_node *conv = new_rd_ia32_Conv_I2FP(dbgi, irg, block, noreg, noreg, in, nomem); + + set_ia32_ls_mode(conv, tgt_mode); + if (in_bits == 32) { + set_ia32_am_support(conv, ia32_am_Source); + } + SET_IA32_ORIG_NODE(conv, ia32_get_old_node_name(cg, old_node)); + + return conv; +} + +/** + * SSE convert of an float node into a double node. + */ +static ir_node *gen_sse_conv_f2d(ia32_code_gen_t *cg, dbg_info *dbgi, + ir_graph *irg, ir_node *block, + ir_node *in, ir_node *old_node) +{ + ir_node *noreg = ia32_new_NoReg_gp(cg); + ir_node *nomem = new_rd_NoMem(irg); + ir_node *conv = new_rd_ia32_Conv_FP2FP(dbgi, irg, block, noreg, noreg, in, nomem); + + set_ia32_am_support(conv, ia32_am_Source); + set_ia32_ls_mode(conv, mode_xmm); + SET_IA32_ORIG_NODE(conv, ia32_get_old_node_name(cg, old_node)); + + return conv; +} +#endif + /* Generates an entity for a known FP const (used for FP Neg + Abs) */ ir_entity *ia32_gen_fp_known_const(ia32_known_const_t kct) { static const struct { @@ -477,8 +518,7 @@ static void fold_immediate(ir_node *node, int in1, int in2) { } clear_ia32_commutative(node); - set_ia32_am_support(node, get_ia32_am_support(node) & ~ia32_am_Source, - get_ia32_am_arity(node)); + set_ia32_am_support(node, get_ia32_am_support(node) & ~ia32_am_Source); } /** @@ -524,9 +564,9 @@ static ir_node *gen_binop(ir_node *node, ir_node *op1, ir_node *op2, new_node = func(dbgi, irg, block, noreg_gp, noreg_gp, new_op1, new_op2, nomem); if (func == new_rd_ia32_IMul) { - set_ia32_am_support(new_node, ia32_am_Source, ia32_am_binary); + set_ia32_am_support(new_node, ia32_am_Source); } else { - set_ia32_am_support(new_node, ia32_am_Full, ia32_am_binary); + set_ia32_am_support(new_node, ia32_am_Full); } SET_IA32_ORIG_NODE(new_node, ia32_get_old_node_name(env_cg, node)); @@ -545,8 +585,8 @@ static ir_node *gen_binop(ir_node *node, ir_node *op1, ir_node *op2, * @param func The node constructor function * @return The constructed ia32 node. */ -static ir_node *gen_binop_sse_float(ir_node *node, ir_node *op1, ir_node *op2, - construct_binop_func *func) +static ir_node *gen_binop_float(ir_node *node, ir_node *op1, ir_node *op2, + construct_binop_func *func) { ir_node *block = be_transform_node(get_nodes_block(node)); ir_node *new_op1 = be_transform_node(op1); @@ -558,9 +598,8 @@ static ir_node *gen_binop_sse_float(ir_node *node, ir_node *op1, ir_node *op2, ir_node *noreg_gp = ia32_new_NoReg_gp(env_cg); ir_node *nomem = new_NoMem(); - new_node = func(dbgi, irg, block, noreg_gp, noreg_gp, new_op1, new_op2, - nomem); - set_ia32_am_support(new_node, ia32_am_Source, ia32_am_binary); + new_node = func(dbgi, irg, block, noreg_gp, noreg_gp, new_op1, new_op2, nomem); + set_ia32_am_support(new_node, ia32_am_Source); if (is_op_commutative(get_irn_op(node))) { set_ia32_commutative(new_node); } @@ -573,43 +612,6 @@ static ir_node *gen_binop_sse_float(ir_node *node, ir_node *op1, ir_node *op2, return new_node; } -/** - * Construct a standard binary operation, set AM and immediate if required. - * - * @param op1 The first operand - * @param op2 The second operand - * @param func The node constructor function - * @return The constructed ia32 node. - */ -static ir_node *gen_binop_x87_float(ir_node *node, ir_node *op1, ir_node *op2, - construct_binop_float_func *func) -{ - ir_node *block = be_transform_node(get_nodes_block(node)); - ir_node *new_op1 = be_transform_node(op1); - ir_node *new_op2 = be_transform_node(op2); - ir_node *new_node = NULL; - dbg_info *dbgi = get_irn_dbg_info(node); - ir_graph *irg = current_ir_graph; - ir_mode *mode = get_irn_mode(node); - ir_node *noreg_gp = ia32_new_NoReg_gp(env_cg); - ir_node *nomem = new_NoMem(); - ir_node *fpcw = be_abi_get_ignore_irn(env_cg->birg->abi, - &ia32_fp_cw_regs[REG_FPCW]); - - new_node = func(dbgi, irg, block, noreg_gp, noreg_gp, new_op1, new_op2, - nomem, fpcw); - set_ia32_am_support(new_node, ia32_am_Source, ia32_am_binary); - if (is_op_commutative(get_irn_op(node))) { - set_ia32_commutative(new_node); - } - if (USE_SSE2(env_cg)) { - set_ia32_ls_mode(new_node, mode); - } - - SET_IA32_ORIG_NODE(new_node, ia32_get_old_node_name(env_cg, node)); - - return new_node; -} /** * Construct a shift/rotate binary operation, sets AM and immediate if required. @@ -676,7 +678,7 @@ static ir_node *gen_shift_binop(ir_node *node, ir_node *op1, ir_node *op2, } /* set AM support */ - set_ia32_am_support(new_op, ia32_am_Dest, ia32_am_binary); + set_ia32_am_support(new_op, ia32_am_Dest); SET_IA32_ORIG_NODE(new_op, ia32_get_old_node_name(env_cg, node)); @@ -705,7 +707,7 @@ static ir_node *gen_unop(ir_node *node, ir_node *op, construct_unop_func *func) new_node = func(dbgi, irg, block, noreg, noreg, new_op, nomem); DB((dbg, LEVEL_1, "INT unop ...")); - set_ia32_am_support(new_node, ia32_am_Dest, ia32_am_unary); + set_ia32_am_support(new_node, ia32_am_Dest); SET_IA32_ORIG_NODE(new_node, ia32_get_old_node_name(env_cg, node)); @@ -741,9 +743,9 @@ static ir_node *gen_Add(ir_node *node) { if (mode_is_float(mode)) { FP_USED(env_cg); if (USE_SSE2(env_cg)) - return gen_binop_sse_float(node, op1, op2, new_rd_ia32_xAdd); + return gen_binop_float(node, op1, op2, new_rd_ia32_xAdd); else - return gen_binop_x87_float(node, op1, op2, new_rd_ia32_vfadd); + return gen_binop_float(node, op1, op2, new_rd_ia32_vfadd); } /* integer ADD */ @@ -764,6 +766,7 @@ static ir_node *gen_Add(ir_node *node) { new_op = new_rd_ia32_Lea(dbgi, irg, block, new_op1, noreg); set_ia32_am_sc(new_op, get_ia32_Immop_symconst(new_op2)); set_ia32_am_flavour(new_op, ia32_am_B); + set_ia32_am_support(new_op, ia32_am_Source); set_ia32_op_type(new_op, ia32_AddrModeS); DBG_OPT_LEA3(new_op1, new_op2, node, new_op); @@ -778,6 +781,7 @@ static ir_node *gen_Add(ir_node *node) { set_ia32_am_sc(new_op, get_ia32_Immop_symconst(new_op1)); add_ia32_am_offs_int(new_op, offs); set_ia32_am_flavour(new_op, ia32_am_OB); + set_ia32_am_support(new_op, ia32_am_Source); set_ia32_op_type(new_op, ia32_AddrModeS); } else if (tp2 == ia32_ImmSymConst) { tarval *tv = get_ia32_Immop_tarval(new_op1); @@ -790,6 +794,7 @@ static ir_node *gen_Add(ir_node *node) { add_ia32_am_offs_int(new_op, offs); set_ia32_am_sc(new_op, get_ia32_Immop_symconst(new_op2)); set_ia32_am_flavour(new_op, ia32_am_OB); + set_ia32_am_support(new_op, ia32_am_Source); set_ia32_op_type(new_op, ia32_AddrModeS); } else { tarval *tv1 = get_ia32_Immop_tarval(new_op1); @@ -832,7 +837,7 @@ static ir_node *gen_Add(ir_node *node) { new_op = new_rd_ia32_Add(dbgi, irg, block, noreg, noreg, new_op1, new_op2, nomem); /* set AM support */ - set_ia32_am_support(new_op, ia32_am_Full, ia32_am_binary); + set_ia32_am_support(new_op, ia32_am_Full); set_ia32_commutative(new_op); fold_immediate(new_op, 2, 3); @@ -857,7 +862,7 @@ static ir_node *create_ia32_Mul(ir_node *node) { res = new_rd_ia32_Mul(dbgi, irg, block, noreg, noreg, new_op1, new_op2, new_NoMem()); set_ia32_commutative(res); - set_ia32_am_support(res, ia32_am_Source | ia32_am_binary); + set_ia32_am_support(res, ia32_am_Source); /* imediates are not supported, so no fold_immediate */ proj_EAX = new_rd_Proj(dbgi, irg, block, res, mode_Iu, pn_EAX); @@ -885,9 +890,9 @@ static ir_node *gen_Mul(ir_node *node) { if (mode_is_float(mode)) { FP_USED(env_cg); if (USE_SSE2(env_cg)) - return gen_binop_sse_float(node, op1, op2, new_rd_ia32_xMul); + return gen_binop_float(node, op1, op2, new_rd_ia32_xMul); else - return gen_binop_x87_float(node, op1, op2, new_rd_ia32_vfmul); + return gen_binop_float(node, op1, op2, new_rd_ia32_vfmul); } /* @@ -926,7 +931,9 @@ static ir_node *gen_Mulh(ir_node *node) { } set_ia32_commutative(res); - set_ia32_am_support(res, ia32_am_Source, ia32_am_binary); + set_ia32_am_support(res, ia32_am_Source); + + set_ia32_am_support(res, ia32_am_Source); proj_EAX = new_rd_Proj(dbgi, irg, block, res, mode_Iu, pn_EAX); proj_EDX = new_rd_Proj(dbgi, irg, block, res, mode_Iu, pn_EDX); @@ -1007,7 +1014,7 @@ static ir_node *gen_Max(ir_node *node) { if (mode_is_float(mode)) { FP_USED(env_cg); if (USE_SSE2(env_cg)) { - new_op = gen_binop_sse_float(node, new_op1, new_op2, new_rd_ia32_xMax); + new_op = gen_binop_float(node, new_op1, new_op2, new_rd_ia32_xMax); } else { panic("Can't create Max node"); } @@ -1046,7 +1053,7 @@ static ir_node *gen_Min(ir_node *node) { if (mode_is_float(mode)) { FP_USED(env_cg); if (USE_SSE2(env_cg)) { - new_op = gen_binop_sse_float(node, op1, op2, new_rd_ia32_xMin); + new_op = gen_binop_float(node, op1, op2, new_rd_ia32_xMin); } else { panic("can't create Min node"); } @@ -1093,9 +1100,9 @@ static ir_node *gen_Sub(ir_node *node) { if (mode_is_float(mode)) { FP_USED(env_cg); if (USE_SSE2(env_cg)) - return gen_binop_sse_float(node, op1, op2, new_rd_ia32_xSub); + return gen_binop_float(node, op1, op2, new_rd_ia32_xSub); else - return gen_binop_x87_float(node, op1, op2, new_rd_ia32_vfsub); + return gen_binop_float(node, op1, op2, new_rd_ia32_vfsub); } /* integer SUB */ @@ -1129,6 +1136,7 @@ static ir_node *gen_Sub(ir_node *node) { set_ia32_am_sc(new_op, get_ia32_Immop_symconst(new_op1)); add_ia32_am_offs_int(new_op, -offs); set_ia32_am_flavour(new_op, ia32_am_OB); + set_ia32_am_support(new_op, ia32_am_Source); set_ia32_op_type(new_op, ia32_AddrModeS); } else if (tp2 == ia32_ImmSymConst) { tarval *tv = get_ia32_Immop_tarval(new_op1); @@ -1142,6 +1150,7 @@ static ir_node *gen_Sub(ir_node *node) { set_ia32_am_sc(new_op, get_ia32_Immop_symconst(new_op2)); set_ia32_am_sc_sign(new_op); set_ia32_am_flavour(new_op, ia32_am_OB); + set_ia32_am_support(new_op, ia32_am_Source); set_ia32_op_type(new_op, ia32_AddrModeS); } else { tarval *tv1 = get_ia32_Immop_tarval(new_op1); @@ -1184,7 +1193,7 @@ static ir_node *gen_Sub(ir_node *node) { new_op = new_rd_ia32_Sub(dbgi, irg, block, noreg, noreg, new_op1, new_op2, nomem); /* set AM support */ - set_ia32_am_support(new_op, ia32_am_Full, ia32_am_binary); + set_ia32_am_support(new_op, ia32_am_Full); fold_immediate(new_op, 2, 3); @@ -1273,7 +1282,7 @@ static ir_node *generate_DivMod(ir_node *node, ir_node *dividend, /* Matze: code can't handle this at the moment... */ #if 0 /* set AM support */ - set_ia32_am_support(res, ia32_am_Source | ia32_am_binary); + set_ia32_am_support(res, ia32_am_Source); #endif /* check, which Proj-Keep, we need to add */ @@ -1347,21 +1356,18 @@ static ir_node *gen_Quot(ir_node *node) { ir_mode *mode = get_irn_mode(op1); if (is_ia32_xConst(new_op2)) { new_op = new_rd_ia32_xDiv(dbgi, irg, block, noreg, noreg, new_op1, noreg, nomem); - set_ia32_am_support(new_op, ia32_am_None, ia32_am_arity_none); + set_ia32_am_support(new_op, ia32_am_None); copy_ia32_Immop_attr(new_op, new_op2); } else { new_op = new_rd_ia32_xDiv(dbgi, irg, block, noreg, noreg, new_op1, new_op2, nomem); // Matze: disabled for now, spillslot coalescer fails - //set_ia32_am_support(new_op, ia32_am_Source | ia32_am_binary); + //set_ia32_am_support(new_op, ia32_am_Source); } set_ia32_ls_mode(new_op, mode); } else { - ir_node *fpcw = be_abi_get_ignore_irn(env_cg->birg->abi, - &ia32_fp_cw_regs[REG_FPCW]); - new_op = new_rd_ia32_vfdiv(dbgi, irg, block, noreg, noreg, new_op1, - new_op2, nomem, fpcw); + new_op = new_rd_ia32_vfdiv(dbgi, irg, block, noreg, noreg, new_op1, new_op2, nomem); // Matze: disabled for now (spillslot coalescer fails) - //set_ia32_am_support(new_op, ia32_am_Source | ia32_am_binary); + //set_ia32_am_support(new_op, ia32_am_Source); } SET_IA32_ORIG_NODE(new_op, ia32_get_old_node_name(env_cg, node)); return new_op; @@ -1670,6 +1676,7 @@ static ir_node *gen_Load(ir_node *node) { } set_irn_pinned(new_op, get_irn_pinned(node)); + set_ia32_am_support(new_op, ia32_am_Source); set_ia32_op_type(new_op, ia32_AddrModeS); set_ia32_am_flavour(new_op, am_flav); set_ia32_ls_mode(new_op, mode); @@ -1757,6 +1764,7 @@ static ir_node *gen_Store(ir_node *node) { } set_irn_pinned(new_op, get_irn_pinned(node)); + set_ia32_am_support(new_op, ia32_am_Dest); set_ia32_op_type(new_op, ia32_AddrModeD); set_ia32_am_flavour(new_op, am_flav); set_ia32_ls_mode(new_op, mode); @@ -1878,7 +1886,7 @@ static ir_node *gen_Cond(ir_node *node) { // is not able to detect the mode of the spilled value // moreover, the lea optimize phase freely exchanges left/right // without updating the pnc - //set_ia32_am_support(res, ia32_am_Source | ia32_am_binary); + //set_ia32_am_support(res, ia32_am_Source); } else { /* determine the smallest switch case value */ @@ -1897,6 +1905,7 @@ static ir_node *gen_Cond(ir_node *node) { SET_IA32_ORIG_NODE(res, ia32_get_old_node_name(env_cg, node)); add_ia32_am_offs_int(res, -switch_min); set_ia32_am_flavour(res, ia32_am_OB); + set_ia32_am_support(res, ia32_am_Source); set_ia32_op_type(res, ia32_AddrModeS); } @@ -2130,6 +2139,7 @@ static ir_node *gen_x87_fp_to_gp(ir_node *node) { set_irn_pinned(fist, op_pin_state_floats); set_ia32_use_frame(fist); + set_ia32_am_support(fist, ia32_am_Dest); set_ia32_op_type(fist, ia32_AddrModeD); set_ia32_am_flavour(fist, ia32_am_B); set_ia32_ls_mode(fist, mode_Iu); @@ -2140,6 +2150,7 @@ static ir_node *gen_x87_fp_to_gp(ir_node *node) { set_irn_pinned(load, op_pin_state_floats); set_ia32_use_frame(load); + set_ia32_am_support(load, ia32_am_Source); set_ia32_op_type(load, ia32_AddrModeS); set_ia32_am_flavour(load, ia32_am_B); set_ia32_ls_mode(load, mode_Iu); @@ -2166,12 +2177,12 @@ static ir_node *gen_x87_gp_to_fp(ir_node *node, ir_mode *src_mode) { src_bits = get_mode_size_bits(src_mode); if (src_bits == 8) { new_op = new_rd_ia32_Conv_I2I8Bit(dbgi, irg, block, noreg, noreg, new_op, nomem); - set_ia32_am_support(new_op, ia32_am_Source, ia32_am_unary); + set_ia32_am_support(new_op, ia32_am_Source); set_ia32_ls_mode(new_op, src_mode); SET_IA32_ORIG_NODE(new_op, ia32_get_old_node_name(env_cg, node)); } else if (src_bits < 32) { new_op = new_rd_ia32_Conv_I2I(dbgi, irg, block, noreg, noreg, new_op, nomem); - set_ia32_am_support(new_op, ia32_am_Source, ia32_am_unary); + set_ia32_am_support(new_op, ia32_am_Source); set_ia32_ls_mode(new_op, src_mode); SET_IA32_ORIG_NODE(new_op, ia32_get_old_node_name(env_cg, node)); } @@ -2180,6 +2191,7 @@ static ir_node *gen_x87_gp_to_fp(ir_node *node, ir_mode *src_mode) { store = new_rd_ia32_Store(dbgi, irg, block, get_irg_frame(irg), noreg, new_op, nomem); set_ia32_use_frame(store); + set_ia32_am_support(store, ia32_am_Dest); set_ia32_op_type(store, ia32_AddrModeD); set_ia32_am_flavour(store, ia32_am_OB); set_ia32_ls_mode(store, mode_Iu); @@ -2188,6 +2200,7 @@ static ir_node *gen_x87_gp_to_fp(ir_node *node, ir_mode *src_mode) { fild = new_rd_ia32_vfild(dbgi, irg, block, get_irg_frame(irg), noreg, store); set_ia32_use_frame(fild); + set_ia32_am_support(fild, ia32_am_Source); set_ia32_op_type(fild, ia32_AddrModeS); set_ia32_am_flavour(fild, ia32_am_OB); set_ia32_ls_mode(fild, mode_Iu); @@ -2218,12 +2231,14 @@ static ir_node *create_Strict_conv(ir_mode *src_mode, ir_mode *tgt_mode, store = new_rd_ia32_vfst(dbgi, irg, block, frame, noreg, node, nomem, smaller_mode); set_ia32_use_frame(store); + set_ia32_am_support(store, ia32_am_Dest); set_ia32_op_type(store, ia32_AddrModeD); set_ia32_am_flavour(store, ia32_am_OB); load = new_rd_ia32_vfld(dbgi, irg, block, frame, noreg, store, smaller_mode); set_ia32_use_frame(load); + set_ia32_am_support(load, ia32_am_Source); set_ia32_op_type(load, ia32_AddrModeS); set_ia32_am_flavour(load, ia32_am_OB); @@ -2308,7 +2323,7 @@ static ir_node *gen_Conv(ir_node *node) { res = new_rd_ia32_Conv_I2FP(dbgi, irg, block, noreg, noreg, new_op, nomem); set_ia32_ls_mode(res, tgt_mode); if(src_bits == 32) { - set_ia32_am_support(res, ia32_am_Source, ia32_am_unary); + set_ia32_am_support(res, ia32_am_Source); } } else { return gen_x87_gp_to_fp(node, src_mode); @@ -2339,7 +2354,7 @@ static ir_node *gen_Conv(ir_node *node) { res = new_rd_ia32_Conv_I2I(dbgi, irg, block, noreg, noreg, new_op, nomem); set_ia32_ls_mode(res, smaller_mode); } - set_ia32_am_support(res, ia32_am_Source, ia32_am_unary); + set_ia32_am_support(res, ia32_am_Source); } } @@ -2893,6 +2908,7 @@ static ir_node *gen_be_StackParam(ir_node *node) { set_ia32_frame_ent(new_op, ent); set_ia32_use_frame(new_op); + set_ia32_am_support(new_op, ia32_am_Source); set_ia32_op_type(new_op, ia32_AddrModeS); set_ia32_am_flavour(new_op, ia32_am_B); set_ia32_ls_mode(new_op, load_mode); @@ -2917,6 +2933,7 @@ static ir_node *gen_be_FrameAddr(ir_node *node) { res = new_rd_ia32_Lea(dbgi, irg, block, new_op, noreg); set_ia32_frame_ent(res, arch_get_frame_entity(env_cg->arch_env, node)); + set_ia32_am_support(res, ia32_am_Full); set_ia32_use_frame(res); set_ia32_am_flavour(res, ia32_am_OB); @@ -2961,6 +2978,7 @@ static ir_node *gen_be_FrameLoad(ir_node *node) { set_ia32_frame_ent(new_op, ent); set_ia32_use_frame(new_op); + set_ia32_am_support(new_op, ia32_am_Source); set_ia32_op_type(new_op, ia32_AddrModeS); set_ia32_am_flavour(new_op, ia32_am_B); set_ia32_ls_mode(new_op, mode); @@ -3005,6 +3023,7 @@ static ir_node *gen_be_FrameStore(ir_node *node) { set_ia32_frame_ent(new_op, ent); set_ia32_use_frame(new_op); + set_ia32_am_support(new_op, ia32_am_Dest); set_ia32_op_type(new_op, ia32_AddrModeD); set_ia32_am_flavour(new_op, ia32_am_B); set_ia32_ls_mode(new_op, mode); @@ -3078,6 +3097,7 @@ static ir_node *gen_be_Return(ir_node *node) { set_ia32_op_type(sse_store, ia32_AddrModeD); set_ia32_use_frame(sse_store); set_ia32_am_flavour(sse_store, ia32_am_B); + set_ia32_am_support(sse_store, ia32_am_Dest); /* load into st0 */ fld = new_rd_ia32_SetST0(dbgi, irg, block, frame, noreg, sse_store); @@ -3085,6 +3105,7 @@ static ir_node *gen_be_Return(ir_node *node) { set_ia32_op_type(fld, ia32_AddrModeS); set_ia32_use_frame(fld); set_ia32_am_flavour(fld, ia32_am_B); + set_ia32_am_support(fld, ia32_am_Source); mproj = new_r_Proj(irg, block, fld, mode_M, pn_ia32_SetST0_M); fld = new_r_Proj(irg, block, fld, mode_vfp, pn_ia32_SetST0_res); @@ -3136,7 +3157,7 @@ static ir_node *gen_be_AddSP(ir_node *node) { /* ia32 stack grows in reverse direction, make a SubSP */ new_op = new_rd_ia32_SubSP(dbgi, irg, block, noreg, noreg, new_sp, new_sz, nomem); - set_ia32_am_support(new_op, ia32_am_Source, ia32_am_binary); + set_ia32_am_support(new_op, ia32_am_Source); fold_immediate(new_op, 2, 3); SET_IA32_ORIG_NODE(new_op, ia32_get_old_node_name(env_cg, node)); @@ -3161,7 +3182,7 @@ static ir_node *gen_be_SubSP(ir_node *node) { /* ia32 stack grows in reverse direction, make an AddSP */ new_op = new_rd_ia32_AddSP(dbgi, irg, block, noreg, noreg, new_sp, new_sz, nomem); - set_ia32_am_support(new_op, ia32_am_Source, ia32_am_binary); + set_ia32_am_support(new_op, ia32_am_Source); fold_immediate(new_op, 2, 3); SET_IA32_ORIG_NODE(new_op, ia32_get_old_node_name(env_cg, node)); @@ -3271,6 +3292,7 @@ static ir_node *gen_lowered_Load(ir_node *node, construct_load_func func, char f new_op = func(dbgi, irg, block, new_ptr, noreg, new_mem); + set_ia32_am_support(new_op, ia32_am_Source); set_ia32_op_type(new_op, ia32_AddrModeS); set_ia32_am_flavour(new_op, ia32_am_OB); set_ia32_am_offs_int(new_op, 0); @@ -3325,6 +3347,7 @@ static ir_node *gen_lowered_Store(ir_node *node, construct_store_func func, char add_ia32_am_offs_int(new_op, am_offs); } + set_ia32_am_support(new_op, ia32_am_Dest); set_ia32_op_type(new_op, ia32_AddrModeD); set_ia32_am_flavour(new_op, am_flav); set_ia32_ls_mode(new_op, mode); @@ -3353,11 +3376,11 @@ static ir_node *gen_lowered_Store(ir_node *node, construct_store_func func, char } #define GEN_LOWERED_x87_OP(op) \ - static ir_node *gen_ia32_l_##op(ir_node *node) { \ + static ir_node *gen_ia32_l_##op(ir_node *node) {\ ir_node *new_op; \ - FORCE_x87(env_cg); \ - new_op = gen_binop_x87_float(node, get_binop_left(node), \ - get_binop_right(node), new_rd_ia32_##op); \ + FORCE_x87(env_cg); \ + new_op = gen_binop_float(node, get_binop_left(node), \ + get_binop_right(node), new_rd_ia32_##op); \ return new_op; \ } @@ -3410,14 +3433,11 @@ static ir_node *gen_ia32_l_vfdiv(ir_node *node) { ir_node *noreg = ia32_new_NoReg_gp(env_cg); ir_graph *irg = current_ir_graph; dbg_info *dbgi = get_irn_dbg_info(node); - ir_node *fpcw = be_abi_get_ignore_irn(env_cg->birg->abi, - &ia32_fp_cw_regs[REG_FPCW]); ir_node *vfdiv; - vfdiv = new_rd_ia32_vfdiv(dbgi, irg, block, noreg, noreg, new_left, - new_right, new_NoMem(), fpcw); + vfdiv = new_rd_ia32_vfdiv(dbgi, irg, block, noreg, noreg, new_left, new_right, new_NoMem()); clear_ia32_commutative(vfdiv); - set_ia32_am_support(vfdiv, ia32_am_Source, ia32_am_binary); + set_ia32_am_support(vfdiv, ia32_am_Source); fold_immediate(vfdiv, 2, 3); SET_IA32_ORIG_NODE(vfdiv, ia32_get_old_node_name(env_cg, node)); @@ -3448,7 +3468,7 @@ static ir_node *gen_ia32_l_Mul(ir_node *node) { /* and then skip the result Proj, because all needed Projs are already there. */ ir_node *muls = new_rd_ia32_Mul(dbgi, irg, block, noreg, noreg, new_left, new_right, new_NoMem()); clear_ia32_commutative(muls); - set_ia32_am_support(muls, ia32_am_Source, ia32_am_binary); + set_ia32_am_support(muls, ia32_am_Source); fold_immediate(muls, 2, 3); /* check if EAX and EDX proj exist, add missing one */ @@ -3531,7 +3551,8 @@ static ir_node *gen_lowered_64bit_shifts(ir_node *node, ir_node *op1, } /* set AM support */ - set_ia32_am_support(new_op, ia32_am_Dest, ia32_am_binary); + // Matze: node has unsupported format (6inputs) + //set_ia32_am_support(new_op, ia32_am_Dest); SET_IA32_ORIG_NODE(new_op, ia32_get_old_node_name(env_cg, node)); @@ -3580,6 +3601,7 @@ static ir_node *gen_ia32_l_X87toSSE(ir_node *node) { set_ia32_frame_ent(res, get_ia32_frame_ent(node)); set_ia32_use_frame(res); set_ia32_ls_mode(res, get_ia32_ls_mode(node)); + set_ia32_am_support(res, ia32_am_Dest); set_ia32_am_flavour(res, ia32_B); set_ia32_op_type(res, ia32_AddrModeD); @@ -3588,6 +3610,7 @@ static ir_node *gen_ia32_l_X87toSSE(ir_node *node) { set_ia32_frame_ent(res, get_ia32_frame_ent(node)); set_ia32_use_frame(res); set_ia32_ls_mode(res, get_ia32_ls_mode(node)); + set_ia32_am_support(res, ia32_am_Source); set_ia32_am_flavour(res, ia32_B); set_ia32_op_type(res, ia32_AddrModeS); res = new_rd_Proj(dbgi, irg, block, res, mode_xmm, pn_ia32_xLoad_res); @@ -3637,6 +3660,7 @@ static ir_node *gen_ia32_l_SSEtoX87(ir_node *node) { set_ia32_frame_ent(res, fent); set_ia32_use_frame(res); set_ia32_ls_mode(res, lsmode); + set_ia32_am_support(res, ia32_am_Dest); set_ia32_am_flavour(res, ia32_B); set_ia32_op_type(res, ia32_AddrModeD); mem = res; @@ -3647,6 +3671,7 @@ static ir_node *gen_ia32_l_SSEtoX87(ir_node *node) { set_ia32_frame_ent(res, fent); set_ia32_use_frame(res); add_ia32_am_offs_int(res, offs); + set_ia32_am_support(res, ia32_am_Source); set_ia32_am_flavour(res, ia32_B); set_ia32_op_type(res, ia32_AddrModeS); res = new_rd_Proj(dbgi, irg, block, res, mode_vfp, pn_ia32_vfld_res); @@ -3965,6 +3990,7 @@ static ir_node *gen_Proj_be_Call(ir_node *node) { set_ia32_op_type(fstp, ia32_AddrModeD); set_ia32_use_frame(fstp); set_ia32_am_flavour(fstp, ia32_am_B); + set_ia32_am_support(fstp, ia32_am_Dest); /* load into SSE register */ sse_load = new_rd_ia32_xLoad(dbgi, irg, block, frame, noreg, fstp); @@ -3972,6 +3998,7 @@ static ir_node *gen_Proj_be_Call(ir_node *node) { set_ia32_op_type(sse_load, ia32_AddrModeS); set_ia32_use_frame(sse_load); set_ia32_am_flavour(sse_load, ia32_am_B); + set_ia32_am_support(sse_load, ia32_am_Source); sse_load = new_rd_Proj(dbgi, irg, block, sse_load, mode_xmm, pn_ia32_xLoad_res); @@ -4040,8 +4067,10 @@ static ir_node *gen_Proj_Cmp(ir_node *node) } /* TODO: * (a == b) -> !(a ^ b) - * (a < 0) -> (a & 0x80000000) oder a >> 31 - * (a >= 0) -> (a >> 31) ^ 1 + * (a < 0) -> (a & 0x80000000) + * (a <= 0) -> !(a & 0x7fffffff) + * (a > 0) -> (a & 0x7fffffff) + * (a >= 0) -> !(a & 0x80000000) */ if(!mode_is_signed(cmp_mode)) { -- 2.20.1