drc: use direct hle calls
authornotaz <notasas@gmail.com>
Sun, 5 Dec 2010 15:00:51 +0000 (17:00 +0200)
committernotaz <notasas@gmail.com>
Sun, 5 Dec 2010 15:00:51 +0000 (17:00 +0200)
libpcsxcore/new_dynarec/emu_if.c
libpcsxcore/new_dynarec/emu_if.h
libpcsxcore/new_dynarec/linkage_arm.s
libpcsxcore/new_dynarec/new_dynarec.c

index cd44726..d9d753d 100644 (file)
@@ -123,7 +123,6 @@ static int ari64_init()
                if (psxCP2[i] != psxNULL)
                        gte_handlers[i] = psxCP2[i];
 
                if (psxCP2[i] != psxNULL)
                        gte_handlers[i] = psxCP2[i];
 
-       psxHLEt_addr = (void *)psxHLEt; // FIXME: rm
        return 0;
 }
 
        return 0;
 }
 
@@ -187,7 +186,6 @@ unsigned short hword;
 unsigned char byte;
 int pending_exception;
 unsigned int next_interupt;
 unsigned char byte;
 int pending_exception;
 unsigned int next_interupt;
-void *psxHLEt_addr;
 void new_dynarec_init() {}
 int  new_dyna_start() {}
 void new_dynarec_cleanup() {}
 void new_dynarec_init() {}
 int  new_dyna_start() {}
 void new_dynarec_cleanup() {}
index 700182a..e93fabd 100644 (file)
@@ -54,4 +54,4 @@ void MTC0_();
 #define MTC0 MTC0_ /* don't call interpreter with wrong args */
 
 /* misc */
 #define MTC0 MTC0_ /* don't call interpreter with wrong args */
 
 /* misc */
-extern void *psxHLEt_addr;
+extern void (*psxHLEt[])();
index aeb8baa..5451110 100644 (file)
@@ -60,7 +60,6 @@ rdram = 0x80000000
        .global memory_map
        /* psx */
        .global psxRegs
        .global memory_map
        /* psx */
        .global psxRegs
-       .global psxHLEt_addr
 
        .bss
        .align  4
 
        .bss
        .align  4
@@ -151,13 +150,10 @@ intCycle = interrupt + 4
        .size   intCycle, 128
 psxRegs_end = intCycle + 128
 
        .size   intCycle, 128
 psxRegs_end = intCycle + 128
 
-psxHLEt_addr = psxRegs_end
-       .type   psxHLEt_addr, %object
-       .size   psxHLEt_addr, 4
-align0 = psxHLEt_addr + 4 /* just for alignment */
+align0 = psxRegs_end /* just for alignment */
        .type   align0, %object
        .type   align0, %object
-       .size   align0, 4
-branch_target = align0 + 4
+       .size   align0, 8
+branch_target = align0 + 8
        .type   branch_target, %object
        .size   branch_target, 4
 mini_ht = branch_target + 4
        .type   branch_target, %object
        .size   branch_target, 4
 mini_ht = branch_target + 4
@@ -676,12 +672,10 @@ pcsx_return:
 jump_hlecall:
        ldr     r2, [fp, #last_count-dynarec_local]
        str     r0, [fp, #pcaddr-dynarec_local]
 jump_hlecall:
        ldr     r2, [fp, #last_count-dynarec_local]
        str     r0, [fp, #pcaddr-dynarec_local]
-       and     r1, r1, #7
        add     r2, r2, r10
        add     r2, r2, r10
-       ldr     r3, [fp, #psxHLEt_addr-dynarec_local] /* psxHLEt */
        str     r2, [fp, #cycle-dynarec_local] /* PCSX cycle counter */
        adr     lr, pcsx_return
        str     r2, [fp, #cycle-dynarec_local] /* PCSX cycle counter */
        adr     lr, pcsx_return
-       ldr     pc, [r3, r1, lsl #2] @ FIXME
+       bx      r1
        .size   jump_hlecall, .-jump_hlecall
 
 new_dyna_leave:
        .size   jump_hlecall, .-jump_hlecall
 
 new_dyna_leave:
index 62250d9..55e5ec9 100644 (file)
@@ -3708,9 +3708,9 @@ void hlecall_assemble(int i,struct regstat *i_regs)
   assert(ccreg==HOST_CCREG);
   assert(!is_delayslot);
   emit_movimm(start+i*4+4,0); // Get PC
   assert(ccreg==HOST_CCREG);
   assert(!is_delayslot);
   emit_movimm(start+i*4+4,0); // Get PC
-  emit_movimm(source[i],1); // opcode
+  emit_movimm((int)psxHLEt[source[i]&7],1);
   emit_addimm(HOST_CCREG,CLOCK_DIVIDER*ccadj[i],HOST_CCREG); // XXX
   emit_addimm(HOST_CCREG,CLOCK_DIVIDER*ccadj[i],HOST_CCREG); // XXX
-  emit_jmp((int)jump_hlecall); // XXX
+  emit_jmp((int)jump_hlecall);
 }
 
 void ds_assemble(int i,struct regstat *i_regs)
 }
 
 void ds_assemble(int i,struct regstat *i_regs)