Author: leo
Date: Tue Feb  7 14:26:04 2006
New Revision: 11468

Modified:
   trunk/src/jit/ppc/core.jit
   trunk/src/jit/ppc/jit_emit.h
Log:
PIC/JIT - ppc: prepare for recursive subs

* same as x86 from r11467
* ppc calling conventions are, well, strange


Modified: trunk/src/jit/ppc/core.jit
==============================================================================
--- trunk/src/jit/ppc/core.jit  (original)
+++ trunk/src/jit/ppc/core.jit  Tue Feb  7 14:26:04 2006
@@ -956,26 +956,8 @@ extern Parrot_set_returns_pc {
     if (jit_info->code_type == JIT_CODE_FILE)
        Parrot_jit_normal_op(jit_info, interpreter);
     else {
-       PMC *sig_pmc;
-       INTVAL *sig_bits, sig;
-
-       sig_pmc = CONTEXT(interpreter->ctx)->constants[CUR_OPCODE[1]]->u.key;
-       sig_bits = PMC_data(sig_pmc);
-       sig = sig_bits[0];
-       /* ISR2 <- args[0] */ 
-       jit_emit_lwz(jit_info->native_ptr, ISR2, 0, r5);
-       switch (sig & (PARROT_ARG_TYPE_MASK|PARROT_ARG_CONSTANT)) {
-           case PARROT_ARG_INTVAL:
-               jit_emit_stw(jit_info->native_ptr, MAP(2), 0, ISR2);
-               break;
-           case PARROT_ARG_INTVAL|PARROT_ARG_CONSTANT:
-               jit_emit_mov_ri_i(NATIVECODE, ISR1, *INT_CONST[2]);
-               jit_emit_stw(jit_info->native_ptr, ISR1, 0, ISR2);
-               break;
-           default:
-               internal_exception(1, "set_returns_jit - unknown tyep");
-               break;
-       }
+        jit_set_returns_pc(jit_info, interpreter, 
+            jit_info->flags & JIT_CODE_RECURSIVE);
     }
 }
 
