From 1780dfad0bee68d4bb09ffce6ffa6a8693bbe753 Mon Sep 17 00:00:00 2001 From: Matthias Braun Date: Fri, 28 Sep 2007 14:33:41 +0000 Subject: [PATCH] fix for fehler87 [r15986] --- ir/be/ia32/ia32_emitter.c | 53 ++++++++++++++------------------------- ir/be/ia32/ia32_x87.c | 2 +- 2 files changed, 20 insertions(+), 35 deletions(-) diff --git a/ir/be/ia32/ia32_emitter.c b/ir/be/ia32/ia32_emitter.c index 3f684791d..311f72145 100644 --- a/ir/be/ia32/ia32_emitter.c +++ b/ir/be/ia32/ia32_emitter.c @@ -144,37 +144,6 @@ static const arch_register_t *get_out_reg(const ir_node *irn, int pos) return reg; } -/** - * Determine the gnu assembler suffix that indicates a mode - */ -static char get_mode_suffix(const ir_mode *mode) -{ - if(mode_is_float(mode)) { - switch(get_mode_size_bits(mode)) { - case 32: - return 's'; - case 64: - return 'l'; - case 80: - case 96: - return 't'; - } - } else { - assert(mode_is_int(mode) || mode_is_reference(mode)); - switch(get_mode_size_bits(mode)) { - case 64: - return 'q'; - case 32: - return 'l'; - case 16: - return 'w'; - case 8: - return 'b'; - } - } - panic("Can't output mode_suffix for %+F\n", mode); -} - /** * Add a number to a prefix. This number will not be used a second time. */ @@ -281,10 +250,26 @@ void ia32_emit_x87_register(const ir_node *node, int pos) be_emit_string(attr->x87[pos]->name); } -static -void ia32_emit_mode_suffix_mode(const ir_mode *mode) +static void ia32_emit_mode_suffix_mode(const ir_mode *mode) { - be_emit_char(get_mode_suffix(mode)); + if(mode_is_float(mode)) { + switch(get_mode_size_bits(mode)) { + case 32: be_emit_char('s'); return; + case 64: be_emit_char('l'); return; + case 80: be_emit_char('t'); return; + } + } else { + assert(mode_is_int(mode) || mode_is_reference(mode)); + switch(get_mode_size_bits(mode)) { + case 64: be_emit_cstring("ll"); return; + /* gas docu says q is the suffix but gcc, objdump and icc use + ll apparently */ + case 32: be_emit_char('l'); return; + case 16: be_emit_char('w'); return; + case 8: be_emit_char('b'); return; + } + } + panic("Can't output mode_suffix for %+F\n", mode); } void ia32_emit_mode_suffix(const ir_node *node) diff --git a/ir/be/ia32/ia32_x87.c b/ir/be/ia32/ia32_x87.c index 7e7565bb4..3aca3391e 100644 --- a/ir/be/ia32/ia32_x87.c +++ b/ir/be/ia32/ia32_x87.c @@ -1213,7 +1213,7 @@ static int sim_store(x87_state *state, ir_node *n, ir_op *op, ir_op *op_p) { - stack not full: push value and fstp - stack full: fstp value and load again */ - if (mode == mode_E) { + if (mode == mode_E || mode == mode_Ls) { if (depth < N_x87_REGS) { /* ok, we have a free register: push + fstp */ x87_create_fpush(state, n, op2_idx, n_ia32_vfst_val); -- 2.20.1