From b8dd50e584e9747da3d0bdc83dff71e13e9deb08 Mon Sep 17 00:00:00 2001 From: Matthias Braun Date: Thu, 9 Aug 2012 12:04:59 +0200 Subject: [PATCH] sparc: support float perms --- ir/be/sparc/sparc_cconv.c | 3 ++- ir/be/sparc/sparc_emitter.c | 22 +++++++++++++++++++--- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/ir/be/sparc/sparc_cconv.c b/ir/be/sparc/sparc_cconv.c index c94fa45be..cccf56990 100644 --- a/ir/be/sparc/sparc_cconv.c +++ b/ir/be/sparc/sparc_cconv.c @@ -51,6 +51,8 @@ static const unsigned ignore_regs[] = { REG_FPFLAGS, REG_FLAGS, REG_Y, + + REG_F31, }; static const arch_register_t* const param_regs[] = { @@ -117,7 +119,6 @@ static const unsigned caller_saves[] = { REG_F28, REG_F29, REG_F30, - REG_F31, REG_FLAGS, REG_FPFLAGS, REG_Y, diff --git a/ir/be/sparc/sparc_emitter.c b/ir/be/sparc/sparc_emitter.c index 0af1f4077..b8ad1c38f 100644 --- a/ir/be/sparc/sparc_emitter.c +++ b/ir/be/sparc/sparc_emitter.c @@ -798,9 +798,25 @@ static void emit_sparc_Call(const ir_node *node) static void emit_be_Perm(const ir_node *irn) { - sparc_emitf(irn, "xor %S1, %S0, %S0"); - sparc_emitf(irn, "xor %S1, %S0, %S1"); - sparc_emitf(irn, "xor %S1, %S0, %S0"); + ir_mode *mode = get_irn_mode(get_irn_n(irn, 0)); + if (mode_is_float(mode)) { + const arch_register_t *reg0 = arch_get_irn_register_in(irn, 0); + const arch_register_t *reg1 = arch_get_irn_register_in(irn, 1); + unsigned reg_idx0 = reg0->global_index; + unsigned reg_idx1 = reg1->global_index; + unsigned width = arch_get_irn_register_req_in(irn, 0)->width; + for (unsigned i = 0; i < width; ++i) { + const arch_register_t *r0 = &sparc_registers[reg_idx0+i]; + const arch_register_t *r1 = &sparc_registers[reg_idx1+i]; + sparc_emitf(irn, "fmovs %R, %%f31", r0); + sparc_emitf(irn, "fmovs %R, %R", r1, r0); + sparc_emitf(irn, "fmovs %%f31, %R", r1); + } + } else { + sparc_emitf(irn, "xor %S1, %S0, %S0"); + sparc_emitf(irn, "xor %S1, %S0, %S1"); + sparc_emitf(irn, "xor %S1, %S0, %S0"); + } } /* The stack pointer must always be SPARC_STACK_ALIGNMENT bytes aligned, so get -- 2.20.1