@@ -984,11 +966,15 @@ extern Parrot_returncc {
        Parrot_jit_restart_op(jit_info, interpreter);
     else {
        /* fetch args[n+1] -> retval */
-       jit_emit_lwz(jit_info->native_ptr, r3, 4 + jit_info->n_args * 4, r5);
+        if (!(jit_info->flags & JIT_CODE_RECURSIVE)) {
+           jit_emit_lwz(jit_info->native_ptr, r3, 4 + jit_info->n_args * 4, 
r5);
+       }
 
        /* return sequence */
        jit_emit_lwz(jit_info->native_ptr, r1, 0, r1);
-       jit_emit_lwz(jit_info->native_ptr, r31, -4, r1);
+        if (!(jit_info->flags & JIT_CODE_RECURSIVE)) {
+           jit_emit_lwz(jit_info->native_ptr, r31, -4, r1);
+       }
        jit_emit_lwz(jit_info->native_ptr, r0, 8, r1);   /* opt */
        jit_emit_mtlr(jit_info->native_ptr, r0);   /* opt */
        jit_emit_blr(jit_info->native_ptr);
@@ -998,17 +984,8 @@ extern Parrot_returncc {
 extern Parrot_get_params_pc {
     if (jit_info->code_type == JIT_CODE_FILE)
        Parrot_jit_normal_op(jit_info, interpreter);
-    else {
-        PMC *sig_pmc;
-        INTVAL *sig_bits, i, n;
-
-        sig_pmc = CONTEXT(interpreter->ctx)->constants[CUR_OPCODE[1]]->u.key;
-        sig_bits = PMC_data(sig_pmc);
-        n = PMC_int_val(sig_pmc);
-        jit_info->n_args = n;
-        for (i = 0; i < n; ++i) {
-            jit_emit_lwz(NATIVECODE, MAP(2+i), 4 + i*4, r5);
-       }
+    else if (!(jit_info->flags & JIT_CODE_RECURSIVE)) {
+        jit_get_params_pc(jit_info, interpreter);
     }
 }
 

Modified: trunk/src/jit/ppc/jit_emit.h
==============================================================================
--- trunk/src/jit/ppc/jit_emit.h        (original)
+++ trunk/src/jit/ppc/jit_emit.h        Tue Feb  7 14:26:04 2006
@@ -784,6 +784,63 @@ Parrot_jit_restart_op(Parrot_jit_info_t 
 }
 
 #endif /* JIT_EMIT == 2 */
+
+#define NATIVECODE jit_info->native_ptr
+#define CUR_OPCODE jit_info->cur_op
+#define MAP(i) jit_info->optimizer->map_branch[jit_info->op_i + (i)]
+static void
+jit_get_params_pc(Parrot_jit_info_t *jit_info, Interp * interpreter)
+{
+    PMC *sig_pmc;
+    INTVAL *sig_bits, i, n;
+
+    sig_pmc = CONTEXT(interpreter->ctx)->constants[CUR_OPCODE[1]]->u.key;
+    sig_bits = PMC_data(sig_pmc);
+    n = PMC_int_val(sig_pmc);
+    jit_info->n_args = n;
+    for (i = 0; i < n; ++i) {
+        jit_emit_lwz(NATIVECODE, MAP(2+i), 4 + i*4, r5);
+    }
+}
+
+static void
+jit_set_returns_pc(Parrot_jit_info_t *jit_info, Interp * interpreter, 
+        int recursive)
+{
+    PMC *sig_pmc;
+    INTVAL *sig_bits, sig;
+
+    sig_pmc = CONTEXT(interpreter->ctx)->constants[CUR_OPCODE[1]]->u.key;
+    sig_bits = PMC_data(sig_pmc);
+    sig = sig_bits[0];
+    if (!recursive) {
+        /* ISR2 <- args[0] */ 
+        jit_emit_lwz(jit_info->native_ptr, ISR2, 0, r5);
+    }
+    switch (sig & (PARROT_ARG_TYPE_MASK|PARROT_ARG_CONSTANT)) {
+        case PARROT_ARG_INTVAL:
+            if (recursive) {
+                if (r3 != MAP(2))
+                    jit_emit_mov_rr(NATIVECODE, r3, MAP(2));
+            }
+            else {
+                jit_emit_stw(jit_info->native_ptr, MAP(2), 0, ISR2);
+            }
+            break;
+        case PARROT_ARG_INTVAL|PARROT_ARG_CONSTANT:
+            if (recursive) {
+                jit_emit_mov_ri_i(NATIVECODE, r3, CUR_OPCODE[2]);
+            }
+            else {
+                jit_emit_stw(jit_info->native_ptr, ISR1, 0, ISR2);
+            }
+            break;
+        default:
+            internal_exception(1, "set_returns_jit - unknown tyep");
+            break;
+    }
+}
+
 #if JIT_EMIT == 0
 
 /*
@@ -846,7 +903,33 @@ Parrot_jit_begin_sub_regs(Parrot_jit_inf
     /* r31 = 0 - needed for load immediate */
     jit_emit_xor_rrr(jit_info->native_ptr, r31, r31, r31);
 
-
+    if (jit_info->flags & JIT_CODE_RECURSIVE) {
+        char * L1;
+        int offs;
+        jit_get_params_pc(jit_info, interpreter);
+        /* remember fixup position - call sub */
+        L1 = NATIVECODE;
+        _emit_bx(NATIVECODE, 1, 0xbeef); /* bl */
+        /* fetch args */
+        jit_emit_lwz(jit_info->native_ptr, ISR2, 0, r5);
+        /* store INTVAL result */
+        jit_emit_stw(jit_info->native_ptr, r3, 0, ISR2);
+        /* fetch pc -> return it */
+        jit_emit_lwz(jit_info->native_ptr, r3, 4 + jit_info->n_args * 4, r5);
+       /* return sequence */
+       jit_emit_lwz(jit_info->native_ptr, r1, 0, r1);
+       jit_emit_lwz(jit_info->native_ptr, r31, -4, r1);
+       jit_emit_lwz(jit_info->native_ptr, r0, 8, r1);   /* opt */
+       jit_emit_mtlr(jit_info->native_ptr, r0);   /* opt */
+       jit_emit_blr(jit_info->native_ptr);
+        /* re-emit call */
+        offs = NATIVECODE - L1;
+        _emit_bx(L1, 1, offs); /* bl */
+        /* TODO this is a part of call */
+        jit_emit_mflr(jit_info->native_ptr, r0);
+        jit_emit_stw(jit_info->native_ptr, r0, 8, r1); /* stw     r0,8(r1) */
+        jit_emit_stwu(jit_info->native_ptr, r1, -32, r1);
+    }
 }
 
 static void

Reply via email to