blob: 7fab760e06baa091fd02f054228d021f068aa1c5 (
plain) (
tree)
|
|
// license:BSD-3-Clause
// copyright-holders:Ryan Holtz
//================================================================
//
// mb86901defs.h - Helpful #defines for emulating the MB86901
// series of SPARC processor.
//
//================================================================
#pragma once
#ifndef __MB86901_DEFS_H__
#define __MB86901_DEFS_H__
#define PSR_CWP_MASK 0x0000001f
#define PSR_ET_SHIFT 5
#define PSR_ET_MASK 0x00000020
#define PSR_PS_SHIFT 6
#define PSR_PS_MASK 0x00000040
#define PSR_S_SHIFT 7
#define PSR_S_MASK 0x00000080
#define PSR_PIL_SHIFT 8
#define PSR_PIL_MASK 0x00000f00
#define PSR_EF_SHIFT 12
#define PSR_EF_MASK 0x00001000
#define PSR_EC_SHIFT 13
#define PSR_EC_MASK 0x00002000
#define PSR_ICC_SHIFT 20
#define PSR_RES_MASK 0x000fc000
#define PSR_ICC_MASK 0x00f00000
#define PSR_N_MASK 0x00800000
#define PSR_Z_MASK 0x00400000
#define PSR_V_MASK 0x00200000
#define PSR_C_MASK 0x00100000
#define PSR_VER_SHIFT 24
#define PSR_VER_MASK 0x0f000000
#define PSR_VER 0
#define PSR_IMPL_SHIFT 28
#define PSR_IMPL_MASK 0xf0000000
#define PSR_IMPL 0
#define PSR_ZERO_MASK (PSR_IMPL_MASK | PSR_VER_MASK | PSR_RES_MASK)
#define ICC_N_SET (m_psr & PSR_N_MASK)
#define ICC_N (ICC_N_SET ? 1 : 0)
#define ICC_N_CLEAR (!ICC_N_SET)
#define SET_ICC_N_FLAG do { m_psr |= PSR_N_MASK; } while(0)
#define CLEAR_ICC_N_FLAG do { m_psr &= ~PSR_N_MASK; } while(0)
#define ICC_Z_SET (m_psr & PSR_Z_MASK)
#define ICC_Z (ICC_Z_SET ? 1 : 0)
#define ICC_Z_CLEAR (!ICC_Z_SET)
#define SET_ICC_Z_FLAG do { m_psr |= PSR_Z_MASK; } while(0)
#define CLEAR_ICC_Z_FLAG do { m_psr &= ~PSR_Z_MASK; } while(0)
#define ICC_V_SET (m_psr & PSR_V_MASK)
#define ICC_V (ICC_V_SET ? 1 : 0)
#define ICC_V_CLEAR (!ICC_V_SET)
#define SET_ICC_V_FLAG do { m_psr |= PSR_V_MASK; } while(0)
#define CLEAR_ICC_V_FLAG do { m_psr &= ~PSR_V_MASK; } while(0)
#define ICC_C_SET (m_psr & PSR_C_MASK)
#define ICC_C (ICC_C_SET ? 1 : 0)
#define ICC_C_CLEAR (!ICC_C_SET)
#define SET_ICC_C_FLAG do { m_psr |= PSR_C_MASK; } while(0)
#define CLEAR_ICC_C_FLAG do { m_psr &= ~PSR_C_MASK; } while(0)
#define CLEAR_ICC do { m_psr &= ~PSR_ICC_MASK; } while(0)
#define TEST_ICC_NZ(x) do { m_psr &= ~PSR_ICC_MASK; m_psr |= (x & 0x80000000) ? PSR_N_MASK : 0; m_psr |= (x == 0) ? PSR_Z_MASK : 0; } while (0)
#define MAKE_PSR do { m_psr = (m_impl << PSR_IMPL_SHIFT) | (m_ver << PSR_VER_SHIFT) | (m_icc << PSR_ICC_SHIFT) | (m_ec ? PSR_EC_MASK : 0) | (m_ef ? PSR_EF_MASK : 0) | (m_pil << PSR_PIL_SHIFT) | (m_s ? PSR_S_MASK : 0) | (m_ps ? PSR_PS_MASK : 0) | (m_et ? PSR_ET_MASK : 0) | m_cwp; } while(0)
#define BREAK_PSR do { m_icc = (m_psr & PSR_ICC_MASK) >> PSR_ICC_SHIFT; m_ec = m_psr & PSR_EC_MASK; m_ef = m_psr & PSR_EF_MASK; m_pil = (m_psr & PSR_PIL_MASK) >> PSR_PIL_SHIFT; m_s = m_psr & PSR_S_MASK; m_ps = m_psr & PSR_PS_MASK; m_et = m_psr & PSR_ET_MASK; m_cwp = m_psr & PSR_CWP_MASK; } while(0)
#define MAKE_ICC do { m_icc = (m_psr & PSR_ICC_MASK) >> PSR_ICC_SHIFT; } while(0)
#define CWP m_cwp
#define S m_s
#define PS m_ps
#define IS_SUPERVISOR (m_psr & PSR_S_MASK)
#define IS_USER (!IS_SUPERVISOR)
#define TRAPS_ENABLED (m_psr & PSR_ET_MASK)
#define TRAPS_DISABLED (!TRAPS_ENABLED)
#define PSR m_psr
#define WIM m_wim
#define TBR m_tbr
#define OP (op >> 30) // gangnam style
#define OP2 ((op >> 22) & 7)
#define OP3 ((op >> 19) & 63)
#define OPF ((op >> 5) & 0x1ff)
#define OPC ((op >> 5) & 0x1ff)
#define OPFLOW ((op >> 5) & 0x3f)
#define DISP30 (INT32(op << 2))
#define DISP22 (INT32(op << 10) >> 8)
#define DISP19 (INT32(op << 13) >> 11)
#define DISP16 (INT32(((op << 10) & 0xc0000000) | ((op << 16) & 0x3fff0000)) >> 14)
#define IMM22 (op << 10)
#define CONST22 (op & 0x3fffff)
#define SIMM13 (INT32(op << 19) >> 19)
#define SIMM11 (INT32(op << 21) >> 21)
#define SIMM10 (INT32(op << 22) >> 22)
#define SIMM8 (INT32(op << 24) >> 24)
#define IMM7 (op & 0x7f)
#define SIMM7 (INT32(op << 25) >> 25)
#define SHCNT32 (op & 31)
#define SHCNT64 (op & 63)
#define IAMODE (op & 0x7)
#define USEIMM ((op >> 13) & 1)
#define USEEXT ((op >> 12) & 1)
#define COND ((op >> 25) & 15)
#define RCOND ((op >> 10) & 7)
#define MOVCOND ((op >> 14) & 15)
#define PRED ((op >> 19) & 1)
#define ANNUL ((op >> 29) & 1)
#define BRCC ((op >> 20) & 3)
#define MOVCC (((op >> 11) & 3) | ((op >> 16) & 4))
#define OPFCC ((op >> 11) & 7)
#define TCCCC ((op >> 11) & 3)
#define ASI ((op >> 5) & 255)
#define MMASK (op & 15)
#define CMASK ((op >> 4) & 7)
#define RD ((op >> 25) & 31)
#define RS1 ((op >> 14) & 31)
#define RS2 (op & 31)
#define FREG(x) m_fpr[(x)]
#define FDREG m_fpr[RD]
#define FSR m_fsr
#define REG(x) *m_regs[(x)]
#define RDREG *m_regs[RD]
#define RS1REG *m_regs[RS1]
#define RS2REG *m_regs[RS2]
#define SET_RDREG(x) do { if(RD) { RDREG = (x); } } while (0)
#define ADDRESS (USEIMM ? (RS1REG + SIMM13) : (RS1REG + RS2REG))
#define PC m_pc
#define nPC m_npc
#define Y m_y
#define ET m_et
#define EF m_ef
#define EC m_ec
#define PIL m_pil
#define MAE m_mae
#define HOLD_BUS m_hold_bus
#define BIT31(x) ((x) & 0x80000000)
#define UPDATE_PC true
#define PC_UPDATED false
#define OP_TYPE0 0
#define OP_CALL 1
#define OP_ALU 2
#define OP_LDST 3
#define OP2_UNIMP 0
#define OP2_BICC 2
#define OP2_SETHI 4
#define OP2_FBFCC 6
#define OP2_CBCCC 7
#define OP3_ADD 0
#define OP3_AND 1
#define OP3_OR 2
#define OP3_XOR 3
#define OP3_SUB 4
#define OP3_ANDN 5
#define OP3_ORN 6
#define OP3_XNOR 7
#define OP3_ADDX 8
#define OP3_UMUL 10
#define OP3_SMUL 11
#define OP3_SUBX 12
#define OP3_UDIV 14
#define OP3_SDIV 15
#define OP3_ADDCC 16
#define OP3_ANDCC 17
#define OP3_ORCC 18
#define OP3_XORCC 19
#define OP3_SUBCC 20
#define OP3_ANDNCC 21
#define OP3_ORNCC 22
#define OP3_XNORCC 23
#define OP3_ADDXCC 24
#define OP3_UMULCC 26
#define OP3_SMULCC 27
#define OP3_SUBXCC 28
#define OP3_UDIVCC 30
#define OP3_SDIVCC 31
#define OP3_TADDCC 32
#define OP3_TSUBCC 33
#define OP3_TADDCCTV 34
#define OP3_TSUBCCTV 35
#define OP3_MULSCC 36
#define OP3_SLL 37
#define OP3_SRL 38
#define OP3_SRA 39
#define OP3_RDASR 40
#define OP3_RDPSR 41
#define OP3_RDWIM 42
#define OP3_RDTBR 43
#define OP3_WRASR 48
#define OP3_WRPSR 49
#define OP3_WRWIM 50
#define OP3_WRTBR 51
#define OP3_FPOP1 52
#define OP3_FPOP2 53
#define OP3_JMPL 56
#define OP3_RETT 57
#define OP3_TICC 58
#define OP3_SAVE 60
#define OP3_RESTORE 61
#define OP3_LD 0
#define OP3_LDUB 1
#define OP3_LDUH 2
#define OP3_LDD 3
#define OP3_ST 4
#define OP3_STB 5
#define OP3_STH 6
#define OP3_STD 7
#define OP3_LDSB 9
#define OP3_LDSH 10
#define OP3_LDSTUB 13
#define OP3_SWAP 15
#define OP3_LDA 16
#define OP3_LDUBA 17
#define OP3_LDUHA 18
#define OP3_LDDA 19
#define OP3_STA 20
#define OP3_STBA 21
#define OP3_STHA 22
#define OP3_STDA 23
#define OP3_LDSBA 25
#define OP3_LDSHA 26
#define OP3_LDSTUBA 29
#define OP3_SWAPA 31
#define OP3_LDFPR 32
#define OP3_LDFSR 33
#define OP3_LDDFPR 35
#define OP3_STFPR 36
#define OP3_STFSR 37
#define OP3_STDFQ 38
#define OP3_STDFPR 39
#define OP3_LDCPR 40
#define OP3_LDCSR 41
#define OP3_LDDCPR 43
#define OP3_STCPR 44
#define OP3_STCSR 45
#define OP3_STDCQ 46
#define OP3_STDCPR 47
#define OP3_CPOP1 54
#define OP3_CPOP2 55
#define COND_BN 0
#define COND_BE 1
#define COND_BLE 2
#define COND_BL 3
#define COND_BLEU 4
#define COND_BCS 5
#define COND_BNEG 6
#define COND_BVS 7
#define COND_BA 8
#define COND_BNE 9
#define COND_BG 10
#define COND_BGE 11
#define COND_BGU 12
#define COND_BCC 13
#define COND_BPOS 14
#define COND_BVC 15
#define LDD (OP3 == OP3_LDD)
#define LD (OP3 == OP3_LD)
#define LDSH (OP3 == OP3_LDSH)
#define LDUH (OP3 == OP3_LDUH)
#define LDSB (OP3 == OP3_LDSB)
#define LDUB (OP3 == OP3_LDUB)
#define LDDF (OP3 == OP3_LDDFPR)
#define LDF (OP3 == OP3_LDFPR)
#define LDFSR (OP3 == OP3_LDFSR)
#define LDDC (OP3 == OP3_LDDCPR)
#define LDC (OP3 == OP3_LDCPR)
#define LDCSR (OP3 == OP3_LDCSR)
#define LDDA (OP3 == OP3_LDDA)
#define LDA (OP3 == OP3_LDA)
#define LDSHA (OP3 == OP3_LDSHA)
#define LDUHA (OP3 == OP3_LDUHA)
#define LDSBA (OP3 == OP3_LDSBA)
#define LDUBA (OP3 == OP3_LDUBA)
#define STD (OP3 == OP3_STD)
#define ST (OP3 == OP3_ST)
#define STH (OP3 == OP3_STH)
#define STB (OP3 == OP3_STB)
#define STDA (OP3 == OP3_STDA)
#define STA (OP3 == OP3_STA)
#define STHA (OP3 == OP3_STHA)
#define STBA (OP3 == OP3_STBA)
#define STF (OP3 == OP3_STFPR)
#define STFSR (OP3 == OP3_STFSR)
#define STDFQ (OP3 == OP3_STDFQ)
#define STDF (OP3 == OP3_STDFPR)
#define STC (OP3 == OP3_STCPR)
#define STCSR (OP3 == OP3_STCSR)
#define STDCQ (OP3 == OP3_STDCQ)
#define STDC (OP3 == OP3_STDCPR)
#define JMPL (OP3 == OP3_JMPL)
#define TICC (OP3 == OP3_TICC)
#define RETT (OP3 == OP3_RETT)
#define SWAP (OP3 == OP3_SWAP)
#define SWAPA (OP3 == OP3_SWAPA)
#define FPOP1 (OP3 == OP3_FPOP1)
#define FPOP2 (OP3 == OP3_FPOP2)
#define CPOP1 (OP3 == OP3_CPOP1)
#define CPOP2 (OP3 == OP3_CPOP2)
#define LDSTUB (OP3 == OP3_LDSTUB)
#define LDSTUBA (OP3 == OP3_LDSTUBA)
#define ADD (OP3 == OP3_ADD)
#define ADDX (OP3 == OP3_ADDX)
#define ADDCC (OP3 == OP3_ADDCC)
#define ADDXCC (OP3 == OP3_ADDXCC)
#define SUB (OP3 == OP3_SUB)
#define SUBX (OP3 == OP3_SUBX)
#define SUBCC (OP3 == OP3_SUBCC)
#define SUBXCC (OP3 == OP3_SUBXCC)
#define TADDCCTV (OP3 == OP3_TADDCCTV)
#define TSUBCCTV (OP3 == OP3_TSUBCCTV)
#define AND (OP3 == OP3_AND)
#define OR (OP3 == OP3_OR)
#define XOR (OP3 == OP3_XOR)
#define ANDN (OP3 == OP3_ANDN)
#define ORN (OP3 == OP3_ORN)
#define XNOR (OP3 == OP3_XNOR)
#define ANDCC (OP3 == OP3_ANDCC)
#define ORCC (OP3 == OP3_ORCC)
#define XORCC (OP3 == OP3_XORCC)
#define ANDNCC (OP3 == OP3_ANDNCC)
#define ORNCC (OP3 == OP3_ORNCC)
#define XNORCC (OP3 == OP3_XNORCC)
#define SLL (OP3 == OP3_SLL)
#define SRL (OP3 == OP3_SRL)
#define SRA (OP3 == OP3_SRA)
#define RDASR (OP3 == OP3_RDASR)
#define RDPSR (OP3 == OP3_RDPSR)
#define RDWIM (OP3 == OP3_RDWIM)
#define RDTBR (OP3 == OP3_RDTBR)
#define WRASR (OP3 == OP3_WRASR)
#define WRPSR (OP3 == OP3_WRPSR)
#define WRWIM (OP3 == OP3_WRWIM)
#define WRTBR (OP3 == OP3_WRTBR)
#define SAVE (OP3 == OP3_SAVE)
#define RESTORE (OP3 == OP3_RESTORE)
#define UMUL (OP3 == OP3_UMUL)
#define UMULCC (OP3 == OP3_UMULCC)
#define SMUL (OP3 == OP3_SMUL)
#define SMULCC (OP3 == OP3_SMULCC)
#define UDIV (OP3 == OP3_UDIV)
#define UDIVCC (OP3 == OP3_UDIVCC)
#define SDIV (OP3 == OP3_SDIV)
#define SDIVCC (OP3 == OP3_SDIVCC)
#endif // __MB86901_DEFS_H__
|