X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=libpcsxcore%2Fnew_dynarec%2Flinkage_arm64.S;h=fa8a41176d604f9285e4a5d214f4c41d81cf6500;hb=HEAD;hp=501a4fe7729bd3b1df6191675300c35bc19d3651;hpb=33a1eda13ebe624fc1233d820c8db7dcd7aba0d8;p=pcsx_rearmed.git diff --git a/libpcsxcore/new_dynarec/linkage_arm64.S b/libpcsxcore/new_dynarec/linkage_arm64.S index 501a4fe7..fa8a4117 100644 --- a/libpcsxcore/new_dynarec/linkage_arm64.S +++ b/libpcsxcore/new_dynarec/linkage_arm64.S @@ -24,6 +24,16 @@ #include "assem_arm64.h" #include "linkage_offsets.h" +#ifdef __MACH__ +#define dynarec_local ESYM(dynarec_local) +#define ndrc_add_jump_out ESYM(ndrc_add_jump_out) +#define ndrc_get_addr_ht ESYM(ndrc_get_addr_ht) +#define gen_interupt ESYM(gen_interupt) +#define gteCheckStallRaw ESYM(gteCheckStallRaw) +#define psxException ESYM(psxException) +#define execI ESYM(execI) +#endif + #if (LO_mem_wtab & 7) #error misligned pointers #endif @@ -31,16 +41,16 @@ .bss .align 4 .global dynarec_local - .type dynarec_local, %object - .size dynarec_local, LO_dynarec_local_size + EOBJECT(dynarec_local) + ESIZE(dynarec_local, LO_dynarec_local_size) dynarec_local: .space LO_dynarec_local_size #define DRC_VAR_(name, vname, size_) \ - vname = dynarec_local + LO_##name; \ - .global vname; \ - .type vname, %object; \ - .size vname, size_ + vname = dynarec_local + LO_##name ASM_SEPARATOR \ + .globl vname; \ + EOBJECT(vname); \ + ESIZE(vname, LO_dynarec_local_size) #define DRC_VAR(name, size_) \ DRC_VAR_(name, ESYM(name), size_) @@ -89,7 +99,7 @@ FUNCTION(dyna_linker): /* r1 = instruction to patch */ bl ndrc_get_addr_ht br x0 - .size dyna_linker, .-dyna_linker + ESIZE(dyna_linker, .-dyna_linker) .align 2 FUNCTION(cc_interrupt): @@ -115,7 +125,7 @@ FUNCTION(cc_interrupt): ldr w0, [rFP, #LO_pcaddr] bl ndrc_get_addr_ht br x0 - .size cc_interrupt, .-cc_interrupt + ESIZE(cc_interrupt, .-cc_interrupt) .align 2 FUNCTION(jump_addrerror_ds): /* R3000E_AdEL / R3000E_AdES in w0 */ @@ -161,14 +171,16 @@ call_psxException: /* note: psxException might do recursive recompiler call from it's HLE code, * so be ready for this */ FUNCTION(jump_to_new_pc): + ldr w2, [rFP, #LO_stop] ldr w1, [rFP, #LO_next_interupt] ldr rCC, [rFP, #LO_cycle] ldr w0, [rFP, #LO_pcaddr] sub rCC, rCC, w1 str w1, [rFP, #LO_last_count] + cbnz w2, new_dyna_leave bl ndrc_get_addr_ht br x0 - .size jump_to_new_pc, .-jump_to_new_pc + ESIZE(jump_to_new_pc, .-jump_to_new_pc) /* stack must be aligned by 16, and include space for save_regs() use */ .align 2 @@ -187,7 +199,7 @@ FUNCTION(new_dyna_start): sub rCC, w2, w1 bl ndrc_get_addr_ht br x0 - .size new_dyna_start, .-new_dyna_start + ESIZE(new_dyna_start, .-new_dyna_start) .align 2 FUNCTION(new_dyna_leave): @@ -201,24 +213,25 @@ FUNCTION(new_dyna_leave): ldp x27, x28, [sp, #16*5] ldp x29, x30, [sp], #SSP_ALL ret - .size new_dyna_leave, .-new_dyna_leave + ESIZE(new_dyna_leave, .-new_dyna_leave) /* --------------------------------------- */ .align 2 .macro memhandler_pre - /* w0 = adddr/data, x1 = rhandler, w2 = cycles, x3 = whandler */ + /* w0 = addr/data, x1 = rhandler, w2 = cycles, x3 = whandler */ ldr w4, [rFP, #LO_last_count] add w4, w4, w2 str w4, [rFP, #LO_cycle] .endm .macro memhandler_post - ldr w0, [rFP, #LO_next_interupt] + /* w2 = cycles_out, x3 = tmp */ + ldr w3, [rFP, #LO_next_interupt] ldr w2, [rFP, #LO_cycle] // memhandlers can modify cc, like dma - str w0, [rFP, #LO_last_count] - sub w0, w2, w0 + str w3, [rFP, #LO_last_count] + sub w2, w2, w3 .endm FUNCTION(do_memhandler_pre): @@ -246,17 +259,18 @@ FUNCTION(do_memhandler_post): FUNCTION(jump_handler_read8): add x1, x1, #0x1000/4*8 + 0x1000/2*8 /* shift to r8 part */ pcsx_read_mem ldrb, 0 - b handler_read_end + ldp xzr, x30, [sp], #16 + ret FUNCTION(jump_handler_read16): add x1, x1, #0x1000/4*8 /* shift to r16 part */ pcsx_read_mem ldrh, 1 - b handler_read_end + ldp xzr, x30, [sp], #16 + ret FUNCTION(jump_handler_read32): pcsx_read_mem ldr, 2 - -handler_read_end: + /* memhandler_post */ ldp xzr, x30, [sp], #16 ret @@ -266,7 +280,6 @@ handler_read_end: ldr x3, [x3, w4, uxtw #3] adds x3, x3, x3 bcs 0f - mov w0, w2 /* cycle return */ \wrtop w1, [x3, w4, uxtw #\tab_shift] ret 0: @@ -279,16 +292,16 @@ handler_read_end: FUNCTION(jump_handler_write8): add x3, x3, #0x1000/4*8 + 0x1000/2*8 /* shift to r8 part */ - pcsx_write_mem strb uxtb 0 + pcsx_write_mem strb, uxtb, 0 b handler_write_end FUNCTION(jump_handler_write16): add x3, x3, #0x1000/4*8 /* shift to r16 part */ - pcsx_write_mem strh uxth 1 + pcsx_write_mem strh, uxth, 1 b handler_write_end FUNCTION(jump_handler_write32): - pcsx_write_mem str mov 2 + pcsx_write_mem str, mov, 2 handler_write_end: memhandler_post