Author: leo
Date: Sun Mar 5 11:49:23 2006
New Revision: 11797
Modified:
trunk/src/jit/ppc/core.jit
trunk/src/jit/ppc/jit_emit.h
Log:
JIT/PIC/ppc - fix codegen
* move register saving from callr to set_args
* ./parrot -Sj fib.pir 38 runs now ok on darwin
Modified: trunk/src/jit/ppc/core.jit
==============================================================================
--- trunk/src/jit/ppc/core.jit (original)
+++ trunk/src/jit/ppc/core.jit Sun Mar 5 11:49:23 2006
@@ -1278,8 +1278,6 @@
skip = -1;
else
skip = MAP(2); /* skip result - save rest */
- /* XXX TODO move to set_args */
- jit_save_regs_call(jit_info, interpreter, skip);
here = NATIVECODE - jit_info->arena.start;
offset -= here;
Modified: trunk/src/jit/ppc/jit_emit.h
==============================================================================
--- trunk/src/jit/ppc/jit_emit.h (original)
+++ trunk/src/jit/ppc/jit_emit.h Sun Mar 5 11:49:23 2006
@@ -953,15 +953,19 @@
}
}
+static int jit_save_regs_call(Parrot_jit_info_t *, Interp * , int skip);
+
static void
jit_set_args_pc(Parrot_jit_info_t *jit_info, Interp * interpreter,
int recursive)
{
- PMC *sig_args, *sig_params;
+ PMC *sig_args, *sig_params, *sig_result;
INTVAL *sig_bits, sig, i, n;
struct PackFile_Constant ** constants;
- opcode_t *params;
+ opcode_t *params, *result;
char params_map;
+ int skip, used_n;
+ const jit_arch_regs *reg_info;
if (!recursive) {
/* create args array */
@@ -977,6 +981,20 @@
ASSERT_SIG_PMC(sig_params);
sig_bits = SIG_ARRAY(sig_args);
n = SIG_ELEMS(sig_args);
+ /*
+ * preserve registers - need get_results, because we skip the
+ * return value
+ */
+ result = CUR_OPCODE + 2 + n + 3; /* set_args, set_p_pc */
+ assert(*result == PARROT_OP_get_results_pc);
+ sig_result = constants[result[1]]->u.key;
+ ASSERT_SIG_PMC(sig_result);
+
+ if (!SIG_ELEMS(sig_result))
+ skip = -1;
+ else
+ skip = MAP(2 + n + 3 + 2);
+ used_n = jit_save_regs_call(jit_info, interpreter, skip);
for (i = 0; i < n; ++i) {
sig = sig_bits[i];
/* move args to params regs */
@@ -1002,7 +1020,7 @@
* b) all used register around a call (skip >= 0 := return result
* TODO save N regs for b) too
*/
-static void
+static int
jit_save_regs_call(Parrot_jit_info_t *jit_info, Interp * interpreter, int skip)
{
int i, used_i, save_i;
@@ -1021,6 +1039,7 @@
jit_emit_stw(jit_info->native_ptr, reg_info->map_I[i], 24 + i*4, r1);
}
/* preserve link register */
+ return 0; /* TODO N regs */
}
static void