mirror of https://github.com/inolen/redream.git
added sh4 interpreter
added OP_FLUSH_CONTEXT fixed bug in ldcsr now that the GPRs are properly flushed when a bank change occurs
This commit is contained in:
parent
94df004840
commit
c703da40f7
|
@ -187,6 +187,7 @@ set(REDREAM_SOURCES
|
|||
src/jit/frontend/armv3/armv3_fallback.c
|
||||
src/jit/frontend/armv3/armv3_frontend.c
|
||||
src/jit/frontend/sh4/sh4_disasm.c
|
||||
src/jit/frontend/sh4/sh4_fallbacks.c
|
||||
src/jit/frontend/sh4/sh4_frontend.c
|
||||
src/jit/frontend/sh4/sh4_translate.c
|
||||
src/jit/ir/ir.c
|
||||
|
|
|
@ -12,6 +12,7 @@
|
|||
#include "hw/rom/flash.h"
|
||||
#include "hw/scheduler.h"
|
||||
#include "jit/backend/x64/x64_backend.h"
|
||||
#include "jit/frontend/sh4/sh4_fallbacks.h"
|
||||
#include "jit/frontend/sh4/sh4_frontend.h"
|
||||
#include "jit/frontend/sh4/sh4_guest.h"
|
||||
#include "jit/ir/ir.h"
|
||||
|
@ -138,11 +139,33 @@ static void sh4_run(struct device *dev, int64_t ns) {
|
|||
PROF_ENTER("cpu", "sh4_run");
|
||||
|
||||
struct sh4 *sh4 = (struct sh4 *)dev;
|
||||
struct sh4_ctx *ctx = &sh4->ctx;
|
||||
struct jit *jit = sh4->jit;
|
||||
|
||||
int64_t cycles = NANO_TO_CYCLES(ns, SH4_CLOCK_FREQ);
|
||||
cycles = MAX(cycles, INT64_C(1));
|
||||
jit_run(sh4->jit, cycles);
|
||||
|
||||
int cache_enabled = sh4->CCR->ICE;
|
||||
|
||||
if (cache_enabled) {
|
||||
jit_run(sh4->jit, cycles);
|
||||
} else {
|
||||
ctx->run_cycles = cycles;
|
||||
ctx->ran_instrs = 0;
|
||||
|
||||
while (ctx->run_cycles-- > 0) {
|
||||
sh4_intc_check_pending(sh4);
|
||||
|
||||
uint16_t data = as_read16(sh4->memory_if->space, ctx->pc);
|
||||
union sh4_instr instr = {data};
|
||||
sh4_fallback_cb cb = sh4_get_fallback(data);
|
||||
|
||||
cb(sh4->guest, ctx->pc, instr);
|
||||
|
||||
ctx->ran_instrs++;
|
||||
}
|
||||
}
|
||||
|
||||
prof_counter_add(COUNTER_sh4_instrs, sh4->ctx.ran_instrs);
|
||||
|
||||
PROF_LEAVE();
|
||||
|
|
|
@ -25,13 +25,10 @@ static void sh4_ccn_reset(struct sh4 *sh4) {
|
|||
void sh4_ccn_sq_prefetch(void *data, uint32_t addr) {
|
||||
PROF_ENTER("cpu", "sh4_ccn_sq_prefetch");
|
||||
|
||||
struct sh4 *sh4 = data;
|
||||
|
||||
/* make sure this is a sq related prefetch */
|
||||
// DCHECK(addr >= 0xe0000000 && addr <= 0xe3ffffff);
|
||||
if (!(addr >= 0xe0000000 && addr <= 0xe3ffffff))
|
||||
return;
|
||||
DCHECK(addr >= 0xe0000000 && addr <= 0xe3ffffff);
|
||||
|
||||
struct sh4 *sh4 = data;
|
||||
uint32_t dst = addr & 0x03ffffe0;
|
||||
uint32_t sqi = (addr & 0x20) >> 5;
|
||||
if (sqi) {
|
||||
|
@ -82,6 +79,8 @@ REG_W32(sh4_cb, MMUCR) {
|
|||
REG_W32(sh4_cb, CCR) {
|
||||
struct sh4 *sh4 = dc->sh4;
|
||||
|
||||
/* TODO check for cache toggle
|
||||
union ccr CCR_OLD = *sh4->CCR;*/
|
||||
sh4->CCR->full = value;
|
||||
|
||||
if (sh4->CCR->ICI) {
|
||||
|
|
|
@ -1642,6 +1642,8 @@ EMITTER(CALL_COND) {
|
|||
e.outLocalLabel();
|
||||
}
|
||||
|
||||
EMITTER(FLUSH_CONTEXT) {}
|
||||
|
||||
EMITTER(DEBUG_INFO) {}
|
||||
|
||||
EMITTER(DEBUG_BREAK) {
|
||||
|
|
|
@ -1,38 +1,18 @@
|
|||
#include "jit/frontend/sh4/sh4_disasm.h"
|
||||
#include "core/assert.h"
|
||||
#include "core/constructor.h"
|
||||
#include "core/string.h"
|
||||
|
||||
static struct sh4_opdef *sh4_opdef_lookup[UINT16_MAX + 1];
|
||||
int sh4_optable[UINT16_MAX + 1];
|
||||
|
||||
struct sh4_opdef sh4_opdefs[NUM_SH4_OPS] = {
|
||||
#define SH4_INSTR(name, desc, sig, cycles, flags) \
|
||||
{SH4_OP_##name, #name, desc, #sig, cycles, flags, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{SH4_OP_##name, #name, desc, #sig, cycles, flags},
|
||||
#include "jit/frontend/sh4/sh4_instr.inc"
|
||||
#undef SH4_INSTR
|
||||
};
|
||||
|
||||
static void sh4_arg_mask(const char *instr_code, char c, uint16_t *mask,
|
||||
uint16_t *shift) {
|
||||
size_t len = strlen(instr_code);
|
||||
if (mask) {
|
||||
*mask = 0;
|
||||
}
|
||||
if (shift) {
|
||||
*shift = 0;
|
||||
}
|
||||
for (size_t i = 0; i < len; i++) {
|
||||
if ((!c && instr_code[i] == '1') || (c && instr_code[i] == c)) {
|
||||
if (mask) {
|
||||
*mask |= (1 << (len - i - 1));
|
||||
}
|
||||
if (shift) {
|
||||
*shift = (uint16_t)(len - i - 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void sh4_init_opdefs() {
|
||||
static void sh4_init_op_table() {
|
||||
static int initialized = 0;
|
||||
|
||||
if (initialized) {
|
||||
|
@ -41,61 +21,41 @@ static void sh4_init_opdefs() {
|
|||
|
||||
initialized = 1;
|
||||
|
||||
/*
|
||||
* finalize type information by extracting argument encoding information
|
||||
* from signatures
|
||||
*/
|
||||
for (int i = 1 /* skip SH4_OP_INVALID */; i < NUM_SH4_OPS; i++) {
|
||||
struct sh4_opdef *def = &sh4_opdefs[i];
|
||||
uint16_t opcodes[NUM_SH4_OPS] = {0};
|
||||
uint16_t opcode_masks[NUM_SH4_OPS] = {0};
|
||||
|
||||
sh4_arg_mask(def->sig, 'i', &def->imm_mask, &def->imm_shift);
|
||||
sh4_arg_mask(def->sig, 'd', &def->disp_mask, &def->disp_shift);
|
||||
sh4_arg_mask(def->sig, 'm', &def->rm_mask, &def->rm_shift);
|
||||
sh4_arg_mask(def->sig, 'n', &def->rn_mask, &def->rn_shift);
|
||||
sh4_arg_mask(def->sig, 0, &def->opcode_mask, NULL);
|
||||
for (int i = 1; i < NUM_SH4_OPS; i++) {
|
||||
struct sh4_opdef *def = &sh4_opdefs[i];
|
||||
size_t len = strlen(def->sig);
|
||||
|
||||
/* 0 or 1 represents part of the opcode, anything else is a flag */
|
||||
for (size_t j = 0; j < len; j++) {
|
||||
char c = def->sig[len - j - 1];
|
||||
|
||||
if (c == '0' || c == '1') {
|
||||
opcodes[i] |= (uint32_t)(c - '0') << j;
|
||||
opcode_masks[i] |= (uint32_t)1 << j;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* initialize lookup table */
|
||||
for (int value = 0; value <= UINT16_MAX; value++) {
|
||||
for (int i = 1 /* skip SH4_OP_INVALID */; i < NUM_SH4_OPS; i++) {
|
||||
struct sh4_opdef *def = &sh4_opdefs[i];
|
||||
uint16_t arg_mask =
|
||||
def->imm_mask | def->disp_mask | def->rm_mask | def->rn_mask;
|
||||
|
||||
if ((value & ~arg_mask) == def->opcode_mask) {
|
||||
sh4_opdef_lookup[value] = def;
|
||||
if ((value & opcode_masks[i]) == opcodes[i]) {
|
||||
sh4_optable[value] = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int sh4_disasm(struct sh4_instr *i) {
|
||||
sh4_init_opdefs();
|
||||
|
||||
struct sh4_opdef *def = sh4_opdef_lookup[i->opcode];
|
||||
void sh4_format(uint32_t addr, union sh4_instr i, char *buffer,
|
||||
size_t buffer_size) {
|
||||
struct sh4_opdef *def = sh4_opdef(i.raw);
|
||||
|
||||
if (!def) {
|
||||
i->op = SH4_OP_INVALID;
|
||||
return 0;
|
||||
}
|
||||
|
||||
i->op = def->op;
|
||||
i->cycles = def->cycles;
|
||||
i->flags = def->flags;
|
||||
i->Rm = (i->opcode & def->rm_mask) >> def->rm_shift;
|
||||
i->Rn = (i->opcode & def->rn_mask) >> def->rn_shift;
|
||||
i->disp = (i->opcode & def->disp_mask) >> def->disp_shift;
|
||||
i->imm = (i->opcode & def->imm_mask) >> def->imm_shift;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
void sh4_format(const struct sh4_instr *i, char *buffer, size_t buffer_size) {
|
||||
sh4_init_opdefs();
|
||||
|
||||
if (i->op == SH4_OP_INVALID) {
|
||||
snprintf(buffer, buffer_size, "%08x .word 0x%04x", i->addr, i->opcode);
|
||||
snprintf(buffer, buffer_size, "%08x .word 0x%04x", addr, i.raw);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -105,7 +65,7 @@ void sh4_format(const struct sh4_instr *i, char *buffer, size_t buffer_size) {
|
|||
uint32_t pcmask;
|
||||
|
||||
/* copy initial formatted description */
|
||||
snprintf(buffer, buffer_size, "%08x %s", i->addr, sh4_opdefs[i->op].desc);
|
||||
snprintf(buffer, buffer_size, "%08x %s", addr, def->desc);
|
||||
|
||||
/* used by mov operators with displacements */
|
||||
if (strnstr(buffer, ".b", buffer_size)) {
|
||||
|
@ -123,70 +83,75 @@ void sh4_format(const struct sh4_instr *i, char *buffer, size_t buffer_size) {
|
|||
}
|
||||
|
||||
/* (disp:4,rn) */
|
||||
value_len = snprintf(value, sizeof(value), "(0x%x,rn)", i->disp * movsize);
|
||||
value_len = snprintf(value, sizeof(value), "(0x%x,rn)", i.def.disp * movsize);
|
||||
CHECK_EQ(strnrep(buffer, buffer_size, "(disp:4,rn)", 11, value, value_len),
|
||||
0);
|
||||
|
||||
/* (disp:4,rm) */
|
||||
value_len = snprintf(value, sizeof(value), "(0x%x,rm)", i->disp * movsize);
|
||||
value_len = snprintf(value, sizeof(value), "(0x%x,rm)", i.def.disp * movsize);
|
||||
CHECK_EQ(strnrep(buffer, buffer_size, "(disp:4,rm)", 11, value, value_len),
|
||||
0);
|
||||
|
||||
/* (disp:8,gbr) */
|
||||
value_len = snprintf(value, sizeof(value), "(0x%x,gbr)", i->disp * movsize);
|
||||
value_len =
|
||||
snprintf(value, sizeof(value), "(0x%x,gbr)", i.disp_8.disp * movsize);
|
||||
CHECK_EQ(strnrep(buffer, buffer_size, "(disp:8,gbr)", 12, value, value_len),
|
||||
0);
|
||||
|
||||
/* (disp:8,pc) */
|
||||
value_len = snprintf(value, sizeof(value), "(0x%08x)",
|
||||
(i->disp * movsize) + (i->addr & pcmask) + 4);
|
||||
(i.disp_8.disp * movsize) + (addr & pcmask) + 4);
|
||||
CHECK_EQ(strnrep(buffer, buffer_size, "(disp:8,pc)", 11, value, value_len),
|
||||
0);
|
||||
|
||||
/* disp:8 */
|
||||
value_len = snprintf(value, sizeof(value), "0x%08x",
|
||||
((int8_t)i->disp * 2) + i->addr + 4);
|
||||
((int8_t)i.disp_8.disp * 2) + addr + 4);
|
||||
CHECK_EQ(strnrep(buffer, buffer_size, "disp:8", 6, value, value_len), 0);
|
||||
|
||||
/* disp:12 */
|
||||
value_len =
|
||||
snprintf(value, sizeof(value), "0x%08x",
|
||||
((((int32_t)(i->disp & 0xfff) << 20) >> 20) * 2) + i->addr + 4);
|
||||
value_len = snprintf(
|
||||
value, sizeof(value), "0x%08x",
|
||||
((((int32_t)(i.disp_12.disp & 0xfff) << 20) >> 20) * 2) + addr + 4);
|
||||
CHECK_EQ(strnrep(buffer, buffer_size, "disp:12", 7, value, value_len), 0);
|
||||
|
||||
/* drm */
|
||||
value_len = snprintf(value, sizeof(value), "dr%d", i->Rm);
|
||||
value_len = snprintf(value, sizeof(value), "dr%d", i.def.rm);
|
||||
CHECK_EQ(strnrep(buffer, buffer_size, "drm", 3, value, value_len), 0);
|
||||
|
||||
/* drn */
|
||||
value_len = snprintf(value, sizeof(value), "dr%d", i->Rn);
|
||||
value_len = snprintf(value, sizeof(value), "dr%d", i.def.rn);
|
||||
CHECK_EQ(strnrep(buffer, buffer_size, "drn", 3, value, value_len), 0);
|
||||
|
||||
/* frm */
|
||||
value_len = snprintf(value, sizeof(value), "fr%d", i->Rm);
|
||||
value_len = snprintf(value, sizeof(value), "fr%d", i.def.rm);
|
||||
CHECK_EQ(strnrep(buffer, buffer_size, "frm", 3, value, value_len), 0);
|
||||
|
||||
/* frn */
|
||||
value_len = snprintf(value, sizeof(value), "fr%d", i->Rn);
|
||||
value_len = snprintf(value, sizeof(value), "fr%d", i.def.rn);
|
||||
CHECK_EQ(strnrep(buffer, buffer_size, "frn", 3, value, value_len), 0);
|
||||
|
||||
/* fvm */
|
||||
value_len = snprintf(value, sizeof(value), "fv%d", i->Rm);
|
||||
value_len = snprintf(value, sizeof(value), "fv%d", (i.def.rm & 0x3) << 2);
|
||||
CHECK_EQ(strnrep(buffer, buffer_size, "fvm", 3, value, value_len), 0);
|
||||
|
||||
/* fvn */
|
||||
value_len = snprintf(value, sizeof(value), "fv%d", i->Rn);
|
||||
value_len = snprintf(value, sizeof(value), "fv%d", (i.def.rm & 0xc));
|
||||
CHECK_EQ(strnrep(buffer, buffer_size, "fvn", 3, value, value_len), 0);
|
||||
|
||||
/* rm */
|
||||
value_len = snprintf(value, sizeof(value), "r%d", i->Rm);
|
||||
value_len = snprintf(value, sizeof(value), "r%d", i.def.rm);
|
||||
CHECK_EQ(strnrep(buffer, buffer_size, "rm", 2, value, value_len), 0);
|
||||
|
||||
/* rn */
|
||||
value_len = snprintf(value, sizeof(value), "r%d", i->Rn);
|
||||
value_len = snprintf(value, sizeof(value), "r%d", i.def.rn);
|
||||
CHECK_EQ(strnrep(buffer, buffer_size, "rn", 2, value, value_len), 0);
|
||||
|
||||
/* #imm8 */
|
||||
value_len = snprintf(value, sizeof(value), "0x%02x", i->imm);
|
||||
value_len = snprintf(value, sizeof(value), "0x%02x", i.imm.imm);
|
||||
CHECK_EQ(strnrep(buffer, buffer_size, "#imm8", 5, value, value_len), 0);
|
||||
}
|
||||
|
||||
CONSTRUCTOR(sh4_disasm_init) {
|
||||
sh4_init_op_table();
|
||||
}
|
||||
|
|
|
@ -28,29 +28,53 @@ struct sh4_opdef {
|
|||
const char *sig;
|
||||
int cycles;
|
||||
int flags;
|
||||
uint16_t opcode_mask;
|
||||
uint16_t imm_mask, imm_shift;
|
||||
uint16_t disp_mask, disp_shift;
|
||||
uint16_t rm_mask, rm_shift;
|
||||
uint16_t rn_mask, rn_shift;
|
||||
};
|
||||
|
||||
struct sh4_instr {
|
||||
uint32_t addr;
|
||||
uint16_t opcode;
|
||||
union sh4_instr {
|
||||
uint16_t raw;
|
||||
|
||||
enum sh4_op op;
|
||||
int cycles;
|
||||
int flags;
|
||||
uint16_t Rm;
|
||||
uint16_t Rn;
|
||||
uint16_t disp;
|
||||
uint16_t imm;
|
||||
struct {
|
||||
uint32_t disp : 4;
|
||||
uint32_t rm : 4;
|
||||
uint32_t rn : 4;
|
||||
uint32_t : 4;
|
||||
} def;
|
||||
|
||||
struct {
|
||||
uint32_t imm : 8;
|
||||
uint32_t rn : 4;
|
||||
uint32_t : 4;
|
||||
} imm;
|
||||
|
||||
struct {
|
||||
uint32_t disp : 8;
|
||||
uint32_t rn : 4;
|
||||
uint32_t : 4;
|
||||
} disp_pc;
|
||||
|
||||
struct {
|
||||
uint32_t disp : 8;
|
||||
uint32_t : 8;
|
||||
} disp_8;
|
||||
|
||||
struct {
|
||||
uint32_t disp : 12;
|
||||
uint32_t : 4;
|
||||
} disp_12;
|
||||
};
|
||||
|
||||
extern int sh4_optable[UINT16_MAX + 1];
|
||||
extern struct sh4_opdef sh4_opdefs[NUM_SH4_OPS];
|
||||
|
||||
int sh4_disasm(struct sh4_instr *i);
|
||||
void sh4_format(const struct sh4_instr *i, char *buffer, size_t buffer_size);
|
||||
static inline int sh4_op(uint16_t instr) {
|
||||
return sh4_optable[instr];
|
||||
}
|
||||
|
||||
static struct sh4_opdef *sh4_opdef(uint16_t instr) {
|
||||
return &sh4_opdefs[sh4_op(instr)];
|
||||
}
|
||||
|
||||
void sh4_format(uint32_t addr, union sh4_instr i, char *buffer,
|
||||
size_t buffer_size);
|
||||
|
||||
#endif
|
||||
|
|
|
@ -0,0 +1,395 @@
|
|||
#include <math.h>
|
||||
#include "jit/frontend/sh4/sh4_fallbacks.h"
|
||||
#include "core/assert.h"
|
||||
#include "core/log.h"
|
||||
#include "jit/frontend/sh4/sh4_context.h"
|
||||
#include "jit/frontend/sh4/sh4_frontend.h"
|
||||
#include "jit/frontend/sh4/sh4_guest.h"
|
||||
#include "jit/jit.h"
|
||||
|
||||
static uint32_t load_sr(struct sh4_ctx *ctx) {
|
||||
sh4_implode_sr(ctx);
|
||||
return ctx->sr;
|
||||
}
|
||||
|
||||
static void store_sr(struct sh4_guest *guest, struct sh4_ctx *ctx,
|
||||
uint32_t new_sr) {
|
||||
uint32_t old_sr = load_sr(ctx);
|
||||
ctx->sr = new_sr;
|
||||
sh4_explode_sr(ctx);
|
||||
guest->sr_updated(guest->data, old_sr);
|
||||
}
|
||||
|
||||
static uint32_t load_fpscr(struct sh4_ctx *ctx) {
|
||||
return ctx->fpscr & 0x003fffff;
|
||||
}
|
||||
|
||||
static void store_fpscr(struct sh4_guest *guest, struct sh4_ctx *ctx,
|
||||
uint32_t new_fpscr) {
|
||||
uint32_t old_fpscr = load_fpscr(ctx);
|
||||
ctx->fpscr = new_fpscr & 0x003fffff;
|
||||
guest->fpscr_updated(guest->data, old_fpscr);
|
||||
}
|
||||
|
||||
static inline int32_t vadd_f32_el(int32_t a, int32_t b) {
|
||||
float r = *(float *)&a + *(float *)&b;
|
||||
return *(int32_t *)&r;
|
||||
}
|
||||
|
||||
static inline int32_t vmul_f32_el(int32_t a, int32_t b) {
|
||||
float r = *(float *)&a * *(float *)&b;
|
||||
return *(int32_t *)&r;
|
||||
}
|
||||
|
||||
static inline float vdot_f32(int32_t *a, int32_t *b) {
|
||||
return *(float *)&a[0] * *(float *)&b[0] + *(float *)&a[1] * *(float *)&b[1] +
|
||||
*(float *)&a[2] * *(float *)&b[2] + *(float *)&a[3] * *(float *)&b[3];
|
||||
}
|
||||
|
||||
/* clang-format off */
|
||||
typedef int32_t int128_t[4];
|
||||
|
||||
#define I8 int8_t
|
||||
#define I16 int16_t
|
||||
#define I32 int32_t
|
||||
#define I64 int64_t
|
||||
#define F32 float
|
||||
#define F64 double
|
||||
#define V128 int128_t
|
||||
|
||||
#define CTX ((struct sh4_ctx *)guest->ctx)
|
||||
#define FPU_DOUBLE_PR (CTX->fpscr & PR_MASK)
|
||||
#define FPU_DOUBLE_SZ (CTX->fpscr & SZ_MASK)
|
||||
|
||||
#define DELAY_INSTR() { \
|
||||
uint32_t delay_addr = addr + 2; \
|
||||
uint16_t delay_data = guest->r16(guest->space, delay_addr); \
|
||||
union sh4_instr delay_instr = {delay_data}; \
|
||||
sh4_fallback_cb cb = sh4_get_fallback(delay_data); \
|
||||
CHECK_NOTNULL(cb); \
|
||||
cb(guest, delay_addr, delay_instr); \
|
||||
}
|
||||
#define NEXT_INSTR() (CTX->pc = addr + 2)
|
||||
#define NEXT_NEXT_INSTR() (CTX->pc = addr + 4)
|
||||
|
||||
#define LOAD_GPR_I8(n) ((int8_t)CTX->r[n])
|
||||
#define LOAD_GPR_I16(n) ((int16_t)CTX->r[n])
|
||||
#define LOAD_GPR_I32(n) ((int32_t)CTX->r[n])
|
||||
#define STORE_GPR_I32(n, v) (CTX->r[n] = (v))
|
||||
#define STORE_GPR_IMM_I32(n, v) STORE_GPR_I32(n, v)
|
||||
|
||||
#define LOAD_GPR_ALT_I32(n) ((int32_t)CTX->ralt[n])
|
||||
#define STORE_GPR_ALT_I32(n, v) (CTX->ralt[n] = (v))
|
||||
|
||||
#define LOAD_FPR_I32(n) ((int32_t)CTX->fr[(n)^1])
|
||||
#define LOAD_FPR_I64(n) (*(int64_t *)&CTX->fr[n])
|
||||
#define LOAD_FPR_F32(n) (*(float *)&CTX->fr[(n)^1])
|
||||
#define LOAD_FPR_F64(n) (*(double *)&CTX->fr[n])
|
||||
#define LOAD_FPR_V128(n) {CTX->fr[(n)+0],CTX->fr[(n)+1],CTX->fr[(n)+2],CTX->fr[(n)+3]}
|
||||
#define STORE_FPR_I32(n, v) (CTX->fr[(n)^1] = (v))
|
||||
#define STORE_FPR_I64(n, v) (*(int64_t *)&CTX->fr[n] = (v))
|
||||
#define STORE_FPR_F32(n, v) (*(float *)&CTX->fr[(n)^1] = (v))
|
||||
#define STORE_FPR_F64(n, v) (*(double *)&CTX->fr[n] = (v))
|
||||
#define STORE_FPR_V128(n, v) memcpy(&CTX->fr[n], v, sizeof(v))
|
||||
#define STORE_FPR_IMM_I32(n, v) STORE_FPR_I32(n, v)
|
||||
|
||||
#define LOAD_XFR_I32(n) ((int32_t)CTX->xf[(n)^1])
|
||||
#define LOAD_XFR_I64(n) (*(int64_t *)&CTX->xf[n])
|
||||
#define LOAD_XFR_V128(n) {CTX->xf[(n)+0],CTX->xf[(n)+1],CTX->xf[(n)+2],CTX->xf[(n)+3]}
|
||||
#define STORE_XFR_I32(n, v) (CTX->xf[(n)^1] = (v))
|
||||
#define STORE_XFR_I64(n, v) (*(int64_t *)&CTX->xf[n] = (v))
|
||||
|
||||
#define LOAD_PR_I32() (CTX->pr)
|
||||
#define STORE_PR_I32(v) (CTX->pr = v)
|
||||
#define STORE_PR_IMM_I32(v) STORE_PR_I32(v)
|
||||
|
||||
#define LOAD_SR_I32() load_sr(CTX)
|
||||
#define STORE_SR_I32(v) store_sr(guest, CTX, v)
|
||||
#define STORE_SR_IMM_I32(v) STORE_SR_I32(v)
|
||||
|
||||
#define LOAD_T_I32() (CTX->sr_t)
|
||||
#define STORE_T_I8(v) (CTX->sr_t = v)
|
||||
#define STORE_T_I32(v) STORE_T_I8(v);
|
||||
#define STORE_T_IMM_I32(v) STORE_T_I8(v)
|
||||
|
||||
#define LOAD_S_I32() (CTX->sr_s)
|
||||
#define STORE_S_I32(v) (CTX->sr_s = v)
|
||||
#define STORE_S_IMM_I32(v) STORE_S_I32(v)
|
||||
|
||||
#define LOAD_QM_I32() (CTX->sr_qm)
|
||||
#define STORE_QM_I32(v) (CTX->sr_qm = v)
|
||||
#define STORE_QM_IMM_I32(v) STORE_QM_I32(v)
|
||||
|
||||
#define LOAD_FPSCR_I32() load_fpscr(CTX)
|
||||
#define STORE_FPSCR_I32(v) store_fpscr(guest, CTX, v)
|
||||
#define STORE_FPSCR_IMM_I32(v) STORE_FPSCR_I32(v)
|
||||
|
||||
#define LOAD_DBR_I32() (CTX->dbr)
|
||||
#define STORE_DBR_I32(v) (CTX->dbr = v)
|
||||
#define STORE_DBR_IMM_I32(v) STORE_DBR_I32(v)
|
||||
|
||||
#define LOAD_GBR_I32() (CTX->gbr)
|
||||
#define STORE_GBR_I32(v) (CTX->gbr = v)
|
||||
#define STORE_GBR_IMM_I32(v) STORE_GBR_I32(v)
|
||||
|
||||
#define LOAD_VBR_I32() (CTX->vbr)
|
||||
#define STORE_VBR_I32(v) (CTX->vbr = v)
|
||||
#define STORE_VBR_IMM_I32(v) STORE_VBR_I32(v)
|
||||
|
||||
#define LOAD_FPUL_I16() (*(uint16_t *)&CTX->fpul)
|
||||
#define LOAD_FPUL_I32() (CTX->fpul)
|
||||
#define LOAD_FPUL_F32() (*(float *)&CTX->fpul)
|
||||
#define STORE_FPUL_I32(v) (CTX->fpul = v)
|
||||
#define STORE_FPUL_F32(v) (*(float *)&CTX->fpul = v)
|
||||
#define STORE_FPUL_IMM_I32(v) STORE_FPUL_I32(v)
|
||||
|
||||
#define LOAD_MACH_I32() (CTX->mach)
|
||||
#define STORE_MACH_I32(v) (CTX->mach = v)
|
||||
#define STORE_MACH_IMM_I32(v) STORE_MACH_I32(v)
|
||||
|
||||
#define LOAD_MACL_I32() (CTX->macl)
|
||||
#define STORE_MACL_I32(v) (CTX->macl = v)
|
||||
#define STORE_MACL_IMM_I32(v) STORE_MACL_I32(v)
|
||||
|
||||
#define LOAD_SGR_I32() (CTX->sgr)
|
||||
#define STORE_SGR_I32(v) (CTX->sgr = v)
|
||||
#define STORE_SGR_IMM_I32(v) STORE_SGR_I32(v)
|
||||
|
||||
#define LOAD_SPC_I32() (CTX->spc)
|
||||
#define STORE_SPC_I32(v) (CTX->spc = v)
|
||||
#define STORE_SPC_IMM_I32(v) STORE_SPC_I32(v)
|
||||
|
||||
#define LOAD_SSR_I32() (CTX->ssr)
|
||||
#define STORE_SSR_I32(v) (CTX->ssr = v)
|
||||
#define STORE_SSR_IMM_I32(v) STORE_SSR_I32(v)
|
||||
|
||||
#define LOAD_I8(addr) guest->r8(guest->space, addr)
|
||||
#define LOAD_I16(addr) guest->r16(guest->space, addr)
|
||||
#define LOAD_I32(addr) guest->r32(guest->space, addr)
|
||||
#define LOAD_I64(addr) guest->r64(guest->space, addr)
|
||||
#define LOAD_IMM_I8(addr) LOAD_I8(addr)
|
||||
#define LOAD_IMM_I16(addr) LOAD_I16(addr)
|
||||
#define LOAD_IMM_I32(addr) LOAD_I32(addr)
|
||||
#define LOAD_IMM_I64(addr) LOAD_I64(addr)
|
||||
|
||||
#define STORE_I8(addr, v) guest->w8(guest->space, addr, v)
|
||||
#define STORE_I16(addr, v) guest->w16(guest->space, addr, v)
|
||||
#define STORE_I32(addr, v) guest->w32(guest->space, addr, v)
|
||||
#define STORE_I64(addr, v) guest->w64(guest->space, addr, v)
|
||||
|
||||
#define LOAD_HOST_F32(addr) (*(float *)(uintptr_t)addr)
|
||||
#define LOAD_HOST_F64(addr) (*(double *)(uintptr_t)addr)
|
||||
|
||||
#define FTOI_I32(v) ((int32_t)(v))
|
||||
#define FTOI_I64(v) ((int64_t)(v))
|
||||
|
||||
#define ITOF_F32(v) ((float)(v))
|
||||
#define ITOF_F64(v) ((double)(v))
|
||||
|
||||
#define SEXT_I8_I32(v) ((int32_t)(int8_t)(v))
|
||||
#define SEXT_I16_I32(v) ((int32_t)(int16_t)(v))
|
||||
#define SEXT_I16_I64(v) ((int64_t)(int16_t)(v))
|
||||
#define SEXT_I32_I64(v) ((int64_t)(int32_t)(v))
|
||||
|
||||
#define ZEXT_I8_I32(v) ((uint32_t)(uint8_t)(v))
|
||||
#define ZEXT_I16_I32(v) ((uint32_t)(uint16_t)(v))
|
||||
#define ZEXT_I16_I64(v) ((uint64_t)(uint16_t)(v))
|
||||
#define ZEXT_I32_I64(v) ((uint64_t)(uint32_t)(v))
|
||||
|
||||
#define TRUNC_I64_I32(a) ((uint32_t)(a))
|
||||
#define FEXT_F32_F64(a) ((double)(a))
|
||||
#define FTRUNC_F64_F32(a) ((float)(a))
|
||||
|
||||
#define SELECT_I8(c, a, b) ((c) ? (a) : (b))
|
||||
#define SELECT_I16 SELECT_I8
|
||||
#define SELECT_I32 SELECT_I8
|
||||
#define SELECT_I64 SELECT_I8
|
||||
|
||||
#define CMPEQ_I8(a, b) ((a) == (b))
|
||||
#define CMPEQ_I16 CMPEQ_I8
|
||||
#define CMPEQ_I32 CMPEQ_I8
|
||||
#define CMPEQ_I64 CMPEQ_I8
|
||||
#define CMPEQ_IMM_I8 CMPEQ_I8
|
||||
#define CMPEQ_IMM_I16 CMPEQ_I8
|
||||
#define CMPEQ_IMM_I32 CMPEQ_I8
|
||||
#define CMPEQ_IMM_I64 CMPEQ_I8
|
||||
|
||||
#define CMPSLT_I32(a, b) ((a) < (b))
|
||||
#define CMPSLT_IMM_I32 CMPSLT_I32
|
||||
#define CMPSLE_I32(a, b) ((a) <= (b))
|
||||
#define CMPSLE_IMM_I32 CMPSLE_I32
|
||||
#define CMPSGT_I32(a, b) ((a) > (b))
|
||||
#define CMPSGT_IMM_I32 CMPSGT_I32
|
||||
#define CMPSGE_I32(a, b) ((a) >= (b))
|
||||
#define CMPSGE_IMM_I32 CMPSGE_I32
|
||||
|
||||
#define CMPULT_I32(a, b) ((uint32_t)(a) < (uint32_t)(b))
|
||||
#define CMPULT_IMM_I32 CMPULT_I32
|
||||
#define CMPULE_I32(a, b) ((uint32_t)(a) <= (uint32_t)(b))
|
||||
#define CMPULE_IMM_I32 CMPULE_I32
|
||||
#define CMPUGT_I32(a, b) ((uint32_t)(a) > (uint32_t)(b))
|
||||
#define CMPUGT_IMM_I32 CMPUGT_I32
|
||||
#define CMPUGE_I32(a, b) ((uint32_t)(a) >= (uint32_t)(b))
|
||||
#define CMPUGE_IMM_I32 CMPUGE_I32
|
||||
|
||||
#define FCMPEQ_F32(a, b) ((a) == (b))
|
||||
#define FCMPEQ_F64(a, b) FCMPEQ_F32(a, b)
|
||||
|
||||
#define FCMPGT_F32(a, b) ((a) > (b))
|
||||
#define FCMPGT_F64(a, b) FCMPGT_F32(a, b)
|
||||
|
||||
#define ADD_I8(a, b) ((a) + (b))
|
||||
#define ADD_I16 ADD_I8
|
||||
#define ADD_I32 ADD_I8
|
||||
#define ADD_I64 ADD_I8
|
||||
#define ADD_IMM_I8 ADD_I8
|
||||
#define ADD_IMM_I16 ADD_I8
|
||||
#define ADD_IMM_I32 ADD_I8
|
||||
#define ADD_IMM_I64 ADD_I8
|
||||
|
||||
#define SUB_I8(a, b) ((a) - (b))
|
||||
#define SUB_I16 SUB_I8
|
||||
#define SUB_I32 SUB_I8
|
||||
#define SUB_I64 SUB_I8
|
||||
#define SUB_IMM_I8 SUB_I8
|
||||
#define SUB_IMM_I16 SUB_I8
|
||||
#define SUB_IMM_I32 SUB_I8
|
||||
#define SUB_IMM_I64 SUB_I8
|
||||
|
||||
#define SMUL_I8(a, b) ((int8_t)(a) * (int8_t)(b))
|
||||
#define SMUL_I16(a, b) ((int16_t)(a) * (int16_t)(b))
|
||||
#define SMUL_I32(a, b) ((int32_t)(a) * (int32_t)(b))
|
||||
#define SMUL_I64(a, b) ((int64_t)(a) * (int64_t)(b))
|
||||
#define SMUL_IMM_I8 SMUL_I8
|
||||
#define SMUL_IMM_I16 SMUL_I16
|
||||
#define SMUL_IMM_I32 SMUL_I32
|
||||
#define SMUL_IMM_I64 SMUL_I64
|
||||
|
||||
#define UMUL_I8(a, b) ((uint8_t)(a) * (uint8_t)(b))
|
||||
#define UMUL_I16(a, b) ((uint16_t)(a) * (uint16_t)(b))
|
||||
#define UMUL_I32(a, b) ((uint32_t)(a) * (uint32_t)(b))
|
||||
#define UMUL_I64(a, b) ((uint64_t)(a) * (uint64_t)(b))
|
||||
#define UMUL_IMM_I8 UMUL_I8
|
||||
#define UMUL_IMM_I16 UMUL_I16
|
||||
#define UMUL_IMM_I32 UMUL_I32
|
||||
#define UMUL_IMM_I64 UMUL_I64
|
||||
|
||||
#define NEG_I8(a) (-(a))
|
||||
#define NEG_I16 NEG_I8
|
||||
#define NEG_I32 NEG_I8
|
||||
#define NEG_I64 NEG_I8
|
||||
|
||||
#define FADD_F32(a, b) ((a) + (b))
|
||||
#define FADD_F64 FADD_F32
|
||||
|
||||
#define FSUB_F32(a, b) ((a) - (b))
|
||||
#define FSUB_F64 FSUB_F32
|
||||
|
||||
#define FMUL_F32(a, b) ((a) * (b))
|
||||
#define FMUL_F64 FMUL_F32
|
||||
|
||||
#define FDIV_F32(a, b) ((a) / (b))
|
||||
#define FDIV_F64 FDIV_F32
|
||||
|
||||
#define FNEG_F32(a) (-(a))
|
||||
#define FNEG_F64 FNEG_F32
|
||||
|
||||
#define FABS_F32(a) fabsf(a)
|
||||
#define FABS_F64(a) fabs(a)
|
||||
|
||||
#define FSQRT_F32(a) sqrtf(a)
|
||||
#define FSQRT_F64(a) sqrt(a)
|
||||
#define FRSQRT_F32(a) (1.0f / sqrtf(a))
|
||||
|
||||
#define VBROADCAST_F32(a) {*(int32_t *)&(a), *(int32_t *)&(a), *(int32_t *)&(a), *(int32_t *)&(a)}
|
||||
#define VADD_F32(a, b) {vadd_f32_el((a)[0], (b)[0]), \
|
||||
vadd_f32_el((a)[1], (b)[1]), \
|
||||
vadd_f32_el((a)[2], (b)[2]), \
|
||||
vadd_f32_el((a)[3], (b)[3])}
|
||||
#define VMUL_F32(a, b) {vmul_f32_el((a)[0], (b)[0]), \
|
||||
vmul_f32_el((a)[1], (b)[1]), \
|
||||
vmul_f32_el((a)[2], (b)[2]), \
|
||||
vmul_f32_el((a)[3], (b)[3])}
|
||||
#define VDOT_F32(a, b) vdot_f32(a, b)
|
||||
|
||||
#define AND_I8(a, b) ((a) & (b))
|
||||
#define AND_I16 AND_I8
|
||||
#define AND_I32 AND_I8
|
||||
#define AND_I64 AND_I8
|
||||
#define AND_IMM_I8 AND_I8
|
||||
#define AND_IMM_I16 AND_I8
|
||||
#define AND_IMM_I32 AND_I8
|
||||
#define AND_IMM_I64 AND_I8
|
||||
|
||||
#define OR_I8(a, b) ((a) | (b))
|
||||
#define OR_I16 OR_I8
|
||||
#define OR_I32 OR_I8
|
||||
#define OR_I64 OR_I8
|
||||
#define OR_IMM_I8 OR_I8
|
||||
#define OR_IMM_I16 OR_I8
|
||||
#define OR_IMM_I32 OR_I8
|
||||
#define OR_IMM_I64 OR_I8
|
||||
|
||||
#define XOR_I8(a, b) ((a) ^ (b))
|
||||
#define XOR_I16 XOR_I8
|
||||
#define XOR_I32 XOR_I8
|
||||
#define XOR_I64 XOR_I8
|
||||
#define XOR_IMM_I8 XOR_I8
|
||||
#define XOR_IMM_I16 XOR_I8
|
||||
#define XOR_IMM_I32 XOR_I8
|
||||
#define XOR_IMM_I64 XOR_I8
|
||||
|
||||
#define NOT_I8(a) (~(a))
|
||||
#define NOT_I16 NOT_I8
|
||||
#define NOT_I32 NOT_I8
|
||||
#define NOT_I64 NOT_I8
|
||||
|
||||
#define SHL_I8(v, n) (v << n)
|
||||
#define SHL_I16(v, n) (v << n)
|
||||
#define SHL_I32(v, n) (v << n)
|
||||
#define SHL_I64(v, n) (v << n)
|
||||
#define SHL_IMM_I8 SHL_I8
|
||||
#define SHL_IMM_I16 SHL_I16
|
||||
#define SHL_IMM_I32 SHL_I32
|
||||
#define SHL_IMM_I64 SHL_I64
|
||||
|
||||
#define ASHR_I8(v, n) ((int8_t)v >> n)
|
||||
#define ASHR_I16(v, n) ((int16_t)v >> n)
|
||||
#define ASHR_I32(v, n) ((int32_t)v >> n)
|
||||
#define ASHR_I64(v, n) ((int64_t)v >> n)
|
||||
#define ASHR_IMM_I8 ASHR_I8
|
||||
#define ASHR_IMM_I16 ASHR_I16
|
||||
#define ASHR_IMM_I32 ASHR_I32
|
||||
#define ASHR_IMM_I64 ASHR_I64
|
||||
|
||||
#define LSHR_I8(v, n) ((uint8_t)v >> n)
|
||||
#define LSHR_I16(v, n) ((uint16_t)v >> n)
|
||||
#define LSHR_I32(v, n) ((uint32_t)v >> n)
|
||||
#define LSHR_I64(v, n) ((uint64_t)v >> n)
|
||||
#define LSHR_IMM_I8 LSHR_I8
|
||||
#define LSHR_IMM_I16 LSHR_I16
|
||||
#define LSHR_IMM_I32 LSHR_I32
|
||||
#define LSHR_IMM_I64 LSHR_I64
|
||||
|
||||
#define ASHD_I32(v, n) (((n) & 0x80000000) ? (((n) & 0x1f) ? ((v) >> -((n) & 0x1f)) : ((v) >> 31)) : ((v) << ((n) & 0x1f)))
|
||||
#define LSHD_I32(v, n) (((n) & 0x80000000) ? (((n) & 0x1f) ? ((uint32_t)(v) >> -((n) & 0x1f)) : 0) : ((uint32_t)(v) << ((n) & 0x1f)))
|
||||
|
||||
#define BRANCH_I32(d) (CTX->pc = d)
|
||||
#define BRANCH_IMM_I32 BRANCH_I32
|
||||
#define BRANCH_TRUE_IMM_I32(c, d) if (c) { CTX->pc = d; return; }
|
||||
#define BRANCH_FALSE_IMM_I32(c, d) if (!c) { CTX->pc = d; return; }
|
||||
|
||||
#define PREF_SQ_COND(c, addr) if (c) { guest->sq_prefetch(guest->data, addr); }
|
||||
/* clang-format on */
|
||||
|
||||
#define INSTR(name) \
|
||||
void sh4_fallback_##name(struct sh4_guest *guest, uint32_t addr, \
|
||||
union sh4_instr i)
|
||||
#include "jit/frontend/sh4/sh4_instr.h"
|
||||
#undef INSTR
|
||||
|
||||
sh4_fallback_cb sh4_fallbacks[NUM_SH4_OPS] = {
|
||||
#define SH4_INSTR(name, desc, sig, cycles, flags) &sh4_fallback_##name,
|
||||
#include "jit/frontend/sh4/sh4_instr.inc"
|
||||
#undef SH4_INSTR
|
||||
};
|
|
@ -0,0 +1,16 @@
|
|||
#ifndef SH4_FALLBACKS_H
|
||||
#define SH4_FALLBACKS_H
|
||||
|
||||
#include "jit/frontend/sh4/sh4_disasm.h"
|
||||
|
||||
struct sh4_guest;
|
||||
|
||||
typedef void (*sh4_fallback_cb)(struct sh4_guest *, uint32_t, union sh4_instr);
|
||||
|
||||
extern sh4_fallback_cb sh4_fallbacks[NUM_SH4_OPS];
|
||||
|
||||
static inline sh4_fallback_cb sh4_get_fallback(uint16_t instr) {
|
||||
return sh4_fallbacks[sh4_op(instr)];
|
||||
}
|
||||
|
||||
#endif
|
|
@ -3,6 +3,7 @@
|
|||
#include "jit/frontend/jit_frontend.h"
|
||||
#include "jit/frontend/sh4/sh4_context.h"
|
||||
#include "jit/frontend/sh4/sh4_disasm.h"
|
||||
#include "jit/frontend/sh4/sh4_fallbacks.h"
|
||||
#include "jit/frontend/sh4/sh4_guest.h"
|
||||
#include "jit/frontend/sh4/sh4_translate.h"
|
||||
#include "jit/ir/ir.h"
|
||||
|
@ -28,29 +29,27 @@ static void sh4_analyze_block(const struct sh4_guest *guest,
|
|||
block->num_instrs = 0;
|
||||
|
||||
while (1) {
|
||||
struct sh4_instr instr = {0};
|
||||
instr.addr = addr;
|
||||
instr.opcode = guest->r16(guest->space, instr.addr);
|
||||
uint32_t data = guest->r16(guest->space, addr);
|
||||
struct sh4_opdef *def = sh4_opdef(data);
|
||||
int valid = def != NULL;
|
||||
|
||||
int valid = sh4_disasm(&instr);
|
||||
addr += 2;
|
||||
block->guest_size += 2;
|
||||
block->num_cycles += instr.cycles;
|
||||
block->num_cycles += def ? def->cycles : 0;
|
||||
block->num_instrs++;
|
||||
|
||||
if (instr.flags & SH4_FLAG_DELAYED) {
|
||||
struct sh4_instr delay_instr = {0};
|
||||
delay_instr.addr = addr;
|
||||
delay_instr.opcode = guest->r16(guest->space, delay_instr.addr);
|
||||
if (def->flags & SH4_FLAG_DELAYED) {
|
||||
uint32_t delay_data = guest->r16(guest->space, addr);
|
||||
struct sh4_opdef *delay_def = sh4_opdef(delay_data);
|
||||
valid |= delay_def != NULL;
|
||||
|
||||
valid = sh4_disasm(&delay_instr);
|
||||
addr += 2;
|
||||
block->guest_size += 2;
|
||||
block->num_cycles += delay_instr.cycles;
|
||||
block->num_cycles += delay_def ? delay_def->cycles : 0;
|
||||
block->num_instrs++;
|
||||
|
||||
/* delay slots can't have another delay slot */
|
||||
CHECK(!(delay_instr.flags & SH4_FLAG_DELAYED));
|
||||
CHECK(!(delay_def->flags & SH4_FLAG_DELAYED));
|
||||
}
|
||||
|
||||
/* end block on invalid instruction */
|
||||
|
@ -62,8 +61,7 @@ static void sh4_analyze_block(const struct sh4_guest *guest,
|
|||
changed, stop emitting since the fpu state is invalidated. also, if
|
||||
sr has changed, stop emitting as there are interrupts that possibly
|
||||
need to be handled */
|
||||
if (instr.flags &
|
||||
(SH4_FLAG_BRANCH | SH4_FLAG_SET_FPSCR | SH4_FLAG_SET_SR)) {
|
||||
if (def->flags & (SH4_FLAG_BRANCH | SH4_FLAG_SET_FPSCR | SH4_FLAG_SET_SR)) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -96,24 +94,26 @@ static void sh4_frontend_translate_code(struct jit_frontend *base,
|
|||
uint32_t end = block->guest_addr + block->guest_size;
|
||||
|
||||
while (addr < end) {
|
||||
struct sh4_instr instr = {0};
|
||||
struct sh4_instr delay_instr = {0};
|
||||
uint16_t data = guest->r16(guest->space, addr);
|
||||
union sh4_instr instr = {data};
|
||||
struct sh4_opdef *def = sh4_opdef(data);
|
||||
sh4_translate_cb cb = sh4_get_translator(data);
|
||||
|
||||
instr.addr = addr;
|
||||
instr.opcode = guest->r16(guest->space, instr.addr);
|
||||
sh4_disasm(&instr);
|
||||
|
||||
addr += 2;
|
||||
|
||||
if (instr.flags & SH4_FLAG_DELAYED) {
|
||||
delay_instr.addr = addr;
|
||||
delay_instr.opcode = guest->r16(guest->space, delay_instr.addr);
|
||||
sh4_disasm(&delay_instr);
|
||||
cb(guest, ir, flags, addr, instr);
|
||||
|
||||
if (def->flags & SH4_FLAG_DELAYED) {
|
||||
addr += 4;
|
||||
} else {
|
||||
addr += 2;
|
||||
}
|
||||
|
||||
sh4_emit_instr(guest, ir, flags, &instr, &delay_instr);
|
||||
#if 0
|
||||
/* emit extra debug info for recc */
|
||||
if (guest->jit->dump_blocks) {
|
||||
const char *name = sh4_opdefs[instr->op].name;
|
||||
ir_debug_info(ir, name, instr->addr, instr->opcode);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
/* if the block terminates in something other than an unconditional branch,
|
||||
|
@ -123,7 +123,17 @@ static void sh4_frontend_translate_code(struct jit_frontend *base,
|
|||
struct ir_instr *tail_instr =
|
||||
list_last_entry(&tail_block->instrs, struct ir_instr, it);
|
||||
|
||||
if (tail_instr->op != OP_BRANCH) {
|
||||
int ends_in_branch = tail_instr->op == OP_BRANCH;
|
||||
|
||||
if (tail_instr->op == OP_FALLBACK) {
|
||||
struct sh4_opdef *opdef = sh4_opdef(tail_instr->arg[2]->i32);
|
||||
|
||||
if (opdef->flags & SH4_FLAG_BRANCH) {
|
||||
ends_in_branch = 1;
|
||||
}
|
||||
}
|
||||
|
||||
if (!ends_in_branch) {
|
||||
ir_set_current_instr(ir, tail_instr);
|
||||
ir_branch(ir, ir_alloc_i32(ir, addr));
|
||||
}
|
||||
|
@ -138,29 +148,26 @@ static void sh4_frontend_dump_code(struct jit_frontend *base, uint32_t addr,
|
|||
|
||||
char buffer[128];
|
||||
|
||||
int i = 0;
|
||||
uint32_t end = addr + size / 2;
|
||||
|
||||
while (i < size) {
|
||||
struct sh4_instr instr = {0};
|
||||
instr.addr = addr + i;
|
||||
instr.opcode = guest->r16(guest->space, instr.addr);
|
||||
sh4_disasm(&instr);
|
||||
while (addr < end) {
|
||||
uint16_t data = guest->r16(guest->space, addr);
|
||||
union sh4_instr instr = {data};
|
||||
struct sh4_opdef *def = sh4_opdef(data);
|
||||
|
||||
sh4_format(&instr, buffer, sizeof(buffer));
|
||||
sh4_format(addr, instr, buffer, sizeof(buffer));
|
||||
LOG_INFO(buffer);
|
||||
|
||||
i += 2;
|
||||
addr += 2;
|
||||
|
||||
if (instr.flags & SH4_FLAG_DELAYED) {
|
||||
struct sh4_instr delay = {0};
|
||||
delay.addr = addr + i;
|
||||
delay.opcode = guest->r16(guest->space, delay.addr);
|
||||
sh4_disasm(&delay);
|
||||
if (def->flags & SH4_FLAG_DELAYED) {
|
||||
uint16_t delay_data = guest->r16(guest->space, addr);
|
||||
union sh4_instr delay_instr = {delay_data};
|
||||
|
||||
sh4_format(&delay, buffer, sizeof(buffer));
|
||||
sh4_format(addr, delay_instr, buffer, sizeof(buffer));
|
||||
LOG_INFO(buffer);
|
||||
|
||||
i += 2;
|
||||
addr += 2;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,246 +1,246 @@
|
|||
//
|
||||
// NAME DESC INSTR_CODE CYCLES FLAGS
|
||||
// NAME DESC INSTR_CODE CYCLES FLAGS
|
||||
//
|
||||
|
||||
SH4_INSTR(INVALID, "invalid", 0000000000000000, 1, 0)
|
||||
SH4_INSTR(INVALID, "invalid", 0000000000000000, 1, 0)
|
||||
|
||||
// fixed-point transfer instructions
|
||||
SH4_INSTR(MOVI, "mov #imm8, rn", 1110nnnniiiiiiii, 1, 0)
|
||||
SH4_INSTR(MOVWLPC, "mov.w @(disp:8,pc), rn", 1001nnnndddddddd, 1, SH4_FLAG_LOAD)
|
||||
SH4_INSTR(MOVLLPC, "mov.l @(disp:8,pc), rn", 1101nnnndddddddd, 1, SH4_FLAG_LOAD)
|
||||
SH4_INSTR(MOV, "mov rm, rn", 0110nnnnmmmm0011, 1, 0)
|
||||
SH4_INSTR(MOVBS, "mov.b rm, @rn", 0010nnnnmmmm0000, 1, SH4_FLAG_STORE)
|
||||
SH4_INSTR(MOVWS, "mov.w rm, @rn", 0010nnnnmmmm0001, 1, SH4_FLAG_STORE)
|
||||
SH4_INSTR(MOVLS, "mov.l rm, @rn", 0010nnnnmmmm0010, 1, SH4_FLAG_STORE)
|
||||
SH4_INSTR(MOVBL, "mov.b @rm, rn", 0110nnnnmmmm0000, 1, SH4_FLAG_LOAD)
|
||||
SH4_INSTR(MOVWL, "mov.w @rm, rn", 0110nnnnmmmm0001, 1, SH4_FLAG_LOAD)
|
||||
SH4_INSTR(MOVLL, "mov.l @rm, rn", 0110nnnnmmmm0010, 1, SH4_FLAG_LOAD)
|
||||
SH4_INSTR(MOVBM, "mov.b rm,@-rn", 0010nnnnmmmm0100, 1, SH4_FLAG_STORE)
|
||||
SH4_INSTR(MOVWM, "mov.w rm,@-rn", 0010nnnnmmmm0101, 1, SH4_FLAG_STORE)
|
||||
SH4_INSTR(MOVLM, "mov.l rm,@-rn", 0010nnnnmmmm0110, 1, SH4_FLAG_STORE)
|
||||
SH4_INSTR(MOVBP, "mov.b @rm+,rn", 0110nnnnmmmm0100, 1, SH4_FLAG_LOAD)
|
||||
SH4_INSTR(MOVWP, "mov.w @rm+,rn", 0110nnnnmmmm0101, 1, SH4_FLAG_LOAD)
|
||||
SH4_INSTR(MOVLP, "mov.l @rm+,rn", 0110nnnnmmmm0110, 1, SH4_FLAG_LOAD)
|
||||
SH4_INSTR(MOVBS0D, "mov.b r0, @(disp:4,rn)", 10000000nnnndddd, 1, SH4_FLAG_STORE)
|
||||
SH4_INSTR(MOVWS0D, "mov.w r0, @(disp:4,rn)", 10000001nnnndddd, 1, SH4_FLAG_STORE)
|
||||
SH4_INSTR(MOVLSMD, "mov.l rm, @(disp:4,rn)", 0001nnnnmmmmdddd, 1, SH4_FLAG_STORE)
|
||||
SH4_INSTR(MOVBLD0, "mov.b @(disp:4,rm), r0", 10000100mmmmdddd, 1, SH4_FLAG_LOAD)
|
||||
SH4_INSTR(MOVWLD0, "mov.w @(disp:4,rm), r0", 10000101mmmmdddd, 1, SH4_FLAG_LOAD)
|
||||
SH4_INSTR(MOVLLDN, "mov.l @(disp:4,rm), rn", 0101nnnnmmmmdddd, 1, SH4_FLAG_LOAD)
|
||||
SH4_INSTR(MOVBS0, "mov.b rm, @(r0,rn)", 0000nnnnmmmm0100, 1, SH4_FLAG_STORE)
|
||||
SH4_INSTR(MOVWS0, "mov.w rm, @(r0,rn)", 0000nnnnmmmm0101, 1, SH4_FLAG_STORE)
|
||||
SH4_INSTR(MOVLS0, "mov.l rm, @(r0,rn)", 0000nnnnmmmm0110, 1, SH4_FLAG_STORE)
|
||||
SH4_INSTR(MOVBL0, "mov.b @(r0,rm), rn", 0000nnnnmmmm1100, 1, SH4_FLAG_LOAD)
|
||||
SH4_INSTR(MOVWL0, "mov.w @(r0,rm), rn", 0000nnnnmmmm1101, 1, SH4_FLAG_LOAD)
|
||||
SH4_INSTR(MOVLL0, "mov.l @(r0,rm), rn", 0000nnnnmmmm1110, 1, SH4_FLAG_LOAD)
|
||||
SH4_INSTR(MOVBS0G, "mov.b r0, @(disp:8,gbr)", 11000000dddddddd, 1, SH4_FLAG_STORE)
|
||||
SH4_INSTR(MOVWS0G, "mov.w r0, @(disp:8,gbr)", 11000001dddddddd, 1, SH4_FLAG_STORE)
|
||||
SH4_INSTR(MOVLS0G, "mov.l r0, @(disp:8,gbr)", 11000010dddddddd, 1, SH4_FLAG_STORE)
|
||||
SH4_INSTR(MOVBLG0, "mov.b @(disp:8,gbr), r0", 11000100dddddddd, 1, SH4_FLAG_LOAD)
|
||||
SH4_INSTR(MOVWLG0, "mov.w @(disp:8,gbr), r0", 11000101dddddddd, 1, SH4_FLAG_LOAD)
|
||||
SH4_INSTR(MOVLLG0, "mov.l @(disp:8,gbr), r0", 11000110dddddddd, 1, SH4_FLAG_LOAD)
|
||||
SH4_INSTR(MOVA, "mova (disp:8,pc), r0", 11000111dddddddd, 1, 0)
|
||||
SH4_INSTR(MOVT, "movt rn", 0000nnnn00101001, 1, 0)
|
||||
SH4_INSTR(SWAPB, "swap.b rm, rn", 0110nnnnmmmm1000, 1, 0)
|
||||
SH4_INSTR(SWAPW, "swap.w rm, rn", 0110nnnnmmmm1001, 1, 0)
|
||||
SH4_INSTR(XTRCT, "xtrct rm, rn", 0010nnnnmmmm1101, 1, 0)
|
||||
SH4_INSTR(MOVI, "mov #imm8, rn", 1110nnnniiiiiiii, 1, 0)
|
||||
SH4_INSTR(MOVWLPC, "mov.w @(disp:8,pc), rn", 1001nnnndddddddd, 1, SH4_FLAG_LOAD)
|
||||
SH4_INSTR(MOVLLPC, "mov.l @(disp:8,pc), rn", 1101nnnndddddddd, 1, SH4_FLAG_LOAD)
|
||||
SH4_INSTR(MOV, "mov rm, rn", 0110nnnnmmmm0011, 1, 0)
|
||||
SH4_INSTR(MOVBS, "mov.b rm, @rn", 0010nnnnmmmm0000, 1, SH4_FLAG_STORE)
|
||||
SH4_INSTR(MOVWS, "mov.w rm, @rn", 0010nnnnmmmm0001, 1, SH4_FLAG_STORE)
|
||||
SH4_INSTR(MOVLS, "mov.l rm, @rn", 0010nnnnmmmm0010, 1, SH4_FLAG_STORE)
|
||||
SH4_INSTR(MOVBL, "mov.b @rm, rn", 0110nnnnmmmm0000, 1, SH4_FLAG_LOAD)
|
||||
SH4_INSTR(MOVWL, "mov.w @rm, rn", 0110nnnnmmmm0001, 1, SH4_FLAG_LOAD)
|
||||
SH4_INSTR(MOVLL, "mov.l @rm, rn", 0110nnnnmmmm0010, 1, SH4_FLAG_LOAD)
|
||||
SH4_INSTR(MOVBM, "mov.b rm,@-rn", 0010nnnnmmmm0100, 1, SH4_FLAG_STORE)
|
||||
SH4_INSTR(MOVWM, "mov.w rm,@-rn", 0010nnnnmmmm0101, 1, SH4_FLAG_STORE)
|
||||
SH4_INSTR(MOVLM, "mov.l rm,@-rn", 0010nnnnmmmm0110, 1, SH4_FLAG_STORE)
|
||||
SH4_INSTR(MOVBP, "mov.b @rm+,rn", 0110nnnnmmmm0100, 1, SH4_FLAG_LOAD)
|
||||
SH4_INSTR(MOVWP, "mov.w @rm+,rn", 0110nnnnmmmm0101, 1, SH4_FLAG_LOAD)
|
||||
SH4_INSTR(MOVLP, "mov.l @rm+,rn", 0110nnnnmmmm0110, 1, SH4_FLAG_LOAD)
|
||||
SH4_INSTR(MOVBS0D, "mov.b r0, @(disp:4,rm)", 10000000nnnndddd, 1, SH4_FLAG_STORE)
|
||||
SH4_INSTR(MOVWS0D, "mov.w r0, @(disp:4,rm)", 10000001nnnndddd, 1, SH4_FLAG_STORE)
|
||||
SH4_INSTR(MOVLSMD, "mov.l rm, @(disp:4,rn)", 0001nnnnmmmmdddd, 1, SH4_FLAG_STORE)
|
||||
SH4_INSTR(MOVBLD0, "mov.b @(disp:4,rm), r0", 10000100mmmmdddd, 1, SH4_FLAG_LOAD)
|
||||
SH4_INSTR(MOVWLD0, "mov.w @(disp:4,rm), r0", 10000101mmmmdddd, 1, SH4_FLAG_LOAD)
|
||||
SH4_INSTR(MOVLLDN, "mov.l @(disp:4,rm), rn", 0101nnnnmmmmdddd, 1, SH4_FLAG_LOAD)
|
||||
SH4_INSTR(MOVBS0, "mov.b rm, @(r0,rn)", 0000nnnnmmmm0100, 1, SH4_FLAG_STORE)
|
||||
SH4_INSTR(MOVWS0, "mov.w rm, @(r0,rn)", 0000nnnnmmmm0101, 1, SH4_FLAG_STORE)
|
||||
SH4_INSTR(MOVLS0, "mov.l rm, @(r0,rn)", 0000nnnnmmmm0110, 1, SH4_FLAG_STORE)
|
||||
SH4_INSTR(MOVBL0, "mov.b @(r0,rm), rn", 0000nnnnmmmm1100, 1, SH4_FLAG_LOAD)
|
||||
SH4_INSTR(MOVWL0, "mov.w @(r0,rm), rn", 0000nnnnmmmm1101, 1, SH4_FLAG_LOAD)
|
||||
SH4_INSTR(MOVLL0, "mov.l @(r0,rm), rn", 0000nnnnmmmm1110, 1, SH4_FLAG_LOAD)
|
||||
SH4_INSTR(MOVBS0G, "mov.b r0, @(disp:8,gbr)", 11000000dddddddd, 1, SH4_FLAG_STORE)
|
||||
SH4_INSTR(MOVWS0G, "mov.w r0, @(disp:8,gbr)", 11000001dddddddd, 1, SH4_FLAG_STORE)
|
||||
SH4_INSTR(MOVLS0G, "mov.l r0, @(disp:8,gbr)", 11000010dddddddd, 1, SH4_FLAG_STORE)
|
||||
SH4_INSTR(MOVBLG0, "mov.b @(disp:8,gbr), r0", 11000100dddddddd, 1, SH4_FLAG_LOAD)
|
||||
SH4_INSTR(MOVWLG0, "mov.w @(disp:8,gbr), r0", 11000101dddddddd, 1, SH4_FLAG_LOAD)
|
||||
SH4_INSTR(MOVLLG0, "mov.l @(disp:8,gbr), r0", 11000110dddddddd, 1, SH4_FLAG_LOAD)
|
||||
SH4_INSTR(MOVA, "mova (disp:8,pc), r0", 11000111dddddddd, 1, 0)
|
||||
SH4_INSTR(MOVT, "movt rn", 0000nnnn00101001, 1, 0)
|
||||
SH4_INSTR(SWAPB, "swap.b rm, rn", 0110nnnnmmmm1000, 1, 0)
|
||||
SH4_INSTR(SWAPW, "swap.w rm, rn", 0110nnnnmmmm1001, 1, 0)
|
||||
SH4_INSTR(XTRCT, "xtrct rm, rn", 0010nnnnmmmm1101, 1, 0)
|
||||
|
||||
|
||||
// arithmetric operation instructions
|
||||
SH4_INSTR(ADD, "add rm, rn", 0011nnnnmmmm1100, 1, 0)
|
||||
SH4_INSTR(ADDI, "add #imm8, rn", 0111nnnniiiiiiii, 1, 0)
|
||||
SH4_INSTR(ADDC, "addc rm, rn", 0011nnnnmmmm1110, 1, 0)
|
||||
SH4_INSTR(ADDV, "addv rm, rn", 0011nnnnmmmm1111, 1, 0)
|
||||
SH4_INSTR(CMPEQI, "cmp/eq #imm8, r0", 10001000iiiiiiii, 1, 0)
|
||||
SH4_INSTR(CMPEQ, "cmp/eq rm, rn", 0011nnnnmmmm0000, 1, 0)
|
||||
SH4_INSTR(CMPHS, "cmp/hs rm, rn", 0011nnnnmmmm0010, 1, 0)
|
||||
SH4_INSTR(CMPGE, "cmp/ge rm, rn", 0011nnnnmmmm0011, 1, 0)
|
||||
SH4_INSTR(CMPHI, "cmp/hi rm, rn", 0011nnnnmmmm0110, 1, 0)
|
||||
SH4_INSTR(CMPGT, "cmp/gt rm, rn", 0011nnnnmmmm0111, 1, 0)
|
||||
SH4_INSTR(CMPPZ, "cmp/pz rn", 0100nnnn00010001, 1, 0)
|
||||
SH4_INSTR(CMPPL, "cmp/pl rn", 0100nnnn00010101, 1, 0)
|
||||
SH4_INSTR(CMPSTR, "cmp/str rm, rn", 0010nnnnmmmm1100, 1, 0)
|
||||
SH4_INSTR(DIV0S, "div0s rm, rn", 0010nnnnmmmm0111, 1, 0)
|
||||
SH4_INSTR(DIV0U, "div0u", 0000000000011001, 1, 0)
|
||||
SH4_INSTR(DIV1, "div1 rm, rn", 0011nnnnmmmm0100, 1, 0)
|
||||
SH4_INSTR(DMULS, "dmuls.l rm, rn", 0011nnnnmmmm1101, 2, 0)
|
||||
SH4_INSTR(DMULU, "dmulu.l rm, rn", 0011nnnnmmmm0101, 2, 0)
|
||||
SH4_INSTR(DT, "dt rn", 0100nnnn00010000, 1, 0)
|
||||
SH4_INSTR(EXTSB, "exts.b rm, rn", 0110nnnnmmmm1110, 1, 0)
|
||||
SH4_INSTR(EXTSW, "exts.w rm, rn", 0110nnnnmmmm1111, 1, 0)
|
||||
SH4_INSTR(EXTUB, "extu.b rm, rn", 0110nnnnmmmm1100, 1, 0)
|
||||
SH4_INSTR(EXTUW, "extu.w rm, rn", 0110nnnnmmmm1101, 1, 0)
|
||||
SH4_INSTR(MACL, "mac.l @rm+, @rn+", 0000nnnnmmmm1111, 2, SH4_FLAG_LOAD | SH4_FLAG_STORE)
|
||||
SH4_INSTR(MACW, "mac.w @rm+, @rn+", 0100nnnnmmmm1111, 2, SH4_FLAG_LOAD | SH4_FLAG_STORE)
|
||||
SH4_INSTR(MULL, "mul.l rm, rn", 0000nnnnmmmm0111, 2, 0)
|
||||
SH4_INSTR(MULS, "muls rm, rn", 0010nnnnmmmm1111, 2, 0)
|
||||
SH4_INSTR(MULU, "mulu rm, rn", 0010nnnnmmmm1110, 2, 0)
|
||||
SH4_INSTR(NEG, "neg rm, rn", 0110nnnnmmmm1011, 1, 0)
|
||||
SH4_INSTR(NEGC, "negc rm, rn", 0110nnnnmmmm1010, 1, 0)
|
||||
SH4_INSTR(SUB, "sub rm, rn", 0011nnnnmmmm1000, 1, 0)
|
||||
SH4_INSTR(SUBC, "subc rm, rn", 0011nnnnmmmm1010, 1, 0)
|
||||
SH4_INSTR(SUBV, "subv rm, rn", 0011nnnnmmmm1011, 1, 0)
|
||||
SH4_INSTR(ADD, "add rm, rn", 0011nnnnmmmm1100, 1, 0)
|
||||
SH4_INSTR(ADDI, "add #imm8, rn", 0111nnnniiiiiiii, 1, 0)
|
||||
SH4_INSTR(ADDC, "addc rm, rn", 0011nnnnmmmm1110, 1, 0)
|
||||
SH4_INSTR(ADDV, "addv rm, rn", 0011nnnnmmmm1111, 1, 0)
|
||||
SH4_INSTR(CMPEQI, "cmp/eq #imm8, r0", 10001000iiiiiiii, 1, 0)
|
||||
SH4_INSTR(CMPEQ, "cmp/eq rm, rn", 0011nnnnmmmm0000, 1, 0)
|
||||
SH4_INSTR(CMPHS, "cmp/hs rm, rn", 0011nnnnmmmm0010, 1, 0)
|
||||
SH4_INSTR(CMPGE, "cmp/ge rm, rn", 0011nnnnmmmm0011, 1, 0)
|
||||
SH4_INSTR(CMPHI, "cmp/hi rm, rn", 0011nnnnmmmm0110, 1, 0)
|
||||
SH4_INSTR(CMPGT, "cmp/gt rm, rn", 0011nnnnmmmm0111, 1, 0)
|
||||
SH4_INSTR(CMPPZ, "cmp/pz rn", 0100nnnn00010001, 1, 0)
|
||||
SH4_INSTR(CMPPL, "cmp/pl rn", 0100nnnn00010101, 1, 0)
|
||||
SH4_INSTR(CMPSTR, "cmp/str rm, rn", 0010nnnnmmmm1100, 1, 0)
|
||||
SH4_INSTR(DIV0S, "div0s rm, rn", 0010nnnnmmmm0111, 1, 0)
|
||||
SH4_INSTR(DIV0U, "div0u", 0000000000011001, 1, 0)
|
||||
SH4_INSTR(DIV1, "div1 rm, rn", 0011nnnnmmmm0100, 1, 0)
|
||||
SH4_INSTR(DMULS, "dmuls.l rm, rn", 0011nnnnmmmm1101, 2, 0)
|
||||
SH4_INSTR(DMULU, "dmulu.l rm, rn", 0011nnnnmmmm0101, 2, 0)
|
||||
SH4_INSTR(DT, "dt rn", 0100nnnn00010000, 1, 0)
|
||||
SH4_INSTR(EXTSB, "exts.b rm, rn", 0110nnnnmmmm1110, 1, 0)
|
||||
SH4_INSTR(EXTSW, "exts.w rm, rn", 0110nnnnmmmm1111, 1, 0)
|
||||
SH4_INSTR(EXTUB, "extu.b rm, rn", 0110nnnnmmmm1100, 1, 0)
|
||||
SH4_INSTR(EXTUW, "extu.w rm, rn", 0110nnnnmmmm1101, 1, 0)
|
||||
SH4_INSTR(MACL, "mac.l @rm+, @rn+", 0000nnnnmmmm1111, 2, SH4_FLAG_LOAD | SH4_FLAG_STORE)
|
||||
SH4_INSTR(MACW, "mac.w @rm+, @rn+", 0100nnnnmmmm1111, 2, SH4_FLAG_LOAD | SH4_FLAG_STORE)
|
||||
SH4_INSTR(MULL, "mul.l rm, rn", 0000nnnnmmmm0111, 2, 0)
|
||||
SH4_INSTR(MULS, "muls rm, rn", 0010nnnnmmmm1111, 2, 0)
|
||||
SH4_INSTR(MULU, "mulu rm, rn", 0010nnnnmmmm1110, 2, 0)
|
||||
SH4_INSTR(NEG, "neg rm, rn", 0110nnnnmmmm1011, 1, 0)
|
||||
SH4_INSTR(NEGC, "negc rm, rn", 0110nnnnmmmm1010, 1, 0)
|
||||
SH4_INSTR(SUB, "sub rm, rn", 0011nnnnmmmm1000, 1, 0)
|
||||
SH4_INSTR(SUBC, "subc rm, rn", 0011nnnnmmmm1010, 1, 0)
|
||||
SH4_INSTR(SUBV, "subv rm, rn", 0011nnnnmmmm1011, 1, 0)
|
||||
|
||||
|
||||
// logic operation instructions
|
||||
SH4_INSTR(AND, "and rm, rn", 0010nnnnmmmm1001, 1, 0)
|
||||
SH4_INSTR(ANDI, "and #imm8, r0", 11001001iiiiiiii, 1, 0)
|
||||
SH4_INSTR(ANDB, "and.b #imm8, @(r0,gbr)", 11001101iiiiiiii, 4, SH4_FLAG_STORE)
|
||||
SH4_INSTR(NOT, "not rm, rn", 0110nnnnmmmm0111, 1, 0)
|
||||
SH4_INSTR(OR, "or rm, rn", 0010nnnnmmmm1011, 1, 0)
|
||||
SH4_INSTR(ORI, "or #imm8, r0", 11001011iiiiiiii, 1, 0)
|
||||
SH4_INSTR(ORB, "or.b #imm8, @(r0,gbr)", 11001111iiiiiiii, 4, SH4_FLAG_STORE)
|
||||
SH4_INSTR(TAS, "tas.b @rn", 0100nnnn00011011, 5, SH4_FLAG_LOAD)
|
||||
SH4_INSTR(TST, "tst rm, rn", 0010nnnnmmmm1000, 1, 0)
|
||||
SH4_INSTR(TSTI, "tst #imm8, r0", 11001000iiiiiiii, 1, 0)
|
||||
SH4_INSTR(TSTB, "tst.b #imm8, @(r0,gbr)", 11001100iiiiiiii, 3, SH4_FLAG_STORE)
|
||||
SH4_INSTR(XOR, "xor rm, rn", 0010nnnnmmmm1010, 1, 0)
|
||||
SH4_INSTR(XORI, "xor #imm8, r0", 11001010iiiiiiii, 1, 0)
|
||||
SH4_INSTR(XORB, "xor.b #imm8, @(r0,gbr)", 11001110iiiiiiii, 4, SH4_FLAG_STORE)
|
||||
SH4_INSTR(AND, "and rm, rn", 0010nnnnmmmm1001, 1, 0)
|
||||
SH4_INSTR(ANDI, "and #imm8, r0", 11001001iiiiiiii, 1, 0)
|
||||
SH4_INSTR(ANDB, "and.b #imm8, @(r0,gbr)", 11001101iiiiiiii, 4, SH4_FLAG_STORE)
|
||||
SH4_INSTR(NOT, "not rm, rn", 0110nnnnmmmm0111, 1, 0)
|
||||
SH4_INSTR(OR, "or rm, rn", 0010nnnnmmmm1011, 1, 0)
|
||||
SH4_INSTR(ORI, "or #imm8, r0", 11001011iiiiiiii, 1, 0)
|
||||
SH4_INSTR(ORB, "or.b #imm8, @(r0,gbr)", 11001111iiiiiiii, 4, SH4_FLAG_STORE)
|
||||
SH4_INSTR(TAS, "tas.b @rn", 0100nnnn00011011, 5, SH4_FLAG_LOAD)
|
||||
SH4_INSTR(TST, "tst rm, rn", 0010nnnnmmmm1000, 1, 0)
|
||||
SH4_INSTR(TSTI, "tst #imm8, r0", 11001000iiiiiiii, 1, 0)
|
||||
SH4_INSTR(TSTB, "tst.b #imm8, @(r0,gbr)", 11001100iiiiiiii, 3, SH4_FLAG_STORE)
|
||||
SH4_INSTR(XOR, "xor rm, rn", 0010nnnnmmmm1010, 1, 0)
|
||||
SH4_INSTR(XORI, "xor #imm8, r0", 11001010iiiiiiii, 1, 0)
|
||||
SH4_INSTR(XORB, "xor.b #imm8, @(r0,gbr)", 11001110iiiiiiii, 4, SH4_FLAG_STORE)
|
||||
|
||||
|
||||
// shift instructions
|
||||
SH4_INSTR(ROTL, "rotl rn", 0100nnnn00000100, 1, 0)
|
||||
SH4_INSTR(ROTR, "rotr rn", 0100nnnn00000101, 1, 0)
|
||||
SH4_INSTR(ROTCL, "rotcl rn", 0100nnnn00100100, 1, 0)
|
||||
SH4_INSTR(ROTCR, "rotcr rn", 0100nnnn00100101, 1, 0)
|
||||
SH4_INSTR(SHAD, "shad rm, rn", 0100nnnnmmmm1100, 1, 0)
|
||||
SH4_INSTR(SHAL, "shal rn", 0100nnnn00100000, 1, 0)
|
||||
SH4_INSTR(SHAR, "shar rn", 0100nnnn00100001, 1, 0)
|
||||
SH4_INSTR(SHLD, "shld rm, rn", 0100nnnnmmmm1101, 1, 0)
|
||||
SH4_INSTR(SHLL, "shll rn", 0100nnnn00000000, 1, 0)
|
||||
SH4_INSTR(SHLR, "shlr rn", 0100nnnn00000001, 1, 0)
|
||||
SH4_INSTR(SHLL2, "shll2 rn", 0100nnnn00001000, 1, 0)
|
||||
SH4_INSTR(SHLR2, "shlr2 rn", 0100nnnn00001001, 1, 0)
|
||||
SH4_INSTR(SHLL8, "shll8 rn", 0100nnnn00011000, 1, 0)
|
||||
SH4_INSTR(SHLR8, "shlr8 rn", 0100nnnn00011001, 1, 0)
|
||||
SH4_INSTR(SHLL16, "shll16 rn", 0100nnnn00101000, 1, 0)
|
||||
SH4_INSTR(SHLR16, "shlr16 rn", 0100nnnn00101001, 1, 0)
|
||||
SH4_INSTR(ROTL, "rotl rn", 0100nnnn00000100, 1, 0)
|
||||
SH4_INSTR(ROTR, "rotr rn", 0100nnnn00000101, 1, 0)
|
||||
SH4_INSTR(ROTCL, "rotcl rn", 0100nnnn00100100, 1, 0)
|
||||
SH4_INSTR(ROTCR, "rotcr rn", 0100nnnn00100101, 1, 0)
|
||||
SH4_INSTR(SHAD, "shad rm, rn", 0100nnnnmmmm1100, 1, 0)
|
||||
SH4_INSTR(SHAL, "shal rn", 0100nnnn00100000, 1, 0)
|
||||
SH4_INSTR(SHAR, "shar rn", 0100nnnn00100001, 1, 0)
|
||||
SH4_INSTR(SHLD, "shld rm, rn", 0100nnnnmmmm1101, 1, 0)
|
||||
SH4_INSTR(SHLL, "shll rn", 0100nnnn00000000, 1, 0)
|
||||
SH4_INSTR(SHLR, "shlr rn", 0100nnnn00000001, 1, 0)
|
||||
SH4_INSTR(SHLL2, "shll2 rn", 0100nnnn00001000, 1, 0)
|
||||
SH4_INSTR(SHLR2, "shlr2 rn", 0100nnnn00001001, 1, 0)
|
||||
SH4_INSTR(SHLL8, "shll8 rn", 0100nnnn00011000, 1, 0)
|
||||
SH4_INSTR(SHLR8, "shlr8 rn", 0100nnnn00011001, 1, 0)
|
||||
SH4_INSTR(SHLL16, "shll16 rn", 0100nnnn00101000, 1, 0)
|
||||
SH4_INSTR(SHLR16, "shlr16 rn", 0100nnnn00101001, 1, 0)
|
||||
|
||||
|
||||
// branch instructions
|
||||
// can we sign extend bdisp12 in sh4_instr code, not inside of sh4_builder
|
||||
// then, we can reuse some more of these disp* types
|
||||
SH4_INSTR(BF, "bf disp:8", 10001011dddddddd, 1, SH4_FLAG_CONDITIONAL | SH4_FLAG_BRANCH)
|
||||
SH4_INSTR(BFS, "bfs disp:8", 10001111dddddddd, 1, SH4_FLAG_CONDITIONAL | SH4_FLAG_BRANCH | SH4_FLAG_DELAYED)
|
||||
SH4_INSTR(BT, "bt disp:8", 10001001dddddddd, 1, SH4_FLAG_CONDITIONAL | SH4_FLAG_BRANCH)
|
||||
SH4_INSTR(BTS, "bts disp:8", 10001101dddddddd, 1, SH4_FLAG_CONDITIONAL | SH4_FLAG_BRANCH | SH4_FLAG_DELAYED)
|
||||
SH4_INSTR(BRA, "bra disp:12", 1010dddddddddddd, 1, SH4_FLAG_BRANCH | SH4_FLAG_DELAYED)
|
||||
SH4_INSTR(BRAF, "braf rn", 0000nnnn00100011, 2, SH4_FLAG_BRANCH | SH4_FLAG_DELAYED)
|
||||
SH4_INSTR(BSR, "bsr disp:12", 1011dddddddddddd, 1, SH4_FLAG_BRANCH | SH4_FLAG_DELAYED)
|
||||
SH4_INSTR(BSRF, "bsrf rn", 0000nnnn00000011, 2, SH4_FLAG_BRANCH | SH4_FLAG_DELAYED)
|
||||
SH4_INSTR(JMP, "jmp @rm", 0100nnnn00101011, 2, SH4_FLAG_BRANCH | SH4_FLAG_DELAYED)
|
||||
SH4_INSTR(JSR, "jsr @rn", 0100nnnn00001011, 2, SH4_FLAG_BRANCH | SH4_FLAG_DELAYED)
|
||||
SH4_INSTR(RTS, "rts", 0000000000001011, 2, SH4_FLAG_BRANCH | SH4_FLAG_DELAYED)
|
||||
SH4_INSTR(BF, "bf disp:8", 10001011dddddddd, 1, SH4_FLAG_CONDITIONAL | SH4_FLAG_BRANCH)
|
||||
SH4_INSTR(BFS, "bfs disp:8", 10001111dddddddd, 1, SH4_FLAG_CONDITIONAL | SH4_FLAG_BRANCH | SH4_FLAG_DELAYED)
|
||||
SH4_INSTR(BT, "bt disp:8", 10001001dddddddd, 1, SH4_FLAG_CONDITIONAL | SH4_FLAG_BRANCH)
|
||||
SH4_INSTR(BTS, "bts disp:8", 10001101dddddddd, 1, SH4_FLAG_CONDITIONAL | SH4_FLAG_BRANCH | SH4_FLAG_DELAYED)
|
||||
SH4_INSTR(BRA, "bra disp:12", 1010dddddddddddd, 1, SH4_FLAG_BRANCH | SH4_FLAG_DELAYED)
|
||||
SH4_INSTR(BRAF, "braf rn", 0000nnnn00100011, 2, SH4_FLAG_BRANCH | SH4_FLAG_DELAYED)
|
||||
SH4_INSTR(BSR, "bsr disp:12", 1011dddddddddddd, 1, SH4_FLAG_BRANCH | SH4_FLAG_DELAYED)
|
||||
SH4_INSTR(BSRF, "bsrf rn", 0000nnnn00000011, 2, SH4_FLAG_BRANCH | SH4_FLAG_DELAYED)
|
||||
SH4_INSTR(JMP, "jmp @rm", 0100nnnn00101011, 2, SH4_FLAG_BRANCH | SH4_FLAG_DELAYED)
|
||||
SH4_INSTR(JSR, "jsr @rn", 0100nnnn00001011, 2, SH4_FLAG_BRANCH | SH4_FLAG_DELAYED)
|
||||
SH4_INSTR(RTS, "rts", 0000000000001011, 2, SH4_FLAG_BRANCH | SH4_FLAG_DELAYED)
|
||||
|
||||
|
||||
// system control instructions
|
||||
SH4_INSTR(CLRMAC, "clrmac", 0000000000101000, 1, 0)
|
||||
SH4_INSTR(CLRS, "clrs", 0000000001001000, 1, 0)
|
||||
SH4_INSTR(CLRT, "clrt", 0000000000001000, 1, 0)
|
||||
SH4_INSTR(LDCSR, "ldc rm, sr", 0100mmmm00001110, 4, SH4_FLAG_SET_SR)
|
||||
SH4_INSTR(LDCGBR, "ldc rm, gbr", 0100mmmm00011110, 3, 0)
|
||||
SH4_INSTR(LDCVBR, "ldc rm, vbr", 0100mmmm00101110, 1, 0)
|
||||
SH4_INSTR(LDCSSR, "ldc rm, ssr", 0100mmmm00111110, 1, 0)
|
||||
SH4_INSTR(LDCSPC, "ldc rm, spc", 0100mmmm01001110, 1, 0)
|
||||
SH4_INSTR(LDCDBR, "ldc rm, dbr", 0100mmmm11111010, 1, 0)
|
||||
SH4_INSTR(LDCRBANK, "ldc.l rm, rn_bank", 0100mmmm1nnn1110, 1, 0)
|
||||
SH4_INSTR(LDCMSR, "ldc.l @rm+, sr", 0100mmmm00000111, 4, SH4_FLAG_LOAD | SH4_FLAG_SET_SR)
|
||||
SH4_INSTR(LDCMGBR, "ldc.l @rm+, gbr", 0100mmmm00010111, 3, SH4_FLAG_LOAD)
|
||||
SH4_INSTR(LDCMVBR, "ldc.l @rm+, vbr", 0100mmmm00100111, 1, SH4_FLAG_LOAD)
|
||||
SH4_INSTR(LDCMSSR, "ldc.l @rm+, ssr", 0100mmmm00110111, 1, SH4_FLAG_LOAD)
|
||||
SH4_INSTR(LDCMSPC, "ldc.l @rm+, spc", 0100mmmm01000111, 1, SH4_FLAG_LOAD)
|
||||
SH4_INSTR(LDCMDBR, "ldc.l @rm+, dbr", 0100mmmm11110110, 1, SH4_FLAG_LOAD)
|
||||
SH4_INSTR(LDCMRBANK, "ldc.l @rm+, rn_bank", 0100mmmm1nnn0111, 1, SH4_FLAG_LOAD)
|
||||
SH4_INSTR(LDSMACH, "lds rm, mach", 0100mmmm00001010, 1, 0)
|
||||
SH4_INSTR(LDSMACL, "lds rm, macl", 0100mmmm00011010, 1, 0)
|
||||
SH4_INSTR(LDSPR, "lds rm, pr", 0100mmmm00101010, 2, 0)
|
||||
SH4_INSTR(LDSMMACH, "lds.l @rm+, mach", 0100mmmm00000110, 1, SH4_FLAG_LOAD)
|
||||
SH4_INSTR(LDSMMACL, "lds.l @rm+, macl", 0100mmmm00010110, 1, SH4_FLAG_LOAD)
|
||||
SH4_INSTR(LDSMPR, "lds.l @rm+, pr", 0100mmmm00100110, 2, SH4_FLAG_LOAD)
|
||||
SH4_INSTR(MOVCAL, "movca.l r0, @rn", 0000nnnn11000011, 1, SH4_FLAG_STORE)
|
||||
SH4_INSTR(NOP, "nop", 0000000000001001, 1, 0)
|
||||
SH4_INSTR(OCBI, "ocbi", 0000nnnn10010011, 1, 0)
|
||||
SH4_INSTR(OCBP, "ocbp", 0000nnnn10100011, 1, 0)
|
||||
SH4_INSTR(OCBWB, "ocbwb", 0000nnnn10110011, 1, 0)
|
||||
SH4_INSTR(PREF, "pref @rn", 0000nnnn10000011, 1, SH4_FLAG_STORE)
|
||||
SH4_INSTR(RTE, "rte", 0000000000101011, 5, SH4_FLAG_BRANCH | SH4_FLAG_DELAYED | SH4_FLAG_SET_SR)
|
||||
SH4_INSTR(SETS, "sets", 0000000001011000, 1, 0)
|
||||
SH4_INSTR(SETT, "sett", 0000000000011000, 1, 0)
|
||||
SH4_INSTR(SLEEP, "sleep", 0000000000011011, 4, 0)
|
||||
SH4_INSTR(STCSR, "stc sr, rn", 0000nnnn00000010, 2, 0)
|
||||
SH4_INSTR(STCGBR, "stc gbr, rn", 0000nnnn00010010, 2, 0)
|
||||
SH4_INSTR(STCVBR, "stc vbr, rn", 0000nnnn00100010, 2, 0)
|
||||
SH4_INSTR(STCSSR, "stc ssr, rn", 0000nnnn00110010, 2, 0)
|
||||
SH4_INSTR(STCSPC, "stc spc, rn", 0000nnnn01000010, 2, 0)
|
||||
SH4_INSTR(STCSGR, "stc sgr, rn", 0000nnnn00111010, 3, 0)
|
||||
SH4_INSTR(STCDBR, "stc dbr, rn", 0000nnnn11111010, 2, 0)
|
||||
SH4_INSTR(STCRBANK, "stc rm_bank, rn", 0000nnnn1mmm0010, 2, 0)
|
||||
SH4_INSTR(STCMSR, "stc.l sr, @-rn", 0100nnnn00000011, 2, SH4_FLAG_STORE)
|
||||
SH4_INSTR(STCMGBR, "stc.l gbr, @-rn", 0100nnnn00010011, 2, SH4_FLAG_STORE)
|
||||
SH4_INSTR(STCMVBR, "stc.l vbr, @-rn", 0100nnnn00100011, 2, SH4_FLAG_STORE)
|
||||
SH4_INSTR(STCMSSR, "stc.l ssr, @-rn", 0100nnnn00110011, 2, SH4_FLAG_STORE)
|
||||
SH4_INSTR(STCMSPC, "stc.l spc, @-rn", 0100nnnn01000011, 2, SH4_FLAG_STORE)
|
||||
SH4_INSTR(STCMSGR, "stc.l sgr, @-rn", 0100nnnn00110010, 3, SH4_FLAG_STORE)
|
||||
SH4_INSTR(STCMDBR, "stc.l dbr, @-rn", 0100nnnn11110010, 2, SH4_FLAG_STORE)
|
||||
SH4_INSTR(STCMRBANK, "stc.l rm_bank, @-rn", 0100nnnn1mmm0011, 2, SH4_FLAG_STORE)
|
||||
SH4_INSTR(STSMACH, "sts mach, rn", 0000nnnn00001010, 1, 0)
|
||||
SH4_INSTR(STSMACL, "sts macl, rn", 0000nnnn00011010, 1, 0)
|
||||
SH4_INSTR(STSPR, "sts pr, rn", 0000nnnn00101010, 2, 0)
|
||||
SH4_INSTR(STSMMACH, "sts.l mach, @-rn", 0100nnnn00000010, 1, SH4_FLAG_STORE)
|
||||
SH4_INSTR(STSMMACL, "sts.l macl, @-rn", 0100nnnn00010010, 1, SH4_FLAG_STORE)
|
||||
SH4_INSTR(STSMPR, "sts.l pr, @-rn", 0100nnnn00100010, 2, SH4_FLAG_STORE)
|
||||
SH4_INSTR(TRAPA, "trapa #imm8", 11000011iiiiiiii, 7, SH4_FLAG_BRANCH)
|
||||
SH4_INSTR(CLRMAC, "clrmac", 0000000000101000, 1, 0)
|
||||
SH4_INSTR(CLRS, "clrs", 0000000001001000, 1, 0)
|
||||
SH4_INSTR(CLRT, "clrt", 0000000000001000, 1, 0)
|
||||
SH4_INSTR(LDCSR, "ldc rn, sr", 0100mmmm00001110, 4, SH4_FLAG_SET_SR)
|
||||
SH4_INSTR(LDCGBR, "ldc rn, gbr", 0100mmmm00011110, 3, 0)
|
||||
SH4_INSTR(LDCVBR, "ldc rn, vbr", 0100mmmm00101110, 1, 0)
|
||||
SH4_INSTR(LDCSSR, "ldc rn, ssr", 0100mmmm00111110, 1, 0)
|
||||
SH4_INSTR(LDCSPC, "ldc rn, spc", 0100mmmm01001110, 1, 0)
|
||||
SH4_INSTR(LDCDBR, "ldc rn, dbr", 0100mmmm11111010, 1, 0)
|
||||
SH4_INSTR(LDCRBANK, "ldc.l rn, rn_bank", 0100mmmm1nnn1110, 1, 0)
|
||||
SH4_INSTR(LDCMSR, "ldc.l @rn+, sr", 0100mmmm00000111, 4, SH4_FLAG_LOAD | SH4_FLAG_SET_SR)
|
||||
SH4_INSTR(LDCMGBR, "ldc.l @rn+, gbr", 0100mmmm00010111, 3, SH4_FLAG_LOAD)
|
||||
SH4_INSTR(LDCMVBR, "ldc.l @rn+, vbr", 0100mmmm00100111, 1, SH4_FLAG_LOAD)
|
||||
SH4_INSTR(LDCMSSR, "ldc.l @rn+, ssr", 0100mmmm00110111, 1, SH4_FLAG_LOAD)
|
||||
SH4_INSTR(LDCMSPC, "ldc.l @rn+, spc", 0100mmmm01000111, 1, SH4_FLAG_LOAD)
|
||||
SH4_INSTR(LDCMDBR, "ldc.l @rn+, dbr", 0100mmmm11110110, 1, SH4_FLAG_LOAD)
|
||||
SH4_INSTR(LDCMRBANK, "ldc.l @rn+, rm_bank", 0100mmmm1nnn0111, 1, SH4_FLAG_LOAD)
|
||||
SH4_INSTR(LDSMACH, "lds rn, mach", 0100mmmm00001010, 1, 0)
|
||||
SH4_INSTR(LDSMACL, "lds rn, macl", 0100mmmm00011010, 1, 0)
|
||||
SH4_INSTR(LDSPR, "lds rn, pr", 0100mmmm00101010, 2, 0)
|
||||
SH4_INSTR(LDSMMACH, "lds.l @rn+, mach", 0100mmmm00000110, 1, SH4_FLAG_LOAD)
|
||||
SH4_INSTR(LDSMMACL, "lds.l @rn+, macl", 0100mmmm00010110, 1, SH4_FLAG_LOAD)
|
||||
SH4_INSTR(LDSMPR, "lds.l @rn+, pr", 0100mmmm00100110, 2, SH4_FLAG_LOAD)
|
||||
SH4_INSTR(MOVCAL, "movca.l r0, @rn", 0000nnnn11000011, 1, SH4_FLAG_STORE)
|
||||
SH4_INSTR(NOP, "nop", 0000000000001001, 1, 0)
|
||||
SH4_INSTR(OCBI, "ocbi", 0000nnnn10010011, 1, 0)
|
||||
SH4_INSTR(OCBP, "ocbp", 0000nnnn10100011, 1, 0)
|
||||
SH4_INSTR(OCBWB, "ocbwb", 0000nnnn10110011, 1, 0)
|
||||
SH4_INSTR(PREF, "pref @rn", 0000nnnn10000011, 1, SH4_FLAG_STORE)
|
||||
SH4_INSTR(RTE, "rte", 0000000000101011, 5, SH4_FLAG_BRANCH | SH4_FLAG_DELAYED | SH4_FLAG_SET_SR)
|
||||
SH4_INSTR(SETS, "sets", 0000000001011000, 1, 0)
|
||||
SH4_INSTR(SETT, "sett", 0000000000011000, 1, 0)
|
||||
SH4_INSTR(SLEEP, "sleep", 0000000000011011, 4, 0)
|
||||
SH4_INSTR(STCSR, "stc sr, rn", 0000nnnn00000010, 2, 0)
|
||||
SH4_INSTR(STCGBR, "stc gbr, rn", 0000nnnn00010010, 2, 0)
|
||||
SH4_INSTR(STCVBR, "stc vbr, rn", 0000nnnn00100010, 2, 0)
|
||||
SH4_INSTR(STCSSR, "stc ssr, rn", 0000nnnn00110010, 2, 0)
|
||||
SH4_INSTR(STCSPC, "stc spc, rn", 0000nnnn01000010, 2, 0)
|
||||
SH4_INSTR(STCSGR, "stc sgr, rn", 0000nnnn00111010, 3, 0)
|
||||
SH4_INSTR(STCDBR, "stc dbr, rn", 0000nnnn11111010, 2, 0)
|
||||
SH4_INSTR(STCRBANK, "stc rm_bank, rn", 0000nnnn1mmm0010, 2, 0)
|
||||
SH4_INSTR(STCMSR, "stc.l sr, @-rn", 0100nnnn00000011, 2, SH4_FLAG_STORE)
|
||||
SH4_INSTR(STCMGBR, "stc.l gbr, @-rn", 0100nnnn00010011, 2, SH4_FLAG_STORE)
|
||||
SH4_INSTR(STCMVBR, "stc.l vbr, @-rn", 0100nnnn00100011, 2, SH4_FLAG_STORE)
|
||||
SH4_INSTR(STCMSSR, "stc.l ssr, @-rn", 0100nnnn00110011, 2, SH4_FLAG_STORE)
|
||||
SH4_INSTR(STCMSPC, "stc.l spc, @-rn", 0100nnnn01000011, 2, SH4_FLAG_STORE)
|
||||
SH4_INSTR(STCMSGR, "stc.l sgr, @-rn", 0100nnnn00110010, 3, SH4_FLAG_STORE)
|
||||
SH4_INSTR(STCMDBR, "stc.l dbr, @-rn", 0100nnnn11110010, 2, SH4_FLAG_STORE)
|
||||
SH4_INSTR(STCMRBANK, "stc.l rm_bank, @-rn", 0100nnnn1mmm0011, 2, SH4_FLAG_STORE)
|
||||
SH4_INSTR(STSMACH, "sts mach, rn", 0000nnnn00001010, 1, 0)
|
||||
SH4_INSTR(STSMACL, "sts macl, rn", 0000nnnn00011010, 1, 0)
|
||||
SH4_INSTR(STSPR, "sts pr, rn", 0000nnnn00101010, 2, 0)
|
||||
SH4_INSTR(STSMMACH, "sts.l mach, @-rn", 0100nnnn00000010, 1, SH4_FLAG_STORE)
|
||||
SH4_INSTR(STSMMACL, "sts.l macl, @-rn", 0100nnnn00010010, 1, SH4_FLAG_STORE)
|
||||
SH4_INSTR(STSMPR, "sts.l pr, @-rn", 0100nnnn00100010, 2, SH4_FLAG_STORE)
|
||||
SH4_INSTR(TRAPA, "trapa #imm8", 11000011iiiiiiii, 7, SH4_FLAG_BRANCH)
|
||||
|
||||
|
||||
// floating-point single and double precision instructions
|
||||
SH4_INSTR(FLDI0, "fldi0 frn", 1111nnnn10001101, 1, 0)
|
||||
SH4_INSTR(FLDI1, "fldi1 frn", 1111nnnn10011101, 1, 0)
|
||||
SH4_INSTR(FMOV, "fmov frm, frn", 1111nnnnmmmm1100, 1, 0)
|
||||
SH4_INSTR(FMOV_LOAD, "fmov.s @(rm), frn", 1111nnnnmmmm1000, 1, SH4_FLAG_LOAD)
|
||||
SH4_INSTR(FMOV_INDEX_LOAD, "fmov.s @(r0,rm), frn", 1111nnnnmmmm0110, 1, SH4_FLAG_LOAD)
|
||||
SH4_INSTR(FMOV_STORE, "fmov.s frm, @rn", 1111nnnnmmmm1010, 1, SH4_FLAG_STORE)
|
||||
SH4_INSTR(FMOV_INDEX_STORE, "fmov.s frm, @(r0,rn)", 1111nnnnmmmm0111, 1, SH4_FLAG_STORE)
|
||||
SH4_INSTR(FMOV_SAVE, "fmov.s frm, @-rn", 1111nnnnmmmm1011, 1, SH4_FLAG_STORE)
|
||||
SH4_INSTR(FMOV_RESTORE, "fmov.s @rm+, frn", 1111nnnnmmmm1001, 1, SH4_FLAG_LOAD)
|
||||
SH4_INSTR(FLDS, "flds frm, fpul", 1111mmmm00011101, 1, 0)
|
||||
SH4_INSTR(FSTS, "fsts fpul, frn", 1111nnnn00001101, 1, 0)
|
||||
SH4_INSTR(FABS, "fabs frn", 1111nnnn01011101, 1, 0)
|
||||
SH4_INSTR(FSRRA, "fsrra frn", 1111nnnn01111101, 1, 0)
|
||||
SH4_INSTR(FADD, "fadd frm, frn", 1111nnnnmmmm0000, 1, 0)
|
||||
SH4_INSTR(FCMPEQ, "fcmp/eq frm, frn", 1111nnnnmmmm0100, 2, 0)
|
||||
SH4_INSTR(FCMPGT, "fcmp/gt frm, frn", 1111nnnnmmmm0101, 2, 0)
|
||||
SH4_INSTR(FDIV, "fdiv frm, frn", 1111nnnnmmmm0011, 1, 0)
|
||||
SH4_INSTR(FLOAT, "float fpul, frn", 1111nnnn00101101, 1, 0)
|
||||
SH4_INSTR(FMAC, "fmac fr0, frm, frn", 1111nnnnmmmm1110, 1, 0)
|
||||
SH4_INSTR(FMUL, "fmul frm, frn", 1111nnnnmmmm0010, 1, 0)
|
||||
SH4_INSTR(FNEG, "fneg frn", 1111nnnn01001101, 1, 0)
|
||||
SH4_INSTR(FSQRT, "fsqrt frn", 1111nnnn01101101, 1, 0)
|
||||
SH4_INSTR(FSUB, "fsub frm, frn", 1111nnnnmmmm0001, 1, 0)
|
||||
SH4_INSTR(FTRC, "ftrc frm, fpul", 1111mmmm00111101, 1, 0)
|
||||
SH4_INSTR(FLDI0, "fldi0 frn", 1111nnnn10001101, 1, 0)
|
||||
SH4_INSTR(FLDI1, "fldi1 frn", 1111nnnn10011101, 1, 0)
|
||||
SH4_INSTR(FMOV, "fmov frm, frn", 1111nnnnmmmm1100, 1, 0)
|
||||
SH4_INSTR(FMOV_LOAD, "fmov.s @(rm), frn", 1111nnnnmmmm1000, 1, SH4_FLAG_LOAD)
|
||||
SH4_INSTR(FMOV_INDEX_LOAD, "fmov.s @(r0,rm), frn", 1111nnnnmmmm0110, 1, SH4_FLAG_LOAD)
|
||||
SH4_INSTR(FMOV_STORE, "fmov.s frm, @rn", 1111nnnnmmmm1010, 1, SH4_FLAG_STORE)
|
||||
SH4_INSTR(FMOV_INDEX_STORE, "fmov.s frm, @(r0,rn)", 1111nnnnmmmm0111, 1, SH4_FLAG_STORE)
|
||||
SH4_INSTR(FMOV_SAVE, "fmov.s frm, @-rn", 1111nnnnmmmm1011, 1, SH4_FLAG_STORE)
|
||||
SH4_INSTR(FMOV_RESTORE, "fmov.s @rm+, frn", 1111nnnnmmmm1001, 1, SH4_FLAG_LOAD)
|
||||
SH4_INSTR(FLDS, "flds frn, fpul", 1111mmmm00011101, 1, 0)
|
||||
SH4_INSTR(FSTS, "fsts fpul, frn", 1111nnnn00001101, 1, 0)
|
||||
SH4_INSTR(FABS, "fabs frn", 1111nnnn01011101, 1, 0)
|
||||
SH4_INSTR(FSRRA, "fsrra frn", 1111nnnn01111101, 1, 0)
|
||||
SH4_INSTR(FADD, "fadd frm, frn", 1111nnnnmmmm0000, 1, 0)
|
||||
SH4_INSTR(FCMPEQ, "fcmp/eq frm, frn", 1111nnnnmmmm0100, 2, 0)
|
||||
SH4_INSTR(FCMPGT, "fcmp/gt frm, frn", 1111nnnnmmmm0101, 2, 0)
|
||||
SH4_INSTR(FDIV, "fdiv frm, frn", 1111nnnnmmmm0011, 1, 0)
|
||||
SH4_INSTR(FLOAT, "float fpul, frn", 1111nnnn00101101, 1, 0)
|
||||
SH4_INSTR(FMAC, "fmac fr0, frm, frn", 1111nnnnmmmm1110, 1, 0)
|
||||
SH4_INSTR(FMUL, "fmul frm, frn", 1111nnnnmmmm0010, 1, 0)
|
||||
SH4_INSTR(FNEG, "fneg frn", 1111nnnn01001101, 1, 0)
|
||||
SH4_INSTR(FSQRT, "fsqrt frn", 1111nnnn01101101, 1, 0)
|
||||
SH4_INSTR(FSUB, "fsub frm, frn", 1111nnnnmmmm0001, 1, 0)
|
||||
SH4_INSTR(FTRC, "ftrc frn, fpul", 1111mmmm00111101, 1, 0)
|
||||
|
||||
|
||||
// floating-point double precision instructions,
|
||||
// some merged with single precision instructions
|
||||
SH4_INSTR(FCNVDS, "fcnvds drm, fpul", 1111mmmm10111101, 1, 0)
|
||||
SH4_INSTR(FCNVSD, "fcnvsd fpul, drn", 1111nnnn10101101, 1, 0)
|
||||
SH4_INSTR(FCNVDS, "fcnvds drn, fpul", 1111mmmm10111101, 1, 0)
|
||||
SH4_INSTR(FCNVSD, "fcnvsd fpul, drn", 1111nnnn10101101, 1, 0)
|
||||
|
||||
|
||||
// floating-point control instructions
|
||||
SH4_INSTR(LDSFPSCR, "lds rm, fpscr", 0100mmmm01101010, 1, SH4_FLAG_SET_FPSCR)
|
||||
SH4_INSTR(LDSFPUL, "lds rm, fpul", 0100mmmm01011010, 1, 0)
|
||||
SH4_INSTR(LDSMFPSCR, "lds.l @rm+, fpscr", 0100mmmm01100110, 1, SH4_FLAG_LOAD | SH4_FLAG_SET_FPSCR)
|
||||
SH4_INSTR(LDSMFPUL, "lds.l @rm+, fpul", 0100mmmm01010110, 1, SH4_FLAG_LOAD)
|
||||
SH4_INSTR(STSFPSCR, "sts fpscr, rn", 0000nnnn01101010, 1, 0)
|
||||
SH4_INSTR(STSFPUL, "sts fpul, rn", 0000nnnn01011010, 1, 0)
|
||||
SH4_INSTR(STSMFPSCR, "sts.l fpscr, @-rn", 0100nnnn01100010, 1, SH4_FLAG_STORE)
|
||||
SH4_INSTR(STSMFPUL, "sts.l fpul, @-rn", 0100nnnn01010010, 1, SH4_FLAG_STORE)
|
||||
SH4_INSTR(LDSFPSCR, "lds rn, fpscr", 0100mmmm01101010, 1, SH4_FLAG_SET_FPSCR)
|
||||
SH4_INSTR(LDSFPUL, "lds rn, fpul", 0100mmmm01011010, 1, 0)
|
||||
SH4_INSTR(LDSMFPSCR, "lds.l @rn+, fpscr", 0100mmmm01100110, 1, SH4_FLAG_LOAD | SH4_FLAG_SET_FPSCR)
|
||||
SH4_INSTR(LDSMFPUL, "lds.l @rn+, fpul", 0100mmmm01010110, 1, SH4_FLAG_LOAD)
|
||||
SH4_INSTR(STSFPSCR, "sts fpscr, rn", 0000nnnn01101010, 1, 0)
|
||||
SH4_INSTR(STSFPUL, "sts fpul, rn", 0000nnnn01011010, 1, 0)
|
||||
SH4_INSTR(STSMFPSCR, "sts.l fpscr, @-rn", 0100nnnn01100010, 1, SH4_FLAG_STORE)
|
||||
SH4_INSTR(STSMFPUL, "sts.l fpul, @-rn", 0100nnnn01010010, 1, SH4_FLAG_STORE)
|
||||
|
||||
|
||||
// floating-point graphics acceleration instructions,
|
||||
// some merged with single precision instructions
|
||||
SH4_INSTR(FIPR, "fipr fvm, fvn", 1111nnmm11101101, 1, 0)
|
||||
SH4_INSTR(FSCA, "fsca fpul, drn", 1111nnn011111101, 1, 0)
|
||||
SH4_INSTR(FTRV, "ftrv xmtrx, fvn", 1111nn0111111101, 1, 0)
|
||||
SH4_INSTR(FRCHG, "frchg", 1111101111111101, 1, SH4_FLAG_SET_FPSCR)
|
||||
SH4_INSTR(FSCHG, "fschg", 1111001111111101, 1, SH4_FLAG_SET_FPSCR)
|
||||
SH4_INSTR(FIPR, "fipr fvm, fvn", 1111nnmm11101101, 1, 0)
|
||||
SH4_INSTR(FSCA, "fsca fpul, drn", 1111nnn011111101, 1, 0)
|
||||
SH4_INSTR(FTRV, "ftrv xmtrx, fvn", 1111nn0111111101, 1, 0)
|
||||
SH4_INSTR(FRCHG, "frchg", 1111101111111101, 1, SH4_FLAG_SET_FPSCR)
|
||||
SH4_INSTR(FSCHG, "fschg", 1111001111111101, 1, SH4_FLAG_SET_FPSCR)
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,12 +1,18 @@
|
|||
#ifndef SH4_TRANSLATE_H
|
||||
#define SH4_TRANSLATE_H
|
||||
|
||||
#include "jit/frontend/sh4/sh4_disasm.h"
|
||||
|
||||
struct ir;
|
||||
struct sh4_guest;
|
||||
struct sh4_instr;
|
||||
|
||||
void sh4_emit_instr(struct sh4_guest *guest, struct ir *ir, int flags,
|
||||
const struct sh4_instr *instr,
|
||||
const struct sh4_instr *delay);
|
||||
typedef void (*sh4_translate_cb)(struct sh4_guest *, struct ir *, int, uint32_t,
|
||||
union sh4_instr);
|
||||
|
||||
extern sh4_translate_cb sh4_translators[NUM_SH4_OPS];
|
||||
|
||||
static inline sh4_translate_cb sh4_get_translator(uint16_t instr) {
|
||||
return sh4_translators[sh4_op(instr)];
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
|
@ -981,6 +981,10 @@ void ir_call_cond_2(struct ir *ir, struct ir_value *cond, struct ir_value *fn,
|
|||
ir_set_arg3(ir, instr, arg1);
|
||||
}
|
||||
|
||||
void ir_flush_context(struct ir *ir) {
|
||||
ir_append_instr(ir, OP_FLUSH_CONTEXT, VALUE_V);
|
||||
}
|
||||
|
||||
void ir_debug_info(struct ir *ir, const char *desc, uint32_t addr,
|
||||
uint32_t raw_instr) {
|
||||
struct ir_instr *instr = ir_append_instr(ir, OP_DEBUG_INFO, VALUE_V);
|
||||
|
|
|
@ -405,6 +405,8 @@ void ir_call_cond_1(struct ir *ir, struct ir_value *fn, struct ir_value *arg0,
|
|||
void ir_call_cond_2(struct ir *ir, struct ir_value *fn, struct ir_value *arg0,
|
||||
struct ir_value *arg1, struct ir_value *cond);
|
||||
|
||||
void ir_flush_context(struct ir *ir);
|
||||
|
||||
/* debug */
|
||||
void ir_debug_info(struct ir *ir, const char *desc, uint32_t addr,
|
||||
uint32_t instr);
|
||||
|
|
|
@ -51,6 +51,7 @@ IR_OP(BRANCH_FALSE)
|
|||
IR_OP(BRANCH_TRUE)
|
||||
IR_OP(CALL)
|
||||
IR_OP(CALL_COND)
|
||||
IR_OP(FLUSH_CONTEXT)
|
||||
IR_OP(DEBUG_INFO)
|
||||
IR_OP(DEBUG_BREAK)
|
||||
IR_OP(ASSERT_LT)
|
||||
|
|
|
@ -133,7 +133,7 @@ static void lse_set_available(struct lse *lse, int offset, struct ir_value *v) {
|
|||
static void lse_eliminate_loads_r(struct lse *lse, struct ir *ir,
|
||||
struct ir_block *block) {
|
||||
list_for_each_entry_safe(instr, &block->instrs, struct ir_instr, it) {
|
||||
if (instr->op == OP_FALLBACK) {
|
||||
if (instr->op == OP_FALLBACK || instr->op == OP_FLUSH_CONTEXT) {
|
||||
lse_clear_available(lse);
|
||||
} else if (instr->op == OP_BRANCH) {
|
||||
if (instr->arg[0]->type != VALUE_BLOCK) {
|
||||
|
@ -215,7 +215,7 @@ static void lse_eliminate_stores_r(struct lse *lse, struct ir *ir,
|
|||
}
|
||||
|
||||
list_for_each_entry_safe_reverse(instr, &block->instrs, struct ir_instr, it) {
|
||||
if (instr->op == OP_FALLBACK) {
|
||||
if (instr->op == OP_FALLBACK || instr->op == OP_FLUSH_CONTEXT) {
|
||||
lse_clear_available(lse);
|
||||
} else if (instr->op == OP_BRANCH) {
|
||||
if (instr->arg[0]->type != VALUE_BLOCK) {
|
||||
|
|
|
@ -19,7 +19,6 @@ test_ldcl_stcl_sr:
|
|||
# r0 in alt bank should have been post-incremented by 4
|
||||
mov.l .ALT_SR, r1
|
||||
stc r0_bank, r4
|
||||
sub r1, r4
|
||||
# r1 in alt bank should have been pre-decremented by 4
|
||||
mov.l .DATA_ADDR, r1
|
||||
stc r1_bank, r5
|
||||
|
|
|
@ -112,13 +112,13 @@ TEST_SH4(test_ldc_stc_sr,(uint8_t *)"\x0d\xe2\x1b\xd0\x0e\x40\x63\xe2\x02\x01\x1
|
|||
TEST_SH4(test_ldc_stc_rbank,(uint8_t *)"\x0d\xe2\x1b\xd0\x0e\x40\x63\xe2\x02\x01\x15\xd0\x12\x20\x1c\xd0\x0e\x40\x13\xd0\x02\x63\x0b\x00\x09\x00\x9e\x40\x63\xe1\x92\x01\x0b\x00\x09\x00\x1e\x40\x12\x01\x0b\x00\x09\x00\x2e\x40\x22\x01\x0b\x00\x09\x00\x3e\x40\x32\x01\x0b\x00\x09\x00\x4e\x40\x42\x01\x0b\x00\x09\x00\xfa\x40\xfa\x01\x0b\x00\x09\x00\x09\x00\x09\x00\x00\x00\x00\x00\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\x50\x00\x01\x8c\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\xf0\x00\x00\x50\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\xf0\x00\x00\x70\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00",144,0x1a,0xbaadf00d,0xd,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xd,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d)
|
||||
TEST_SH4(test_ldc_stc_ssr,(uint8_t *)"\x0d\xe2\x1b\xd0\x0e\x40\x63\xe2\x02\x01\x15\xd0\x12\x20\x1c\xd0\x0e\x40\x13\xd0\x02\x63\x0b\x00\x09\x00\x9e\x40\x63\xe1\x92\x01\x0b\x00\x09\x00\x1e\x40\x12\x01\x0b\x00\x09\x00\x2e\x40\x22\x01\x0b\x00\x09\x00\x3e\x40\x32\x01\x0b\x00\x09\x00\x4e\x40\x42\x01\x0b\x00\x09\x00\xfa\x40\xfa\x01\x0b\x00\x09\x00\x09\x00\x09\x00\x00\x00\x00\x00\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\x50\x00\x01\x8c\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\xf0\x00\x00\x50\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\xf0\x00\x00\x70\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00",144,0x34,0xbaadf00d,0xd,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xd,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d)
|
||||
TEST_SH4(test_ldc_stc_dbr,(uint8_t *)"\x0d\xe2\x1b\xd0\x0e\x40\x63\xe2\x02\x01\x15\xd0\x12\x20\x1c\xd0\x0e\x40\x13\xd0\x02\x63\x0b\x00\x09\x00\x9e\x40\x63\xe1\x92\x01\x0b\x00\x09\x00\x1e\x40\x12\x01\x0b\x00\x09\x00\x2e\x40\x22\x01\x0b\x00\x09\x00\x3e\x40\x32\x01\x0b\x00\x09\x00\x4e\x40\x42\x01\x0b\x00\x09\x00\xfa\x40\xfa\x01\x0b\x00\x09\x00\x09\x00\x09\x00\x00\x00\x00\x00\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\x50\x00\x01\x8c\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\xf0\x00\x00\x50\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\xf0\x00\x00\x70\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00",144,0x44,0xbaadf00d,0xd,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xd,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d)
|
||||
TEST_SH4(test_ldcl_stcl_spc,(uint8_t *)"\x0d\xe2\x33\xd0\x07\x40\x63\xe2\x2d\xd1\x04\x71\x03\x41\x34\xd3\x07\x43\x2b\xd0\x02\x63\x2e\xd1\x82\x04\x18\x34\x28\xd1\x92\x05\x18\x35\x0b\x00\x09\x00\x26\xd1\x02\x21\xb7\x41\x63\xe3\x24\xd2\x08\x72\xb3\x42\x10\x32\x29\x04\x22\x65\x0b\x00\x09\x00\x20\xd1\x02\x21\x1f\xd2\x08\x72\x17\x41\x13\x42\x20\x31\x29\x03\x22\x64\x0b\x00\x09\x00\x1a\xd1\x02\x21\x19\xd2\x08\x72\x27\x41\x23\x42\x20\x31\x29\x03\x22\x64\x0b\x00\x09\x00\x15\xd1\x02\x21\x14\xd2\x08\x72\x37\x41\x33\x42\x20\x31\x29\x03\x22\x64\x0b\x00\x09\x00\x0f\xd1\x02\x21\x0e\xd2\x08\x72\x47\x41\x43\x42\x20\x31\x29\x03\x22\x64\x0b\x00\x09\x00\x0a\xd1\x02\x21\x09\xd2\x08\x72\xf6\x41\xf2\x42\x20\x31\x29\x03\x22\x64\x0b\x00\x09\x00\x09\x00\x09\x00\xf0\x00\x00\x50\xf0\x00\x00\x70\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x00\x01\x8c\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\xb0\x00\x01\x8c\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\xb4\x00\x01\x8c\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00",240,0x80,0xbaadf00d,0xd,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0x1,0xd,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d)
|
||||
TEST_SH4(test_ldcl_stcl_sr,(uint8_t *)"\x0d\xe2\x33\xd0\x07\x40\x63\xe2\x2d\xd1\x04\x71\x03\x41\x34\xd3\x07\x43\x2b\xd0\x02\x63\x2e\xd1\x82\x04\x18\x34\x28\xd1\x92\x05\x18\x35\x0b\x00\x09\x00\x26\xd1\x02\x21\xb7\x41\x63\xe3\x24\xd2\x08\x72\xb3\x42\x10\x32\x29\x04\x22\x65\x0b\x00\x09\x00\x20\xd1\x02\x21\x1f\xd2\x08\x72\x17\x41\x13\x42\x20\x31\x29\x03\x22\x64\x0b\x00\x09\x00\x1a\xd1\x02\x21\x19\xd2\x08\x72\x27\x41\x23\x42\x20\x31\x29\x03\x22\x64\x0b\x00\x09\x00\x15\xd1\x02\x21\x14\xd2\x08\x72\x37\x41\x33\x42\x20\x31\x29\x03\x22\x64\x0b\x00\x09\x00\x0f\xd1\x02\x21\x0e\xd2\x08\x72\x47\x41\x43\x42\x20\x31\x29\x03\x22\x64\x0b\x00\x09\x00\x0a\xd1\x02\x21\x09\xd2\x08\x72\xf6\x41\xf2\x42\x20\x31\x29\x03\x22\x64\x0b\x00\x09\x00\x09\x00\x09\x00\xf0\x00\x00\x50\xf0\x00\x00\x70\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x00\x01\x8c\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\xb0\x00\x01\x8c\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\xb4\x00\x01\x8c\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00",240,0x0,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xd,0x500000f0,0x4,0x0,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d)
|
||||
TEST_SH4(test_ldcl_stcl_rbank,(uint8_t *)"\x0d\xe2\x33\xd0\x07\x40\x63\xe2\x2d\xd1\x04\x71\x03\x41\x34\xd3\x07\x43\x2b\xd0\x02\x63\x2e\xd1\x82\x04\x18\x34\x28\xd1\x92\x05\x18\x35\x0b\x00\x09\x00\x26\xd1\x02\x21\xb7\x41\x63\xe3\x24\xd2\x08\x72\xb3\x42\x10\x32\x29\x04\x22\x65\x0b\x00\x09\x00\x20\xd1\x02\x21\x1f\xd2\x08\x72\x17\x41\x13\x42\x20\x31\x29\x03\x22\x64\x0b\x00\x09\x00\x1a\xd1\x02\x21\x19\xd2\x08\x72\x27\x41\x23\x42\x20\x31\x29\x03\x22\x64\x0b\x00\x09\x00\x15\xd1\x02\x21\x14\xd2\x08\x72\x37\x41\x33\x42\x20\x31\x29\x03\x22\x64\x0b\x00\x09\x00\x0f\xd1\x02\x21\x0e\xd2\x08\x72\x47\x41\x43\x42\x20\x31\x29\x03\x22\x64\x0b\x00\x09\x00\x0a\xd1\x02\x21\x09\xd2\x08\x72\xf6\x41\xf2\x42\x20\x31\x29\x03\x22\x64\x0b\x00\x09\x00\x09\x00\x09\x00\xf0\x00\x00\x50\xf0\x00\x00\x70\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x00\x01\x8c\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\xb0\x00\x01\x8c\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\xb4\x00\x01\x8c\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00",240,0x26,0xbaadf00d,0xd,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0x1,0xd,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d)
|
||||
TEST_SH4(test_ldcl_stcl_vbr,(uint8_t *)"\x0d\xe2\x33\xd0\x07\x40\x63\xe2\x2d\xd1\x04\x71\x03\x41\x34\xd3\x07\x43\x2b\xd0\x02\x63\x2e\xd1\x82\x04\x18\x34\x28\xd1\x92\x05\x18\x35\x0b\x00\x09\x00\x26\xd1\x02\x21\xb7\x41\x63\xe3\x24\xd2\x08\x72\xb3\x42\x10\x32\x29\x04\x22\x65\x0b\x00\x09\x00\x20\xd1\x02\x21\x1f\xd2\x08\x72\x17\x41\x13\x42\x20\x31\x29\x03\x22\x64\x0b\x00\x09\x00\x1a\xd1\x02\x21\x19\xd2\x08\x72\x27\x41\x23\x42\x20\x31\x29\x03\x22\x64\x0b\x00\x09\x00\x15\xd1\x02\x21\x14\xd2\x08\x72\x37\x41\x33\x42\x20\x31\x29\x03\x22\x64\x0b\x00\x09\x00\x0f\xd1\x02\x21\x0e\xd2\x08\x72\x47\x41\x43\x42\x20\x31\x29\x03\x22\x64\x0b\x00\x09\x00\x0a\xd1\x02\x21\x09\xd2\x08\x72\xf6\x41\xf2\x42\x20\x31\x29\x03\x22\x64\x0b\x00\x09\x00\x09\x00\x09\x00\xf0\x00\x00\x50\xf0\x00\x00\x70\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x00\x01\x8c\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\xb0\x00\x01\x8c\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\xb4\x00\x01\x8c\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00",240,0x54,0xbaadf00d,0xd,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0x1,0xd,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d)
|
||||
TEST_SH4(test_ldcl_stcl_gbr,(uint8_t *)"\x0d\xe2\x33\xd0\x07\x40\x63\xe2\x2d\xd1\x04\x71\x03\x41\x34\xd3\x07\x43\x2b\xd0\x02\x63\x2e\xd1\x82\x04\x18\x34\x28\xd1\x92\x05\x18\x35\x0b\x00\x09\x00\x26\xd1\x02\x21\xb7\x41\x63\xe3\x24\xd2\x08\x72\xb3\x42\x10\x32\x29\x04\x22\x65\x0b\x00\x09\x00\x20\xd1\x02\x21\x1f\xd2\x08\x72\x17\x41\x13\x42\x20\x31\x29\x03\x22\x64\x0b\x00\x09\x00\x1a\xd1\x02\x21\x19\xd2\x08\x72\x27\x41\x23\x42\x20\x31\x29\x03\x22\x64\x0b\x00\x09\x00\x15\xd1\x02\x21\x14\xd2\x08\x72\x37\x41\x33\x42\x20\x31\x29\x03\x22\x64\x0b\x00\x09\x00\x0f\xd1\x02\x21\x0e\xd2\x08\x72\x47\x41\x43\x42\x20\x31\x29\x03\x22\x64\x0b\x00\x09\x00\x0a\xd1\x02\x21\x09\xd2\x08\x72\xf6\x41\xf2\x42\x20\x31\x29\x03\x22\x64\x0b\x00\x09\x00\x09\x00\x09\x00\xf0\x00\x00\x50\xf0\x00\x00\x70\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x00\x01\x8c\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\xb0\x00\x01\x8c\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\xb4\x00\x01\x8c\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00",240,0x3e,0xbaadf00d,0xd,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0x1,0xd,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d)
|
||||
TEST_SH4(test_ldcl_stcl_ssr,(uint8_t *)"\x0d\xe2\x33\xd0\x07\x40\x63\xe2\x2d\xd1\x04\x71\x03\x41\x34\xd3\x07\x43\x2b\xd0\x02\x63\x2e\xd1\x82\x04\x18\x34\x28\xd1\x92\x05\x18\x35\x0b\x00\x09\x00\x26\xd1\x02\x21\xb7\x41\x63\xe3\x24\xd2\x08\x72\xb3\x42\x10\x32\x29\x04\x22\x65\x0b\x00\x09\x00\x20\xd1\x02\x21\x1f\xd2\x08\x72\x17\x41\x13\x42\x20\x31\x29\x03\x22\x64\x0b\x00\x09\x00\x1a\xd1\x02\x21\x19\xd2\x08\x72\x27\x41\x23\x42\x20\x31\x29\x03\x22\x64\x0b\x00\x09\x00\x15\xd1\x02\x21\x14\xd2\x08\x72\x37\x41\x33\x42\x20\x31\x29\x03\x22\x64\x0b\x00\x09\x00\x0f\xd1\x02\x21\x0e\xd2\x08\x72\x47\x41\x43\x42\x20\x31\x29\x03\x22\x64\x0b\x00\x09\x00\x0a\xd1\x02\x21\x09\xd2\x08\x72\xf6\x41\xf2\x42\x20\x31\x29\x03\x22\x64\x0b\x00\x09\x00\x09\x00\x09\x00\xf0\x00\x00\x50\xf0\x00\x00\x70\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x00\x01\x8c\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\xb0\x00\x01\x8c\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\xb4\x00\x01\x8c\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00",240,0x6a,0xbaadf00d,0xd,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0x1,0xd,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d)
|
||||
TEST_SH4(test_ldcl_stcl_dbr,(uint8_t *)"\x0d\xe2\x33\xd0\x07\x40\x63\xe2\x2d\xd1\x04\x71\x03\x41\x34\xd3\x07\x43\x2b\xd0\x02\x63\x2e\xd1\x82\x04\x18\x34\x28\xd1\x92\x05\x18\x35\x0b\x00\x09\x00\x26\xd1\x02\x21\xb7\x41\x63\xe3\x24\xd2\x08\x72\xb3\x42\x10\x32\x29\x04\x22\x65\x0b\x00\x09\x00\x20\xd1\x02\x21\x1f\xd2\x08\x72\x17\x41\x13\x42\x20\x31\x29\x03\x22\x64\x0b\x00\x09\x00\x1a\xd1\x02\x21\x19\xd2\x08\x72\x27\x41\x23\x42\x20\x31\x29\x03\x22\x64\x0b\x00\x09\x00\x15\xd1\x02\x21\x14\xd2\x08\x72\x37\x41\x33\x42\x20\x31\x29\x03\x22\x64\x0b\x00\x09\x00\x0f\xd1\x02\x21\x0e\xd2\x08\x72\x47\x41\x43\x42\x20\x31\x29\x03\x22\x64\x0b\x00\x09\x00\x0a\xd1\x02\x21\x09\xd2\x08\x72\xf6\x41\xf2\x42\x20\x31\x29\x03\x22\x64\x0b\x00\x09\x00\x09\x00\x09\x00\xf0\x00\x00\x50\xf0\x00\x00\x70\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x00\x01\x8c\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\xb0\x00\x01\x8c\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\xb4\x00\x01\x8c\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00",240,0x96,0xbaadf00d,0xd,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0x1,0xd,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d)
|
||||
TEST_SH4(test_ldcl_stcl_spc,(uint8_t *)"\x0d\xe2\x33\xd0\x07\x40\x63\xe2\x2d\xd1\x04\x71\x03\x41\x34\xd3\x07\x43\x2b\xd0\x02\x63\x2e\xd1\x82\x04\x29\xd1\x92\x05\x18\x35\x0b\x00\x09\x00\x26\xd1\x02\x21\xb7\x41\x63\xe3\x24\xd2\x08\x72\xb3\x42\x10\x32\x29\x04\x22\x65\x0b\x00\x09\x00\x20\xd1\x02\x21\x1f\xd2\x08\x72\x17\x41\x13\x42\x20\x31\x29\x03\x22\x64\x0b\x00\x09\x00\x1b\xd1\x02\x21\x1a\xd2\x08\x72\x27\x41\x23\x42\x20\x31\x29\x03\x22\x64\x0b\x00\x09\x00\x15\xd1\x02\x21\x14\xd2\x08\x72\x37\x41\x33\x42\x20\x31\x29\x03\x22\x64\x0b\x00\x09\x00\x10\xd1\x02\x21\x0f\xd2\x08\x72\x47\x41\x43\x42\x20\x31\x29\x03\x22\x64\x0b\x00\x09\x00\x0a\xd1\x02\x21\x09\xd2\x08\x72\xf6\x41\xf2\x42\x20\x31\x29\x03\x22\x64\x0b\x00\x09\x00\x09\x00\x09\x00\x09\x00\xf0\x00\x00\x50\xf0\x00\x00\x70\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x00\x01\x8c\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\xb0\x00\x01\x8c\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\xb4\x00\x01\x8c\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00",240,0x7e,0xbaadf00d,0xd,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0x1,0xd,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d)
|
||||
TEST_SH4(test_ldcl_stcl_sr,(uint8_t *)"\x0d\xe2\x33\xd0\x07\x40\x63\xe2\x2d\xd1\x04\x71\x03\x41\x34\xd3\x07\x43\x2b\xd0\x02\x63\x2e\xd1\x82\x04\x29\xd1\x92\x05\x18\x35\x0b\x00\x09\x00\x26\xd1\x02\x21\xb7\x41\x63\xe3\x24\xd2\x08\x72\xb3\x42\x10\x32\x29\x04\x22\x65\x0b\x00\x09\x00\x20\xd1\x02\x21\x1f\xd2\x08\x72\x17\x41\x13\x42\x20\x31\x29\x03\x22\x64\x0b\x00\x09\x00\x1b\xd1\x02\x21\x1a\xd2\x08\x72\x27\x41\x23\x42\x20\x31\x29\x03\x22\x64\x0b\x00\x09\x00\x15\xd1\x02\x21\x14\xd2\x08\x72\x37\x41\x33\x42\x20\x31\x29\x03\x22\x64\x0b\x00\x09\x00\x10\xd1\x02\x21\x0f\xd2\x08\x72\x47\x41\x43\x42\x20\x31\x29\x03\x22\x64\x0b\x00\x09\x00\x0a\xd1\x02\x21\x09\xd2\x08\x72\xf6\x41\xf2\x42\x20\x31\x29\x03\x22\x64\x0b\x00\x09\x00\x09\x00\x09\x00\x09\x00\xf0\x00\x00\x50\xf0\x00\x00\x70\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x00\x01\x8c\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\xb0\x00\x01\x8c\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\xb4\x00\x01\x8c\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00",240,0x0,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xd,0x500000f0,0x4,0x0,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d)
|
||||
TEST_SH4(test_ldcl_stcl_rbank,(uint8_t *)"\x0d\xe2\x33\xd0\x07\x40\x63\xe2\x2d\xd1\x04\x71\x03\x41\x34\xd3\x07\x43\x2b\xd0\x02\x63\x2e\xd1\x82\x04\x29\xd1\x92\x05\x18\x35\x0b\x00\x09\x00\x26\xd1\x02\x21\xb7\x41\x63\xe3\x24\xd2\x08\x72\xb3\x42\x10\x32\x29\x04\x22\x65\x0b\x00\x09\x00\x20\xd1\x02\x21\x1f\xd2\x08\x72\x17\x41\x13\x42\x20\x31\x29\x03\x22\x64\x0b\x00\x09\x00\x1b\xd1\x02\x21\x1a\xd2\x08\x72\x27\x41\x23\x42\x20\x31\x29\x03\x22\x64\x0b\x00\x09\x00\x15\xd1\x02\x21\x14\xd2\x08\x72\x37\x41\x33\x42\x20\x31\x29\x03\x22\x64\x0b\x00\x09\x00\x10\xd1\x02\x21\x0f\xd2\x08\x72\x47\x41\x43\x42\x20\x31\x29\x03\x22\x64\x0b\x00\x09\x00\x0a\xd1\x02\x21\x09\xd2\x08\x72\xf6\x41\xf2\x42\x20\x31\x29\x03\x22\x64\x0b\x00\x09\x00\x09\x00\x09\x00\x09\x00\xf0\x00\x00\x50\xf0\x00\x00\x70\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x00\x01\x8c\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\xb0\x00\x01\x8c\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\xb4\x00\x01\x8c\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00",240,0x24,0xbaadf00d,0xd,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0x1,0xd,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d)
|
||||
TEST_SH4(test_ldcl_stcl_vbr,(uint8_t *)"\x0d\xe2\x33\xd0\x07\x40\x63\xe2\x2d\xd1\x04\x71\x03\x41\x34\xd3\x07\x43\x2b\xd0\x02\x63\x2e\xd1\x82\x04\x29\xd1\x92\x05\x18\x35\x0b\x00\x09\x00\x26\xd1\x02\x21\xb7\x41\x63\xe3\x24\xd2\x08\x72\xb3\x42\x10\x32\x29\x04\x22\x65\x0b\x00\x09\x00\x20\xd1\x02\x21\x1f\xd2\x08\x72\x17\x41\x13\x42\x20\x31\x29\x03\x22\x64\x0b\x00\x09\x00\x1b\xd1\x02\x21\x1a\xd2\x08\x72\x27\x41\x23\x42\x20\x31\x29\x03\x22\x64\x0b\x00\x09\x00\x15\xd1\x02\x21\x14\xd2\x08\x72\x37\x41\x33\x42\x20\x31\x29\x03\x22\x64\x0b\x00\x09\x00\x10\xd1\x02\x21\x0f\xd2\x08\x72\x47\x41\x43\x42\x20\x31\x29\x03\x22\x64\x0b\x00\x09\x00\x0a\xd1\x02\x21\x09\xd2\x08\x72\xf6\x41\xf2\x42\x20\x31\x29\x03\x22\x64\x0b\x00\x09\x00\x09\x00\x09\x00\x09\x00\xf0\x00\x00\x50\xf0\x00\x00\x70\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x00\x01\x8c\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\xb0\x00\x01\x8c\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\xb4\x00\x01\x8c\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00",240,0x52,0xbaadf00d,0xd,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0x1,0xd,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d)
|
||||
TEST_SH4(test_ldcl_stcl_gbr,(uint8_t *)"\x0d\xe2\x33\xd0\x07\x40\x63\xe2\x2d\xd1\x04\x71\x03\x41\x34\xd3\x07\x43\x2b\xd0\x02\x63\x2e\xd1\x82\x04\x29\xd1\x92\x05\x18\x35\x0b\x00\x09\x00\x26\xd1\x02\x21\xb7\x41\x63\xe3\x24\xd2\x08\x72\xb3\x42\x10\x32\x29\x04\x22\x65\x0b\x00\x09\x00\x20\xd1\x02\x21\x1f\xd2\x08\x72\x17\x41\x13\x42\x20\x31\x29\x03\x22\x64\x0b\x00\x09\x00\x1b\xd1\x02\x21\x1a\xd2\x08\x72\x27\x41\x23\x42\x20\x31\x29\x03\x22\x64\x0b\x00\x09\x00\x15\xd1\x02\x21\x14\xd2\x08\x72\x37\x41\x33\x42\x20\x31\x29\x03\x22\x64\x0b\x00\x09\x00\x10\xd1\x02\x21\x0f\xd2\x08\x72\x47\x41\x43\x42\x20\x31\x29\x03\x22\x64\x0b\x00\x09\x00\x0a\xd1\x02\x21\x09\xd2\x08\x72\xf6\x41\xf2\x42\x20\x31\x29\x03\x22\x64\x0b\x00\x09\x00\x09\x00\x09\x00\x09\x00\xf0\x00\x00\x50\xf0\x00\x00\x70\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x00\x01\x8c\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\xb0\x00\x01\x8c\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\xb4\x00\x01\x8c\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00",240,0x3c,0xbaadf00d,0xd,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0x1,0xd,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d)
|
||||
TEST_SH4(test_ldcl_stcl_ssr,(uint8_t *)"\x0d\xe2\x33\xd0\x07\x40\x63\xe2\x2d\xd1\x04\x71\x03\x41\x34\xd3\x07\x43\x2b\xd0\x02\x63\x2e\xd1\x82\x04\x29\xd1\x92\x05\x18\x35\x0b\x00\x09\x00\x26\xd1\x02\x21\xb7\x41\x63\xe3\x24\xd2\x08\x72\xb3\x42\x10\x32\x29\x04\x22\x65\x0b\x00\x09\x00\x20\xd1\x02\x21\x1f\xd2\x08\x72\x17\x41\x13\x42\x20\x31\x29\x03\x22\x64\x0b\x00\x09\x00\x1b\xd1\x02\x21\x1a\xd2\x08\x72\x27\x41\x23\x42\x20\x31\x29\x03\x22\x64\x0b\x00\x09\x00\x15\xd1\x02\x21\x14\xd2\x08\x72\x37\x41\x33\x42\x20\x31\x29\x03\x22\x64\x0b\x00\x09\x00\x10\xd1\x02\x21\x0f\xd2\x08\x72\x47\x41\x43\x42\x20\x31\x29\x03\x22\x64\x0b\x00\x09\x00\x0a\xd1\x02\x21\x09\xd2\x08\x72\xf6\x41\xf2\x42\x20\x31\x29\x03\x22\x64\x0b\x00\x09\x00\x09\x00\x09\x00\x09\x00\xf0\x00\x00\x50\xf0\x00\x00\x70\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x00\x01\x8c\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\xb0\x00\x01\x8c\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\xb4\x00\x01\x8c\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00",240,0x68,0xbaadf00d,0xd,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0x1,0xd,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d)
|
||||
TEST_SH4(test_ldcl_stcl_dbr,(uint8_t *)"\x0d\xe2\x33\xd0\x07\x40\x63\xe2\x2d\xd1\x04\x71\x03\x41\x34\xd3\x07\x43\x2b\xd0\x02\x63\x2e\xd1\x82\x04\x29\xd1\x92\x05\x18\x35\x0b\x00\x09\x00\x26\xd1\x02\x21\xb7\x41\x63\xe3\x24\xd2\x08\x72\xb3\x42\x10\x32\x29\x04\x22\x65\x0b\x00\x09\x00\x20\xd1\x02\x21\x1f\xd2\x08\x72\x17\x41\x13\x42\x20\x31\x29\x03\x22\x64\x0b\x00\x09\x00\x1b\xd1\x02\x21\x1a\xd2\x08\x72\x27\x41\x23\x42\x20\x31\x29\x03\x22\x64\x0b\x00\x09\x00\x15\xd1\x02\x21\x14\xd2\x08\x72\x37\x41\x33\x42\x20\x31\x29\x03\x22\x64\x0b\x00\x09\x00\x10\xd1\x02\x21\x0f\xd2\x08\x72\x47\x41\x43\x42\x20\x31\x29\x03\x22\x64\x0b\x00\x09\x00\x0a\xd1\x02\x21\x09\xd2\x08\x72\xf6\x41\xf2\x42\x20\x31\x29\x03\x22\x64\x0b\x00\x09\x00\x09\x00\x09\x00\x09\x00\xf0\x00\x00\x50\xf0\x00\x00\x70\x00\x00\x00\x00\x00\x00\x00\x00\xb8\x00\x01\x8c\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\xb0\x00\x01\x8c\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\xb4\x00\x01\x8c\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00\x09\x00",240,0x94,0xbaadf00d,0xd,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0x1,0xd,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d)
|
||||
TEST_SH4(test_lds_sts_mach,(uint8_t *)"\x0a\x40\x0a\x01\x0b\x00\x09\x00\x1a\x40\x1a\x01\x0b\x00\x09\x00\x2a\x02\x2a\x40\x2a\x01\x2a\x42\x0b\x00\x09\x00\x6a\x40\x6a\x01\x0b\x00\x09\x00\x5a\x40\x5a\x01\x0b\x00\x09\x00",44,0x0,0xbaadf00d,0xd,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xd,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d)
|
||||
TEST_SH4(test_lds_sts_fpul,(uint8_t *)"\x0a\x40\x0a\x01\x0b\x00\x09\x00\x1a\x40\x1a\x01\x0b\x00\x09\x00\x2a\x02\x2a\x40\x2a\x01\x2a\x42\x0b\x00\x09\x00\x6a\x40\x6a\x01\x0b\x00\x09\x00\x5a\x40\x5a\x01\x0b\x00\x09\x00",44,0x24,0xbaadf00d,0xd,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xd,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d)
|
||||
TEST_SH4(test_lds_sts_macl,(uint8_t *)"\x0a\x40\x0a\x01\x0b\x00\x09\x00\x1a\x40\x1a\x01\x0b\x00\x09\x00\x2a\x02\x2a\x40\x2a\x01\x2a\x42\x0b\x00\x09\x00\x6a\x40\x6a\x01\x0b\x00\x09\x00\x5a\x40\x5a\x01\x0b\x00\x09\x00",44,0x8,0xbaadf00d,0xd,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xd,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d,0xbaadf00d)
|
||||
|
|
Loading…
Reference in New Issue