added be_AddSP transformation
authorChristian Würdig <chriswue@ipd.info.uni-karlsruhe.de>
Fri, 11 Aug 2006 12:23:59 +0000 (12:23 +0000)
committerChristian Würdig <chriswue@ipd.info.uni-karlsruhe.de>
Fri, 11 Aug 2006 12:23:59 +0000 (12:23 +0000)
ir/be/ia32/ia32_transform.c

index df81ef0..9755eb9 100644 (file)
@@ -2383,6 +2383,51 @@ static ir_node *gen_be_Return(ia32_transform_env_t *env) {
        return NULL;
 }
 
+/**
+ * Transform a be_AddSP into an ia32_AddSP. Eat up const sizes.
+ */
+static ir_node *gen_be_AddSP(ia32_transform_env_t *env) {
+       ir_node *new_op;
+       const ir_edge_t *edge;
+       ir_node *sz = get_irn_n(env->irn, be_pos_AddSP_size);
+       ir_node *sp = get_irn_n(env->irn, be_pos_AddSP_old_sp);
+
+       new_op = new_rd_ia32_AddSP(env->dbg, env->irg, env->block, sp, sz);
+
+       if (is_ia32_Const(sz)) {
+               set_ia32_Immop_attr(new_op, sz);
+               set_irn_n(new_op, 1, ia32_new_NoReg_gp(env->cg));
+       }
+       else if (is_ia32_Load(sz) && get_ia32_am_flavour(sz) == ia32_O) {
+               set_ia32_immop_type(new_op, ia32_ImmSymConst);
+               set_ia32_op_type(new_op, ia32_AddrModeS);
+               set_ia32_am_sc(new_op, get_ia32_am_sc(sz));
+               add_ia32_am_offs(new_op, get_ia32_am_offs(sz));
+               set_irn_n(new_op, 1, ia32_new_NoReg_gp(env->cg));
+       }
+
+       /* fix proj nums */
+       foreach_out_edge(env->irn, edge) {
+               ir_node *proj = get_edge_src_irn(edge);
+
+               assert(is_Proj(proj));
+
+               if (get_Proj_proj(proj) == pn_be_AddSP_res) {
+                       /* the node is not yet exchanged: we need to set the register manually */
+                       ia32_attr_t *attr = get_ia32_attr(new_op);
+                       attr->slots[pn_ia32_AddSP_stack] = &ia32_gp_regs[REG_ESP];
+                       set_Proj_proj(proj, pn_ia32_AddSP_stack);
+               }
+               else if (get_Proj_proj(proj) == pn_be_AddSP_M) {
+                       set_Proj_proj(proj, pn_ia32_AddSP_M);
+               }
+               else {
+                       assert(0);
+               }
+       }
+
+       return new_op;
+}
 
 /**
  * This function just sets the register for the Unknown node
@@ -2883,6 +2928,7 @@ void ia32_register_transformers(void) {
        GEN(be_FrameLoad);
        GEN(be_FrameStore);
        GEN(be_StackParam);
+       GEN(be_AddSP);
 
        /* set the register for all Unknown nodes */
        GEN(Unknown);