From 3b6152031e325cfa5798c6aa4523cd9b2d8971ea Mon Sep 17 00:00:00 2001 From: Doug Nazar Date: Fri, 13 Sep 2019 19:52:58 -0400 Subject: [PATCH] powerpc: Move load/store align helpers to common file --- orc/orcpowerpc.c | 39 +++++++++++++++++++++++++++++++++++++++ orc/orcpowerpc.h | 3 +++ orc/orcrules-altivec.c | 34 +--------------------------------- 3 files changed, 43 insertions(+), 33 deletions(-) diff --git a/orc/orcpowerpc.c b/orc/orcpowerpc.c index 0b84134..ed98437 100644 --- a/orc/orcpowerpc.c +++ b/orc/orcpowerpc.c @@ -740,3 +740,42 @@ void powerpc_emit_label (OrcCompiler *compiler, int label) powerpc_add_label (compiler, compiler->codeptr, label); } +void +powerpc_load_align (OrcCompiler *compiler, int vector_reg, int offset_reg, int src_reg) +{ + if (IS_POWERPC_BE (compiler)) { + ORC_ASM_CODE(compiler," lvsl %s, %s, %s\n", + powerpc_get_regname (vector_reg), + offset_reg == 0 ? "0" : powerpc_get_regname (offset_reg), + powerpc_get_regname (src_reg)); + powerpc_emit_X (compiler, 0x7c00000c, powerpc_regnum(vector_reg), + offset_reg == 0 ? 0 : powerpc_regnum(offset_reg), powerpc_regnum(src_reg)); + } else { + ORC_ASM_CODE(compiler," lvsr %s, %s, %s\n", + powerpc_get_regname (vector_reg), + offset_reg == 0 ? "0" : powerpc_get_regname (offset_reg), + powerpc_get_regname (src_reg)); + powerpc_emit_X (compiler, 0x7c00004c, powerpc_regnum(vector_reg), + offset_reg == 0 ? 0 : powerpc_regnum(offset_reg), powerpc_regnum(src_reg)); + } +} + +void +powerpc_store_align (OrcCompiler *compiler, int vector_reg, int offset_reg, int src_reg) +{ + if (IS_POWERPC_BE (compiler)) { + ORC_ASM_CODE(compiler," lvsr %s, %s, %s\n", + powerpc_get_regname (vector_reg), + offset_reg == 0 ? "0" : powerpc_get_regname (offset_reg), + powerpc_get_regname (src_reg)); + powerpc_emit_X (compiler, 0x7c00004c, powerpc_regnum(vector_reg), + offset_reg == 0 ? 0 : powerpc_regnum(offset_reg), powerpc_regnum(src_reg)); + } else { + ORC_ASM_CODE(compiler," lvsl %s, %s, %s\n", + powerpc_get_regname (vector_reg), + offset_reg == 0 ? "0" : powerpc_get_regname (offset_reg), + powerpc_get_regname (src_reg)); + powerpc_emit_X (compiler, 0x7c00000c, powerpc_regnum(vector_reg), + offset_reg == 0 ? 0 : powerpc_regnum(offset_reg), powerpc_regnum(src_reg)); + } +} diff --git a/orc/orcpowerpc.h b/orc/orcpowerpc.h index e6b315a..a4b6c06 100644 --- a/orc/orcpowerpc.h +++ b/orc/orcpowerpc.h @@ -138,6 +138,9 @@ void powerpc_emit_full_constants (OrcCompiler* p); void powerpc_emit_load_address (OrcCompiler* compiler, int regd, int rega, int imm); void powerpc_load_constant (OrcCompiler* p, int i, int reg); +void powerpc_load_align (OrcCompiler *compiler, int vector_reg, int offset_reg, int src_reg); +void powerpc_store_align (OrcCompiler *compiler, int vector_reg, int offset_reg, int src_reg); + /* instructions */ #define powerpc_emit_vand(p,a,b,c) powerpc_emit_VX_2 (p, "vand", 0x10000404, a, b, c) #define powerpc_emit_vandc(p,a,b,c) powerpc_emit_VX_2 (p, "vandc", 0x10000444, a, b, c) diff --git a/orc/orcrules-altivec.c b/orc/orcrules-altivec.c index a17e024..b453d64 100644 --- a/orc/orcrules-altivec.c +++ b/orc/orcrules-altivec.c @@ -15,26 +15,6 @@ /* rules */ -static void -powerpc_load_align (OrcCompiler *compiler, int vector_reg, int offset_reg, int src_reg) -{ - if (IS_POWERPC_BE (compiler)) { - ORC_ASM_CODE(compiler," lvsl %s, %s, %s\n", - powerpc_get_regname (vector_reg), - offset_reg == 0 ? "0" : powerpc_get_regname (offset_reg), - powerpc_get_regname (src_reg)); - powerpc_emit_X (compiler, 0x7c00000c, powerpc_regnum(vector_reg), - offset_reg == 0 ? 0 : powerpc_regnum(offset_reg), powerpc_regnum(src_reg)); - } else { - ORC_ASM_CODE(compiler," lvsr %s, %s, %s\n", - powerpc_get_regname (vector_reg), - offset_reg == 0 ? "0" : powerpc_get_regname (offset_reg), - powerpc_get_regname (src_reg)); - powerpc_emit_X (compiler, 0x7c00004c, powerpc_regnum(vector_reg), - offset_reg == 0 ? 0 : powerpc_regnum(offset_reg), powerpc_regnum(src_reg)); - } -} - static inline int powerpc_select_value (OrcCompiler *compiler, int be_value, int le_value) { @@ -322,19 +302,7 @@ powerpc_rule_storeX (OrcCompiler *compiler, void *user, OrcInstruction *insn) int perm = orc_compiler_get_temp_reg (compiler); int tmp = orc_compiler_get_temp_reg (compiler); - if (IS_POWERPC_BE (compiler)) { - ORC_ASM_CODE(compiler," lvsr %s, 0, %s\n", - powerpc_get_regname (perm), - powerpc_get_regname (dest->ptr_register)); - powerpc_emit_X (compiler, 0x7c00004c, powerpc_regnum(perm), - 0, powerpc_regnum(dest->ptr_register)); - } else { - ORC_ASM_CODE(compiler," lvsl %s, 0, %s\n", - powerpc_get_regname (perm), - powerpc_get_regname (dest->ptr_register)); - powerpc_emit_X (compiler, 0x7c00000c, powerpc_regnum(perm), - 0, powerpc_regnum(dest->ptr_register)); - } + powerpc_store_align (compiler, perm, 0, dest->ptr_register); powerpc_emit_vperm (compiler, tmp, src->alloc, src->alloc, perm); switch (size) { -- 2.7.4