do { \
*(u32 *)ptr = x; \
ptr = (void *)((u8 *)ptr + sizeof(u32)); \
+ COUNT_OP; \
} while (0)
#define EMIT(x) EMIT_PTR(tcache_ptr, x)
static void emith_op_imm(int cond, int op, int r, unsigned int imm)
{
- u32 v, ror2;
+ int ror2, rn = r;
+ u32 v;
- if (imm == 0 && op != A_OP_MOV)
+ if (op == A_OP_MOV)
+ rn = 0;
+ else if (imm == 0)
return;
- /* shift down to get starting rot2 */
- for (v = imm, ror2 = 0; v && !(v & 3); v >>= 2)
- ror2++;
- ror2 = 16 - ror2;
+ for (v = imm, ror2 = 0; v != 0 || op == A_OP_MOV; v >>= 8, ror2 -= 8/2) {
+ /* shift down to get 'best' rot2 */
+ for (; v && !(v & 3); v >>= 2)
+ ror2--;
- EOP_C_DOP_IMM(cond, op, 0, op == A_OP_MOV ? 0 : r, r, ror2 & 0x0f, v & 0xff);
- if (op == A_OP_MOV)
- op = A_OP_ORR;
-
- v >>= 8;
- if (v & 0xff)
- 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 - 16/2) & 0x0f, v & 0xff);
- v >>= 8;
- if (v & 0xff)
- EOP_C_DOP_IMM(cond, op, 0, r, r, (ror2 - 24/2) & 0x0f, v & 0xff);
+ EOP_C_DOP_IMM(cond, op, 0, rn, r, ror2 & 0x0f, v & 0xff);
+
+ if (op == A_OP_MOV) {
+ op = A_OP_ORR;
+ rn = r;
+ }
+ }
}
#define is_offset_24(val) \
return (u32 *)tcache_ptr - start_ptr;
}
-static void handle_caches(void)
-{
-#ifdef ARM
- extern void cache_flush_d_inval_i(const void *start_addr, const void *end_addr);
- cache_flush_d_inval_i(tcache, tcache_ptr);
-#endif
-}
-
#define EMITH_CONDITIONAL(code, is_nonzero) { \
u32 val, cond, *ptr; \
#include <stdarg.h>
-#if (DRC_DEBUG & 1)
-#define COUNT_OP \
- host_insn_count++
-#else
-#define COUNT_OP
-#endif
-
enum { xAX = 0, xCX, xDX, xBX, xSP, xBP, xSI, xDI };
#define CONTEXT_REG xBP
#define DRC_DEBUG 0
#endif
+#if DRC_DEBUG
#define dbg(l,...) { \
if ((l) & DRC_DEBUG) \
elprintf(EL_STATUS, ##__VA_ARGS__); \
}
-#if DRC_DEBUG
#include "mame/sh2dasm.h"
#include <platform/linux/host_dasm.h>
static int insns_compiled, hash_collisions, host_insn_count;
+#define COUNT_OP \
+ host_insn_count++
+#else // !DRC_DEBUG
+#define COUNT_OP
+#define dbg(...)
#endif
+
#if (DRC_DEBUG & 2)
static u8 *tcache_dsm_ptrs[3];
static char sh2dasm_buff[64];
extern void sh2_drc_exit(void);
// tmp
-extern void __attribute__((regparm(2))) sh2_do_op(SH2 *sh2, int opcode);
-static void __attribute__((regparm(1))) sh2_test_irq(SH2 *sh2);
+extern void REGPARM(2) sh2_do_op(SH2 *sh2, int opcode);
+static void REGPARM(1) sh2_test_irq(SH2 *sh2);
static void flush_tcache(int tcid)
{
- printf("tcache #%d flush! (%d/%d, bds %d/%d)\n", tcid,
+ dbg(1, "tcache #%d flush! (%d/%d, bds %d/%d)", tcid,
tcache_ptrs[tcid] - tcache_bases[tcid], tcache_sizes[tcid],
block_counts[tcid], block_max_counts[tcid]);
emith_jump(sh2_drc_exit);
tcache_ptrs[tcache_id] = tcache_ptr;
+#ifdef ARM
+ cache_flush_d_inval_i(block_entry, tcache_ptr);
+#endif
+
do_host_disasm(tcache_id);
dbg(1, " block #%d,%d tcache %d/%d, insns %d -> %d %.3f",
tcache_id, block_counts[tcache_id],
insns_compiled, host_insn_count, (double)host_insn_count / insns_compiled);
if ((sh2->pc & 0xc6000000) == 0x02000000) // ROM
dbg(1, " hash collisions %d/%d", hash_collisions, block_counts[tcache_id]);
+#if (DRC_DEBUG & 2)
+ fflush(stdout);
+#endif
+
return block_entry;
/*
unimplemented:
sh2->cycles_done += cycles - ((signed int)sh2->sr >> 12);
}
-static void __attribute__((regparm(1))) sh2_test_irq(SH2 *sh2)
+static void REGPARM(1) sh2_test_irq(SH2 *sh2)
{
if (sh2->pending_level > ((sh2->sr >> 4) & 0x0f))
{
(double)maxb->refcount / total * 100.0);
maxb->refcount = 0;
}
+
+ for (b = 0; b < ARRAY_SIZE(block_tables); b++)
+ for (i = 0; i < block_counts[b]; i++)
+ block_tables[b][i].refcount = 0;
}
+#else
+#define block_stats()
#endif
+void sh2_drc_flush_all(void)
+{
+ block_stats();
+ flush_tcache(0);
+ flush_tcache(1);
+ flush_tcache(2);
+}
+
int sh2_drc_init(SH2 *sh2)
{
if (block_tables[0] == NULL) {
tcache_bases[i] = tcache_ptrs[i] = tcache_bases[i - 1] + tcache_sizes[i - 1];
}
+ // tmp
+ PicoOpt |= POPT_DIS_VDP_FIFO;
+
#if (DRC_DEBUG & 2)
for (i = 0; i < ARRAY_SIZE(block_tables); i++)
tcache_dsm_ptrs[i] = tcache_bases[i];
void sh2_drc_finish(SH2 *sh2)
{
if (block_tables[0] != NULL) {
-#if (DRC_DEBUG & 1)
block_stats();
-#endif
free(block_tables[0]);
memset(block_tables, 0, sizeof(block_tables));
#else // DRC_TMP
+#ifdef __i386__
+#define REGPARM(x) __attribute__((regparm(x)))
+#else
+#define REGPARM(x)
+#endif
+
// tmp
-void __attribute__((regparm(2))) sh2_do_op(SH2 *sh2_, int opcode)
+void REGPARM(2) sh2_do_op(SH2 *sh2_, int opcode)
{
sh2 = sh2_;
sh2->pc += 2;
static void PicoWrite16_32x_on(u32 a, u32 d)
{
if ((a & 0xfc00) == 0x5000)
- elprintf(EL_UIO, "m68k 32x w16 [%06x] %04x @%06x", a, d & 0xffff, SekPc);
+ elprintf(EL_32X, "m68k 32x w16 [%06x] %04x @%06x", a, d & 0xffff, SekPc);
if ((a & 0xffc0) == 0x5100) { // a15100
p32x_reg_write16(a, d);
void ssp_drc_end(void){}
#endif
+#define COUNT_OP
#include "../../../cpu/drc/emit_arm.c"
// -----------------------------------------------------
exit(0);
#endif
- handle_caches();
+#ifdef ARM
+ cache_flush_d_inval_i(tcache, tcache_ptr);
+#endif
return block_start;
}
if (xcycles >= timer_b_next_oflow) \\r
ym2612.OPN.ST.status |= (ym2612.OPN.ST.mode >> 2) & 2\r
\r
-static u32 MEMH_FUNC ym2612_read_local_z80(void)\r
+static u32 ym2612_read_local_z80(void)\r
{\r
int xcycles = z80_cyclesDone() << 8;\r
\r
// -----------------------------------------------------------------\r
// z80 memhandlers\r
\r
-static unsigned char MEMH_FUNC z80_md_vdp_read(unsigned short a)\r
+static unsigned char z80_md_vdp_read(unsigned short a)\r
{\r
// TODO?\r
elprintf(EL_ANOMALY, "z80 invalid r8 [%06x] %02x", a, 0xff);\r
return 0xff;\r
}\r
\r
-static unsigned char MEMH_FUNC z80_md_bank_read(unsigned short a)\r
+static unsigned char z80_md_bank_read(unsigned short a)\r
{\r
unsigned int addr68k;\r
unsigned char ret;\r
return ret;\r
}\r
\r
-static void MEMH_FUNC z80_md_ym2612_write(unsigned int a, unsigned char data)\r
+static void z80_md_ym2612_write(unsigned int a, unsigned char data)\r
{\r
if (PicoOpt & POPT_EN_FM)\r
emustatus |= ym2612_write_local(a, data, 1) & 1;\r
}\r
\r
-static void MEMH_FUNC z80_md_vdp_br_write(unsigned int a, unsigned char data)\r
+static void z80_md_vdp_br_write(unsigned int a, unsigned char data)\r
{\r
// TODO: allow full VDP access\r
if ((a&0xfff9) == 0x7f11) // 7f11 7f13 7f15 7f17\r
elprintf(EL_ANOMALY, "z80 invalid w8 [%06x] %02x", a, data);\r
}\r
\r
-static void MEMH_FUNC z80_md_bank_write(unsigned int a, unsigned char data)\r
+static void z80_md_bank_write(unsigned int a, unsigned char data)\r
{\r
unsigned int addr68k;\r
\r
#define cdprintf(x...)\r
#endif\r
\r
-#if defined(__GNUC__) && __GNUC__ >= 4 && __GNUC_MINOR__ >= 3\r
-#define MEMH_FUNC __attribute__((aligned(4)))\r
+#ifdef __i386__\r
+#define REGPARM(x) __attribute__((regparm(x)))\r
#else\r
-#define MEMH_FUNC\r
+#define REGPARM(x)\r
#endif\r
\r
#ifdef __GNUC__\r
}
}
-static void MEMH_FUNC xwrite(unsigned int a, unsigned char d)
+static void xwrite(unsigned int a, unsigned char d)
{
elprintf(EL_IO, "z80 write [%04x] %02x", a, d);
if (a >= 0xc000)
use_sh2drc = 1\r
drc_debug = 1\r
\r
+-include Makefile.local\r
\r
ifeq "$(debug_cyclone)" "1"\r
use_cyclone = 1\r
use_musashi = 1\r
endif\r
ifeq "$(use_musashi)" "1"\r
+# due to CPU stop flag acces\r
asm_cdpico = 0\r
-asm_memory = 0\r
asm_cdmemory = 0\r
else\r
use_cyclone = 1\r
OBJS += cpu/sh2/mame/sh2pico.o\r
OBJS += cpu/sh2/compiler.o\r
OBJS += cpu/sh2/stub_arm.o\r
-ifeq "$(drc_debug)" "1"\r
-DEFINES += DRC_DEBUG=1\r
+ifdef drc_debug\r
+DEFINES += DRC_DEBUG=$(drc_debug)\r
OBJS += cpu/sh2/mame/sh2dasm.o\r
OBJS += platform/linux/host_dasm.o\r
LDFLAGS += -lbfd -lopcodes -liberty\r
endif
DEFINES = _UNZIP_SUPPORT IO_STATS IN_EVDEV
CFLAGS += -I../.. -I.
-LDFLAGS += -lpthread
+LDFLAGS += -lm -lpng
ifeq "$(ARCH)" "arm"
CFLAGS += -mcpu=arm920t
DEFINES += ARM
-else
-LDFLAGS += -lX11
endif
+LDFLAGS += -lpthread
+LDFLAGS += -lX11
CC = $(CROSS)gcc
OBJS += cpu/sh2/mame/sh2pico.o
OBJS += cpu/sh2/compiler.o
OBJS += cpu/sh2/stub_$(ARCH).o
-ifeq "$(drc_debug)" "1"
-DEFINES += DRC_DEBUG=1
+ifdef drc_debug
+DEFINES += DRC_DEBUG=$(drc_debug)
OBJS += cpu/sh2/mame/sh2dasm.o
OBJS += host_dasm.o
LDFLAGS += -lbfd -lopcodes -liberty
PicoDrive : $(OBJS)
@echo ">>>" $@
- $(CC) $(CFLAGS) $^ $(LDFLAGS) -lm -lpng -Wl,-Map=PicoDrive.map -o $@
+ $(CC) $(CFLAGS) $^ $(LDFLAGS) -Wl,-Map=PicoDrive.map -o $@
mkdirs:
@mkdir -p $(DIRS)
{
asymbol *sym = *in_ptr++;
- if (sym->name == NULL || sym->name[0] == '\0')
+ if (sym->name == NULL || sym->name[0] == '\0' || sym->name[0] == '$')
continue;
if (sym->flags & (BSF_DEBUGGING | BSF_SECTION_SYM))
continue;
*/
*out_ptr++ = sym;
}
+
return out_ptr - symbols;
}