From 7f5a3fc12a778ff161ebf3f379ccc3127de4ef29 Mon Sep 17 00:00:00 2001 From: notaz Date: Thu, 22 Oct 2009 09:54:54 +0000 Subject: [PATCH] drc related bugfixes git-svn-id: file:///home/notaz/opt/svn/PicoDrive@822 be3aeb3a-fb24-0410-a615-afba39da0efa --- cpu/drc/cmn.c | 8 +++----- cpu/drc/emit_arm.c | 4 ++-- cpu/sh2/compiler.c | 5 +++++ 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/cpu/drc/cmn.c b/cpu/drc/cmn.c index 08059f2d..0e794897 100644 --- a/cpu/drc/cmn.c +++ b/cpu/drc/cmn.c @@ -1,5 +1,5 @@ #include -#if defined(__linux__) && defined(ARM) +#ifdef __linux__ #include #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); diff --git a/cpu/drc/emit_arm.c b/cpu/drc/emit_arm.c index 5a1da7f9..921474c1 100644 --- a/cpu/drc/emit_arm.c +++ b/cpu/drc/emit_arm.c @@ -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) \ diff --git a/cpu/sh2/compiler.c b/cpu/sh2/compiler.c index 4dd74e8d..9368b583 100644 --- a/cpu/sh2/compiler.c +++ b/cpu/sh2/compiler.c @@ -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) { -- 2.39.5