fixed prologue
[libfirm] / ir / be / ia32 / ia32_emitter.c
index a86a40f..70d59d3 100644 (file)
 #include "ia32_new_nodes.h"
 #include "ia32_map_regs.h"
 
-#ifdef obstack_chunk_alloc
-# undef obstack_chunk_alloc
-# define obstack_chunk_alloc xmalloc
-#else
-# define obstack_chunk_alloc xmalloc
-# define obstack_chunk_free free
-#endif
-
 #define BLOCK_PREFIX(x) ".L" x
 
-extern int obstack_printf(struct obstack *obst, char *fmt, ...);
-
 #define SNPRINTF_BUF_LEN 128
 
 /* global arch_env for lc_printf functions */
@@ -62,9 +52,8 @@ static const arch_env_t *arch_env = NULL;
 /**
  * returns true if a node has x87 registers
  */
-static int has_x87_register(const ir_node *n)
-{
-       return get_irn_op(n)->flags & (irop_flag_machine << 1);
+static int has_x87_register(const ir_node *n) {
+       return is_irn_machine_user(n, 0);
 }
 
 /* We always pass the ir_node which is a pointer. */
@@ -921,19 +910,9 @@ static void emit_ia32_SwitchJmp(const ir_node *irn, ia32_emit_env_t *emit_env) {
        interval = tbl.max_value - tbl.min_value;
 
        /* emit the table */
-       if (tbl.min_value != 0) {
-               lc_esnprintf(env, cmd_buf, SNPRINTF_BUF_LEN, "sub [%1S-%d], %u", irn, tbl.min_value * 4, interval);
-               lc_esnprintf(env, cmd_buf, SNPRINTF_BUF_LEN, "cmp DWORD PTR [%1S-%d], %u", irn, tbl.min_value * 4, interval);
-               snprintf(cmnt_buf, SNPRINTF_BUF_LEN, "/* first switch value is not 0 */");
-
-               IA32_DO_EMIT(irn);
-       }
-       else {
-               lc_esnprintf(env, cmd_buf, SNPRINTF_BUF_LEN, "cmp %1S, %u", irn, interval);
-               snprintf(cmnt_buf, SNPRINTF_BUF_LEN, "/* compare for switch */");
-
-               IA32_DO_EMIT(irn);
-       }
+       lc_esnprintf(env, cmd_buf, SNPRINTF_BUF_LEN, "cmp %1S, %u", irn, interval);
+       snprintf(cmnt_buf, SNPRINTF_BUF_LEN, "/* compare for switch */");
+       IA32_DO_EMIT(irn);
 
        snprintf(cmd_buf, SNPRINTF_BUF_LEN, "ja %s", get_cfop_target(tbl.defProj, buf));
        snprintf(cmnt_buf, SNPRINTF_BUF_LEN, "/* default jump if out of range  */");
@@ -952,7 +931,7 @@ static void emit_ia32_SwitchJmp(const ir_node *irn, ia32_emit_env_t *emit_env) {
                fprintf(F, "%s:\n", tbl.label);
 
                snprintf(cmd_buf, SNPRINTF_BUF_LEN, ".long %s", get_cfop_target(tbl.branches[0].target, buf));
-               snprintf(cmnt_buf, SNPRINTF_BUF_LEN, "/* case %d */\n",  tbl.branches[0].value);
+               snprintf(cmnt_buf, SNPRINTF_BUF_LEN, "/* case %d */",  tbl.branches[0].value);
                IA32_DO_EMIT(irn);
 
                last_value = tbl.branches[0].value;
@@ -967,7 +946,7 @@ static void emit_ia32_SwitchJmp(const ir_node *irn, ia32_emit_env_t *emit_env) {
                        IA32_DO_EMIT(irn);
                }
 
-               fprintf(F, "\t.text");
+               fprintf(F, "\n\t.text\n\n");
        }
        else {
                /* one jump is enough */
@@ -1264,7 +1243,7 @@ static void emit_be_Call(const ir_node *irn, ia32_emit_env_t *emit_env) {
        char cmd_buf[SNPRINTF_BUF_LEN], cmnt_buf[SNPRINTF_BUF_LEN];
 
        if (ent) {
-               snprintf(cmd_buf, SNPRINTF_BUF_LEN, "call %s", get_entity_name(ent));
+               snprintf(cmd_buf, SNPRINTF_BUF_LEN, "call %s", get_entity_ld_name(ent));
        }
        else {
                lc_esnprintf(ia32_get_arg_env(), cmd_buf, SNPRINTF_BUF_LEN, "%1D", get_irn_n(irn, be_pos_Call_ptr));
@@ -1285,8 +1264,10 @@ static void emit_be_IncSP(const ir_node *irn, ia32_emit_env_t *emit_env) {
        char cmd_buf[SNPRINTF_BUF_LEN], cmnt_buf[SNPRINTF_BUF_LEN];
 
        if (offs) {
-               lc_esnprintf(ia32_get_arg_env(), cmd_buf, SNPRINTF_BUF_LEN, "add %1S,%s%u", irn,
-                       (dir == be_stack_dir_expand) ? " -" : " ", offs);
+               if (dir == be_stack_dir_expand)
+                       lc_esnprintf(ia32_get_arg_env(), cmd_buf, SNPRINTF_BUF_LEN, "sub %1S, %u", irn, offs);
+               else
+                       lc_esnprintf(ia32_get_arg_env(), cmd_buf, SNPRINTF_BUF_LEN, "add %1S, %u", irn, offs);
                lc_esnprintf(ia32_get_arg_env(), cmnt_buf, SNPRINTF_BUF_LEN, "/* %+F (IncSP) */", irn);
        }
        else {
@@ -1495,7 +1476,7 @@ void ia32_gen_routine(FILE *F, ir_graph *irg, const ia32_code_gen_t *cg) {
        ia32_emit_func_prolog(F, irg);
        irg_block_walk_graph(irg, ia32_gen_labels, NULL, &emit_env);
 
-       if (cg->opt.extbb && cg->blk_sched) {
+       if ((cg->opt & IA32_OPT_EXTBB) && cg->blk_sched) {
                int i, n = ARR_LEN(cg->blk_sched);
 
                for (i = 0; i < n;) {