notaz.gp2x.de
/
picodrive.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
svp compiler: ops completed? last ver. with interpreter built in
[picodrive.git]
/
Pico
/
carthw
/
svp
/
compiler.c
diff --git
a/Pico/carthw/svp/compiler.c
b/Pico/carthw/svp/compiler.c
index
0cdd6ad
..
a3ca499
100644
(file)
--- a/
Pico/carthw/svp/compiler.c
+++ b/
Pico/carthw/svp/compiler.c
@@
-1,5
+1,3
@@
-// 187 blocks, 12072 bytes
-// 14 IRAM blocks
#include "../../PicoInt.h"
#include "compiler.h"
#include "../../PicoInt.h"
#include "compiler.h"
@@
-12,7
+10,7
@@
static int nblocks = 0;
static int iram_context = 0;
#ifndef ARM
static int iram_context = 0;
#ifndef ARM
-#define DUMP_BLOCK 0x
2018
+#define DUMP_BLOCK 0x
0c9a
unsigned int tcache[512*1024];
void regfile_load(void){}
void regfile_store(void){}
unsigned int tcache[512*1024];
void regfile_load(void){}
void regfile_store(void){}
@@
-499,11
+497,9
@@
static u32 ssp_pm_read(int reg)
{
ssp->pmac_read[reg] = rPMC.v;
ssp->emu_status &= ~SSP_PMC_SET;
{
ssp->pmac_read[reg] = rPMC.v;
ssp->emu_status &= ~SSP_PMC_SET;
- //elprintf("set PM%i %08x", ssp->pmac_read[reg]);
return 0;
}
return 0;
}
- //elprintf("rd PM%i %08x", ssp->pmac_read[reg]);
// just in case
ssp->emu_status &= ~SSP_PMC_HAVE_ADDR;
// just in case
ssp->emu_status &= ~SSP_PMC_HAVE_ADDR;
@@
-574,6
+570,7
@@
static void ssp_pm_write(u32 d, int reg)
// -----------------------------------------------------
// -----------------------------------------------------
+// 14 IRAM blocks
static unsigned char iram_context_map[] =
{
0, 0, 0, 0, 1, 0, 0, 0, // 04
static unsigned char iram_context_map[] =
{
0, 0, 0, 0, 1, 0, 0, 0, // 04
@@
-602,14
+599,7
@@
static int get_iram_context(void)
}
// -----------------------------------------------------
}
// -----------------------------------------------------
-/*
-enum {
- SSP_GR0, SSP_X, SSP_Y, SSP_A,
- SSP_ST, SSP_STACK, SSP_PC, SSP_P,
- SSP_PM0, SSP_PM1, SSP_PM2, SSP_XST,
- SSP_PM4, SSP_gr13, SSP_PMC, SSP_AL
-};
-*/
+
/* regs with known values */
static struct
{
/* regs with known values */
static struct
{
@@
-1058,8
+1048,6
@@
static int tr_aop_ssp2arm(int op)
// -----------------------------------------------------
// -----------------------------------------------------
-// SSP_GR0, SSP_X, SSP_Y, SSP_A,
-// SSP_ST, SSP_STACK, SSP_PC, SSP_P,
//@ r4: XXYY
//@ r5: A
//@ r6: STACK and emu flags
//@ r4: XXYY
//@ r5: A
//@ r6: STACK and emu flags
@@
-1082,7
+1070,6
@@
static void tr_X_to_r0(int op)
static void tr_Y_to_r0(int op)
{
static void tr_Y_to_r0(int op)
{
- // TODO..
if (hostreg_r[0] != (SSP_Y<<16)) {
EOP_MOV_REG_SIMPLE(0, 4); // mov r0, r4
hostreg_r[0] = SSP_Y<<16;
if (hostreg_r[0] != (SSP_Y<<16)) {
EOP_MOV_REG_SIMPLE(0, 4); // mov r0, r4
hostreg_r[0] = SSP_Y<<16;
@@
-1379,7
+1366,6
@@
static void tr_r0_to_AL(int const_val)
static void tr_r0_to_PMX(int reg)
{
static void tr_r0_to_PMX(int reg)
{
-#if 1
if ((known_regb & KRREG_PMC) && (known_regs.emu_status & SSP_PMC_SET))
{
known_regs.pmac_write[reg] = known_regs.pmc.v;
if ((known_regb & KRREG_PMC) && (known_regs.emu_status & SSP_PMC_SET))
{
known_regs.pmac_write[reg] = known_regs.pmc.v;
@@
-1388,8
+1374,7
@@
static void tr_r0_to_PMX(int reg)
dirty_regb |= 1 << (25+reg);
return;
}
dirty_regb |= 1 << (25+reg);
return;
}
-#endif
-#if 1
+
if ((known_regb & KRREG_PMC) && (known_regb & (1 << (25+reg))))
{
int mode, addr;
if ((known_regb & KRREG_PMC) && (known_regb & (1 << (25+reg))))
{
int mode, addr;
@@
-1440,15
+1425,6
@@
static void tr_r0_to_PMX(int reg)
dirty_regb &= ~KRREG_PMC;
known_regb &= ~(1 << (25+reg));
dirty_regb &= ~(1 << (25+reg));
dirty_regb &= ~KRREG_PMC;
known_regb &= ~(1 << (25+reg));
dirty_regb &= ~(1 << (25+reg));
-#else
-tr_flush_dirty_pmcrs();
-hostreg_clear();
-known_regb &= ~KRREG_PMC;
-dirty_regb &= ~KRREG_PMC;
-known_regb &= ~(1 << (25+reg));
-dirty_regb &= ~(1 << (25+reg));
-#endif
-
// call the C code to handle this
tr_flush_dirty_ST();
// call the C code to handle this
tr_flush_dirty_ST();
@@
-1639,7
+1615,6
@@
static int translate_op(unsigned int op, int *pc, int imm)
if (op == 0) { ret++; break; } // nop
tmpv = op & 0xf; // src
tmpv2 = (op >> 4) & 0xf; // dst
if (op == 0) { ret++; break; } // nop
tmpv = op & 0xf; // src
tmpv2 = (op >> 4) & 0xf; // dst
- //if (tmpv2 >= 8) return -1; // TODO
if (tmpv2 == SSP_A && tmpv == SSP_P) { // ld A, P
tr_flush_dirty_P();
EOP_MOV_REG_SIMPLE(5, 10);
if (tmpv2 == SSP_A && tmpv == SSP_P) { // ld A, P
tr_flush_dirty_P();
EOP_MOV_REG_SIMPLE(5, 10);
@@
-1654,13
+1629,11
@@
static int translate_op(unsigned int op, int *pc, int imm)
// ld d, (ri)
case 0x01: {
// ld d, (ri)
case 0x01: {
- // tmpv = ptr1_read(op); REG_WRITE((op & 0xf0) >> 4, tmpv); break;
int r = (op&3) | ((op>>6)&4);
int mod = (op>>2)&3;
tmpv = (op >> 4) & 0xf; // dst
ret = tr_detect_rotate(op, pc, imm);
if (ret > 0) break;
int r = (op&3) | ((op>>6)&4);
int mod = (op>>2)&3;
tmpv = (op >> 4) & 0xf; // dst
ret = tr_detect_rotate(op, pc, imm);
if (ret > 0) break;
- if (tmpv >= 8) return -1; // TODO
if (tmpv != 0)
tr_rX_read(r, mod);
else tr_ptrr_mod(r, mod, 1, 1);
if (tmpv != 0)
tr_rX_read(r, mod);
else tr_ptrr_mod(r, mod, 1, 1);
@@
-1687,21
+1660,16
@@
static int translate_op(unsigned int op, int *pc, int imm)
tmpv = (op & 0xf0) >> 4; // dst
ret = tr_detect_pm0_block(op, pc, imm);
if (ret > 0) break;
tmpv = (op & 0xf0) >> 4; // dst
ret = tr_detect_pm0_block(op, pc, imm);
if (ret > 0) break;
- if (tmpv < 8)
- {
- tr_mov16(0, imm);
- tr_write_funcs[tmpv](imm);
- ret += 2; break;
- }
ret = tr_detect_set_pm(op, pc, imm);
if (ret > 0) break;
ret = tr_detect_set_pm(op, pc, imm);
if (ret > 0) break;
+ tr_mov16(0, imm);
+ tr_write_funcs[tmpv](imm);
if (tmpv == SSP_PC) ret |= 0x10000;
if (tmpv == SSP_PC) ret |= 0x10000;
- ret
urn -1; /* TODO.. */
+ ret
+= 2; break;
// ld d, ((ri))
case 0x05:
tmpv2 = (op >> 4) & 0xf; // dst
// ld d, ((ri))
case 0x05:
tmpv2 = (op >> 4) & 0xf; // dst
- if (tmpv2 >= 8) return -1; // TODO
tr_rX_read2(op);
tr_write_funcs[tmpv2](-1);
if (tmpv2 == SSP_PC) ret |= 0x10000;
tr_rX_read2(op);
tr_write_funcs[tmpv2](-1);
if (tmpv2 == SSP_PC) ret |= 0x10000;
@@
-1724,7
+1692,6
@@
static int translate_op(unsigned int op, int *pc, int imm)
int r;
r = (op&3) | ((op>>6)&4); // src
tmpv2 = (op >> 4) & 0xf; // dst
int r;
r = (op&3) | ((op>>6)&4); // src
tmpv2 = (op >> 4) & 0xf; // dst
- if (tmpv2 >= 8) tr_unhandled();
if ((r&3) == 3) tr_unhandled();
if (known_regb & (1 << (r+8))) {
if ((r&3) == 3) tr_unhandled();
if (known_regb & (1 << (r+8))) {
@@
-1801,8
+1768,6
@@
static int translate_op(unsigned int op, int *pc, int imm)
// ld d, (a)
case 0x25:
tmpv2 = (op >> 4) & 0xf; // dst
// ld d, (a)
case 0x25:
tmpv2 = (op >> 4) & 0xf; // dst
- if (tmpv2 >= 8) return -1; // TODO
-
tr_A_to_r0(op);
EOP_LDR_IMM(1,7,0x48c); // ptr_iram_rom
EOP_ADD_REG_LSL(0,1,0,1); // add r0, r1, r0, lsl #1
tr_A_to_r0(op);
EOP_LDR_IMM(1,7,0x48c); // ptr_iram_rom
EOP_ADD_REG_LSL(0,1,0,1); // add r0, r1, r0, lsl #1
@@
-2025,9
+1990,6
@@
static void *translate_block(int pc)
unsigned int *block_start;
int ret, ret_prev = -1, tpc;
unsigned int *block_start;
int ret, ret_prev = -1, tpc;
- // create .pool
- //*tcache_ptr++ = (u32) in_funcs; // -1 func pool
-
printf("translate %04x -> %04x\n", pc<<1, (tcache_ptr-tcache)<<2);
block_start = tcache_ptr;
known_regb = 0;
printf("translate %04x -> %04x\n", pc<<1, (tcache_ptr-tcache)<<2);
block_start = tcache_ptr;
known_regb = 0;
@@
-2039,7
+2001,6
@@
static void *translate_block(int pc)
for (; ccount < 100;)
{
for (; ccount < 100;)
{
- //printf(" insn #%i\n", icount);
op = PROGRAM(pc++);
op1 = op >> 9;
imm = (u32)-1;
op = PROGRAM(pc++);
op1 = op >> 9;
imm = (u32)-1;
@@
-2087,12
+2048,14
@@
static void *translate_block(int pc)
ret_prev = ret;
}
ret_prev = ret;
}
+ if (ccount >= 100)
+ emit_pc_dump(pc);
+
tr_flush_dirty_prs();
tr_flush_dirty_ST();
tr_flush_dirty_pmcrs();
emit_block_epilogue(ccount + 1);
*tcache_ptr++ = 0xffffffff; // end of block
tr_flush_dirty_prs();
tr_flush_dirty_ST();
tr_flush_dirty_pmcrs();
emit_block_epilogue(ccount + 1);
*tcache_ptr++ = 0xffffffff; // end of block
- //printf(" %i inst\n", icount);
if (tcache_ptr - tcache > TCACHE_SIZE/4) {
printf("tcache overflow!\n");
if (tcache_ptr - tcache > TCACHE_SIZE/4) {
printf("tcache overflow!\n");
@@
-2102,9
+2065,7
@@
static void *translate_block(int pc)
// stats
nblocks++;
// stats
nblocks++;
- //if (pc >= 0x400)
printf("%i blocks, %i bytes\n", nblocks, (tcache_ptr - tcache)*4);
printf("%i blocks, %i bytes\n", nblocks, (tcache_ptr - tcache)*4);
- //printf("%p %p\n", tcache_ptr, emit_block_epilogue);
#ifdef DUMP_BLOCK
{
#ifdef DUMP_BLOCK
{
@@
-2158,8
+2119,6
@@
void ssp1601_dyn_reset(ssp1601_t *ssp)
void ssp1601_dyn_run(int cycles)
{
if (ssp->emu_status & SSP_WAIT_MASK) return;
void ssp1601_dyn_run(int cycles)
{
if (ssp->emu_status & SSP_WAIT_MASK) return;
- //{ printf("%i wait\n", Pico.m.frame_count); return; }
- //printf("%i %04x\n", Pico.m.frame_count, rPC<<1);
#ifdef DUMP_BLOCK
rPC = DUMP_BLOCK >> 1;
#ifdef DUMP_BLOCK
rPC = DUMP_BLOCK >> 1;
@@
-2184,11
+2143,7
@@
void ssp1601_dyn_run(int cycles)
trans_entry = (void *) block_table[rPC];
}
trans_entry = (void *) block_table[rPC];
}
- //printf("enter %04x\n", rPC<<1);
cycles -= trans_entry();
cycles -= trans_entry();
- //printf("leave %04x\n", rPC<<1);
}
}
-// debug_dump2file("tcache.bin", tcache, (tcache_ptr - tcache) << 1);
-// exit(1);
}
}