From: Christoph Mallon Date: Sun, 11 Nov 2012 21:46:53 +0000 (+0100) Subject: Implement binary emitter for ia32 bswap. X-Git-Url: http://nsz.repo.hu/git/?a=commitdiff_plain;h=2b46e60b14fff10d1991dfca926718b0604dd16f;p=libfirm Implement binary emitter for ia32 bswap. --- diff --git a/ir/be/ia32/ia32_emitter.c b/ir/be/ia32/ia32_emitter.c index 8d2f2c834..522f20db6 100644 --- a/ir/be/ia32/ia32_emitter.c +++ b/ir/be/ia32/ia32_emitter.c @@ -2514,6 +2514,12 @@ static void bemit_bsr(ir_node const *const node) bemit_0f_unop_reg(node, 0xBD, n_ia32_Bsr_operand); } +static void bemit_bswap(ir_node const *const node) +{ + bemit8(0x0F); + bemit_modru(arch_get_irn_register_out(node, pn_ia32_Bswap_res), 1); +} + static void bemit_cmovcc(const ir_node *node) { const ia32_attr_t *attr = get_ia32_attr_const(node); @@ -3595,6 +3601,7 @@ static void ia32_register_binary_emitters(void) register_emitter(op_ia32_Breakpoint, bemit_int3); 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_CMovcc, bemit_cmovcc); register_emitter(op_ia32_Call, bemit_call); register_emitter(op_ia32_Cltd, bemit_cltd); diff --git a/ir/be/ia32/ia32_spec.pl b/ir/be/ia32/ia32_spec.pl index bb66c8f52..402bce62d 100644 --- a/ir/be/ia32/ia32_spec.pl +++ b/ir/be/ia32/ia32_spec.pl @@ -1435,6 +1435,7 @@ Bswap => { irn_flags => [ "rematerializable" ], reg_req => { in => [ "gp" ], out => [ "in_r1" ] }, + outs => [ "res" ], emit => 'bswap%M %S0', ins => [ "val" ], units => [ "GP" ],