Browse Source

overhaul of translation cache and sh2 literals handling

kub 5 years ago
parent
commit
f133766faa
4 changed files with 471 additions and 351 deletions
  1. 454 338
      cpu/sh2/compiler.c
  2. 7 5
      cpu/sh2/compiler.h
  3. 6 6
      pico/32x/memory.c
  4. 4 2
      pico/pico_int.h

File diff suppressed because it is too large
+ 454 - 338
cpu/sh2/compiler.c


+ 7 - 5
cpu/sh2/compiler.h

@@ -24,7 +24,7 @@ void sh2_drc_frame(void);
 
 void scan_block(unsigned int base_pc, int is_slave,
 		unsigned char *op_flags, unsigned int *end_pc,
-		unsigned int *end_literals);
+		unsigned int *base_literals, unsigned int *end_literals);
 
 #if defined(DRC_SH2)
 // direct access to some host CPU registers used by the DRC
@@ -39,13 +39,15 @@ void scan_block(unsigned int base_pc, int is_slave,
 #warning "direct DRC register access not available for this host"
 #endif
 
-#ifdef DCR_SR_REG
-#define	DRC_DECLARE_SR	register int sh2_sr asm(#DCR_SR_REG)
+#ifdef DRC_SR_REG
+#define	__DRC_DECLARE_SR(SR)	register int sh2_sr asm(#SR)
+#define	_DRC_DECLARE_SR(SR)	__DRC_DECLARE_SR(SR)
+#define	DRC_DECLARE_SR	_DRC_DECLARE_SR(DRC_SR_REG)
 #define DRC_SAVE_SR(sh2) \
-    if ((sh2->state & (SH2_STATE_RUN|SH2_STATE_BUSY)) == SH2_STATE_RUN) \
+    if ((sh2->state & (SH2_STATE_RUN)) == SH2_STATE_RUN) \
         sh2->sr = sh2_sr;
 #define DRC_RESTORE_SR(sh2) \
-    if ((sh2->state & (SH2_STATE_RUN|SH2_STATE_BUSY)) == SH2_STATE_RUN) \
+    if ((sh2->state & (SH2_STATE_RUN)) == SH2_STATE_RUN) \
         sh2_sr = sh2->sr;
 #else
 #define	DRC_DECLARE_SR

+ 6 - 6
pico/32x/memory.c

@@ -1432,7 +1432,7 @@ static void REGPARM(3) sh2_write8_sdram(u32 a, u32 d, SH2 *sh2)
 {
   u32 a1 = a & 0x3ffff;
 #ifdef DRC_SH2
-  u16 *p = sh2->p_drcblk_ram;
+  u8 *p = sh2->p_drcblk_ram;
   int t = p[a1 >> SH2_DRCBLK_RAM_SHIFT];
   if (t)
     sh2_drc_wcheck_ram(a, t, sh2);
@@ -1456,7 +1456,7 @@ static void REGPARM(3) sh2_write8_da(u32 a, u32 d, SH2 *sh2)
 {
   u32 a1 = a & 0xfff;
 #ifdef DRC_SH2
-  u16 *p = sh2->p_drcblk_da;
+  u8 *p = sh2->p_drcblk_da;
   int t = p[a1 >> SH2_DRCBLK_DA_SHIFT];
   if (t)
     sh2_drc_wcheck_da(a, t, sh2);
@@ -1511,7 +1511,7 @@ static void REGPARM(3) sh2_write16_sdram(u32 a, u32 d, SH2 *sh2)
 {
   u32 a1 = a & 0x3fffe;
 #ifdef DRC_SH2
-  u16 *p = sh2->p_drcblk_ram;
+  u8 *p = sh2->p_drcblk_ram;
   int t = p[a1 >> SH2_DRCBLK_RAM_SHIFT];
   if (t)
     sh2_drc_wcheck_ram(a, t, sh2);
@@ -1523,7 +1523,7 @@ static void REGPARM(3) sh2_write16_da(u32 a, u32 d, SH2 *sh2)
 {
   u32 a1 = a & 0xffe;
 #ifdef DRC_SH2
-  u16 *p = sh2->p_drcblk_da;
+  u8 *p = sh2->p_drcblk_da;
   int t = p[a1 >> SH2_DRCBLK_DA_SHIFT];
   if (t)
     sh2_drc_wcheck_da(a, t, sh2);
@@ -1580,7 +1580,7 @@ static void REGPARM(3) sh2_write32_sdram(u32 a, u32 d, SH2 *sh2)
 {
   u32 a1 = a & 0x3fffc;
 #ifdef DRC_SH2
-  u16 *p = sh2->p_drcblk_ram;
+  u8 *p = sh2->p_drcblk_ram;
   int t = p[a1 >> SH2_DRCBLK_RAM_SHIFT];
   if (t)
     sh2_drc_wcheck_ram(a, t, sh2);
@@ -1595,7 +1595,7 @@ static void REGPARM(3) sh2_write32_da(u32 a, u32 d, SH2 *sh2)
 {
   u32 a1 = a & 0xffc;
 #ifdef DRC_SH2
-  u16 *p = sh2->p_drcblk_da;
+  u8 *p = sh2->p_drcblk_da;
   int t = p[a1 >> SH2_DRCBLK_DA_SHIFT];
   if (t)
     sh2_drc_wcheck_da(a, t, sh2);

+ 4 - 2
pico/pico_int.h

@@ -599,7 +599,8 @@ struct Pico32xMem
 {
   unsigned char  sdram[0x40000];
 #ifdef DRC_SH2
-  unsigned short drcblk_ram[1 << (18 - SH2_DRCBLK_RAM_SHIFT)];
+  unsigned char drcblk_ram[1 << (18 - SH2_DRCBLK_RAM_SHIFT)];
+  unsigned char drclit_ram[1 << (18 - SH2_DRCBLK_RAM_SHIFT)];
 #endif
   unsigned short dram[2][0x20000/2];    // AKA fb
   union {
@@ -607,7 +608,8 @@ struct Pico32xMem
     unsigned char  m68k_rom_bank[0x10000]; // M68K_BANK_SIZE
   };
 #ifdef DRC_SH2
-  unsigned short drcblk_da[2][1 << (12 - SH2_DRCBLK_DA_SHIFT)];
+  unsigned char drcblk_da[2][1 << (12 - SH2_DRCBLK_DA_SHIFT)];
+  unsigned char drclit_da[2][1 << (12 - SH2_DRCBLK_DA_SHIFT)];
 #endif
   union {
     unsigned char  b[0x800];

Some files were not shown because too many files changed in this diff