X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=cpu%2Fdrc%2Femit_arm.c;h=64face126d9742fcda472e645f06e311f4852672;hb=a90cc666d08526ada34a87c3e6d9a5312d90be84;hp=efee0f3735e050f760ecc01d121d19fccf2b87eb;hpb=bf092a3631694f525c3d1179b21ab8941e87e7d7;p=picodrive.git diff --git a/cpu/drc/emit_arm.c b/cpu/drc/emit_arm.c index efee0f3..64face1 100644 --- a/cpu/drc/emit_arm.c +++ b/cpu/drc/emit_arm.c @@ -639,6 +639,21 @@ static int emith_xbranch(int cond, void *target, int is_call) EOP_MOV_REG_ASR(d,d,32 - (bits)); \ } +#define emith_do_caller_regs(mask, func) { \ + u32 _reg_mask = (mask) & 0x500f; \ + if (_reg_mask) { \ + if (__builtin_parity(_reg_mask) == 1) \ + _reg_mask |= 0x10; /* eabi align */ \ + func(_reg_mask); \ + } \ +} + +#define emith_save_caller_regs(mask) \ + emith_do_caller_regs(mask, EOP_STMFD_SP) + +#define emith_restore_caller_regs(mask) \ + emith_do_caller_regs(mask, EOP_LDMFD_SP) + // upto 4 args #define emith_pass_arg_r(arg, reg) \ EOP_MOV_REG_SIMPLE(arg, reg) @@ -724,7 +739,7 @@ static int emith_xbranch(int cond, void *target, int is_call) #define emith_sh2_wcall(a, tab) { \ emith_lsr(12, a, SH2_WRITE_SHIFT); \ EOP_LDR_REG_LSL(A_COND_AL,12,tab,12,2); \ - emith_ctx_read(2, offsetof(SH2, is_slave)); \ + emith_move_r_r(2, CONTEXT_REG); \ emith_jump_reg(12); \ }