mirror of
https://git.proxmox.com/git/qemu
synced 2025-08-14 19:11:58 +00:00
correct split between helper.c and op_helper.c - cosmetics
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@1505 c046a42c-6fe2-441c-8c8c-71466251a162
This commit is contained in:
parent
fdabc366bd
commit
e37e863f5e
@ -240,174 +240,6 @@ enum {
|
|||||||
EXCP_FLUSH = 0x109,
|
EXCP_FLUSH = 0x109,
|
||||||
};
|
};
|
||||||
|
|
||||||
/* MIPS opcodes */
|
|
||||||
#define EXT_SPECIAL 0x100
|
|
||||||
#define EXT_SPECIAL2 0x200
|
|
||||||
#define EXT_REGIMM 0x300
|
|
||||||
#define EXT_CP0 0x400
|
|
||||||
#define EXT_CP1 0x500
|
|
||||||
#define EXT_CP2 0x600
|
|
||||||
#define EXT_CP3 0x700
|
|
||||||
|
|
||||||
enum {
|
|
||||||
/* indirect opcode tables */
|
|
||||||
OPC_SPECIAL = 0x00,
|
|
||||||
OPC_BREGIMM = 0x01,
|
|
||||||
OPC_CP0 = 0x10,
|
|
||||||
OPC_CP1 = 0x11,
|
|
||||||
OPC_CP2 = 0x12,
|
|
||||||
OPC_CP3 = 0x13,
|
|
||||||
OPC_SPECIAL2 = 0x1C,
|
|
||||||
/* arithmetic with immediate */
|
|
||||||
OPC_ADDI = 0x08,
|
|
||||||
OPC_ADDIU = 0x09,
|
|
||||||
OPC_SLTI = 0x0A,
|
|
||||||
OPC_SLTIU = 0x0B,
|
|
||||||
OPC_ANDI = 0x0C,
|
|
||||||
OPC_ORI = 0x0D,
|
|
||||||
OPC_XORI = 0x0E,
|
|
||||||
OPC_LUI = 0x0F,
|
|
||||||
/* Jump and branches */
|
|
||||||
OPC_J = 0x02,
|
|
||||||
OPC_JAL = 0x03,
|
|
||||||
OPC_BEQ = 0x04, /* Unconditional if rs = rt = 0 (B) */
|
|
||||||
OPC_BEQL = 0x14,
|
|
||||||
OPC_BNE = 0x05,
|
|
||||||
OPC_BNEL = 0x15,
|
|
||||||
OPC_BLEZ = 0x06,
|
|
||||||
OPC_BLEZL = 0x16,
|
|
||||||
OPC_BGTZ = 0x07,
|
|
||||||
OPC_BGTZL = 0x17,
|
|
||||||
OPC_JALX = 0x1D, /* MIPS 16 only */
|
|
||||||
/* Load and stores */
|
|
||||||
OPC_LB = 0x20,
|
|
||||||
OPC_LH = 0x21,
|
|
||||||
OPC_LWL = 0x22,
|
|
||||||
OPC_LW = 0x23,
|
|
||||||
OPC_LBU = 0x24,
|
|
||||||
OPC_LHU = 0x25,
|
|
||||||
OPC_LWR = 0x26,
|
|
||||||
OPC_SB = 0x28,
|
|
||||||
OPC_SH = 0x29,
|
|
||||||
OPC_SWL = 0x2A,
|
|
||||||
OPC_SW = 0x2B,
|
|
||||||
OPC_SWR = 0x2E,
|
|
||||||
OPC_LL = 0x30,
|
|
||||||
OPC_SC = 0x38,
|
|
||||||
/* Floating point load/store */
|
|
||||||
OPC_LWC1 = 0x31,
|
|
||||||
OPC_LWC2 = 0x32,
|
|
||||||
OPC_LDC1 = 0x35,
|
|
||||||
OPC_LDC2 = 0x36,
|
|
||||||
OPC_SWC1 = 0x39,
|
|
||||||
OPC_SWC2 = 0x3A,
|
|
||||||
OPC_SDC1 = 0x3D,
|
|
||||||
OPC_SDC2 = 0x3E,
|
|
||||||
/* Cache and prefetch */
|
|
||||||
OPC_CACHE = 0x2F,
|
|
||||||
OPC_PREF = 0x33,
|
|
||||||
};
|
|
||||||
|
|
||||||
/* MIPS special opcodes */
|
|
||||||
enum {
|
|
||||||
/* Shifts */
|
|
||||||
OPC_SLL = 0x00 | EXT_SPECIAL,
|
|
||||||
/* NOP is SLL r0, r0, 0 */
|
|
||||||
/* SSNOP is SLL r0, r0, 1 */
|
|
||||||
OPC_SRL = 0x02 | EXT_SPECIAL,
|
|
||||||
OPC_SRA = 0x03 | EXT_SPECIAL,
|
|
||||||
OPC_SLLV = 0x04 | EXT_SPECIAL,
|
|
||||||
OPC_SRLV = 0x06 | EXT_SPECIAL,
|
|
||||||
OPC_SRAV = 0x07 | EXT_SPECIAL,
|
|
||||||
/* Multiplication / division */
|
|
||||||
OPC_MULT = 0x18 | EXT_SPECIAL,
|
|
||||||
OPC_MULTU = 0x19 | EXT_SPECIAL,
|
|
||||||
OPC_DIV = 0x1A | EXT_SPECIAL,
|
|
||||||
OPC_DIVU = 0x1B | EXT_SPECIAL,
|
|
||||||
/* 2 registers arithmetic / logic */
|
|
||||||
OPC_ADD = 0x20 | EXT_SPECIAL,
|
|
||||||
OPC_ADDU = 0x21 | EXT_SPECIAL,
|
|
||||||
OPC_SUB = 0x22 | EXT_SPECIAL,
|
|
||||||
OPC_SUBU = 0x23 | EXT_SPECIAL,
|
|
||||||
OPC_AND = 0x24 | EXT_SPECIAL,
|
|
||||||
OPC_OR = 0x25 | EXT_SPECIAL,
|
|
||||||
OPC_XOR = 0x26 | EXT_SPECIAL,
|
|
||||||
OPC_NOR = 0x27 | EXT_SPECIAL,
|
|
||||||
OPC_SLT = 0x2A | EXT_SPECIAL,
|
|
||||||
OPC_SLTU = 0x2B | EXT_SPECIAL,
|
|
||||||
/* Jumps */
|
|
||||||
OPC_JR = 0x08 | EXT_SPECIAL,
|
|
||||||
OPC_JALR = 0x09 | EXT_SPECIAL,
|
|
||||||
/* Traps */
|
|
||||||
OPC_TGE = 0x30 | EXT_SPECIAL,
|
|
||||||
OPC_TGEU = 0x31 | EXT_SPECIAL,
|
|
||||||
OPC_TLT = 0x32 | EXT_SPECIAL,
|
|
||||||
OPC_TLTU = 0x33 | EXT_SPECIAL,
|
|
||||||
OPC_TEQ = 0x34 | EXT_SPECIAL,
|
|
||||||
OPC_TNE = 0x36 | EXT_SPECIAL,
|
|
||||||
/* HI / LO registers load & stores */
|
|
||||||
OPC_MFHI = 0x10 | EXT_SPECIAL,
|
|
||||||
OPC_MTHI = 0x11 | EXT_SPECIAL,
|
|
||||||
OPC_MFLO = 0x12 | EXT_SPECIAL,
|
|
||||||
OPC_MTLO = 0x13 | EXT_SPECIAL,
|
|
||||||
/* Conditional moves */
|
|
||||||
OPC_MOVZ = 0x0A | EXT_SPECIAL,
|
|
||||||
OPC_MOVN = 0x0B | EXT_SPECIAL,
|
|
||||||
|
|
||||||
OPC_MOVCI = 0x01 | EXT_SPECIAL,
|
|
||||||
|
|
||||||
/* Special */
|
|
||||||
OPC_PMON = 0x05 | EXT_SPECIAL,
|
|
||||||
OPC_SYSCALL = 0x0C | EXT_SPECIAL,
|
|
||||||
OPC_BREAK = 0x0D | EXT_SPECIAL,
|
|
||||||
OPC_SYNC = 0x0F | EXT_SPECIAL,
|
|
||||||
};
|
|
||||||
|
|
||||||
enum {
|
|
||||||
/* Mutiply & xxx operations */
|
|
||||||
OPC_MADD = 0x00 | EXT_SPECIAL2,
|
|
||||||
OPC_MADDU = 0x01 | EXT_SPECIAL2,
|
|
||||||
OPC_MUL = 0x02 | EXT_SPECIAL2,
|
|
||||||
OPC_MSUB = 0x04 | EXT_SPECIAL2,
|
|
||||||
OPC_MSUBU = 0x05 | EXT_SPECIAL2,
|
|
||||||
/* Misc */
|
|
||||||
OPC_CLZ = 0x20 | EXT_SPECIAL2,
|
|
||||||
OPC_CLO = 0x21 | EXT_SPECIAL2,
|
|
||||||
/* Special */
|
|
||||||
OPC_SDBBP = 0x3F | EXT_SPECIAL2,
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Branch REGIMM */
|
|
||||||
enum {
|
|
||||||
OPC_BLTZ = 0x00 | EXT_REGIMM,
|
|
||||||
OPC_BLTZL = 0x02 | EXT_REGIMM,
|
|
||||||
OPC_BGEZ = 0x01 | EXT_REGIMM,
|
|
||||||
OPC_BGEZL = 0x03 | EXT_REGIMM,
|
|
||||||
OPC_BLTZAL = 0x10 | EXT_REGIMM,
|
|
||||||
OPC_BLTZALL = 0x12 | EXT_REGIMM,
|
|
||||||
OPC_BGEZAL = 0x11 | EXT_REGIMM,
|
|
||||||
OPC_BGEZALL = 0x13 | EXT_REGIMM,
|
|
||||||
OPC_TGEI = 0x08 | EXT_REGIMM,
|
|
||||||
OPC_TGEIU = 0x09 | EXT_REGIMM,
|
|
||||||
OPC_TLTI = 0x0A | EXT_REGIMM,
|
|
||||||
OPC_TLTIU = 0x0B | EXT_REGIMM,
|
|
||||||
OPC_TEQI = 0x0C | EXT_REGIMM,
|
|
||||||
OPC_TNEI = 0x0E | EXT_REGIMM,
|
|
||||||
};
|
|
||||||
|
|
||||||
enum {
|
|
||||||
/* Coprocessor 0 (MMU) */
|
|
||||||
OPC_MFC0 = 0x00 | EXT_CP0,
|
|
||||||
OPC_MTC0 = 0x04 | EXT_CP0,
|
|
||||||
OPC_TLBR = 0x01 | EXT_CP0,
|
|
||||||
OPC_TLBWI = 0x02 | EXT_CP0,
|
|
||||||
OPC_TLBWR = 0x06 | EXT_CP0,
|
|
||||||
OPC_TLBP = 0x08 | EXT_CP0,
|
|
||||||
OPC_ERET = 0x18 | EXT_CP0,
|
|
||||||
OPC_DERET = 0x1F | EXT_CP0,
|
|
||||||
OPC_WAIT = 0x20 | EXT_CP0,
|
|
||||||
};
|
|
||||||
|
|
||||||
int cpu_mips_exec(CPUMIPSState *s);
|
int cpu_mips_exec(CPUMIPSState *s);
|
||||||
CPUMIPSState *cpu_mips_init(void);
|
CPUMIPSState *cpu_mips_init(void);
|
||||||
uint32_t cpu_mips_get_clock (void);
|
uint32_t cpu_mips_get_clock (void);
|
||||||
|
@ -19,27 +19,15 @@ typedef uint32_t host_uint_t;
|
|||||||
register host_uint_t T0 asm(AREG1);
|
register host_uint_t T0 asm(AREG1);
|
||||||
register host_uint_t T1 asm(AREG2);
|
register host_uint_t T1 asm(AREG2);
|
||||||
register host_uint_t T2 asm(AREG3);
|
register host_uint_t T2 asm(AREG3);
|
||||||
register host_int_t Ts0 asm(AREG1);
|
|
||||||
register host_int_t Ts1 asm(AREG2);
|
|
||||||
register host_int_t Ts2 asm(AREG3);
|
|
||||||
|
|
||||||
#define PARAM(n) ((uint32_t)PARAM##n)
|
|
||||||
#define SPARAM(n) ((int32_t)PARAM##n)
|
|
||||||
|
|
||||||
#if defined (USE_HOST_FLOAT_REGS)
|
#if defined (USE_HOST_FLOAT_REGS)
|
||||||
register double FT0 asm(FREG0);
|
register double FT0 asm(FREG0);
|
||||||
register double FT1 asm(FREG1);
|
register double FT1 asm(FREG1);
|
||||||
register double FT2 asm(FREG2);
|
register double FT2 asm(FREG2);
|
||||||
register float FTS0 asm(FREG0);
|
|
||||||
register float FTS1 asm(FREG1);
|
|
||||||
register float FTS2 asm(FREG2);
|
|
||||||
#else
|
#else
|
||||||
#define FT0 (env->ft0.d)
|
#define FT0 (env->ft0.d)
|
||||||
#define FT1 (env->ft1.d)
|
#define FT1 (env->ft1.d)
|
||||||
#define FT2 (env->ft2.d)
|
#define FT2 (env->ft2.d)
|
||||||
#define FTS0 (env->ft0.f)
|
|
||||||
#define FTS1 (env->ft1.f)
|
|
||||||
#define FTS2 (env->ft2.f)
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined (DEBUG_OP)
|
#if defined (DEBUG_OP)
|
||||||
|
@ -17,7 +17,16 @@
|
|||||||
* License along with this library; if not, write to the Free Software
|
* License along with this library; if not, write to the Free Software
|
||||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
*/
|
*/
|
||||||
#include "exec.h"
|
#include <stdarg.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <inttypes.h>
|
||||||
|
#include <signal.h>
|
||||||
|
#include <assert.h>
|
||||||
|
|
||||||
|
#include "cpu.h"
|
||||||
|
#include "exec-all.h"
|
||||||
|
|
||||||
/* MIPS32 4K MMU emulation */
|
/* MIPS32 4K MMU emulation */
|
||||||
#ifdef MIPS_USES_R4K_TLB
|
#ifdef MIPS_USES_R4K_TLB
|
||||||
@ -142,57 +151,10 @@ target_ulong cpu_get_phys_page_debug(CPUState *env, target_ulong addr)
|
|||||||
return -1;
|
return -1;
|
||||||
return phys_addr;
|
return phys_addr;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
#if !defined(CONFIG_USER_ONLY)
|
|
||||||
|
|
||||||
#define MMUSUFFIX _mmu
|
|
||||||
#define GETPC() (__builtin_return_address(0))
|
|
||||||
|
|
||||||
#define SHIFT 0
|
|
||||||
#include "softmmu_template.h"
|
|
||||||
|
|
||||||
#define SHIFT 1
|
|
||||||
#include "softmmu_template.h"
|
|
||||||
|
|
||||||
#define SHIFT 2
|
|
||||||
#include "softmmu_template.h"
|
|
||||||
|
|
||||||
#define SHIFT 3
|
|
||||||
#include "softmmu_template.h"
|
|
||||||
|
|
||||||
void tlb_fill (target_ulong addr, int is_write, int is_user, void *retaddr)
|
|
||||||
{
|
|
||||||
TranslationBlock *tb;
|
|
||||||
CPUState *saved_env;
|
|
||||||
unsigned long pc;
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
/* XXX: hack to restore env in all cases, even if not called from
|
|
||||||
generated code */
|
|
||||||
saved_env = env;
|
|
||||||
env = cpu_single_env;
|
|
||||||
ret = cpu_mips_handle_mmu_fault(env, addr, is_write, is_user, 1);
|
|
||||||
if (ret) {
|
|
||||||
if (retaddr) {
|
|
||||||
/* now we have a real cpu fault */
|
|
||||||
pc = (unsigned long)retaddr;
|
|
||||||
tb = tb_find_pc(pc);
|
|
||||||
if (tb) {
|
|
||||||
/* the PC is inside the translated code. It means that we have
|
|
||||||
a virtual CPU fault */
|
|
||||||
cpu_restore_state(tb, env, pc, NULL);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
do_raise_exception_err(env->exception_index, env->error_code);
|
|
||||||
}
|
|
||||||
env = saved_env;
|
|
||||||
}
|
|
||||||
|
|
||||||
void cpu_mips_init_mmu (CPUState *env)
|
void cpu_mips_init_mmu (CPUState *env)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* !defined(CONFIG_USER_ONLY) */
|
#endif /* !defined(CONFIG_USER_ONLY) */
|
||||||
|
|
||||||
int cpu_mips_handle_mmu_fault (CPUState *env, target_ulong address, int rw,
|
int cpu_mips_handle_mmu_fault (CPUState *env, target_ulong address, int rw,
|
||||||
|
@ -29,7 +29,6 @@ void cpu_loop_exit(void)
|
|||||||
longjmp(env->jmp_env, 1);
|
longjmp(env->jmp_env, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
__attribute__ (( regparm(2) ))
|
|
||||||
void do_raise_exception_err (uint32_t exception, int error_code)
|
void do_raise_exception_err (uint32_t exception, int error_code)
|
||||||
{
|
{
|
||||||
#if 1
|
#if 1
|
||||||
@ -42,7 +41,6 @@ void do_raise_exception_err (uint32_t exception, int error_code)
|
|||||||
cpu_loop_exit();
|
cpu_loop_exit();
|
||||||
}
|
}
|
||||||
|
|
||||||
__attribute__ (( regparm(1) ))
|
|
||||||
void do_raise_exception (uint32_t exception)
|
void do_raise_exception (uint32_t exception)
|
||||||
{
|
{
|
||||||
do_raise_exception_err(exception, 0);
|
do_raise_exception_err(exception, 0);
|
||||||
@ -117,7 +115,6 @@ void do_msubu (void)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* CP0 helpers */
|
/* CP0 helpers */
|
||||||
__attribute__ (( regparm(2) ))
|
|
||||||
void do_mfc0 (int reg, int sel)
|
void do_mfc0 (int reg, int sel)
|
||||||
{
|
{
|
||||||
const unsigned char *rn;
|
const unsigned char *rn;
|
||||||
@ -267,12 +264,10 @@ void do_mfc0 (int reg, int sel)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
__attribute__ (( regparm(2) ))
|
|
||||||
void do_mtc0 (int reg, int sel)
|
void do_mtc0 (int reg, int sel)
|
||||||
{
|
{
|
||||||
const unsigned char *rn;
|
const unsigned char *rn;
|
||||||
uint32_t val, old, mask;
|
uint32_t val, old, mask;
|
||||||
int i, raise;
|
|
||||||
|
|
||||||
if (sel != 0 && reg != 16 && reg != 28) {
|
if (sel != 0 && reg != 16 && reg != 28) {
|
||||||
val = -1;
|
val = -1;
|
||||||
@ -379,11 +374,14 @@ void do_mtc0 (int reg, int sel)
|
|||||||
old = env->CP0_Cause;
|
old = env->CP0_Cause;
|
||||||
env->CP0_Cause = val;
|
env->CP0_Cause = val;
|
||||||
#if 0
|
#if 0
|
||||||
/* Check if we ever asserted a software IRQ */
|
{
|
||||||
for (i = 0; i < 2; i++) {
|
int i;
|
||||||
mask = 0x100 << i;
|
/* Check if we ever asserted a software IRQ */
|
||||||
if ((val & mask) & !(old & mask))
|
for (i = 0; i < 2; i++) {
|
||||||
mips_set_irq(i);
|
mask = 0x100 << i;
|
||||||
|
if ((val & mask) & !(old & mask))
|
||||||
|
mips_set_irq(i);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
rn = "Cause";
|
rn = "Cause";
|
||||||
@ -486,7 +484,6 @@ void do_mtc0 (int reg, int sel)
|
|||||||
|
|
||||||
/* TLB management */
|
/* TLB management */
|
||||||
#if defined(MIPS_USES_R4K_TLB)
|
#if defined(MIPS_USES_R4K_TLB)
|
||||||
__attribute__ (( regparm(1) ))
|
|
||||||
static void invalidate_tb (int idx)
|
static void invalidate_tb (int idx)
|
||||||
{
|
{
|
||||||
tlb_t *tlb;
|
tlb_t *tlb;
|
||||||
@ -505,7 +502,6 @@ static void invalidate_tb (int idx)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
__attribute__ (( regparm(1) ))
|
|
||||||
static void fill_tb (int idx)
|
static void fill_tb (int idx)
|
||||||
{
|
{
|
||||||
tlb_t *tlb;
|
tlb_t *tlb;
|
||||||
@ -584,7 +580,6 @@ void do_tlbr (void)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
__attribute__ (( regparm(1) ))
|
|
||||||
void op_dump_ldst (const unsigned char *func)
|
void op_dump_ldst (const unsigned char *func)
|
||||||
{
|
{
|
||||||
if (loglevel)
|
if (loglevel)
|
||||||
@ -608,7 +603,6 @@ void debug_eret (void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
__attribute__ (( regparm(1) ))
|
|
||||||
void do_pmon (int function)
|
void do_pmon (int function)
|
||||||
{
|
{
|
||||||
function /= 2;
|
function /= 2;
|
||||||
@ -634,3 +628,50 @@ void do_pmon (int function)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if !defined(CONFIG_USER_ONLY)
|
||||||
|
|
||||||
|
#define MMUSUFFIX _mmu
|
||||||
|
#define GETPC() (__builtin_return_address(0))
|
||||||
|
|
||||||
|
#define SHIFT 0
|
||||||
|
#include "softmmu_template.h"
|
||||||
|
|
||||||
|
#define SHIFT 1
|
||||||
|
#include "softmmu_template.h"
|
||||||
|
|
||||||
|
#define SHIFT 2
|
||||||
|
#include "softmmu_template.h"
|
||||||
|
|
||||||
|
#define SHIFT 3
|
||||||
|
#include "softmmu_template.h"
|
||||||
|
|
||||||
|
void tlb_fill (target_ulong addr, int is_write, int is_user, void *retaddr)
|
||||||
|
{
|
||||||
|
TranslationBlock *tb;
|
||||||
|
CPUState *saved_env;
|
||||||
|
unsigned long pc;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
/* XXX: hack to restore env in all cases, even if not called from
|
||||||
|
generated code */
|
||||||
|
saved_env = env;
|
||||||
|
env = cpu_single_env;
|
||||||
|
ret = cpu_mips_handle_mmu_fault(env, addr, is_write, is_user, 1);
|
||||||
|
if (ret) {
|
||||||
|
if (retaddr) {
|
||||||
|
/* now we have a real cpu fault */
|
||||||
|
pc = (unsigned long)retaddr;
|
||||||
|
tb = tb_find_pc(pc);
|
||||||
|
if (tb) {
|
||||||
|
/* the PC is inside the translated code. It means that we have
|
||||||
|
a virtual CPU fault */
|
||||||
|
cpu_restore_state(tb, env, pc, NULL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
do_raise_exception_err(env->exception_index, env->error_code);
|
||||||
|
}
|
||||||
|
env = saved_env;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
@ -43,6 +43,174 @@ static uint32_t *gen_opparam_ptr;
|
|||||||
|
|
||||||
#include "gen-op.h"
|
#include "gen-op.h"
|
||||||
|
|
||||||
|
/* MIPS opcodes */
|
||||||
|
#define EXT_SPECIAL 0x100
|
||||||
|
#define EXT_SPECIAL2 0x200
|
||||||
|
#define EXT_REGIMM 0x300
|
||||||
|
#define EXT_CP0 0x400
|
||||||
|
#define EXT_CP1 0x500
|
||||||
|
#define EXT_CP2 0x600
|
||||||
|
#define EXT_CP3 0x700
|
||||||
|
|
||||||
|
enum {
|
||||||
|
/* indirect opcode tables */
|
||||||
|
OPC_SPECIAL = 0x00,
|
||||||
|
OPC_BREGIMM = 0x01,
|
||||||
|
OPC_CP0 = 0x10,
|
||||||
|
OPC_CP1 = 0x11,
|
||||||
|
OPC_CP2 = 0x12,
|
||||||
|
OPC_CP3 = 0x13,
|
||||||
|
OPC_SPECIAL2 = 0x1C,
|
||||||
|
/* arithmetic with immediate */
|
||||||
|
OPC_ADDI = 0x08,
|
||||||
|
OPC_ADDIU = 0x09,
|
||||||
|
OPC_SLTI = 0x0A,
|
||||||
|
OPC_SLTIU = 0x0B,
|
||||||
|
OPC_ANDI = 0x0C,
|
||||||
|
OPC_ORI = 0x0D,
|
||||||
|
OPC_XORI = 0x0E,
|
||||||
|
OPC_LUI = 0x0F,
|
||||||
|
/* Jump and branches */
|
||||||
|
OPC_J = 0x02,
|
||||||
|
OPC_JAL = 0x03,
|
||||||
|
OPC_BEQ = 0x04, /* Unconditional if rs = rt = 0 (B) */
|
||||||
|
OPC_BEQL = 0x14,
|
||||||
|
OPC_BNE = 0x05,
|
||||||
|
OPC_BNEL = 0x15,
|
||||||
|
OPC_BLEZ = 0x06,
|
||||||
|
OPC_BLEZL = 0x16,
|
||||||
|
OPC_BGTZ = 0x07,
|
||||||
|
OPC_BGTZL = 0x17,
|
||||||
|
OPC_JALX = 0x1D, /* MIPS 16 only */
|
||||||
|
/* Load and stores */
|
||||||
|
OPC_LB = 0x20,
|
||||||
|
OPC_LH = 0x21,
|
||||||
|
OPC_LWL = 0x22,
|
||||||
|
OPC_LW = 0x23,
|
||||||
|
OPC_LBU = 0x24,
|
||||||
|
OPC_LHU = 0x25,
|
||||||
|
OPC_LWR = 0x26,
|
||||||
|
OPC_SB = 0x28,
|
||||||
|
OPC_SH = 0x29,
|
||||||
|
OPC_SWL = 0x2A,
|
||||||
|
OPC_SW = 0x2B,
|
||||||
|
OPC_SWR = 0x2E,
|
||||||
|
OPC_LL = 0x30,
|
||||||
|
OPC_SC = 0x38,
|
||||||
|
/* Floating point load/store */
|
||||||
|
OPC_LWC1 = 0x31,
|
||||||
|
OPC_LWC2 = 0x32,
|
||||||
|
OPC_LDC1 = 0x35,
|
||||||
|
OPC_LDC2 = 0x36,
|
||||||
|
OPC_SWC1 = 0x39,
|
||||||
|
OPC_SWC2 = 0x3A,
|
||||||
|
OPC_SDC1 = 0x3D,
|
||||||
|
OPC_SDC2 = 0x3E,
|
||||||
|
/* Cache and prefetch */
|
||||||
|
OPC_CACHE = 0x2F,
|
||||||
|
OPC_PREF = 0x33,
|
||||||
|
};
|
||||||
|
|
||||||
|
/* MIPS special opcodes */
|
||||||
|
enum {
|
||||||
|
/* Shifts */
|
||||||
|
OPC_SLL = 0x00 | EXT_SPECIAL,
|
||||||
|
/* NOP is SLL r0, r0, 0 */
|
||||||
|
/* SSNOP is SLL r0, r0, 1 */
|
||||||
|
OPC_SRL = 0x02 | EXT_SPECIAL,
|
||||||
|
OPC_SRA = 0x03 | EXT_SPECIAL,
|
||||||
|
OPC_SLLV = 0x04 | EXT_SPECIAL,
|
||||||
|
OPC_SRLV = 0x06 | EXT_SPECIAL,
|
||||||
|
OPC_SRAV = 0x07 | EXT_SPECIAL,
|
||||||
|
/* Multiplication / division */
|
||||||
|
OPC_MULT = 0x18 | EXT_SPECIAL,
|
||||||
|
OPC_MULTU = 0x19 | EXT_SPECIAL,
|
||||||
|
OPC_DIV = 0x1A | EXT_SPECIAL,
|
||||||
|
OPC_DIVU = 0x1B | EXT_SPECIAL,
|
||||||
|
/* 2 registers arithmetic / logic */
|
||||||
|
OPC_ADD = 0x20 | EXT_SPECIAL,
|
||||||
|
OPC_ADDU = 0x21 | EXT_SPECIAL,
|
||||||
|
OPC_SUB = 0x22 | EXT_SPECIAL,
|
||||||
|
OPC_SUBU = 0x23 | EXT_SPECIAL,
|
||||||
|
OPC_AND = 0x24 | EXT_SPECIAL,
|
||||||
|
OPC_OR = 0x25 | EXT_SPECIAL,
|
||||||
|
OPC_XOR = 0x26 | EXT_SPECIAL,
|
||||||
|
OPC_NOR = 0x27 | EXT_SPECIAL,
|
||||||
|
OPC_SLT = 0x2A | EXT_SPECIAL,
|
||||||
|
OPC_SLTU = 0x2B | EXT_SPECIAL,
|
||||||
|
/* Jumps */
|
||||||
|
OPC_JR = 0x08 | EXT_SPECIAL,
|
||||||
|
OPC_JALR = 0x09 | EXT_SPECIAL,
|
||||||
|
/* Traps */
|
||||||
|
OPC_TGE = 0x30 | EXT_SPECIAL,
|
||||||
|
OPC_TGEU = 0x31 | EXT_SPECIAL,
|
||||||
|
OPC_TLT = 0x32 | EXT_SPECIAL,
|
||||||
|
OPC_TLTU = 0x33 | EXT_SPECIAL,
|
||||||
|
OPC_TEQ = 0x34 | EXT_SPECIAL,
|
||||||
|
OPC_TNE = 0x36 | EXT_SPECIAL,
|
||||||
|
/* HI / LO registers load & stores */
|
||||||
|
OPC_MFHI = 0x10 | EXT_SPECIAL,
|
||||||
|
OPC_MTHI = 0x11 | EXT_SPECIAL,
|
||||||
|
OPC_MFLO = 0x12 | EXT_SPECIAL,
|
||||||
|
OPC_MTLO = 0x13 | EXT_SPECIAL,
|
||||||
|
/* Conditional moves */
|
||||||
|
OPC_MOVZ = 0x0A | EXT_SPECIAL,
|
||||||
|
OPC_MOVN = 0x0B | EXT_SPECIAL,
|
||||||
|
|
||||||
|
OPC_MOVCI = 0x01 | EXT_SPECIAL,
|
||||||
|
|
||||||
|
/* Special */
|
||||||
|
OPC_PMON = 0x05 | EXT_SPECIAL,
|
||||||
|
OPC_SYSCALL = 0x0C | EXT_SPECIAL,
|
||||||
|
OPC_BREAK = 0x0D | EXT_SPECIAL,
|
||||||
|
OPC_SYNC = 0x0F | EXT_SPECIAL,
|
||||||
|
};
|
||||||
|
|
||||||
|
enum {
|
||||||
|
/* Mutiply & xxx operations */
|
||||||
|
OPC_MADD = 0x00 | EXT_SPECIAL2,
|
||||||
|
OPC_MADDU = 0x01 | EXT_SPECIAL2,
|
||||||
|
OPC_MUL = 0x02 | EXT_SPECIAL2,
|
||||||
|
OPC_MSUB = 0x04 | EXT_SPECIAL2,
|
||||||
|
OPC_MSUBU = 0x05 | EXT_SPECIAL2,
|
||||||
|
/* Misc */
|
||||||
|
OPC_CLZ = 0x20 | EXT_SPECIAL2,
|
||||||
|
OPC_CLO = 0x21 | EXT_SPECIAL2,
|
||||||
|
/* Special */
|
||||||
|
OPC_SDBBP = 0x3F | EXT_SPECIAL2,
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Branch REGIMM */
|
||||||
|
enum {
|
||||||
|
OPC_BLTZ = 0x00 | EXT_REGIMM,
|
||||||
|
OPC_BLTZL = 0x02 | EXT_REGIMM,
|
||||||
|
OPC_BGEZ = 0x01 | EXT_REGIMM,
|
||||||
|
OPC_BGEZL = 0x03 | EXT_REGIMM,
|
||||||
|
OPC_BLTZAL = 0x10 | EXT_REGIMM,
|
||||||
|
OPC_BLTZALL = 0x12 | EXT_REGIMM,
|
||||||
|
OPC_BGEZAL = 0x11 | EXT_REGIMM,
|
||||||
|
OPC_BGEZALL = 0x13 | EXT_REGIMM,
|
||||||
|
OPC_TGEI = 0x08 | EXT_REGIMM,
|
||||||
|
OPC_TGEIU = 0x09 | EXT_REGIMM,
|
||||||
|
OPC_TLTI = 0x0A | EXT_REGIMM,
|
||||||
|
OPC_TLTIU = 0x0B | EXT_REGIMM,
|
||||||
|
OPC_TEQI = 0x0C | EXT_REGIMM,
|
||||||
|
OPC_TNEI = 0x0E | EXT_REGIMM,
|
||||||
|
};
|
||||||
|
|
||||||
|
enum {
|
||||||
|
/* Coprocessor 0 (MMU) */
|
||||||
|
OPC_MFC0 = 0x00 | EXT_CP0,
|
||||||
|
OPC_MTC0 = 0x04 | EXT_CP0,
|
||||||
|
OPC_TLBR = 0x01 | EXT_CP0,
|
||||||
|
OPC_TLBWI = 0x02 | EXT_CP0,
|
||||||
|
OPC_TLBWR = 0x06 | EXT_CP0,
|
||||||
|
OPC_TLBP = 0x08 | EXT_CP0,
|
||||||
|
OPC_ERET = 0x18 | EXT_CP0,
|
||||||
|
OPC_DERET = 0x1F | EXT_CP0,
|
||||||
|
OPC_WAIT = 0x20 | EXT_CP0,
|
||||||
|
};
|
||||||
|
|
||||||
const unsigned char *regnames[] =
|
const unsigned char *regnames[] =
|
||||||
{ "r0", "at", "v0", "v1", "a0", "a1", "a2", "a3",
|
{ "r0", "at", "v0", "v1", "a0", "a1", "a2", "a3",
|
||||||
"t0", "t1", "t2", "t3", "t4", "t5", "t6", "t7",
|
"t0", "t1", "t2", "t3", "t4", "t5", "t6", "t7",
|
||||||
|
Loading…
Reference in New Issue
Block a user