Implement binary emitter for ia32 bswap.
authorChristoph Mallon <christoph.mallon@gmx.de>
Sun, 11 Nov 2012 21:46:53 +0000 (22:46 +0100)
committerChristoph Mallon <christoph.mallon@gmx.de>
Sun, 11 Nov 2012 22:19:07 +0000 (23:19 +0100)
ir/be/ia32/ia32_emitter.c
ir/be/ia32/ia32_spec.pl

index 8d2f2c8..522f20d 100644 (file)
@@ -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);
index bb66c8f..402bce6 100644 (file)
@@ -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" ],