put register classes into arch_env struct, no need for complicated callbacks
[libfirm] / ir / be / sparc / sparc_emitter.c
index 427b89e..f796857 100644 (file)
@@ -47,6 +47,7 @@
 #include "../begnuas.h"
 #include "../be_dbgout.h"
 #include "../benode.h"
+#include "../bestack.h"
 
 #include "sparc_emitter.h"
 #include "gen_sparc_emitter.h"
@@ -190,7 +191,7 @@ void sparc_emit_reg_or_imm(const ir_node *node, int pos)
 
 static bool is_stack_pointer_relative(const ir_node *node)
 {
-       const arch_register_t *sp = &sparc_gp_regs[REG_SP];
+       const arch_register_t *sp = &sparc_registers[REG_SP];
        return (is_sparc_St(node) && get_in_reg(node, n_sparc_St_ptr) == sp)
            || (is_sparc_Ld(node) && get_in_reg(node, n_sparc_Ld_ptr) == sp);
 }
@@ -857,12 +858,11 @@ static void emit_sparc_Ba(const ir_node *node)
 static void emit_jump_table(const ir_node *node)
 {
        const sparc_switch_jmp_attr_t *attr = get_sparc_switch_jmp_attr_const(node);
-       long             switch_min    = LONG_MAX;
        long             switch_max    = LONG_MIN;
        long             default_pn    = attr->default_proj_num;
        ir_entity       *entity        = attr->jump_table;
        ir_node         *default_block = NULL;
-       unsigned         length;
+       unsigned long    length;
        const ir_edge_t *edge;
        unsigned         i;
        ir_node        **table;
@@ -877,12 +877,18 @@ static void emit_jump_table(const ir_node *node)
                        assert(default_block == NULL); /* more than 1 default_pn? */
                        default_block = get_jump_target(proj);
                } else {
-                       switch_min = pn < switch_min ? pn : switch_min;
                        switch_max = pn > switch_max ? pn : switch_max;
                }
        }
-       length = (unsigned long) (switch_max - switch_min) + 1;
-       assert(switch_min < LONG_MAX || switch_max > LONG_MIN);
+       assert(switch_max > LONG_MIN);
+
+       length = (unsigned long) switch_max + 1;
+       /* the 16000 isn't a real limit of the architecture. But should protect us
+        * from seamingly endless compiler runs */
+       if (length > 16000) {
+               /* switch lowerer should have broken this monster to pieces... */
+               panic("too large switch encountered");
+       }
 
        table = XMALLOCNZ(ir_node*, length);
        foreach_out_edge(node, edge) {
@@ -891,7 +897,7 @@ static void emit_jump_table(const ir_node *node)
                if (pn == default_pn)
                        continue;
 
-               table[pn - switch_min] = get_jump_target(proj);
+               table[pn] = get_jump_target(proj);
        }
 
        /* emit table */
@@ -926,9 +932,9 @@ static void emit_sparc_SwitchJmp(const ir_node *node)
 static void emit_fmov(const ir_node *node, const arch_register_t *src_reg,
                       const arch_register_t *dst_reg)
 {
-       be_emit_cstring("\tfmov ");
+       be_emit_cstring("\tfmovs %");
        be_emit_string(arch_register_get_name(src_reg));
-       be_emit_cstring(", ");
+       be_emit_cstring(", %");
        be_emit_string(arch_register_get_name(dst_reg));
        be_emit_finish_line_gas(node);
 }
@@ -936,10 +942,10 @@ static void emit_fmov(const ir_node *node, const arch_register_t *src_reg,
 static const arch_register_t *get_next_fp_reg(const arch_register_t *reg)
 {
        unsigned index = reg->index;
-       assert(reg == &sparc_fp_regs[index]);
+       assert(reg == &sparc_registers[index]);
        index++;
-       assert(index < N_sparc_fp_REGS);
-       return &sparc_fp_regs[index];
+       assert(index - REG_F0 < N_sparc_fp_REGS);
+       return &sparc_registers[index];
 }
 
 static void emit_be_Copy(const ir_node *node)
@@ -1032,7 +1038,7 @@ static void sparc_emit_node(const ir_node *node)
                be_dbg_set_dbg_info(get_irn_dbg_info(node));
                (*func) (node);
        } else {
-               panic("No emit handler for node %+F (graph %+F)\n",     node,
+               panic("No emit handler for node %+F (graph %+F)\n", node,
                      current_ir_graph);
        }
 }