From: Christoph Mallon Date: Fri, 30 Nov 2012 10:37:02 +0000 (+0100) Subject: ia32: When emitting an asm memory operand, ignore the size of the referenced value... X-Git-Url: http://nsz.repo.hu/git/?a=commitdiff_plain;h=f9e2c357ccf94135482a5986d39fb85da8905547;p=libfirm ia32: When emitting an asm memory operand, ignore the size of the referenced value and asm operand size modifier. The register, which is emitted, contains the address of the value, so it always is the size of a pointer, not whatever the register points to. --- diff --git a/ir/be/ia32/ia32_emitter.c b/ir/be/ia32/ia32_emitter.c index 123c33059..4b39bcd9e 100644 --- a/ir/be/ia32/ia32_emitter.c +++ b/ir/be/ia32/ia32_emitter.c @@ -1054,31 +1054,19 @@ static const char* emit_asm_operand(const ir_node *node, const char *s) return s; } + /* Emit the register. */ if (asm_reg->memory) { be_emit_char('('); - } - - /* emit it */ - if (modifier != 0) { + emit_register(reg, NULL); + be_emit_char(')'); + } else { switch (modifier) { - case 'b': - emit_8bit_register(reg); - break; - case 'h': - emit_8bit_register_high(reg); - break; - case 'w': - emit_16bit_register(reg); - break; - default: - panic("Invalid asm op modifier"); + case '\0': emit_register(reg, asm_reg->mode); break; + case 'b': emit_8bit_register(reg); break; + case 'h': emit_8bit_register_high(reg); break; + case 'w': emit_16bit_register(reg); break; + default: panic("Invalid asm op modifier"); } - } else { - emit_register(reg, asm_reg->memory ? mode_Iu : asm_reg->mode); - } - - if (asm_reg->memory) { - be_emit_char(')'); } return s;