Teach new_tarval_from_str_int() to parse binary numbers: 0[bB][01]+.
[libfirm] / ir / be / arm / arm_emitter.c
index 85f3abb..4695a57 100644 (file)
@@ -21,7 +21,6 @@
  * @file
  * @brief   arm emitter
  * @author  Oliver Richter, Tobias Gneist, Michael Beck
- * @version $Id$
  */
 #include "config.h"
 
@@ -46,7 +45,7 @@
 #include "beblocksched.h"
 #include "beirg.h"
 #include "begnuas.h"
-#include "be_dbgout.h"
+#include "bedwarf.h"
 
 #include "arm_emitter.h"
 #include "arm_optimize.h"
@@ -264,7 +263,7 @@ static void emit_arm_SymConst(const ir_node *irn)
        key.u.entity  = attr->entity;
        key.is_entity = true;
        key.label     = 0;
-       entry = (sym_or_tv_t *)set_insert(sym_or_tv, &key, sizeof(key), HASH_PTR(key.u.generic));
+       entry = (sym_or_tv_t *)set_insert(sym_or_tv, &key, sizeof(key), hash_ptr(key.u.generic));
        if (entry->label == 0) {
                /* allocate a label */
                entry->label = get_unique_label();
@@ -302,7 +301,7 @@ static void emit_arm_fConst(const ir_node *irn)
        key.u.tv      = get_fConst_value(irn);
        key.is_entity = false;
        key.label     = 0;
-       entry = (sym_or_tv_t *)set_insert(sym_or_tv, &key, sizeof(key), HASH_PTR(key.u.generic));
+       entry = (sym_or_tv_t *)set_insert(sym_or_tv, &key, sizeof(key), hash_ptr(key.u.generic));
        if (entry->label == 0) {
                /* allocate a label */
                entry->label = get_unique_label();
@@ -579,80 +578,13 @@ static void emit_arm_CopyB(const ir_node *irn)
 
 static void emit_arm_SwitchJmp(const ir_node *irn)
 {
-       const ir_edge_t    *edge;
-       ir_node            *proj;
-       int i;
-       ir_node **projs;
-       int n_projs;
-       int block_nr;
-       ir_node *default_proj = NULL;
-
-       block_nr = get_irn_node_nr(irn);
-       n_projs = get_arm_SwitchJmp_n_projs(irn);
-
-       projs = XMALLOCNZ(ir_node*, n_projs);
-
-       foreach_out_edge(irn, edge) {
-               proj = get_edge_src_irn(edge);
-               assert(is_Proj(proj) && "Only proj allowed at SwitchJmp");
-
-               if (get_Proj_proj(proj) == get_arm_SwitchJmp_default_proj_num(irn))
-                       default_proj = proj;
-
-               projs[get_Proj_proj(proj)] = proj;
-       }
-       assert(default_proj != NULL && "SwitchJmp should have a Default Proj");
-
-       /*
-          CMP %1S, n_projs - 1
-          BHI default
-       */
-
-       be_emit_cstring("\tcmp ");
+       const arm_SwitchJmp_attr_t *attr = get_arm_SwitchJmp_attr_const(irn);
+       be_emit_cstring("\tldrls pc, [pc, ");
        arm_emit_source_register(irn, 0);
-       be_emit_irprintf(", #%u", n_projs - 1);
+       be_emit_cstring(", asl #2]");
        be_emit_finish_line_gas(irn);
 
-       be_emit_cstring("\tbhi ");
-       arm_emit_cfop_target(default_proj);
-       be_emit_finish_line_gas(default_proj);
-
-       /*
-          LDR %r12, .TABLE_X_START
-          ADD %r12, %r12, [%1S, LSL #2]
-          LDR %r15, %r12
-        */
-
-       be_emit_irprintf("\tldr %%r12, TABLE_%d_START", block_nr);
-       be_emit_finish_line_gas(NULL);
-
-       be_emit_irprintf("\tadd %%r12, %%r12, ");
-       arm_emit_source_register(irn, 0);
-       be_emit_cstring(", LSL #2");
-       be_emit_finish_line_gas(NULL);
-
-       be_emit_cstring("\tldr %r15, [%r12, #0]");
-       be_emit_finish_line_gas(NULL);
-
-       be_emit_irprintf("TABLE_%d_START:\n\t.word\tTABLE_%d", block_nr, block_nr);
-       be_emit_finish_line_gas(NULL);
-       be_emit_irprintf("\t.align 2");
-       be_emit_finish_line_gas(NULL);
-       be_emit_irprintf("TABLE_%d:", block_nr);
-       be_emit_finish_line_gas(NULL);
-
-       for (i = 0; i < n_projs; ++i) {
-               proj = projs[i];
-               if (proj == NULL) {
-                       proj = projs[get_arm_SwitchJmp_default_proj_num(irn)];
-               }
-               be_emit_cstring("\t.word\t");
-               arm_emit_cfop_target(proj);
-               be_emit_finish_line_gas(proj);
-       }
-       be_emit_irprintf("\t.align 2\n");
-       be_emit_finish_line_gas(NULL);
-       xfree(projs);
+       be_emit_jump_table(irn, attr->table, NULL, get_cfop_target_block);
 }
 
 /** Emit an IncSP node */
@@ -862,7 +794,7 @@ static inline void set_emitter(ir_op *op, emit_func arm_emit_node)
 static void arm_register_emitters(void)
 {
        /* first clear the generic function pointer for all ops */
-       clear_irp_opcodes_generic_func();
+       ir_clear_opcodes_generic_func();
 
        /* register all emitter functions defined in spec */
        arm_register_spec_emitters();
@@ -897,11 +829,11 @@ static void arm_emit_node(const ir_node *irn)
 
        if (op->ops.generic) {
                emit_func *emit = (emit_func *)op->ops.generic;
-               be_dbg_set_dbg_info(get_irn_dbg_info(irn));
+               be_dwarf_location(get_irn_dbg_info(irn));
                (*emit)(irn);
        } else {
                panic("Error: No emit handler for node %+F (graph %+F)\n",
-                     irn, current_ir_graph);
+                     irn, get_irn_irg(irn));
        }
 }
 
@@ -969,7 +901,7 @@ static void arm_gen_block(ir_node *block, ir_node *prev_block)
        ir_node *irn;
 
        arm_emit_block_header(block, prev_block);
-       be_dbg_set_dbg_info(get_irn_dbg_info(block));
+       be_dwarf_location(get_irn_dbg_info(block));
        sched_foreach(block, irn) {
                arm_emit_node(irn);
        }
@@ -1023,7 +955,7 @@ void arm_gen_routine(ir_graph *irg)
        /* create the block schedule */
        blk_sched = be_create_block_schedule(irg);
 
-       be_gas_emit_function_prolog(entity, 4);
+       be_gas_emit_function_prolog(entity, 4, NULL);
 
        irg_block_walk_graph(irg, arm_gen_labels, NULL, NULL);