From 6b1e338cf9730ad1b2bd97db0d7f99acca71b5d2 Mon Sep 17 00:00:00 2001 From: Christoph Mallon Date: Tue, 22 Sep 2009 14:40:34 +0000 Subject: [PATCH] Correctly implement binary emitter for Cmp8Bit. [r26606] --- ir/be/ia32/ia32_emitter.c | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/ir/be/ia32/ia32_emitter.c b/ir/be/ia32/ia32_emitter.c index 5b0f2d620..b649b1528 100644 --- a/ir/be/ia32/ia32_emitter.c +++ b/ir/be/ia32/ia32_emitter.c @@ -2774,6 +2774,32 @@ SHIFT(shl, 4) SHIFT(shr, 5) SHIFT(sar, 7) +static void bemit_cmp8bit(const ir_node *node) +{ + const arch_register_t *out = get_in_reg(node, n_ia32_Cmp_left); + ir_node *right = get_irn_n(node, n_ia32_binary_right); + if (is_ia32_Immediate(right)) { + if (get_ia32_op_type(node) != ia32_Normal) { + bemit8(0x80); + bemit_mod_am(7, node); + } else if (out->index == REG_EAX) { + bemit8(0x3C); + } else { + bemit8(0x80); + bemit_modru(out, 7); + } + bemit8(get_ia32_immediate_attr_const(right)->offset); + } else { + bemit8(0x3A); + if (get_ia32_op_type(node) == ia32_Normal) { + const arch_register_t *in = get_in_reg(node, n_ia32_Cmp_right); + bemit_modrr(out, in); + } else { + bemit_mod_am(reg_gp_map[out->index], node); + } + } +} + static void bemit_imul(const ir_node *node) { ir_node *right = get_irn_n(node, n_ia32_IMul_right); @@ -3218,7 +3244,7 @@ static void ia32_register_binary_emitters(void) register_emitter(op_ia32_Call, bemit_call); register_emitter(op_ia32_Cltd, bemit_cltd); register_emitter(op_ia32_Cmc, bemit_cmc); - register_emitter(op_ia32_Cmp8Bit, bemit_cmp); + register_emitter(op_ia32_Cmp8Bit, bemit_cmp8bit); register_emitter(op_ia32_Cmp, bemit_cmp); register_emitter(op_ia32_Const, bemit_mov_const); register_emitter(op_ia32_Conv_I2I8Bit, bemit_conv_i2i); -- 2.20.1