Merge branch 'kaps-included' into master
[libfirm] / ir / be / sparc / sparc_transform.c
index fea974b..29b2e52 100644 (file)
@@ -26,6 +26,7 @@
 #include "config.h"
 
 #include <stdint.h>
+#include <stdbool.h>
 
 #include "irnode_t.h"
 #include "irgraph_t.h"
@@ -70,9 +71,14 @@ static ir_mode               *mode_fp2;
 //static ir_mode               *mode_fp4;
 static pmap                  *node_to_stack;
 
-static inline int mode_needs_gp_reg(ir_mode *mode)
+static inline bool mode_needs_gp_reg(ir_mode *mode)
 {
-       return mode_is_int(mode) || mode_is_reference(mode);
+       if (mode_is_int(mode) || mode_is_reference(mode)) {
+               /* we should only see 32bit code */
+               assert(get_mode_size_bits(mode) <= 32);
+               return true;
+       }
+       return false;
 }
 
 /**
@@ -239,6 +245,9 @@ static ir_node *gen_helper_binop_args(ir_node *node,
        }
        mode1 = get_irn_mode(op1);
        mode2 = get_irn_mode(op2);
+       /* we shouldn't see 64bit code */
+       assert(get_mode_size_bits(mode1) <= 32);
+       assert(get_mode_size_bits(mode2) <= 32);
 
        if (is_imm_encodeable(op2)) {
                ir_node *new_op1   = be_transform_node(op1);
@@ -511,6 +520,10 @@ static ir_node *gen_Load(ir_node *node)
        ir_node  *new_load = NULL;
        address_t address;
 
+       if (get_Load_unaligned(node) == align_non_aligned) {
+               panic("sparc: transformation of unaligned Loads not implemented yet");
+       }
+
        if (mode_is_float(mode)) {
                match_address(ptr, &address, false);
                new_load = create_ldf(dbgi, block, address.ptr, new_mem, mode,
@@ -551,12 +564,17 @@ static ir_node *gen_Store(ir_node *node)
        ir_node  *new_store = NULL;
        address_t address;
 
+       if (get_Store_unaligned(node) == align_non_aligned) {
+               panic("sparc: transformation of unaligned Stores not implemented yet");
+       }
+
        if (mode_is_float(mode)) {
                /* TODO: variants with reg+reg address mode */
                match_address(ptr, &address, false);
                new_store = create_stf(dbgi, block, new_val, address.ptr, new_mem,
                                       mode, address.entity, address.offset, false);
        } else {
+               assert(get_mode_size_bits(mode) <= 32);
                match_address(ptr, &address, true);
                if (address.ptr2 != NULL) {
                        assert(address.entity == NULL && address.offset == 0);
@@ -1261,7 +1279,6 @@ static void create_stacklayout(ir_graph *irg)
        layout->arg_type       = arg_type;
        layout->initial_offset = 0;
        layout->initial_bias   = 0;
-       layout->stack_dir      = -1;
        layout->sp_relative    = cconv->omit_fp;
 
        assert(N_FRAME_TYPES == 3);
@@ -1283,7 +1300,7 @@ static ir_node *gen_Start(ir_node *node)
        dbg_info  *dbgi          = get_irn_dbg_info(node);
        ir_node   *mem;
        ir_node   *start;
-       ir_node   *sp;
+ir_node   *sp;
        size_t     i;
 
        /* stackpointer is important at function prolog */
@@ -1317,6 +1334,7 @@ static ir_node *gen_Start(ir_node *node)
        }
 
        start = be_prolog_create_start(abihelper, dbgi, new_block);
+#if 0
        mem   = be_prolog_get_memory(abihelper);
        sp    = be_prolog_get_reg_value(abihelper, sp_reg);
 
@@ -1333,6 +1351,7 @@ static ir_node *gen_Start(ir_node *node)
        arch_irn_add_flags(sp, arch_irn_flags_prolog);
        be_prolog_set_reg_value(abihelper, sp_reg, sp);
        be_prolog_set_memory(abihelper, mem);
+#endif
 
        return start;
 }
@@ -1406,6 +1425,7 @@ static ir_node *gen_Return(ir_node *node)
                }
        }
 
+#if 0
        /* we need a restore instruction */
        if (!cconv->omit_fp) {
                ir_node *fp      = be_prolog_get_reg_value(abihelper, fp_reg);
@@ -1421,10 +1441,9 @@ static ir_node *gen_Return(ir_node *node)
                arch_irn_add_flags(sp, arch_irn_flags_epilog);
                be_epilog_set_reg_value(abihelper, sp_reg, sp);
        }
+#endif
 
        bereturn = be_epilog_create_return(abihelper, dbgi, new_block);
-       arch_irn_add_flags(bereturn, arch_irn_flags_epilog);
-
        return bereturn;
 }
 
@@ -1869,8 +1888,6 @@ static ir_node *gen_Proj_Start(ir_node *node)
                return new_r_Bad(get_irn_irg(block));
        case pn_Start_P_frame_base:
                return get_frame_base();
-       case pn_Start_P_tls:
-               return new_r_Bad(current_ir_graph);
        case pn_Start_max:
                break;
        }
@@ -1951,7 +1968,6 @@ static ir_node *gen_Proj_Call(ir_node *node)
        case pn_Call_X_regular:
        case pn_Call_X_except:
        case pn_Call_T_result:
-       case pn_Call_P_value_res_base:
        case pn_Call_max:
                break;
        }