From 8346b244168af0098565c0f1e7c58bdeeeec365a6f8e3d75abcb0789ac7c4232 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ismail=20D=C3=B6nmez?= Date: Tue, 18 Sep 2012 13:09:39 +0000 Subject: [PATCH] Accepting request 134801 from home:AndreasSchwab:ff - ppc64.patch: Add support for PowerPC64 - altivec.patch: Fix altivec implementation of cmpltf and cmplef operations - Reenable check on ppc and ppc64 OBS-URL: https://build.opensuse.org/request/show/134801 OBS-URL: https://build.opensuse.org/package/show/multimedia:libs/orc?expand=0&rev=33 --- altivec.patch | 20 +++++ orc.changes | 7 ++ orc.spec | 6 +- ppc64.patch | 228 ++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 260 insertions(+), 1 deletion(-) create mode 100644 altivec.patch create mode 100644 ppc64.patch diff --git a/altivec.patch b/altivec.patch new file mode 100644 index 0000000..d9bb56d --- /dev/null +++ b/altivec.patch @@ -0,0 +1,20 @@ +--- orc/orcrules-altivec.c ++++ orc/orcrules-altivec.c +@@ -1141,7 +1141,7 @@ powerpc_rule_cmpltf (OrcCompiler *p, void *user, OrcInstruction *insn) + int src2 = ORC_SRC_ARG (p, insn, 1); + int dest = ORC_DEST_ARG (p, insn, 0); + +- powerpc_emit_VXR (p, "vcmpgefp", 0x100001c6, dest, src2, src1, FALSE); ++ powerpc_emit_VXR (p, "vcmpgtfp", 0x100002c6, dest, src2, src1, FALSE); + } + + static void +@@ -1151,7 +1151,7 @@ powerpc_rule_cmplef (OrcCompiler *p, void *user, OrcInstruction *insn) + int src2 = ORC_SRC_ARG (p, insn, 1); + int dest = ORC_DEST_ARG (p, insn, 0); + +- powerpc_emit_VXR (p, "vcmpgtfp", 0x100002c6, dest, src2, src1, FALSE); ++ powerpc_emit_VXR (p, "vcmpgefp", 0x100001c6, dest, src2, src1, FALSE); + } + + static void diff --git a/orc.changes b/orc.changes index 45c880d..b15fadd 100644 --- a/orc.changes +++ b/orc.changes @@ -1,3 +1,10 @@ +------------------------------------------------------------------- +Mon Sep 17 17:48:52 UTC 2012 - schwab@linux-m68k.org + +- ppc64.patch: Add support for PowerPC64 +- altivec.patch: Fix altivec implementation of cmpltf and cmplef operations +- Reenable check on ppc and ppc64 + ------------------------------------------------------------------- Thu Mar 8 11:58:18 UTC 2012 - idonmez@suse.com diff --git a/orc.spec b/orc.spec index cfbb35b..73f1c27 100644 --- a/orc.spec +++ b/orc.spec @@ -26,6 +26,8 @@ Release: 0 Url: http://code.entropywave.com/projects/orc/ Source: http://code.entropywave.com/download/orc/%{name}-%{version}.tar.gz Source99: baselibs.conf +Patch1: ppc64.patch +Patch2: altivec.patch BuildRequires: gtk-doc BuildRequires: pkg-config Provides: %{name}-devel = %{version} @@ -62,6 +64,8 @@ arithmetic operations. %prep %setup -q +%patch1 +%patch2 %build %configure \ @@ -77,7 +81,7 @@ rm -rf %{buildroot}%{_libdir}/orc find %{buildroot}%{_libdir} -name '*.la' -delete -print %check -%ifnarch %arm ppc ppc64 +%ifnarch %arm make check %endif diff --git a/ppc64.patch b/ppc64.patch new file mode 100644 index 0000000..401f82a --- /dev/null +++ b/ppc64.patch @@ -0,0 +1,228 @@ +--- orc/orcpowerpc.c ++++ orc/orcpowerpc.c +@@ -150,6 +150,48 @@ powerpc_emit_stwu (OrcCompiler *compiler, int regs, int rega, int offset) + } + + void ++powerpc_emit_ld (OrcCompiler *compiler, int regd, int rega, int imm) ++{ ++ unsigned int insn; ++ ++ ORC_ASM_CODE(compiler," ld %s, %d(%s)\n", ++ powerpc_get_regname(regd), ++ imm, powerpc_get_regname(rega)); ++ insn = (58<<26) | (powerpc_regnum (regd)<<21) | (powerpc_regnum (rega)<<16); ++ insn |= imm&0xffff; ++ ++ powerpc_emit (compiler, insn); ++} ++ ++void ++powerpc_emit_std (OrcCompiler *compiler, int regs, int rega, int offset) ++{ ++ unsigned int insn; ++ ++ ORC_ASM_CODE(compiler," std %s, %d(%s)\n", ++ powerpc_get_regname(regs), ++ offset, powerpc_get_regname(rega)); ++ insn = (62<<26) | (powerpc_regnum (regs)<<21) | (powerpc_regnum (rega)<<16); ++ insn |= offset&0xffff; ++ ++ powerpc_emit (compiler, insn); ++} ++ ++void ++powerpc_emit_stdu (OrcCompiler *compiler, int regs, int rega, int offset) ++{ ++ unsigned int insn; ++ ++ ORC_ASM_CODE(compiler," stdu %s, %d(%s)\n", ++ powerpc_get_regname(regs), ++ offset, powerpc_get_regname(rega)); ++ insn = (62<<26) | (powerpc_regnum (regs)<<21) | (powerpc_regnum (rega)<<16); ++ insn |= (offset&0xffff) | 1; ++ ++ powerpc_emit (compiler, insn); ++} ++ ++void + powerpc_emit_srawi (OrcCompiler *compiler, int regd, int rega, int shift, + int record) + { +@@ -381,6 +423,9 @@ orc_powerpc_flush_cache (OrcCode *code) + int size = code->code_size; + + ptr = code->code; ++#ifdef __powerpc64__ ++ *(unsigned char **) ptr = (unsigned char *) code->exec + 24; ++#endif + for (i=0;iis_64bit) { ++ powerpc_emit_ld (p, ++ greg, ++ POWERPC_R3, ++ (int)ORC_STRUCT_OFFSET(OrcExecutor, arrays[ORC_VAR_A2])); ++ powerpc_emit_ld (p, ++ greg, greg, ++ (int)ORC_STRUCT_OFFSET(OrcCode, exec)); ++ } else { ++ powerpc_emit_lwz (p, ++ greg, ++ POWERPC_R3, ++ (int)ORC_STRUCT_OFFSET(OrcExecutor, arrays[ORC_VAR_A2])); ++ powerpc_emit_lwz (p, ++ greg, greg, ++ (int)ORC_STRUCT_OFFSET(OrcCode, exec)); ++ } + + powerpc_add_fixup (p, 1, p->codeptr, label_data); + { +--- orc/orcpowerpc.h ++++ orc/orcpowerpc.h +@@ -6,6 +6,10 @@ + + ORC_BEGIN_DECLS + ++typedef enum { ++ ORC_TARGET_POWERPC_64BIT = (1<<0) ++} OrcTargetPowerPCFlags; ++ + #ifdef ORC_ENABLE_UNSTABLE_API + + enum { +@@ -86,6 +90,9 @@ void powerpc_emit_addi (OrcCompiler *compiler, int regd, int rega, int imm); + void powerpc_emit_lwz (OrcCompiler *compiler, int regd, int rega, int imm); + void powerpc_emit_stw (OrcCompiler *compiler, int regs, int rega, int offset); + void powerpc_emit_stwu (OrcCompiler *compiler, int regs, int rega, int offset); ++void powerpc_emit_ld (OrcCompiler *compiler, int regd, int rega, int imm); ++void powerpc_emit_std (OrcCompiler *compiler, int regs, int rega, int offset); ++void powerpc_emit_stdu (OrcCompiler *compiler, int regs, int rega, int offset); + + void powerpc_emit_ret (OrcCompiler *compiler); + void powerpc_emit_b (OrcCompiler *compiler, int label); +--- orc/orcprogram-altivec.c ++++ orc/orcprogram-altivec.c +@@ -26,7 +26,17 @@ powerpc_emit_prologue (OrcCompiler *compiler) + ORC_ASM_CODE (compiler, ".global %s\n", compiler->program->name); + ORC_ASM_CODE (compiler, "%s:\n", compiler->program->name); + +- powerpc_emit_stwu (compiler, POWERPC_R1, POWERPC_R1, -16); ++ if (compiler->is_64bit) { ++ ORC_ASM_CODE (compiler, " .quad .%s,.TOC.@tocbase,0\n", ++ compiler->program->name); ++ ORC_ASM_CODE (compiler, ".%s:\n", compiler->program->name); ++ powerpc_emit (compiler, 0); powerpc_emit (compiler, 0); ++ powerpc_emit (compiler, 0); powerpc_emit (compiler, 0); ++ powerpc_emit (compiler, 0); powerpc_emit (compiler, 0); ++ powerpc_emit_stdu (compiler, POWERPC_R1, POWERPC_R1, -16); ++ } else { ++ powerpc_emit_stwu (compiler, POWERPC_R1, POWERPC_R1, -16); ++ } + + for(i=POWERPC_R13;i<=POWERPC_R31;i++){ + if (compiler->used_regs[i]) { +@@ -82,7 +92,13 @@ orc_powerpc_init (void) + unsigned int + orc_compiler_powerpc_get_default_flags (void) + { +- return 0; ++ unsigned int flags = 0; ++ ++#ifdef __powerpc64__ ++ flags |= ORC_TARGET_POWERPC_64BIT; ++#endif ++ ++ return flags; + } + + void +@@ -90,6 +106,10 @@ orc_compiler_powerpc_init (OrcCompiler *compiler) + { + int i; + ++ if (compiler->target_flags & ORC_TARGET_POWERPC_64BIT) { ++ compiler->is_64bit = TRUE; ++ } ++ + for(i=0;i<32;i++){ + compiler->valid_regs[POWERPC_R0+i] = 1; + compiler->valid_regs[POWERPC_V0+i] = 1; +@@ -127,10 +147,17 @@ powerpc_load_inner_constants (OrcCompiler *compiler) + case ORC_VAR_TYPE_SRC: + case ORC_VAR_TYPE_DEST: + if (compiler->vars[i].ptr_register) { +- powerpc_emit_lwz (compiler, +- compiler->vars[i].ptr_register, +- POWERPC_R3, +- (int)ORC_STRUCT_OFFSET(OrcExecutor, arrays[i])); ++ if (compiler->is_64bit) { ++ powerpc_emit_ld (compiler, ++ compiler->vars[i].ptr_register, ++ POWERPC_R3, ++ (int)ORC_STRUCT_OFFSET(OrcExecutor, arrays[i])); ++ } else { ++ powerpc_emit_lwz (compiler, ++ compiler->vars[i].ptr_register, ++ POWERPC_R3, ++ (int)ORC_STRUCT_OFFSET(OrcExecutor, arrays[i])); ++ } + } else { + /* FIXME */ + ORC_ASM_CODE(compiler,"ERROR"); +@@ -319,10 +346,17 @@ orc_compiler_powerpc_assemble (OrcCompiler *compiler) + if (compiler->vars[k].vartype == ORC_VAR_TYPE_SRC || + compiler->vars[k].vartype == ORC_VAR_TYPE_DEST) { + if (compiler->vars[k].ptr_register) { +- powerpc_emit_lwz (compiler, +- compiler->vars[k].ptr_register, +- POWERPC_R3, +- (int)ORC_STRUCT_OFFSET(OrcExecutor, arrays[k])); ++ if (compiler->is_64bit) { ++ powerpc_emit_ld (compiler, ++ compiler->vars[k].ptr_register, ++ POWERPC_R3, ++ (int)ORC_STRUCT_OFFSET(OrcExecutor, arrays[k])); ++ } else { ++ powerpc_emit_lwz (compiler, ++ compiler->vars[k].ptr_register, ++ POWERPC_R3, ++ (int)ORC_STRUCT_OFFSET(OrcExecutor, arrays[k])); ++ } + powerpc_emit_lwz (compiler, + POWERPC_R0, + POWERPC_R3, +@@ -331,10 +365,17 @@ orc_compiler_powerpc_assemble (OrcCompiler *compiler) + compiler->vars[k].ptr_register, + compiler->vars[k].ptr_register, + POWERPC_R0); +- powerpc_emit_stw (compiler, +- compiler->vars[k].ptr_register, +- POWERPC_R3, +- (int)ORC_STRUCT_OFFSET(OrcExecutor, arrays[k])); ++ if (compiler->is_64bit) { ++ powerpc_emit_std (compiler, ++ compiler->vars[k].ptr_register, ++ POWERPC_R3, ++ (int)ORC_STRUCT_OFFSET(OrcExecutor, arrays[k])); ++ } else { ++ powerpc_emit_stw (compiler, ++ compiler->vars[k].ptr_register, ++ POWERPC_R3, ++ (int)ORC_STRUCT_OFFSET(OrcExecutor, arrays[k])); ++ } + } else { + ORC_ASM_CODE(compiler,"ERROR\n"); + }