implement aggregate returns according to sparc ABI
[libfirm] / ir / be / TEMPLATE / TEMPLATE_transform.c
index c86fd0e..4426fb0 100644 (file)
@@ -77,18 +77,26 @@ static ir_node *gen_Eor(ir_node *node)
        return transform_binop(node, new_bd_TEMPLATE_Xor);
 }
 
-static ir_node *gen_Quot(ir_node *node)
+static ir_node *gen_Div(ir_node *node)
 {
+       ir_mode *mode = get_Div_resmode(node);
+       assert(mode_is_float(mode));
        return transform_binop(node, new_bd_TEMPLATE_fDiv);
 }
 
 static ir_node *gen_Shl(ir_node *node)
 {
+       ir_mode *mode = get_irn_mode(node);
+       if (get_mode_modulo_shift(mode) != 32)
+               panic("modulo shift!=32 not supported by TEMPLATE backend");
        return transform_binop(node, new_bd_TEMPLATE_Shl);
 }
 
 static ir_node *gen_Shr(ir_node *node)
 {
+       ir_mode *mode = get_irn_mode(node);
+       if (get_mode_modulo_shift(mode) != 32)
+               panic("modulo shift!=32 not supported by TEMPLATE backend");
        return transform_binop(node, new_bd_TEMPLATE_Shr);
 }
 
@@ -153,17 +161,14 @@ static ir_node *gen_Not(ir_node *node)
 
 static ir_node *gen_Const(ir_node *node)
 {
-       ir_node  *block     = get_nodes_block(node);
-       ir_node  *new_block = be_transform_node(block);
-       dbg_info *dbgi      = get_irn_dbg_info(node);
-       tarval   *value     = get_Const_tarval(node);
-       ir_node  *result;
+       ir_node   *block     = get_nodes_block(node);
+       ir_node   *new_block = be_transform_node(block);
+       dbg_info  *dbgi      = get_irn_dbg_info(node);
+       ir_tarval *value     = get_Const_tarval(node);
+       ir_node   *result;
 
        result = new_bd_TEMPLATE_Const(dbgi, new_block, value);
 
-       /* make sure the node does not float above the barrier into the prologue */
-       be_dep_on_frame(result);
-
        return result;
 }
 
@@ -254,6 +259,7 @@ static void TEMPLATE_register_transformers(void)
        be_set_transform_function(op_Add,   gen_Add);
        be_set_transform_function(op_And,   gen_And);
        be_set_transform_function(op_Const, gen_Const);
+       be_set_transform_function(op_Div,   gen_Div);
        be_set_transform_function(op_Eor,   gen_Eor);
        be_set_transform_function(op_Jmp,   gen_Jmp);
        be_set_transform_function(op_Load,  gen_Load);
@@ -262,7 +268,6 @@ static void TEMPLATE_register_transformers(void)
        be_set_transform_function(op_Not,   gen_Not);
        be_set_transform_function(op_Or,    gen_Or);
        be_set_transform_function(op_Phi,   gen_Phi);
-       be_set_transform_function(op_Quot,  gen_Quot);
        be_set_transform_function(op_Shl,   gen_Shl);
        be_set_transform_function(op_Shr,   gen_Shr);
        be_set_transform_function(op_Store, gen_Store);
@@ -272,10 +277,10 @@ static void TEMPLATE_register_transformers(void)
 /**
  * Transform generic IR-nodes into TEMPLATE machine instructions
  */
-void TEMPLATE_transform_graph(TEMPLATE_code_gen_t *cg)
+void TEMPLATE_transform_graph(ir_graph *irg)
 {
        TEMPLATE_register_transformers();
-       be_transform_graph(cg->irg, NULL);
+       be_transform_graph(irg, NULL);
 }
 
 void TEMPLATE_init_transform(void)