fix sse/x87 fixup code added at wrong places
[libfirm] / ir / be / ia32 / ia32_emitter.c
index c4a4f1a..1ccd8a1 100644 (file)
@@ -250,6 +250,29 @@ void ia32_emit_source_register(ia32_emit_env_t *env, const ir_node *node, int po
        be_emit_string(env, reg_name);
 }
 
+void ia32_emit_8bit_source_register(ia32_emit_env_t *env, const ir_node *node, int pos)
+{
+       const arch_register_t *reg = get_in_reg(env, node, pos);
+       const char *reg_name = arch_register_get_name(reg);
+
+       assert(pos < get_irn_arity(node));
+
+       be_emit_char(env, '%');
+       be_emit_char(env, reg_name[1]);
+       be_emit_char(env, 'l');
+}
+
+void ia32_emit_16bit_source_register(ia32_emit_env_t *env, const ir_node *node, int pos)
+{
+       const arch_register_t *reg = get_in_reg(env, node, pos);
+       const char *reg_name = arch_register_get_name(reg);
+
+       assert(pos < get_irn_arity(node));
+
+       be_emit_char(env, '%');
+       be_emit_string(env, &reg_name[1]);
+}
+
 void ia32_emit_dest_register(ia32_emit_env_t *env, const ir_node *node, int pos) {
        const arch_register_t *reg = get_out_reg(env, node, pos);
        const char *reg_name = arch_register_get_name(reg);
@@ -639,6 +662,11 @@ void ia32_emit_am(ia32_emit_env_t *env, const ir_node *node) {
                }
                be_emit_char(env, ')');
        }
+
+       /* special case if nothing is set */
+       if(ent == NULL && offs == 0 && !has_base && !has_index) {
+               be_emit_char(env, '0');
+       }
 }
 
 /*************************************************
@@ -728,8 +756,13 @@ ir_node *get_cfop_target_block(const ir_node *irn) {
 static
 void ia32_emit_block_name(ia32_emit_env_t *env, const ir_node *block)
 {
-       be_emit_cstring(env, BLOCK_PREFIX);
-       be_emit_irprintf(env->emit, "%d", get_irn_node_nr(block));
+       if (has_Block_label(block)) {
+               be_emit_string(env, be_gas_label_prefix());
+               be_emit_irprintf(env->emit, "%u", (unsigned)get_Block_label(block));
+       } else {
+               be_emit_cstring(env, BLOCK_PREFIX);
+               be_emit_irprintf(env->emit, "%d", get_irn_node_nr(block));
+       }
 }
 
 /**
@@ -1377,7 +1410,7 @@ void emit_ia32_Immediate(ia32_emit_env_t *env, const ir_node *node)
        if(attr->symconst == NULL || attr->offset != 0) {
                if(attr->symconst != NULL)
                        be_emit_char(env, '+');
-               be_emit_irprintf(env->emit, "%d", attr->offset);
+               be_emit_irprintf(env->emit, "0x%X", attr->offset);
        }
 }
 
@@ -1721,7 +1754,7 @@ void emit_ia32_Conv_I2I(ia32_emit_env_t *env, const ir_node *node) {
                        be_emit_cstring(env, "\tmov");
                        be_emit_string(env, sign_suffix);
                        ia32_emit_mode_suffix_mode(env, smaller_mode);
-                       be_emit_cstring(env, "l %");
+                       be_emit_cstring(env, "l ");
                        ia32_emit_am(env, node);
                        be_emit_cstring(env, ", ");
                        ia32_emit_dest_register(env, node, 0);