summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDoug Nazar <nazard@nazar.ca>2019-09-13 21:07:35 -0400
committerDoug Nazar <nazard@nazar.ca>2019-09-13 21:07:35 -0400
commit261caa09fed2d79318ef3b697a9e6316e548588b (patch)
tree0cb76d4666c22d02e0705e5896081b9ff2fc90e1
parent02d416b33d68ac5a1ef988b8a34d11b2524f3719 (diff)
powerpc: Fix a few rules to handle multiple vector elements
-rw-r--r--orc/orcrules-altivec.c31
1 files changed, 12 insertions, 19 deletions
diff --git a/orc/orcrules-altivec.c b/orc/orcrules-altivec.c
index 598ae6e..96b99e4 100644
--- a/orc/orcrules-altivec.c
+++ b/orc/orcrules-altivec.c
@@ -642,16 +642,13 @@ powerpc_rule_mulhuw (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);
+ int tmp = orc_compiler_get_temp_reg(p);
+ int perm = powerpc_get_constant_full(p, 0x10110001, 0x14150405,
+ 0x18190809, 0x1c1d0c0d);;
- if (IS_POWERPC_BE (p)) {
- powerpc_emit_vmuleuh (p, dest, src1, src2);
- } else {
- int tmp = powerpc_get_constant (p, ORC_CONST_SPLAT_B, 8);
-
- powerpc_emit_vmulouh (p, dest, src1, src2);
- powerpc_emit_VX_2 (p, "vsro", 0x1000044c, dest, dest, tmp);
- powerpc_emit_VX_2 (p, "vsro", 0x1000044c, dest, dest, tmp);
- }
+ powerpc_emit_vmulouh (p, tmp, src1, src2);
+ powerpc_emit_vmuleuh (p, dest, src1, src2);
+ powerpc_emit_vperm(p, dest, tmp, dest, perm);
}
static void
@@ -882,17 +879,13 @@ powerpc_rule_mulll (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);
+ int tmp = orc_compiler_get_temp_reg(p);
+ int perm = powerpc_get_constant_full(p, 0x14151617, 0x04050607,
+ 0x1c1d1e1f, 0x0c0d0e0f);
- if (IS_POWERPC_BE (p)) {
- int perm;
-
- powerpc_emit_vmuleuw (p, dest, src1, src2);
- perm = powerpc_get_constant_full (p, 0x04050607, 0x04050607,
- 0x0c0d0e0f, 0x0c0d0e0f);
- powerpc_emit_vperm (p, dest, dest, dest, perm);
- } else {
- powerpc_emit_vmulouw (p, dest, src1, src2);
- }
+ powerpc_emit_vmulouw (p, tmp, src1, src2);
+ powerpc_emit_vmuleuw (p, dest, src1, src2);
+ powerpc_emit_vperm (p, dest, tmp, dest, perm);
}
static void