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 */