drc related bugfixes
authornotaz <notasas@gmail.com>
Thu, 22 Oct 2009 09:54:54 +0000 (09:54 +0000)
committernotaz <notasas@gmail.com>
Thu, 22 Oct 2009 09:54:54 +0000 (09:54 +0000)
git-svn-id: file:///home/notaz/opt/svn/PicoDrive@822 be3aeb3a-fb24-0410-a615-afba39da0efa

cpu/drc/cmn.c
cpu/drc/emit_arm.c
cpu/sh2/compiler.c

index 08059f2..0e79489 100644 (file)
@@ -1,5 +1,5 @@
 #include <stdio.h>
-#if defined(__linux__) && defined(ARM)
+#ifdef __linux__
 #include <sys/mman.h>
 #endif
 
@@ -10,19 +10,17 @@ u8 __attribute__((aligned(4096))) tcache[DRC_TCACHE_SIZE];
 
 void drc_cmn_init(void)
 {
-#if defined(__linux__) && defined(ARM)
+#ifdef __linux__
        void *tmp;
 
        tmp = mmap(tcache, DRC_TCACHE_SIZE, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_SHARED|MAP_ANONYMOUS, -1, 0);
        printf("mmap tcache: %p, asked %p\n", tmp, tcache);
 #endif
-
 }
 
-// TODO: add calls in core, possibly to cart.c?
 void drc_cmn_cleanup(void)
 {
-#if defined(__linux__) && defined(ARM)
+#ifdef __linux__
        int ret;
        ret = munmap(tcache, DRC_TCACHE_SIZE);
        printf("munmap tcache: %i\n", ret);
index 5a1da7f..921474c 100644 (file)
@@ -189,10 +189,10 @@ static void emith_op_imm(int cond, int op, int r, unsigned int imm)
                EOP_C_DOP_IMM(cond, op, 0, r, r, (ror2 - 8/2) & 0x0f, v & 0xff);
        v >>= 8;
        if (v & 0xff)
-               EOP_C_DOP_IMM(cond, op, 0, r, r, (ror2 - 8/2) & 0x0f, v & 0xff);
+               EOP_C_DOP_IMM(cond, op, 0, r, r, (ror2 - 16/2) & 0x0f, v & 0xff);
        v >>= 8;
        if (v & 0xff)
-               EOP_C_DOP_IMM(cond, op, 0, r, r, (ror2 - 8/2) & 0x0f, v & 0xff);
+               EOP_C_DOP_IMM(cond, op, 0, r, r, (ror2 - 24/2) & 0x0f, v & 0xff);
 }
 
 #define is_offset_24(val) \
index 4dd74e8..9368b58 100644 (file)
@@ -641,6 +641,9 @@ int sh2_drc_init(SH2 *sh2)
 {
   if (block_tables[0] == NULL) {
     int i, cnt;
+
+    drc_cmn_init();
+
     cnt = block_max_counts[0] + block_max_counts[1] + block_max_counts[2];
     block_tables[0] = calloc(cnt, sizeof(*block_tables[0]));
     if (block_tables[0] == NULL)
@@ -680,6 +683,8 @@ void sh2_drc_finish(SH2 *sh2)
 #endif
     free(block_tables[0]);
     memset(block_tables, 0, sizeof(block_tables));
+
+    drc_cmn_cleanup();
   }
 
   if (hash_table != NULL) {