drc: rework block tracking
[pcsx_rearmed.git] / libpcsxcore / new_dynarec / linkage_arm64.S
index 7df82b4..d073ded 100644 (file)
@@ -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
 
@@ -253,10 +219,10 @@ FUNCTION(new_dyna_leave):
 .endm
 
 .macro memhandler_post
-       ldr     w2, [rFP, #LO_next_interupt]
-       ldr     w1, [rFP, #LO_cycle]
-       sub     w0, w1, w2
-       str     w2, [rFP, #LO_last_count]
+       ldr     w0, [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
 .endm
 
 FUNCTION(do_memhandler_pre):
@@ -336,7 +302,7 @@ handler_write_end:
 FUNCTION(jump_handle_swl):
        /* w0 = address, w1 = data, w2 = cycles */
        ldr     x3, [rFP, #LO_mem_wtab]
-       mov     w4, w0, lsr #12
+       orr     w4, wzr, w0, lsr #12
        ldr     x3, [x3, w4, uxtw #3]
        adds    x3, x3, x3
        bcs     4f
@@ -371,7 +337,7 @@ FUNCTION(jump_handle_swl):
 FUNCTION(jump_handle_swr):
        /* w0 = address, w1 = data, w2 = cycles */
        ldr     x3, [rFP, #LO_mem_wtab]
-       mov     w4, w0, lsr #12
+       orr     w4, wzr, w0, lsr #12
        ldr     x3, [x3, w4, uxtw #3]
        adds    x3, x3, x3
        bcs     4f