X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=libpcsxcore%2Fnew_dynarec%2Flinkage_arm64.S;h=d073ded4cd54106fc82259a32b7a2702e3031d23;hb=104df9d3b15f92d5c73d2d6beb6f01f0cc158e03;hp=5e9626f5e95f44f712b914a07df693a5361ce39e;hpb=48ce252818e5a9751b0ef5067b2b6136b41698a1;p=pcsx_rearmed.git diff --git a/libpcsxcore/new_dynarec/linkage_arm64.S b/libpcsxcore/new_dynarec/linkage_arm64.S index 5e9626f5..d073ded4 100644 --- a/libpcsxcore/new_dynarec/linkage_arm64.S +++ b/libpcsxcore/new_dynarec/linkage_arm64.S @@ -52,7 +52,7 @@ DRC_VAR(pending_exception, 4) DRC_VAR(stop, 4) DRC_VAR(branch_target, 4) DRC_VAR(address, 4) -#DRC_VAR(align0, 16) /* unused/alignment */ +DRC_VAR(hack_addr, 4) DRC_VAR(psxRegs, LO_psxRegs_end - LO_psxRegs) /* psxRegs */ @@ -79,55 +79,26 @@ DRC_VAR(zeromem_ptr, 8) DRC_VAR(scratch_buf_ptr, 8) DRC_VAR(ram_offset, 8) DRC_VAR(mini_ht, 256) -DRC_VAR(restore_candidate, 512) .text .align 2 -/* r0 = virtual target address */ -/* r1 = instruction to patch */ -.macro dyna_linker_main - /* XXX TODO: should be able to do better than this... */ - bl get_addr_ht - br x0 -.endm - - FUNCTION(dyna_linker): /* r0 = virtual target address */ /* r1 = instruction to patch */ - dyna_linker_main + bl ndrc_get_addr_ht + br x0 .size dyna_linker, .-dyna_linker -FUNCTION(exec_pagefault): - /* r0 = instruction pointer */ - /* r1 = fault address */ - /* r2 = cause */ - bl abort - .size exec_pagefault, .-exec_pagefault - -/* Special dynamic linker for the case where a page fault - may occur in a branch delay slot */ -FUNCTION(dyna_linker_ds): - /* r0 = virtual target address */ - /* r1 = instruction to patch */ - dyna_linker_main - .size dyna_linker_ds, .-dyna_linker_ds - .align 2 FUNCTION(cc_interrupt): ldr w0, [rFP, #LO_last_count] - mov w2, #0x1fc add rCC, w0, rCC str wzr, [rFP, #LO_pending_exception] - and w2, w2, rCC, lsr #17 - add x3, rFP, #LO_restore_candidate str rCC, [rFP, #LO_cycle] /* PCSX cycles */ # str rCC, [rFP, #LO_reg_cop0+36] /* Count */ - ldr w19, [x3, w2, uxtw] mov x21, lr - cbnz w19, 4f 1: bl gen_interupt mov lr, x21 @@ -142,22 +113,8 @@ FUNCTION(cc_interrupt): ret 2: ldr w0, [rFP, #LO_pcaddr] - bl get_addr_ht + bl ndrc_get_addr_ht br x0 -4: - /* Move 'dirty' blocks to the 'clean' list */ - lsl w20, w2, #3 - str wzr, [x3, w2, uxtw] -5: - mov w0, w20 - add w20, w20, #1 - tbz w19, #0, 6f - bl clean_blocks -6: - lsr w19, w19, #1 - tst w20, #31 - bne 5b - b 1b .size cc_interrupt, .-cc_interrupt .align 2 @@ -172,7 +129,7 @@ FUNCTION(fp_exception): str w1, [rFP, #LO_reg_cop0+48] /* Status */ str w2, [rFP, #LO_reg_cop0+52] /* Cause */ add w0, w3, #0x80 - bl get_addr_ht + bl ndrc_get_addr_ht br x0 .size fp_exception, .-fp_exception .align 2 @@ -182,19 +139,28 @@ FUNCTION(fp_exception_ds): .size fp_exception_ds, .-fp_exception_ds .align 2 +FUNCTION(jump_break_ds): + mov w0, #0x24 + mov w1, #1 + b call_psxException +FUNCTION(jump_break): + mov w0, #0x24 + mov w1, #0 + b call_psxException +FUNCTION(jump_syscall_ds): + mov w0, #0x20 + mov w1, #1 + b call_psxException FUNCTION(jump_syscall): - ldr w1, [rFP, #LO_reg_cop0+48] /* Status */ - mov w3, #0x80000000 - str w0, [rFP, #LO_reg_cop0+56] /* EPC */ - orr w1, w1, #2 - mov w2, #0x20 - str w1, [rFP, #LO_reg_cop0+48] /* Status */ - str w2, [rFP, #LO_reg_cop0+52] /* Cause */ - add w0, w3, #0x80 - bl get_addr_ht - br x0 - .size jump_syscall, .-jump_syscall - .align 2 + mov w0, #0x20 + mov w1, #0 + +call_psxException: + ldr w3, [rFP, #LO_last_count] + str w2, [rFP, #LO_pcaddr] + add rCC, w3, rCC + str rCC, [rFP, #LO_cycle] /* PCSX cycles */ + bl psxException /* note: psxException might do recursive recompiler call from it's HLE code, * so be ready for this */ @@ -204,7 +170,7 @@ FUNCTION(jump_to_new_pc): ldr w0, [rFP, #LO_pcaddr] sub rCC, rCC, w1 str w1, [rFP, #LO_last_count] - bl get_addr_ht + bl ndrc_get_addr_ht br x0 .size jump_to_new_pc, .-jump_to_new_pc @@ -223,7 +189,7 @@ FUNCTION(new_dyna_start): ldr w0, [rFP, #LO_pcaddr] str w1, [rFP, #LO_last_count] sub rCC, w2, w1 - bl get_addr_ht + bl ndrc_get_addr_ht br x0 .size new_dyna_start, .-new_dyna_start