Author: leo
Date: Thu Feb  9 05:59:09 2006
New Revision: 11483

Modified:
   trunk/include/parrot/inter_call.h
   trunk/src/jit/i386/core.jit
   trunk/src/jit/i386/jit_emit.h
Log:
Argument passing cleanup 4

* use SIG_* macros in JIT/x86
* also split register save/restore code - the cases are 2 different


Modified: trunk/include/parrot/inter_call.h
==============================================================================
--- trunk/include/parrot/inter_call.h   (original)
+++ trunk/include/parrot/inter_call.h   Thu Feb  9 05:59:09 2006
@@ -111,6 +111,13 @@ FLOATVAL set_retval_f(Interp*, int sig_r
 void* set_retval(Interp*, int sig_ret, parrot_context_t *ctx);
 INTVAL set_retval_i(Interp*, int sig_ret, parrot_context_t *ctx);
 
+#define ASSERT_SIG_PMC(sig) \
+    assert(PObj_is_PMC_TEST(sig) && \
+           sig->vtable->base_type == enum_class_FixedIntegerArray)
+
+#define SIG_ELEMS(sig) PMC_int_val(sig)
+#define SIG_ARRAY(sig) (INTVAL*)PMC_data(sig)
+#define SIG_ITEM(sig, idx) (SIG_ARRAY(sig))[idx]
 #define ADD_OP_VAR_PART(interpreter, seg, pc, n) do { \
     if (*pc == PARROT_OP_set_args_pc || \
             *pc == PARROT_OP_get_results_pc || \
@@ -118,17 +125,10 @@ INTVAL set_retval_i(Interp*, int sig_ret
             *pc == PARROT_OP_set_returns_pc) { \
         PMC *sig; \
         sig = seg->const_table->constants[pc[1]]->u.key; \
-        n += VTABLE_elements(interpreter, sig); \
+        n += SIG_ELEMS(sig); \
     } \
 } while (0)
 
-#define ASSERT_SIG_PMC(sig) \
-    assert(PObj_is_PMC_TEST(sig) && \
-           sig->vtable->base_type == enum_class_FixedIntegerArray)
-
-#define SIG_ELEMS(sig) PMC_int_val(sig)
-#define SIG_ARRAY(sig) (INTVAL*)PMC_data(sig)
-#define SIG_ITEM(sig, idx) (SIG_ARRAY(sig))[idx]
 
 #endif /* PARROT_INTER_CALL_H_GUARD */
 

Modified: trunk/src/jit/i386/core.jit
==============================================================================
--- trunk/src/jit/i386/core.jit (original)
+++ trunk/src/jit/i386/core.jit Thu Feb  9 05:59:09 2006
@@ -1452,7 +1452,7 @@ extern Parrot_returncc {
     else {
         /* restore pushed regs if any */
         if (!(jit_info->flags & JIT_CODE_RECURSIVE)) {
-            jit_restore_regs(jit_info, interpreter, -1);
+            jit_restore_regs(jit_info, interpreter);
             emitm_movl_m_r(NATIVECODE, emit_EAX, emit_EBP, emit_None, 1, 16);
             /* retval = pc is at 4 + n_args * 4 */
             emitm_movl_m_r(NATIVECODE, emit_EAX, emit_EAX, emit_None, 1, 
@@ -1473,23 +1473,23 @@ Parrot_pic_callr___pc {
     constants = CONTEXT(interpreter->ctx)->constants;
     params = jit_info->optimizer->sections->begin;
     sig_params = constants[params[1]]->u.key;
-    op_i = 2 + PMC_int_val(sig_params);
+    op_i = 2 + SIG_ELEMS(sig_params);
 
     offset = jit_info->arena.op_map[op_i].offset;
     /* TODO preserve necessary regs */
     assert(*CUR_OPCODE == PARROT_OP_get_results_pc);
     constants = CONTEXT(interpreter->ctx)->constants;
     sig_result = constants[CUR_OPCODE[1]]->u.key;
-    if (!PMC_int_val(sig_result))
+    if (!SIG_ELEMS(sig_result))
         skip = -1;
     else 
         skip = MAP(2);      /* skip result - save rest */
-    jit_save_regs(jit_info, interpreter, skip);
+    jit_save_regs_call(jit_info, interpreter, skip);
 
     here = NATIVECODE - jit_info->arena.start;
     emitm_calll(NATIVECODE, offset - here - 5);
 
-    jit_restore_regs(jit_info, interpreter, skip);
+    jit_restore_regs_call(jit_info, interpreter, skip);
 }
 
 extern Parrot_get_params_pc {
@@ -1514,7 +1514,7 @@ Parrot_get_results_pc {
 
         constants = CONTEXT(interpreter->ctx)->constants;
         sig_result = constants[CUR_OPCODE[1]]->u.key;
-        if (!PMC_int_val(sig_result))
+        if (!SIG_ELEMS(sig_result))
             return;
         /* result is eax TODO Nums */
         jit_emit_mov_rr_i(NATIVECODE, MAP(2), emit_EAX);

Modified: trunk/src/jit/i386/jit_emit.h
==============================================================================
--- trunk/src/jit/i386/jit_emit.h       (original)
+++ trunk/src/jit/i386/jit_emit.h       Thu Feb  9 05:59:09 2006
@@ -2774,31 +2774,50 @@ jit_get_params_pc(Parrot_jit_info_t *jit
     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);
+    sig_bits = SIG_ARRAY(sig_pmc);
+    n = SIG_ELEMS(sig_pmc);
     jit_info->n_args = n;
     emitm_movl_m_r(NATIVECODE, emit_EAX, emit_EBP, emit_None, 1, 16);
-    for (i = 0; i < n; ++i)
+    for (i = 0; i < n; ++i) {
+        /* TODO other arg types */
         emitm_movl_m_r(NATIVECODE, MAP(2+i), emit_EAX, emit_None, 
                 1, 4 + i*4);
+    }
 }
 
 /*
  * preserve registers
- * a) all callee saved on function entry (skip == -1)
+ * a) all callee saved on function entry 
+ */
+static void 
+jit_save_regs(Parrot_jit_info_t *jit_info, Interp * interpreter)
+{
+    int i, used_i, save_i;
+    const jit_arch_regs *reg_info;
+
+    used_i = CONTEXT(interpreter->ctx)->n_regs_used[REGNO_INT];
+    reg_info = &jit_info->arch_info->regs[jit_info->code_type]; 
+    save_i = reg_info->n_preserved_I;
+    for (i = save_i; i < used_i; ++i) {
+        emitm_pushl_r(jit_info->native_ptr, reg_info->map_I[i]);
+    }
+}
+
+/*
+ * preserve registers around a functioncall
+ * 
  * b) all used register around a call (skip >= 0 := return result
  *    TODO save N regs for b) too
  */
 static void 
-jit_save_regs(Parrot_jit_info_t *jit_info, Interp * interpreter, int skip)
+jit_save_regs_call(Parrot_jit_info_t *jit_info, Interp * interpreter, int skip)
 {
     int i, used_i, save_i;
     const jit_arch_regs *reg_info;
 
     used_i = CONTEXT(interpreter->ctx)->n_regs_used[REGNO_INT];
     reg_info = &jit_info->arch_info->regs[jit_info->code_type]; 
-    save_i = skip >= 0 ? 0 : reg_info->n_preserved_I;
-    for (i = save_i; i < used_i; ++i) {
+    for (i = 0; i < used_i; ++i) {
         if (reg_info->map_I[i] == skip)
             continue;
         emitm_pushl_r(jit_info->native_ptr, reg_info->map_I[i]);
@@ -2807,7 +2826,7 @@ jit_save_regs(Parrot_jit_info_t *jit_inf
 
 /* restore saved regs, see above */
 static void 
-jit_restore_regs(Parrot_jit_info_t *jit_info, Interp * interpreter, int skip)
+jit_restore_regs(Parrot_jit_info_t *jit_info, Interp * interpreter)
 {
 
     int i, used_i, save_i;
@@ -2815,13 +2834,30 @@ jit_restore_regs(Parrot_jit_info_t *jit_
 
     used_i = CONTEXT(interpreter->ctx)->n_regs_used[REGNO_INT];
     reg_info = &jit_info->arch_info->regs[jit_info->code_type]; 
-    save_i = skip >= 0 ? 0 : reg_info->n_preserved_I;
+    save_i = reg_info->n_preserved_I;
     /* note - reversed order of jit_save_regs  */
     for (i = used_i - 1; i >= save_i; --i) {
+        emitm_popl_r(jit_info->native_ptr, reg_info->map_I[i]);
+    }
+}
+
+static void 
+jit_restore_regs_call(Parrot_jit_info_t *jit_info, Interp * interpreter, 
+        int skip)
+{
+
+    int i, used_i, save_i;
+    const jit_arch_regs *reg_info;
+
+    used_i = CONTEXT(interpreter->ctx)->n_regs_used[REGNO_INT];
+    reg_info = &jit_info->arch_info->regs[jit_info->code_type]; 
+    /* note - reversed order of jit_save_regs  */
+    for (i = used_i - 1; i >= 0; --i) {
         if (reg_info->map_I[i] == skip)
             continue;
         emitm_popl_r(jit_info->native_ptr, reg_info->map_I[i]);
     }
+    /* TODO other types */
 }
 
 static void
@@ -2832,9 +2868,9 @@ jit_set_returns_pc(Parrot_jit_info_t *ji
     INTVAL *sig_bits, sig;
 
     sig_pmc = CONTEXT(interpreter->ctx)->constants[CUR_OPCODE[1]]->u.key;
-    if (!PMC_int_val(sig_pmc))
+    if (!SIG_ELEMS(sig_pmc))
         return;
-    sig_bits = PMC_data(sig_pmc);
+    sig_bits = SIG_ARRAY(sig_pmc);
     sig = sig_bits[0];
     if (!recursive) {
         /* mov 16(%ebp), %eax - fetch args ptr */
@@ -2883,14 +2919,13 @@ jit_set_args_pc(Parrot_jit_info_t *jit_i
 
     constants = CONTEXT(interpreter->ctx)->constants;
     sig_args = constants[CUR_OPCODE[1]]->u.key;
-    if (!PMC_int_val(sig_args))
+    if (!SIG_ELEMS(sig_args))
         return;
     params = jit_info->optimizer->sections->begin;
     sig_params = constants[params[1]]->u.key;
-    assert(PObj_is_PMC_TEST(sig_params));
-    assert(sig_params->vtable->base_type == enum_class_FixedIntegerArray);
-    sig_bits = PMC_data(sig_args);
-    n = PMC_int_val(sig_args);  
+    ASSERT_SIG_PMC(sig_params);
+    sig_bits = SIG_ARRAY(sig_args);
+    n = SIG_ELEMS(sig_args);  
     for (i = 0; i < n; ++i) {
         sig = sig_bits[i];
         /* move args to params regs */
@@ -3136,7 +3171,7 @@ Parrot_jit_begin_sub_regs(Parrot_jit_inf
      * check register usage of the subroutine
      * how many we have to preserve
      */ 
-    jit_save_regs(jit_info, interpreter, -1);
+    jit_save_regs(jit_info, interpreter);
     /* when it's a recursive sub, we fetch params to registers
      * and all a inner helper sub, which run with registers only
      */
@@ -3156,7 +3191,7 @@ Parrot_jit_begin_sub_regs(Parrot_jit_inf
         emitm_movl_m_r(NATIVECODE, emit_EAX, emit_EDX, emit_None, 1, 
                     4 + jit_info->n_args * 4);
         /* restore pushed callee saved */
-        jit_restore_regs(jit_info, interpreter, -1);
+        jit_restore_regs(jit_info, interpreter);
         jit_emit_stack_frame_leave(NATIVECODE);
         emitm_ret(NATIVECODE);
         /* align the inner sub */

Reply via email to