mirror of
https://github.com/kanjitalk755/macemu.git
synced 2025-03-08 08:30:34 +00:00
We need at least for native registers, hence we are guaranteed to have
REG_T2 available. Add 16/32 sign-extension in T1. Add call generators with (T0, T1) and (T0, T1, T2) arguments.
This commit is contained in:
parent
93c472ec0a
commit
6a4463b8fb
@ -179,6 +179,7 @@ DEFINE_OP(ror_32_T0_im, T0 = do_ror_32(T0, PARAM1));
|
||||
|
||||
// Sign-/Zero-extension
|
||||
DEFINE_OP(se_16_32_T0, T0 = (int32)(int16)T0);
|
||||
DEFINE_OP(se_16_32_T1, T1 = (int32)(int16)T1);
|
||||
DEFINE_OP(ze_16_32_T0, T0 = (uint32)(uint16)T0);
|
||||
DEFINE_OP(se_8_32_T0, T0 = (int32)(int8)T0);
|
||||
DEFINE_OP(ze_8_32_T0, T0 = (uint32)(uint8)T0);
|
||||
@ -483,6 +484,18 @@ DEFINE_OP(op_invoke_T0, {
|
||||
CALL(func(T0));
|
||||
});
|
||||
|
||||
DEFINE_OP(op_invoke_T0_T1, {
|
||||
typedef void (*func_t)(uint32, uint32);
|
||||
func_t func = (func_t)reg_A0;
|
||||
CALL(func(T0, T1));
|
||||
});
|
||||
|
||||
DEFINE_OP(op_invoke_T0_T1_T2, {
|
||||
typedef void (*func_t)(uint32, uint32, uint32);
|
||||
func_t func = (func_t)reg_A0;
|
||||
CALL(func(T0, T1, T2));
|
||||
});
|
||||
|
||||
DEFINE_OP(op_invoke_im, {
|
||||
typedef void (*func_t)(uint32);
|
||||
func_t func = (func_t)reg_A0;
|
||||
@ -525,6 +538,18 @@ DEFINE_OP(op_invoke_direct_T0, {
|
||||
CALL(func(T0));
|
||||
});
|
||||
|
||||
DEFINE_OP(op_invoke_direct_T0_T1, {
|
||||
typedef void (*func_t)(uint32, uint32);
|
||||
func_t func = (func_t)PARAM1;
|
||||
CALL(func(T0, T1));
|
||||
});
|
||||
|
||||
DEFINE_OP(op_invoke_direct_T0_T1_T2, {
|
||||
typedef void (*func_t)(uint32, uint32, uint32);
|
||||
func_t func = (func_t)PARAM1;
|
||||
CALL(func(T0, T1, T2));
|
||||
});
|
||||
|
||||
DEFINE_OP(op_invoke_direct_im, {
|
||||
typedef void (*func_t)(uint32);
|
||||
func_t func = (func_t)PARAM1;
|
||||
|
@ -59,6 +59,28 @@ basic_dyngen::gen_invoke_T0(void (*func)(uint32))
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
basic_dyngen::gen_invoke_T0_T1(void (*func)(uint32, uint32))
|
||||
{
|
||||
if (direct_call_possible((uintptr)func))
|
||||
gen_op_invoke_direct_T0_T1((uintptr)func);
|
||||
else {
|
||||
gen_op_mov_ad_A0_im((uintptr)func);
|
||||
gen_op_invoke_T0_T1();
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
basic_dyngen::gen_invoke_T0_T1_T2(void (*func)(uint32, uint32, uint32))
|
||||
{
|
||||
if (direct_call_possible((uintptr)func))
|
||||
gen_op_invoke_direct_T0_T1_T2((uintptr)func);
|
||||
else {
|
||||
gen_op_mov_ad_A0_im((uintptr)func);
|
||||
gen_op_invoke_T0_T1_T2();
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
basic_dyngen::gen_invoke_im(void (*func)(uint32), uint32 value)
|
||||
{
|
||||
|
@ -77,6 +77,8 @@ public:
|
||||
void gen_jmp(const uint8 *target);
|
||||
void gen_invoke(void (*func)(void));
|
||||
void gen_invoke_T0(void (*func)(uint32));
|
||||
void gen_invoke_T0_T1(void (*func)(uint32, uint32));
|
||||
void gen_invoke_T0_T1_T2(void (*func)(uint32, uint32, uint32));
|
||||
void gen_invoke_im(void (*func)(uint32), uint32 value);
|
||||
void gen_invoke_CPU(void (*func)(dyngen_cpu_base));
|
||||
void gen_invoke_CPU_T0(void (*func)(dyngen_cpu_base, uint32));
|
||||
@ -156,6 +158,7 @@ public:
|
||||
|
||||
// Sign-/Zero-extension
|
||||
DEFINE_ALIAS(se_16_32_T0,0);
|
||||
DEFINE_ALIAS(se_16_32_T1,0);
|
||||
DEFINE_ALIAS(ze_16_32_T0,0);
|
||||
DEFINE_ALIAS(se_8_32_T0,0);
|
||||
DEFINE_ALIAS(ze_8_32_T0,0);
|
||||
|
@ -31,10 +31,8 @@
|
||||
#define REG_T0_ID AREG1_ID
|
||||
#define REG_T1 AREG2
|
||||
#define REG_T1_ID AREG2_ID
|
||||
#ifdef AREG3
|
||||
#define REG_T2 AREG3
|
||||
#define REG_T2_ID AREG3_ID
|
||||
#endif
|
||||
#ifdef AREG4
|
||||
#define REG_T3 AREG4
|
||||
#define REG_T3_ID AREG4_ID
|
||||
|
Loading…
x
Reference in New Issue
Block a user