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 

Reply via email to