Add gen_invoke_CPU_im_im() to invoke do_record_step(pc, opcode).

This commit is contained in:
gbeauche 2003-12-04 17:53:04 +00:00
parent 328bb9f239
commit 5dca41d253
6 changed files with 33 additions and 5 deletions

View File

@ -507,6 +507,12 @@ DEFINE_OP(op_invoke_CPU_im, {
CALL(func(CPU, PARAM1));
});
DEFINE_OP(op_invoke_CPU_im_im, {
typedef void (*func_t)(void *, uint32, uint32);
func_t func = (func_t)reg_A0;
CALL(func(CPU, PARAM1, PARAM2));
});
DEFINE_OP(op_invoke_direct, {
typedef void (*func_t)(void);
func_t func = (func_t)PARAM1;
@ -543,4 +549,10 @@ DEFINE_OP(op_invoke_direct_CPU_im, {
CALL(func(CPU, PARAM2));
});
DEFINE_OP(op_invoke_direct_CPU_im_im, {
typedef void (*func_t)(void *, uint32, uint32);
func_t func = (func_t)PARAM1;
CALL(func(CPU, PARAM2, PARAM3));
});
#undef DEFINE_OP

View File

@ -102,3 +102,14 @@ basic_dyngen::gen_invoke_CPU_im(void (*func)(dyngen_cpu_base, uint32), uint32 va
gen_op_invoke_CPU_im(value);
}
}
void
basic_dyngen::gen_invoke_CPU_im_im(void (*func)(dyngen_cpu_base, uint32, uint32), uint32 param1, uint32 param2)
{
if (direct_call_possible((uintptr)func))
gen_op_invoke_direct_CPU_im_im((uintptr)func, param1, param2);
else {
gen_op_mov_ad_A0_im((uintptr)func);
gen_op_invoke_CPU_im_im(param1, param2);
}
}

View File

@ -81,6 +81,7 @@ public:
void gen_invoke_CPU(void (*func)(dyngen_cpu_base));
void gen_invoke_CPU_T0(void (*func)(dyngen_cpu_base, uint32));
void gen_invoke_CPU_im(void (*func)(dyngen_cpu_base, uint32), uint32 value);
void gen_invoke_CPU_im_im(void (*func)(dyngen_cpu_base, uint32, uint32), uint32 param1, uint32 param2);
// Raw aliases
#define DEFINE_ALIAS_RAW(NAME, ARGLIST, ARGS) \

View File

@ -130,10 +130,10 @@ void powerpc_cpu::init_flight_recorder()
#endif
}
void powerpc_cpu::record_step(uint32 opcode)
void powerpc_cpu::do_record_step(uint32 pc, uint32 opcode)
{
#if PPC_FLIGHT_RECORDER
log[log_ptr].pc = pc();
log[log_ptr].pc = pc;
log[log_ptr].opcode = opcode;
#ifdef SHEEPSHAVER
log[log_ptr].sp = gpr(1);

View File

@ -176,7 +176,8 @@ private:
#else
static const bool logging = false;
#endif
void record_step(uint32 opcode);
void do_record_step(uint32 pc, uint32 opcode);
void record_step(uint32 opcode) { do_record_step(pc(), opcode); }
// Syscall callback must return TRUE if no error occurred
typedef bool (*syscall_fn)(powerpc_cpu *cpu);

View File

@ -140,8 +140,11 @@ powerpc_cpu::compile_block(uint32 entry_point)
done_compile = true;
#if PPC_FLIGHT_RECORDER
if (is_logging())
dg.gen_invoke_CPU_im(nv_mem_fun(&powerpc_cpu::record_step).ptr(), opcode);
if (is_logging()) {
typedef void (*func_t)(dyngen_cpu_base, uint32, uint32);
func_t func = (func_t)nv_mem_fun((execute_pmf)&powerpc_cpu::do_record_step).ptr();
dg.gen_invoke_CPU_im_im(func, dpc, opcode);
}
#endif
union operands_t {