From f9e2c357ccf94135482a5986d39fb85da8905547 Mon Sep 17 00:00:00 2001 From: Christoph Mallon Date: Fri, 30 Nov 2012 11:37:02 +0100 Subject: [PATCH] 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. --- ir/be/ia32/ia32_emitter.c | 30 +++++++++--------------------- 1 file changed, 9 insertions(+), 21 deletions(-) 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; -- 2.20.1