get_mode_size_bits(dest_mode) <= get_mode_size_bits(src_mode);
}
-/* Skip all Down-Conv's on a given node and return the resulting node. */
+/** Skip all Down-Conv's on a given node and return the resulting node. */
ir_node *ia32_skip_downconv(ir_node *node)
{
while (is_downconv(node))
return node;
}
+static bool is_sameconv(ir_node *node)
+{
+ ir_mode *src_mode;
+ ir_mode *dest_mode;
+
+ if (!is_Conv(node))
+ return 0;
+
+ src_mode = get_irn_mode(get_Conv_op(node));
+ dest_mode = get_irn_mode(node);
+ return
+ ia32_mode_needs_gp_reg(src_mode) &&
+ ia32_mode_needs_gp_reg(dest_mode) &&
+ get_mode_size_bits(dest_mode) == get_mode_size_bits(src_mode);
+}
+
+/** Skip all signedness convs */
+static ir_node *ia32_skip_sameconv(ir_node *node)
+{
+ while (is_sameconv(node))
+ node = get_Conv_op(node);
+
+ return node;
+}
+
static ir_node *create_upconv(ir_node *node, ir_node *orig_node)
{
ir_mode *mode = get_irn_mode(node);
if (op1 != NULL) {
op1 = ia32_skip_downconv(op1);
}
+ } else {
+ op2 = ia32_skip_sameconv(op2);
+ if (op1 != NULL) {
+ op1 = ia32_skip_sameconv(op1);
+ }
}
/* match immediates. firm nodes are normalized: constants are always on the
ir_node *index;
dbg_info *dbgi = get_irn_dbg_info(node);
ir_mode *mode = get_Load_mode(node);
- ir_mode *res_mode;
ir_node *new_node;
ia32_address_t addr;
if (ia32_cg_config.use_sse2) {
new_node = new_bd_ia32_xLoad(dbgi, block, base, index, new_mem,
mode);
- res_mode = mode_xmm;
} else {
new_node = new_bd_ia32_vfld(dbgi, block, base, index, new_mem,
mode);
- res_mode = mode_vfp;
}
} else {
assert(mode != mode_b);
} else {
new_node = new_bd_ia32_Load(dbgi, block, base, index, new_mem);
}
- res_mode = mode_Iu;
}
set_irn_pinned(new_node, get_irn_pinned(node));
ir_node *mux_true = get_Mux_true(node);
ir_node *mux_false = get_Mux_false(node);
ir_node *cond;
- ir_node *new_mem;
dbg_info *dbgi;
ir_node *block;
ir_node *new_block;
dbgi = get_irn_dbg_info(node);
block = get_nodes_block(node);
new_block = be_transform_node(block);
- new_mem = be_transform_node(mem);
new_node = new_bd_ia32_SetccMem(dbgi, new_block, addr.base,
addr.index, addr.mem, flags, pnc);
set_address(new_node, &addr);
setcc_transform_t res;
int step;
- /* check if flags is a cmp node and we are the only user,
- i.e no other user yet */
- int permutate_allowed = 0;
- if (is_ia32_Cmp(flags) && get_irn_n_edges(flags) == 0) {
- /* yes, we can permutate its inputs */
- permutate_allowed = 1;
- }
find_const_transform(pnc, tv_true, tv_false, &res);
new_node = node;
if (res.permutate_cmp_ins) {
*/
static ir_node *gen_Proj_Bound(ir_node *node)
{
- ir_node *new_node, *block;
+ ir_node *new_node;
ir_node *pred = get_Proj_pred(node);
switch (get_Proj_proj(node)) {
return be_transform_node(get_Bound_mem(pred));
case pn_Bound_X_regular:
new_node = be_transform_node(pred);
- block = get_nodes_block(new_node);
return new_r_Proj(new_node, mode_X, pn_ia32_Jcc_true);
case pn_Bound_X_except:
new_node = be_transform_node(pred);
- block = get_nodes_block(new_node);
return new_r_Proj(new_node, mode_X, pn_ia32_Jcc_false);
case pn_Bound_res:
return be_transform_node(get_Bound_index(pred));
clear_irp_opcodes_generic_func();
#define GEN(a) { be_transform_func *func = gen_##a; op_##a->ops.generic = (op_func) func; }
-#define BAD(a) op_##a->ops.generic = (op_func)bad_transform
-
- GEN(Add);
- GEN(Sub);
- GEN(Mul);
- GEN(Mulh);
- GEN(And);
- GEN(Or);
- GEN(Eor);
-
- GEN(Shl);
- GEN(Shr);
- GEN(Shrs);
- GEN(Rotl);
-
- GEN(Quot);
-
- GEN(Div);
- GEN(Mod);
- GEN(DivMod);
-
- GEN(Minus);
- GEN(Conv);
- GEN(Abs);
- GEN(Not);
-
- GEN(Load);
- GEN(Store);
- GEN(Cond);
-
- GEN(Cmp);
- GEN(ASM);
- GEN(CopyB);
- GEN(Mux);
- GEN(Proj);
- GEN(Phi);
- GEN(Jmp);
- GEN(IJmp);
- GEN(Bound);
+#define BAD(a) { op_##a->ops.generic = (op_func)bad_transform; }
+
+ GEN(Add)
+ GEN(Sub)
+ GEN(Mul)
+ GEN(Mulh)
+ GEN(And)
+ GEN(Or)
+ GEN(Eor)
+
+ GEN(Shl)
+ GEN(Shr)
+ GEN(Shrs)
+ GEN(Rotl)
+
+ GEN(Quot)
+
+ GEN(Div)
+ GEN(Mod)
+ GEN(DivMod)
+
+ GEN(Minus)
+ GEN(Conv)
+ GEN(Abs)
+ GEN(Not)
+
+ GEN(Load)
+ GEN(Store)
+ GEN(Cond)
+
+ GEN(Cmp)
+ GEN(ASM)
+ GEN(CopyB)
+ GEN(Mux)
+ GEN(Proj)
+ GEN(Phi)
+ GEN(Jmp)
+ GEN(IJmp)
+ GEN(Bound)
/* transform ops from intrinsic lowering */
- GEN(ia32_l_Add);
- GEN(ia32_l_Adc);
- GEN(ia32_l_Mul);
- GEN(ia32_l_IMul);
- GEN(ia32_l_ShlDep);
- GEN(ia32_l_ShrDep);
- GEN(ia32_l_SarDep);
- GEN(ia32_l_ShlD);
- GEN(ia32_l_ShrD);
- GEN(ia32_l_Sub);
- GEN(ia32_l_Sbb);
- GEN(ia32_l_LLtoFloat);
- GEN(ia32_l_FloattoLL);
-
- GEN(Const);
- GEN(SymConst);
- GEN(Unknown);
+ GEN(ia32_l_Add)
+ GEN(ia32_l_Adc)
+ GEN(ia32_l_Mul)
+ GEN(ia32_l_IMul)
+ GEN(ia32_l_ShlDep)
+ GEN(ia32_l_ShrDep)
+ GEN(ia32_l_SarDep)
+ GEN(ia32_l_ShlD)
+ GEN(ia32_l_ShrD)
+ GEN(ia32_l_Sub)
+ GEN(ia32_l_Sbb)
+ GEN(ia32_l_LLtoFloat)
+ GEN(ia32_l_FloattoLL)
+
+ GEN(Const)
+ GEN(SymConst)
+ GEN(Unknown)
/* we should never see these nodes */
- BAD(Raise);
- BAD(Sel);
- BAD(InstOf);
- BAD(Cast);
- BAD(Free);
- BAD(Tuple);
- BAD(Id);
- //BAD(Bad);
- BAD(Confirm);
- BAD(Filter);
- BAD(CallBegin);
- BAD(EndReg);
- BAD(EndExcept);
+ BAD(Raise)
+ BAD(Sel)
+ BAD(InstOf)
+ BAD(Cast)
+ BAD(Free)
+ BAD(Tuple)
+ BAD(Id)
+ //BAD(Bad)
+ BAD(Confirm)
+ BAD(Filter)
+ BAD(CallBegin)
+ BAD(EndReg)
+ BAD(EndExcept)
/* handle builtins */
- GEN(Builtin);
+ GEN(Builtin)
/* handle generic backend nodes */
- GEN(be_FrameAddr);
- GEN(be_Call);
- GEN(be_IncSP);
- GEN(be_Return);
- GEN(be_AddSP);
- GEN(be_SubSP);
- GEN(be_Copy);
+ GEN(be_FrameAddr)
+ GEN(be_Call)
+ GEN(be_IncSP)
+ GEN(be_Return)
+ GEN(be_AddSP)
+ GEN(be_SubSP)
+ GEN(be_Copy)
#undef GEN
#undef BAD
{
ia32_code_gen_t *cg = env_cg;
- cg->unknown_gp = be_pre_transform_node(cg->unknown_gp);
- cg->unknown_vfp = be_pre_transform_node(cg->unknown_vfp);
- cg->unknown_xmm = be_pre_transform_node(cg->unknown_xmm);
cg->noreg_gp = be_pre_transform_node(cg->noreg_gp);
cg->noreg_vfp = be_pre_transform_node(cg->noreg_vfp);
cg->noreg_xmm = be_pre_transform_node(cg->noreg_xmm);
call_list = NEW_ARR_F(ir_node *, 0);
call_types = NEW_ARR_F(ir_type *, 0);
- be_transform_graph(cg->birg, ia32_pretransform_node);
+ be_transform_graph(cg->irg, ia32_pretransform_node);
if (ia32_cg_config.use_sse2)
postprocess_fp_call_results();