Fix PowerPC support, from upstream via Brad. Allows removing forced -O0

(always nice for code which is supposed to run fast). Tested by landry@
This commit is contained in:
sthen 2011-04-05 08:09:00 +00:00
parent 5dd2076054
commit cfd8f226fc
3 changed files with 86 additions and 7 deletions

View File

@ -1,8 +1,9 @@
# $OpenBSD: Makefile,v 1.8 2011/03/26 10:05:24 sthen Exp $
# $OpenBSD: Makefile,v 1.9 2011/04/05 08:09:00 sthen Exp $
COMMENT= library and toolset to operate arrays of data
DISTNAME= orc-0.4.11
REVISION= 0
CATEGORIES= devel
MASTER_SITES= http://code.entropywave.com/download/orc/
@ -25,10 +26,4 @@ USE_LIBTOOL= Yes
CONFIGURE_STYLE= autoconf
AUTOCONF_VERSION= 2.65
# Workaround for a known issue with the
# PowerPC AltiVec backend.
.if ${MACHINE_ARCH} == "powerpc"
CFLAGS+= -O0
.endif
.include <bsd.port.mk>

View File

@ -0,0 +1,31 @@
$OpenBSD: patch-orc_orcpowerpc_c,v 1.1 2011/04/05 08:09:00 sthen Exp $
don't clobber register r31
--- orc/orcpowerpc.c.orig Fri Mar 25 16:51:31 2011
+++ orc/orcpowerpc.c Fri Mar 25 16:53:03 2011
@@ -382,13 +382,13 @@ orc_powerpc_flush_cache (OrcCode *code)
ptr = code->code;
for (i=0;i<size;i+=cache_line_size) {
- __asm__ __volatile__ ("dcbst %0,%1" :: "r" (ptr), "r" (i));
+ __asm__ __volatile__ ("dcbst %0,%1" :: "b" (ptr), "r" (i));
}
__asm__ __volatile ("sync");
ptr = (void *)code->exec;
for (i=0;i<size;i+=cache_line_size) {
- __asm__ __volatile__ ("icbi %0,%1" :: "r" (ptr), "r" (i));
+ __asm__ __volatile__ ("icbi %0,%1" :: "b" (ptr), "r" (i));
}
__asm__ __volatile ("isync");
#endif
@@ -399,7 +399,7 @@ powerpc_load_constant (OrcCompiler *p, int i, int reg)
{
int j;
int value = p->constants[i].value;
- int greg = POWERPC_R31;
+ int greg = p->gp_tmpreg;
int label_skip, label_data;
switch (p->constants[i].type) {

View File

@ -0,0 +1,53 @@
$OpenBSD: patch-orc_orcrules-altivec_c,v 1.1 2011/04/05 08:09:00 sthen Exp $
- fix mullw rule
- fix div255w rule
--- orc/orcrules-altivec.c.orig Fri Mar 25 16:53:32 2011
+++ orc/orcrules-altivec.c Fri Mar 25 16:55:06 2011
@@ -388,17 +388,6 @@ powerpc_rule_mulhub (OrcCompiler *p, void *user, OrcIn
}
static void
-powerpc_rule_mullw (OrcCompiler *p, void *user, OrcInstruction *insn)
-{
- int src1 = ORC_SRC_ARG (p, insn, 0);
- int src2 = ORC_SRC_ARG (p, insn, 1);
- int dest = ORC_DEST_ARG (p, insn, 0);
-
- powerpc_emit_vmulesh (p, dest, src1, src2);
- powerpc_emit_vsldoi (p, dest, dest, dest, 2);
-}
-
-static void
powerpc_rule_mulhsw (OrcCompiler *p, void *user, OrcInstruction *insn)
{
int src1 = ORC_SRC_ARG (p, insn, 0);
@@ -418,7 +407,6 @@ powerpc_rule_mulhuw (OrcCompiler *p, void *user, OrcIn
powerpc_emit_vmuleuh (p, dest, src1, src2);
}
-#ifdef alternate
static void
powerpc_rule_mullw (OrcCompiler *p, void *user, OrcInstruction *insn)
{
@@ -430,7 +418,6 @@ powerpc_rule_mullw (OrcCompiler *p, void *user, OrcIns
powerpc_emit_vxor (p, tmp, tmp, tmp);
powerpc_emit_vmladduhm (p, dest, src1, src2, POWERPC_V0);
}
-#endif
static void
powerpc_rule_convsbw (OrcCompiler *p, void *user, OrcInstruction *insn)
@@ -1028,9 +1015,9 @@ powerpc_rule_div255w (OrcCompiler *p, void *user, OrcI
ORC_ASM_CODE(p," vspltish %s, 8\n", powerpc_get_regname(tmp2));
powerpc_emit_VX(p, 0x1000034c, powerpc_regnum(tmp2), 8, 0);
- powerpc_emit_VX_2 (p, "vsrw", 0x10000284, tmp, dest, tmp2);
+ powerpc_emit_VX_2 (p, "vsrh", 0x10000244, tmp, dest, tmp2);
powerpc_emit_VX_2 (p, "vadduhm", 0x10000040, dest, dest, tmp);
- powerpc_emit_VX_2 (p, "vsrw", 0x10000284, dest, dest, tmp2);
+ powerpc_emit_VX_2 (p, "vsrh", 0x10000244, dest, dest, tmp2);
}
void