mirror of
https://github.com/RaySollium99/picodrive.git
synced 2025-09-06 15:48:05 -04:00
32x: drc: self-reentrant blocks
git-svn-id: file:///home/notaz/opt/svn/PicoDrive@841 be3aeb3a-fb24-0410-a615-afba39da0efa
This commit is contained in:
parent
8beb44303e
commit
18b9412743
3 changed files with 453 additions and 179 deletions
|
@ -264,12 +264,12 @@ static void emith_op_imm2(int cond, int s, int op, int rd, int rn, unsigned int
|
|||
emith_op_imm2(cond, s, op, r, r, imm)
|
||||
|
||||
// test op
|
||||
#define emith_top_imm(cond, op, r, imm) { \
|
||||
#define emith_top_imm(cond, op, r, imm) do { \
|
||||
u32 ror2, v; \
|
||||
for (ror2 = 0, v = imm; v && !(v & 3); v >>= 2) \
|
||||
ror2--; \
|
||||
EOP_C_DOP_IMM(cond, op, 1, r, 0, ror2 & 0x0f, v & 0xff); \
|
||||
}
|
||||
} while (0)
|
||||
|
||||
#define is_offset_24(val) \
|
||||
((val) >= (int)0xff000000 && (val) <= 0x00ffffff)
|
||||
|
@ -595,6 +595,15 @@ static int emith_xbranch(int cond, void *target, int is_call)
|
|||
#define emith_jump(target) \
|
||||
emith_jump_cond(A_COND_AL, target)
|
||||
|
||||
#define emith_jump_patchable(cond) \
|
||||
emith_jump_cond(cond, 0)
|
||||
|
||||
#define emith_jump_patch(ptr, target) do { \
|
||||
u32 *ptr_ = ptr; \
|
||||
u32 val = (u32 *)(target) - (u32 *)ptr_ - 2; \
|
||||
*ptr_ = (*ptr_ & 0xff000000) | (val & 0x00ffffff); \
|
||||
} while (0)
|
||||
|
||||
#define emith_jump_reg(r) \
|
||||
EOP_BX(r)
|
||||
|
||||
|
@ -605,11 +614,6 @@ static int emith_xbranch(int cond, void *target, int is_call)
|
|||
#define emith_sh2_drc_exit() \
|
||||
EOP_LDMFD_SP(A_R4M|A_R5M|A_R6M|A_R7M|A_R8M|A_R9M|A_R10M|A_R11M|A_R15M)
|
||||
|
||||
#define emith_sh2_test_t() { \
|
||||
int r = rcache_get_reg(SHR_SR, RC_GR_READ); \
|
||||
EOP_TST_IMM(r, 0, 1); \
|
||||
}
|
||||
|
||||
#define emith_sh2_dtbf_loop() { \
|
||||
int cr, rn; \
|
||||
int tmp_ = rcache_get_tmp(); \
|
||||
|
@ -631,11 +635,10 @@ static int emith_xbranch(int cond, void *target, int is_call)
|
|||
rcache_free_tmp(tmp_); \
|
||||
}
|
||||
|
||||
#define emith_write_sr(srcr) { \
|
||||
int srr = rcache_get_reg(SHR_SR, RC_GR_RMW); \
|
||||
emith_lsr(srr, srr, 12); \
|
||||
emith_or_r_r_r_lsl(srr, srr, srcr, 20); \
|
||||
emith_ror(srr, srr, 20); \
|
||||
#define emith_write_sr(sr, srcr) { \
|
||||
emith_lsr(sr, sr, 10); \
|
||||
emith_or_r_r_r_lsl(sr, sr, srcr, 22); \
|
||||
emith_ror(sr, sr, 22); \
|
||||
}
|
||||
|
||||
#define emith_carry_to_t(srr, is_sub) { \
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue