lowering: fix i_mapper for new exception attributes
[libfirm] / ir / be / sparc / bearch_sparc.c
index a953b04..fa424b5 100644 (file)
@@ -20,6 +20,7 @@
 /**
  * @file
  * @brief    The main sparc backend driver file.
+ * @author   Hannes Rapp, Matthias Braun
  * @version  $Id$
  */
 #include "config.h"
@@ -37,6 +38,7 @@
 #include "irtools.h"
 #include "irdump.h"
 #include "lowering.h"
+#include "lower_dw.h"
 
 #include "bitset.h"
 #include "debug.h"
@@ -116,13 +118,15 @@ static int sparc_get_sp_bias(const ir_node *node)
                 * calculates that! */
                assert(attr->immediate_value <= -SPARC_MIN_STACKSIZE);
                return attr->immediate_value + SPARC_MIN_STACKSIZE;
+       } else if (is_sparc_RestoreZero(node)) {
+               return SP_BIAS_RESET;
        }
        return 0;
 }
 
 /* fill register allocator interface */
 
-static const arch_irn_ops_t sparc_irn_ops = {
+const arch_irn_ops_t sparc_irn_ops = {
        sparc_classify,
        sparc_get_frame_entity,
        sparc_set_frame_offset,
@@ -168,8 +172,8 @@ static void transform_Reload(ir_node *node)
 {
        ir_node   *block  = get_nodes_block(node);
        dbg_info  *dbgi   = get_irn_dbg_info(node);
-       ir_node   *ptr    = get_irn_n(node, be_pos_Spill_frame);
-       ir_node   *mem    = get_irn_n(node, be_pos_Reload_mem);
+       ir_node   *ptr    = get_irn_n(node, n_be_Spill_frame);
+       ir_node   *mem    = get_irn_n(node, n_be_Reload_mem);
        ir_mode   *mode   = get_irn_mode(node);
        ir_entity *entity = be_get_frame_entity(node);
        const arch_register_t *reg;
@@ -197,10 +201,10 @@ static void transform_Spill(ir_node *node)
 {
        ir_node   *block  = get_nodes_block(node);
        dbg_info  *dbgi   = get_irn_dbg_info(node);
-       ir_node   *ptr    = get_irn_n(node, be_pos_Spill_frame);
+       ir_node   *ptr    = get_irn_n(node, n_be_Spill_frame);
        ir_graph  *irg    = get_irn_irg(node);
-       ir_node   *mem    = new_r_NoMem(irg);
-       ir_node   *val    = get_irn_n(node, be_pos_Spill_val);
+       ir_node   *mem    = get_irg_no_mem(irg);
+       ir_node   *val    = get_irn_n(node, n_be_Spill_val);
        ir_mode   *mode   = get_irn_mode(val);
        ir_entity *entity = be_get_frame_entity(node);
        ir_node   *sched_point;
@@ -280,13 +284,17 @@ static void sparc_set_frame_entity(ir_node *node, ir_entity *entity)
 
 static void sparc_after_ra(ir_graph *irg)
 {
-       be_fec_env_t *fec_env = be_new_frame_entity_coalescer(irg);
+       be_stack_layout_t *stack_layout = be_get_irg_stack_layout(irg);
+       bool               at_begin     = stack_layout->sp_relative ? true : false;
+       be_fec_env_t      *fec_env      = be_new_frame_entity_coalescer(irg);
 
        irg_walk_graph(irg, NULL, sparc_collect_frame_entity_nodes, fec_env);
-       be_assign_entities(fec_env, sparc_set_frame_entity);
+       be_assign_entities(fec_env, sparc_set_frame_entity, at_begin);
        be_free_frame_entity_coalescer(fec_env);
 
        irg_block_walk_graph(irg, NULL, sparc_after_ra_walker, NULL);
+
+       sparc_introduce_prolog_epilog(irg);
 }
 
 static void sparc_init_graph(ir_graph *irg)
@@ -305,7 +313,6 @@ static sparc_isa_t sparc_isa_template = {
                &sparc_registers[REG_SP],           /* stack pointer register */
                &sparc_registers[REG_FRAME_POINTER],/* base pointer register */
                &sparc_reg_classes[CLASS_sparc_gp], /* link pointer register class */
-               -1,                                 /* stack direction */
                3,                                  /* power of two stack alignment
                                                       for calls */
                NULL,                               /* main environment */
@@ -343,9 +350,9 @@ static void rewrite_unsigned_float_Conv(ir_node *node)
                ir_node   *signed_x    = new_rd_Conv(dbgi, block, unsigned_x, mode_s);
                ir_node   *res         = new_rd_Conv(dbgi, block, signed_x, mode_d);
                ir_node   *zero        = new_r_Const(irg, get_mode_null(mode_s));
-               ir_node   *cmp         = new_rd_Cmp(dbgi, block, signed_x, zero);
-               ir_node   *proj_lt     = new_r_Proj(cmp, mode_b, pn_Cmp_Lt);
-               ir_node   *cond        = new_rd_Cond(dbgi, block, proj_lt);
+               ir_node   *cmp         = new_rd_Cmp(dbgi, block, signed_x, zero,
+                                                   ir_relation_less);
+               ir_node   *cond        = new_rd_Cond(dbgi, block, cmp);
                ir_node   *proj_true   = new_r_Proj(cond, mode_X, pn_Cond_true);
                ir_node   *proj_false  = new_r_Proj(cond, mode_X, pn_Cond_false);
                ir_node   *in_true[1]  = { proj_true };
@@ -431,7 +438,6 @@ static void sparc_handle_intrinsics(void)
                rt_iMod.mem_proj_nr     = pn_Mod_M;
                rt_iMod.regular_proj_nr = pn_Mod_X_regular;
                rt_iMod.exc_proj_nr     = pn_Mod_X_except;
-               rt_iMod.exc_mem_proj_nr = pn_Mod_M;
                rt_iMod.res_proj_nr     = pn_Mod_res;
 
                set_entity_visibility(rt_iMod.ent, ir_visibility_external);
@@ -457,7 +463,6 @@ static void sparc_handle_intrinsics(void)
                rt_uMod.mem_proj_nr     = pn_Mod_M;
                rt_uMod.regular_proj_nr = pn_Mod_X_regular;
                rt_uMod.exc_proj_nr     = pn_Mod_X_except;
-               rt_uMod.exc_mem_proj_nr = pn_Mod_M;
                rt_uMod.res_proj_nr     = pn_Mod_res;
 
                set_entity_visibility(rt_uMod.ent, ir_visibility_external);
@@ -478,7 +483,7 @@ static void sparc_handle_intrinsics(void)
 static arch_env_t *sparc_init(FILE *outfile)
 {
        sparc_isa_t *isa = XMALLOC(sparc_isa_t);
-       memcpy(isa, &sparc_isa_template, sizeof(*isa));
+       *isa = sparc_isa_template;
        isa->constants = pmap_create();
 
        be_emit_init(outfile);
@@ -536,18 +541,27 @@ static ir_node *sparc_create_set(ir_node *cond)
 
 static void sparc_lower_for_target(void)
 {
-       int i;
-       int n_irgs = get_irp_n_irgs();
+       size_t i, n_irgs = get_irp_n_irgs();
        lower_mode_b_config_t lower_mode_b_config = {
                mode_Iu,
                sparc_create_set,
                0,
        };
+       lower_params_t params = {
+               4,                                     /* def_ptr_alignment */
+               LF_COMPOUND_RETURN | LF_RETURN_HIDDEN, /* flags */
+               ADD_HIDDEN_ALWAYS_IN_FRONT,            /* hidden_params */
+               NULL,                                  /* find pointer type */
+               NULL,                                  /* ret_compound_in_regs */
+       };
+       lower_calls_with_compounds(&params);
+
+       sparc_lower_64bit();
 
        for (i = 0; i < n_irgs; ++i) {
                ir_graph *irg = get_irp_irg(i);
                ir_lower_mode_b(irg, &lower_mode_b_config);
-               lower_switch(irg, 256, false);
+               lower_switch(irg, 4, 256, false);
        }
 }
 
@@ -588,7 +602,9 @@ static const backend_params *sparc_get_backend_params(void)
                1,     /* big endian */
                &arch_dep,              /* will be set later */
                sparc_is_mux_allowed,   /* parameter for if conversion */
+               32,    /* machine size */
                NULL,  /* float arithmetic mode */
+               128,   /* size of long double */
                0,     /* no trampoline support: size 0 */
                0,     /* no trampoline support: align 0 */
                NULL,  /* no trampoline support: no trampoline builder */
@@ -637,11 +653,12 @@ const arch_isa_if_t sparc_isa_if = {
        sparc_prepare_graph,
        sparc_before_ra,
        sparc_after_ra,
-       NULL, /* finish */
+       sparc_finish,
        sparc_emit_routine,
+       NULL, /* register_saved_by */
 };
 
-BE_REGISTER_MODULE_CONSTRUCTOR(be_init_arch_sparc);
+BE_REGISTER_MODULE_CONSTRUCTOR(be_init_arch_sparc)
 void be_init_arch_sparc(void)
 {
        be_register_isa_if("sparc", &sparc_isa_if);