32x: drc: block linking

git-svn-id: file:///home/notaz/opt/svn/PicoDrive@853 be3aeb3a-fb24-0410-a615-afba39da0efa
This commit is contained in:
notaz 2010-01-06 13:18:04 +00:00
parent 25eb407c56
commit 44e6452e02
4 changed files with 256 additions and 125 deletions

View file

@ -625,16 +625,19 @@ 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(target) \
emith_jump(target)
#define emith_jump_cond(cond, target) \
emith_xbranch(cond, target, 0)
#define emith_jump_patchable(cond) \
emith_jump_cond(cond, 0)
#define emith_jump_cond_patchable(cond, target) \
emith_jump_cond(cond, target)
#define emith_jump_patch(ptr, target) do { \
u32 *ptr_ = ptr; \
u32 val = (u32 *)(target) - (u32 *)ptr_ - 2; \
*ptr_ = (*ptr_ & 0xff000000) | (val & 0x00ffffff); \
u32 val_ = (u32 *)(target) - ptr_ - 2; \
*ptr_ = (*ptr_ & 0xff000000) | (val_ & 0x00ffffff); \
} while (0)
#define emith_jump_reg_c(cond, r) \

View file

@ -463,6 +463,9 @@ enum { xAX = 0, xCX, xDX, xBX, xSP, xBP, xSI, xDI };
EMIT(disp, u32); \
}
#define emith_jump_patchable(target) \
emith_jump(target)
#define emith_jump_cond(cond, ptr) { \
u32 disp = (u32)(ptr) - ((u32)tcache_ptr + 6); \
EMIT(0x0f, u8); \
@ -470,12 +473,13 @@ enum { xAX = 0, xCX, xDX, xBX, xSP, xBP, xSI, xDI };
EMIT(disp, u32); \
}
#define emith_jump_patchable(cond) \
emith_jump_cond(cond, 0)
#define emith_jump_cond_patchable(cond, target) \
emith_jump_cond(cond, target)
#define emith_jump_patch(ptr, target) do { \
u32 disp = (u32)(target) - ((u32)(ptr) + 6); \
EMIT_PTR((u8 *)(ptr) + 2, disp, u32); \
u32 disp_ = (u32)(target) - ((u32)(ptr) + 4); \
u32 offs_ = (*(u8 *)(ptr) == 0x0f) ? 2 : 1; \
EMIT_PTR((u8 *)(ptr) + offs_, disp_ - offs_, u32); \
} while (0)
#define emith_call(ptr) { \