From: Christoph Mallon Date: Sun, 11 Nov 2012 22:17:00 +0000 (+0100) Subject: Implement binary emitter for ia32 bt. X-Git-Url: http://nsz.repo.hu/git/?a=commitdiff_plain;h=4b34dcdf83c922c5047e81eb59e1ff0365c95fe4;p=libfirm Implement binary emitter for ia32 bt. --- diff --git a/ir/be/ia32/ia32_emitter.c b/ir/be/ia32/ia32_emitter.c index e4a62ceaa..b561b32ad 100644 --- a/ir/be/ia32/ia32_emitter.c +++ b/ir/be/ia32/ia32_emitter.c @@ -2520,6 +2520,25 @@ static void bemit_bswap(ir_node const *const node) bemit_modru(arch_get_irn_register_out(node, pn_ia32_Bswap_res), 1); } +static void bemit_bt(ir_node const *const node) +{ + bemit8(0x0F); + arch_register_t const *const lreg = arch_get_irn_register_in(node, n_ia32_Bt_left); + ir_node const *const right = get_irn_n(node, n_ia32_Bt_right); + if (is_ia32_Immediate(right)) { + ia32_immediate_attr_t const *const attr = get_ia32_immediate_attr_const(right); + int const offset = attr->offset; + assert(!attr->symconst); + assert(get_signed_imm_size(offset) == 1); + bemit8(0xBA); + bemit_modru(lreg, 4); + bemit8(offset); + } else { + bemit8(0xA3); + bemit_modrr(lreg, arch_get_irn_register(right)); + } +} + static void bemit_cmovcc(const ir_node *node) { const ia32_attr_t *attr = get_ia32_attr_const(node); @@ -3620,6 +3639,7 @@ static void ia32_register_binary_emitters(void) register_emitter(op_ia32_Bsf, bemit_bsf); register_emitter(op_ia32_Bsr, bemit_bsr); register_emitter(op_ia32_Bswap, bemit_bswap); + register_emitter(op_ia32_Bt, bemit_bt); register_emitter(op_ia32_CMovcc, bemit_cmovcc); register_emitter(op_ia32_Call, bemit_call); register_emitter(op_ia32_Cltd, bemit_cltd);