1260 lines
42 KiB
C
1260 lines
42 KiB
C
|
/*++
|
|||
|
|
|||
|
Copyright (c) 1992-1999 Digital Equipment Corporation
|
|||
|
|
|||
|
Module Name:
|
|||
|
|
|||
|
alphaops.h
|
|||
|
|
|||
|
Abstract:
|
|||
|
|
|||
|
Alpha AXP instruction and floating constant definitions.
|
|||
|
|
|||
|
Author:
|
|||
|
|
|||
|
Revision History:
|
|||
|
|
|||
|
--*/
|
|||
|
|
|||
|
#ifndef _ALPHAOPS_
|
|||
|
#define _ALPHAOPS_
|
|||
|
|
|||
|
#if _MSC_VER > 1000
|
|||
|
#pragma once
|
|||
|
#endif
|
|||
|
|
|||
|
//
|
|||
|
// Instruction types.
|
|||
|
// The Alpha architecture does not number the instruction types,
|
|||
|
// this numbering is for software decoding only.
|
|||
|
//
|
|||
|
|
|||
|
#define ALPHA_UNKNOWN 0 // Reserved or illegal
|
|||
|
#define ALPHA_MEMORY 1 // Memory (load/store)
|
|||
|
#define ALPHA_FP_MEMORY 2 // Floating point Memory
|
|||
|
#define ALPHA_MEMSPC 3 // Memory special
|
|||
|
#define ALPHA_JUMP 4 // Jump (memory formation)
|
|||
|
#define ALPHA_BRANCH 5 // Branch
|
|||
|
#define ALPHA_FP_BRANCH 6 // Floating Point Branch
|
|||
|
#define ALPHA_OPERATE 7 // Register-register operate
|
|||
|
#define ALPHA_LITERAL 8 // Literal-register operate
|
|||
|
#define ALPHA_FP_OPERATE 9 // Floating point operate
|
|||
|
#define ALPHA_FP_CONVERT 10 // Floating point convert
|
|||
|
#define ALPHA_CALLPAL 11 // Call to PAL
|
|||
|
#define ALPHA_EV4_PR 12 // EV4 MTPR/MFPR PAL mode instructions
|
|||
|
#define ALPHA_EV4_MEM 13 // EV4 special memory PAL mode access
|
|||
|
#define ALPHA_EV4_REI 14 // EV4 PAL mode switch
|
|||
|
|
|||
|
//
|
|||
|
// Instruction Opcodes.
|
|||
|
//
|
|||
|
|
|||
|
#define CALLPAL_OP 0x00 // ALPHA_CALLPAL
|
|||
|
#define _01_OP 0x01 // - reserved opcode
|
|||
|
#define _02_OP 0x02 // - reserved opcode
|
|||
|
#define _03_OP 0x03 // - reserved opcode
|
|||
|
#define _04_OP 0x04 // - reserved opcode
|
|||
|
#define _05_OP 0x05 // - reserved opcode
|
|||
|
#define _06_OP 0x06 // - reserved opcode
|
|||
|
#define _07_OP 0x07 // - reserved opcode
|
|||
|
#define _0A_OP 0x0A // - reserved opcode
|
|||
|
#define _0C_OP 0x0C // - reserved opcode
|
|||
|
#define _0D_OP 0x0D // - reserved opcode
|
|||
|
#define _0E_OP 0x0E // - reserved opcode
|
|||
|
#define _1C_OP 0x1C // - reserved opcode
|
|||
|
#define LDA_OP 0x08 // ALPHA_MEMORY
|
|||
|
#define LDAH_OP 0x09 // ALPHA_MEMORY
|
|||
|
#define LDBU_OP 0x0A // ALPHA_MEMORY
|
|||
|
#define LDQ_U_OP 0x0B // ALPHA_MEMORY
|
|||
|
#define LDWU_OP 0x0C // ALPHA_MEMORY
|
|||
|
#define STW_OP 0x0D // ALPHA_MEMORY
|
|||
|
#define STB_OP 0x0E // ALPHA_MEMORY
|
|||
|
#define STQ_U_OP 0x0F // ALPHA_MEMORY
|
|||
|
#define ARITH_OP 0x10 // ALPHA_OPERATE or ALPHA_LITERAL
|
|||
|
#define BIT_OP 0x11 // ALPHA_OPERATE or ALPHA_LITERAL
|
|||
|
#define BYTE_OP 0x12 // ALPHA_OPERATE or ALPHA_LITERAL
|
|||
|
#define MUL_OP 0x13 // ALPHA_OPERATE or ALPHA_LITERAL
|
|||
|
#define _14_OP 0x14 // - reserved opcode
|
|||
|
#define VAXFP_OP 0x15 // ALPHA_FP_OPERATE
|
|||
|
#define IEEEFP_OP 0x16 // ALPHA_FP_OPERATE
|
|||
|
#define FPOP_OP 0x17 // ALPHA_FP_OPERATE
|
|||
|
#define MEMSPC_OP 0x18 // ALPHA_MEMORY
|
|||
|
#define PAL19_OP 0x19 // - reserved for PAL mode
|
|||
|
//#define MFPR_OP 0x19 // ALPHA_MFPR
|
|||
|
#define JMP_OP 0x1A // ALPHA_JUMP
|
|||
|
#define PAL1B_OP 0x1B // - reserved for PAL mode
|
|||
|
#define SEXT_OP 0x1C // ALPHA_OPERATE
|
|||
|
#define PAL1D_OP 0x1D // - reserved for PAL mode
|
|||
|
//#define MTPR_OP 0x1D // ALPHA_MTPR
|
|||
|
#define PAL1E_OP 0x1E // - reserved for PAL mode
|
|||
|
#define PAL1F_OP 0x1F // - reserved for PAL mode
|
|||
|
#define LDF_OP 0x20 // ALPHA_MEMORY
|
|||
|
#define LDG_OP 0x21 // ALPHA_MEMORY
|
|||
|
#define LDS_OP 0x22 // ALPHA_MEMORY
|
|||
|
#define LDT_OP 0x23 // ALPHA_MEMORY
|
|||
|
#define STF_OP 0x24 // ALPHA_MEMORY
|
|||
|
#define STG_OP 0x25 // ALPHA_MEMORY
|
|||
|
#define STS_OP 0x26 // ALPHA_MEMORY
|
|||
|
#define STT_OP 0x27 // ALPHA_MEMORY
|
|||
|
#define LDL_OP 0x28 // ALPHA_MEMORY
|
|||
|
#define LDQ_OP 0x29 // ALPHA_MEMORY
|
|||
|
#define LDL_L_OP 0x2A // ALPHA_MEMORY
|
|||
|
#define LDQ_L_OP 0x2B // ALPHA_MEMORY
|
|||
|
#define STL_OP 0x2C // ALPHA_MEMORY
|
|||
|
#define STQ_OP 0x2D // ALPHA_MEMORY
|
|||
|
#define STL_C_OP 0x2E // ALPHA_MEMORY
|
|||
|
#define STQ_C_OP 0x2F // ALPHA_MEMORY
|
|||
|
#define BR_OP 0x30 // ALPHA_BRANCH
|
|||
|
#define FBEQ_OP 0x31 // ALPHA_BRANCH
|
|||
|
#define FBLT_OP 0x32 // ALPHA_BRANCH
|
|||
|
#define FBLE_OP 0x33 // ALPHA_BRANCH
|
|||
|
#define BSR_OP 0x34 // ALPHA_BRANCH
|
|||
|
#define FBNE_OP 0x35 // ALPHA_BRANCH
|
|||
|
#define FBGE_OP 0x36 // ALPHA_BRANCH
|
|||
|
#define FBGT_OP 0x37 // ALPHA_BRANCH
|
|||
|
#define BLBC_OP 0x38 // ALPHA_BRANCH
|
|||
|
#define BEQ_OP 0x39 // ALPHA_BRANCH
|
|||
|
#define BLT_OP 0x3A // ALPHA_BRANCH
|
|||
|
#define BLE_OP 0x3B // ALPHA_BRANCH
|
|||
|
#define BLBS_OP 0x3C // ALPHA_BRANCH
|
|||
|
#define BNE_OP 0x3D // ALPHA_BRANCH
|
|||
|
#define BGE_OP 0x3E // ALPHA_BRANCH
|
|||
|
#define BGT_OP 0x3F // ALPHA_BRANCH
|
|||
|
|
|||
|
#define LDA_OP_STR "lda"
|
|||
|
#define LDAH_OP_STR "ldah"
|
|||
|
#define LDBU_OP_STR "ldbu"
|
|||
|
#define LDQ_U_OP_STR "ldq_u"
|
|||
|
#define STQ_U_OP_STR "stq_u"
|
|||
|
#define LDF_OP_STR "ldf"
|
|||
|
#define LDG_OP_STR "ldg"
|
|||
|
#define LDS_OP_STR "lds"
|
|||
|
#define LDT_OP_STR "ldt"
|
|||
|
#define LDWU_OP_STR "ldwu"
|
|||
|
#define STF_OP_STR "stf"
|
|||
|
#define STG_OP_STR "stg"
|
|||
|
#define STS_OP_STR "sts"
|
|||
|
#define STT_OP_STR "stt"
|
|||
|
#define LDL_OP_STR "ldl"
|
|||
|
#define LDQ_OP_STR "ldq"
|
|||
|
#define LDL_L_OP_STR "ldl_l"
|
|||
|
#define LDQ_L_OP_STR "ldq_l"
|
|||
|
#define SEXT_OP_STR "sext"
|
|||
|
#define STB_OP_STR "stb"
|
|||
|
#define STL_OP_STR "stl"
|
|||
|
#define STQ_OP_STR "stq"
|
|||
|
#define STL_C_OP_STR "stl_c"
|
|||
|
#define STQ_C_OP_STR "stq_c"
|
|||
|
#define STW_OP_STR "stw"
|
|||
|
#define BR_OP_STR "br"
|
|||
|
#define FBEQ_OP_STR "fbeq"
|
|||
|
#define FBLT_OP_STR "fblt"
|
|||
|
#define FBLE_OP_STR "fble"
|
|||
|
#define BSR_OP_STR "bsr"
|
|||
|
#define FBNE_OP_STR "fbne"
|
|||
|
#define FBGE_OP_STR "fbge"
|
|||
|
#define FBGT_OP_STR "fbgt"
|
|||
|
#define BLBC_OP_STR "blbc"
|
|||
|
#define BEQ_OP_STR "beq"
|
|||
|
#define BLT_OP_STR "blt"
|
|||
|
#define BLE_OP_STR "ble"
|
|||
|
#define BLBS_OP_STR "blbs"
|
|||
|
#define BNE_OP_STR "bne"
|
|||
|
#define BGE_OP_STR "bge"
|
|||
|
#define BGT_OP_STR "bgt"
|
|||
|
|
|||
|
//
|
|||
|
// Type (1) Memory Instruction Format.
|
|||
|
// Type (2) Memory Special Instruction Format.
|
|||
|
//
|
|||
|
// 3 2 2 2 2 1 1
|
|||
|
// 1 6 5 1 0 6 5 0
|
|||
|
// +-----------+---------+---------+-------------------------------+
|
|||
|
// | opcode | Ra | Rb | Memory_disp |
|
|||
|
// +-----------+---------+---------+-------------------------------+
|
|||
|
//
|
|||
|
// LDAx Ra.wq,disp.ab(Rb.ab) x = (,H)
|
|||
|
// LDx Ra.wq,disp.ab(Rb.ab) x = (L,Q,F,G,S,T)
|
|||
|
// LDQ_U Ra.wq,disp.ab(Rb.ab)
|
|||
|
// LDx_L Ra.wq,disp.ab(Rb.ab) x = (L,Q)
|
|||
|
// STx_C Ra.mq,disp.ab(Rb.ab) x = (L,Q)
|
|||
|
// STx Ra.rq,disp.ab(Rb.ab) x = (L,Q,F,G,S,T)
|
|||
|
// STQ_U Ra.rq,disp.ab(Rb.ab)
|
|||
|
//
|
|||
|
|
|||
|
typedef struct _Alpha_Memory_Format {
|
|||
|
LONG MemDisp : 16;
|
|||
|
ULONG Rb : 5;
|
|||
|
ULONG Ra : 5;
|
|||
|
ULONG Opcode : 6;
|
|||
|
} Alpha_Memory_Format;
|
|||
|
|
|||
|
//
|
|||
|
// Special Memory instruction function codes (in Memdisp).
|
|||
|
//
|
|||
|
|
|||
|
#define TRAPB_FUNC 0x0000
|
|||
|
#define EXCB_FUNC 0x0400
|
|||
|
#define MB_FUNC 0x4000
|
|||
|
#define WMB_FUNC 0x4400
|
|||
|
#define MB2_FUNC 0x4800
|
|||
|
#define MB3_FUNC 0x4C00
|
|||
|
#define FETCH_FUNC 0x8000
|
|||
|
#define FETCH_M_FUNC 0xA000
|
|||
|
#define RPCC_FUNC 0xC000
|
|||
|
#define RC_FUNC 0xE000
|
|||
|
#define RS_FUNC 0xF000
|
|||
|
|
|||
|
#define TRAPB_FUNC_STR "trapb"
|
|||
|
#define EXCB_FUNC_STR "excb"
|
|||
|
#define MB_FUNC_STR "mb"
|
|||
|
#define MB1_FUNC_STR "wmb"
|
|||
|
#define MB2_FUNC_STR "mb2"
|
|||
|
#define MB3_FUNC_STR "mb3"
|
|||
|
#define FETCH_FUNC_STR "fetch"
|
|||
|
#define FETCH_M_FUNC_STR "fetch_m"
|
|||
|
#define RPCC_FUNC_STR "rpcc"
|
|||
|
#define RC_FUNC_STR "rc"
|
|||
|
#define RS_FUNC_STR "rs"
|
|||
|
|
|||
|
//
|
|||
|
// Type (3) Memory Format Jump Instructions.
|
|||
|
//
|
|||
|
// 3 2 2 2 2 1 1 1 1
|
|||
|
// 1 6 5 1 0 6 5 4 3 0
|
|||
|
// +-----------+---------+---------+---+---------------------------+
|
|||
|
// | opcode | Ra | Rb |Fnc| Hint |
|
|||
|
// +-----------+---------+---------+---+---------------------------+
|
|||
|
//
|
|||
|
// xxx Ra.wq,(Rb.ab),hint xxx = (JMP, JSR, RET, JSR_COROUTINE)
|
|||
|
//
|
|||
|
|
|||
|
typedef struct _Alpha_Jump_Format {
|
|||
|
LONG Hint : 14;
|
|||
|
ULONG Function : 2;
|
|||
|
ULONG Rb : 5;
|
|||
|
ULONG Ra : 5;
|
|||
|
ULONG Opcode : 6;
|
|||
|
} Alpha_Jump_Format;
|
|||
|
|
|||
|
//
|
|||
|
// Jump function codes (in Function, opcode 1A, JMP_OP).
|
|||
|
//
|
|||
|
|
|||
|
#define JMP_FUNC 0x0 // Jump
|
|||
|
#define JSR_FUNC 0x1 // Jump to Subroutine
|
|||
|
#define RET_FUNC 0x2 // Return from Subroutine
|
|||
|
#define JSR_CO_FUNC 0x3 // Jump to Subroutine Return
|
|||
|
|
|||
|
#define JMP_FUNC_STR "jmp"
|
|||
|
#define JSR_FUNC_STR "jsr"
|
|||
|
#define RET_FUNC_STR "ret"
|
|||
|
#define JSR_CO_FUNC_STR "jsr_coroutine"
|
|||
|
|
|||
|
//
|
|||
|
// The exception handling compatible return instruction has a hint value
|
|||
|
// of 0001. Define a macro that identifies these return instructions.
|
|||
|
// The Rb register field is masked out since it is normally, but not
|
|||
|
// required to be, RA_REG.
|
|||
|
//
|
|||
|
|
|||
|
#define IS_RETURN_0001_INSTRUCTION(Instruction) \
|
|||
|
(((Instruction) & 0xFFE0FFFF) == 0x6BE08001)
|
|||
|
|
|||
|
//
|
|||
|
// Type (4) Branch Instruction Format.
|
|||
|
//
|
|||
|
// 3 2 2 2 2
|
|||
|
// 1 6 5 1 0 0
|
|||
|
// +-----------+---------+-----------------------------------------+
|
|||
|
// | opcode | Ra | Branch_disp |
|
|||
|
// +-----------+---------+-----------------------------------------+
|
|||
|
//
|
|||
|
// Bxx Ra.rq,disp.al x = (EQ,NE,LT,LE,GT,GE,LBC,LBS)
|
|||
|
// BxR Ra.wq,disp.al x = (,S)
|
|||
|
// FBxx Ra.rq,disp.al x = (EQ,NE,LT,LE,GT,GE)
|
|||
|
//
|
|||
|
|
|||
|
typedef struct _Alpha_Branch_Format {
|
|||
|
LONG BranchDisp : 21;
|
|||
|
ULONG Ra : 5;
|
|||
|
ULONG Opcode : 6;
|
|||
|
} Alpha_Branch_Format;
|
|||
|
|
|||
|
//
|
|||
|
// Type (5) Operate Register Instruction Format.
|
|||
|
// Type (6) Operate Literal Instruction Format.
|
|||
|
// bop = Rb.rq or #b.ib
|
|||
|
//
|
|||
|
// 3 2 2 2 2 1 1 1 1 1
|
|||
|
// 1 6 5 1 0 6 5 3 2 1 5 4 0
|
|||
|
// +-----------+---------+---------+-----+-+-------------+---------+
|
|||
|
// | opcode | Ra | Rb | SBZ |0| function | Rc |
|
|||
|
// +-----------+---------+---------+-----+-+-------------+---------+
|
|||
|
// 3 2 2 2 2 1 1 1
|
|||
|
// 1 6 5 1 0 3 2 1 5 4 0
|
|||
|
// +-----------+---------+---------------+-+-------------+---------+
|
|||
|
// | opcode | Ra | LIT |1| function | Rc |
|
|||
|
// +-----------+---------+---------------+-+-------------+---------+
|
|||
|
//
|
|||
|
//
|
|||
|
// ADDx Ra.rq,bop,Rc.wq /V x = (Q,L)
|
|||
|
// SxADDy Ra.rq,bop,Rc.wq x = (4,8), y = (Q, L)
|
|||
|
// CMPx Ra.rq,bop,Rc.wq x = (EQ,LT,LE,ULT,ULE)
|
|||
|
// MULx Ra.rq,bop,Rc.wq /V x = (Q,L)
|
|||
|
// UMULH Ra.rq,bop,Rc.wq
|
|||
|
// SUBx Ra.rq,bop,Rc.wq /V x = (Q,L)
|
|||
|
// SxSUBy Ra.rq,bop,Rc.wq x = (4,8), y = (Q, L)
|
|||
|
// xxx Ra.rq,bop,Rc.wq xxx = (AND,BIS,XOR,BIC,ORNOT,EQV)
|
|||
|
// CMOVxx Ra.rq,bop,Rc.wq xx = (EQ,NE,LT,LE,GT,GE,LBC,LBS)
|
|||
|
// SxL Ra.rq,bop,Rc.wq x = (L,R)
|
|||
|
// SRA Ra.rq,bop,Rc.wq
|
|||
|
// CMPBGE Ra.rq,bop,Rc.wq
|
|||
|
// EXTxx Ra.rq,bop,Rc.wq xx = (BL,WL,WH,LL,LH,WL,QH)
|
|||
|
// INSxx Ra.rq,bop,Rc.wq xx = (BL,WL,WH,LL,LH,WL,QH)
|
|||
|
// MSKxx Ra.rq,bop,Rc.wq xx = (BL,WL,WH,LL,LH,WL,QH)
|
|||
|
// ZAPx Ra.rq,bop,Rc.wq x = (,NOT)
|
|||
|
//
|
|||
|
|
|||
|
typedef struct _Alpha_OpReg_Format {
|
|||
|
ULONG Rc : 5;
|
|||
|
ULONG Function : 7;
|
|||
|
ULONG RbvType : 1; // 0 for register format
|
|||
|
ULONG SBZ : 3;
|
|||
|
ULONG Rb : 5;
|
|||
|
ULONG Ra : 5;
|
|||
|
ULONG Opcode : 6;
|
|||
|
} Alpha_OpReg_Format;
|
|||
|
|
|||
|
typedef struct _Alpha_OpLit_Format {
|
|||
|
ULONG Rc : 5;
|
|||
|
ULONG Function : 7;
|
|||
|
ULONG RbvType : 1; // 1 for literal format
|
|||
|
ULONG Literal : 8;
|
|||
|
ULONG Ra : 5;
|
|||
|
ULONG Opcode : 6;
|
|||
|
} Alpha_OpLit_Format;
|
|||
|
|
|||
|
#define RBV_REGISTER_FORMAT 0
|
|||
|
#define RBV_LITERAL_FORMAT 1
|
|||
|
|
|||
|
//
|
|||
|
// Arithmetic operate function codes (in Function, Opcode 10, ARITH_OP).
|
|||
|
//
|
|||
|
|
|||
|
#define ADDL_FUNC 0x00 // Add Longword
|
|||
|
#define ADDLV_FUNC 0x40 // Add Longword, Integer Overflow Enable
|
|||
|
#define S4ADDL_FUNC 0x02 // Scaled Add Longword by 4
|
|||
|
#define S8ADDL_FUNC 0x12 // Scaled Add Longword by 8
|
|||
|
|
|||
|
#define ADDQ_FUNC 0x20 // Add Quadword
|
|||
|
#define ADDQV_FUNC 0x60 // Add Quadword, Integer Overflow Enable
|
|||
|
#define S4ADDQ_FUNC 0x22 // Scaled Add Quadword by 4
|
|||
|
#define S8ADDQ_FUNC 0x32 // Scaled Add Quadword by 8
|
|||
|
|
|||
|
#define SUBL_FUNC 0x09 // Subtract Longword
|
|||
|
#define SUBLV_FUNC 0x49 // Subtract Longword, Integer Overflow Enable
|
|||
|
#define S4SUBL_FUNC 0x0B // Scaled Subtract Longword by 4
|
|||
|
#define S8SUBL_FUNC 0x1B // Scaled Subtract Longword by 8
|
|||
|
|
|||
|
#define SUBQ_FUNC 0x29 // Subtract Quadword
|
|||
|
#define SUBQV_FUNC 0x69 // Subtract Quadword, Integer Overflow Enable
|
|||
|
#define S4SUBQ_FUNC 0x2B // Scaled Subtract Quadword by 4
|
|||
|
#define S8SUBQ_FUNC 0x3B // Scaled Subtract Quadword by 8
|
|||
|
|
|||
|
#define CMPEQ_FUNC 0x2D // Compare Signed Quadword Equal
|
|||
|
#define CMPLT_FUNC 0x4D // Compare Signed Quadword Less Than
|
|||
|
#define CMPLE_FUNC 0x6D // Compare Signed Quadword Less Than or Equal
|
|||
|
#define CMPULT_FUNC 0x1D // Compare Unsigned Quadword Less Than
|
|||
|
#define CMPULE_FUNC 0x3D // Compare Unsigned Quadword Less Than or Equal
|
|||
|
#define CMPBGE_FUNC 0x0F // Compare 8 Unsigned Bytes Greater Than or Equal
|
|||
|
|
|||
|
#define ADDL_FUNC_STR "addl"
|
|||
|
#define ADDLV_FUNC_STR "addl/v"
|
|||
|
#define S4ADDL_FUNC_STR "s4addl"
|
|||
|
#define S8ADDL_FUNC_STR "s8addl"
|
|||
|
|
|||
|
#define ADDQ_FUNC_STR "addq"
|
|||
|
#define ADDQV_FUNC_STR "addq/v"
|
|||
|
#define S4ADDQ_FUNC_STR "s4addq"
|
|||
|
#define S8ADDQ_FUNC_STR "s8addq"
|
|||
|
|
|||
|
#define SUBL_FUNC_STR "subl"
|
|||
|
#define SUBLV_FUNC_STR "subl/v"
|
|||
|
#define S4SUBL_FUNC_STR "s4subl"
|
|||
|
#define S8SUBL_FUNC_STR "s8subl"
|
|||
|
|
|||
|
#define SUBQ_FUNC_STR "subq"
|
|||
|
#define SUBQV_FUNC_STR "subq/v"
|
|||
|
#define S4SUBQ_FUNC_STR "s4subq"
|
|||
|
#define S8SUBQ_FUNC_STR "s8subq"
|
|||
|
|
|||
|
#define CMPEQ_FUNC_STR "cmpeq"
|
|||
|
#define CMPLT_FUNC_STR "cmplt"
|
|||
|
#define CMPLE_FUNC_STR "cmple"
|
|||
|
#define CMPULT_FUNC_STR "cmpult"
|
|||
|
#define CMPULE_FUNC_STR "cmpule"
|
|||
|
#define CMPBGE_FUNC_STR "cmpbge"
|
|||
|
|
|||
|
//
|
|||
|
// Bit and conditional operate function codes (in Function, Opcode 11, BIT_OP).
|
|||
|
//
|
|||
|
|
|||
|
#define AND_FUNC 0x00 // Logical Product
|
|||
|
#define BIC_FUNC 0x08 // Logical Product with Complement
|
|||
|
#define BIS_FUNC 0x20 // Logical Sum (OR)
|
|||
|
#define EQV_FUNC 0x48 // Logical Equivalence (XORNOT)
|
|||
|
#define ORNOT_FUNC 0x28 // Logical Sum with Complement
|
|||
|
#define XOR_FUNC 0x40 // Logical Difference
|
|||
|
|
|||
|
#define CMOVEQ_FUNC 0x24 // CMOVE if Register Equal to Zero
|
|||
|
#define CMOVGE_FUNC 0x46 // CMOVE if Register Greater Than or Equal to Zero
|
|||
|
#define CMOVGT_FUNC 0x66 // CMOVE if Register Greater Than Zero
|
|||
|
#define CMOVLBC_FUNC 0x16 // CMOVE if Register Low Bit Clear
|
|||
|
#define CMOVLBS_FUNC 0x14 // CMOVE if Register Low Bit Set
|
|||
|
#define CMOVLE_FUNC 0x64 // CMOVE if Register Less Than or Equal to Zero
|
|||
|
#define CMOVLT_FUNC 0x44 // CMOVE if Register Less Than Zero
|
|||
|
#define CMOVNE_FUNC 0x26 // CMOVE if Register Not Equal to Zero
|
|||
|
|
|||
|
#define AND_FUNC_STR "and"
|
|||
|
#define BIC_FUNC_STR "bic"
|
|||
|
#define BIS_FUNC_STR "bis"
|
|||
|
#define EQV_FUNC_STR "eqv"
|
|||
|
#define ORNOT_FUNC_STR "ornot"
|
|||
|
#define XOR_FUNC_STR "xor"
|
|||
|
|
|||
|
#define CMOVEQ_FUNC_STR "cmoveq"
|
|||
|
#define CMOVGE_FUNC_STR "cmovge"
|
|||
|
#define CMOVGT_FUNC_STR "cmovgt"
|
|||
|
#define CMOVLBC_FUNC_STR "cmovlbc"
|
|||
|
#define CMOVLBS_FUNC_STR "cmovlbs"
|
|||
|
#define CMOVLE_FUNC_STR "cmovle"
|
|||
|
#define CMOVLT_FUNC_STR "cmovlt"
|
|||
|
#define CMOVNE_FUNC_STR "cmovne"
|
|||
|
|
|||
|
//
|
|||
|
// Shift and byte operate function codes (in Function, Opcode 12, BYTE_OP).
|
|||
|
//
|
|||
|
|
|||
|
#define SLL_FUNC 0x39 // Shift Left Logical
|
|||
|
#define SRL_FUNC 0x34 // Shift Right Logical
|
|||
|
#define SRA_FUNC 0x3C // Shift Right Arithmetic
|
|||
|
|
|||
|
#define EXTBL_FUNC 0x06 // Extract Byte Low
|
|||
|
#define EXTWL_FUNC 0x16 // Extract Word Low
|
|||
|
#define EXTLL_FUNC 0x26 // Extract Longword Low
|
|||
|
#define EXTQL_FUNC 0x36 // Extract Quadword Low
|
|||
|
#define EXTWH_FUNC 0x5A // Extract Word High
|
|||
|
#define EXTLH_FUNC 0x6A // Extract Longword High
|
|||
|
#define EXTQH_FUNC 0x7A // Extract Quadword High
|
|||
|
|
|||
|
#define INSBL_FUNC 0x0B // Insert Byte Low
|
|||
|
#define INSWL_FUNC 0x1B // Insert Word Low
|
|||
|
#define INSLL_FUNC 0x2B // Insert Longword Low
|
|||
|
#define INSQL_FUNC 0x3B // Quadword Low
|
|||
|
#define INSWH_FUNC 0x57 // Insert Word High
|
|||
|
#define INSLH_FUNC 0x67 // Insert Longword High
|
|||
|
#define INSQH_FUNC 0x77 // Insert Quadword High
|
|||
|
|
|||
|
#define MSKBL_FUNC 0x02 // Mask Byte Low
|
|||
|
#define MSKWL_FUNC 0x12 // Mask Word Low
|
|||
|
#define MSKLL_FUNC 0x22 // Mask Longword Low
|
|||
|
#define MSKQL_FUNC 0x32 // Mask Quadword Low
|
|||
|
#define MSKWH_FUNC 0x52 // Mask Word High
|
|||
|
#define MSKLH_FUNC 0x62 // Mask Longword High
|
|||
|
#define MSKQH_FUNC 0x72 // Mask Quadword High
|
|||
|
|
|||
|
#define ZAP_FUNC 0x30 // Zero Bytes
|
|||
|
#define ZAPNOT_FUNC 0x31 // Zero Bytes Not
|
|||
|
|
|||
|
#define SLL_FUNC_STR "sll"
|
|||
|
#define SRL_FUNC_STR "srl"
|
|||
|
#define SRA_FUNC_STR "sra"
|
|||
|
|
|||
|
#define EXTBL_FUNC_STR "extbl"
|
|||
|
#define EXTWL_FUNC_STR "extwl"
|
|||
|
#define EXTLL_FUNC_STR "extll"
|
|||
|
#define EXTQL_FUNC_STR "extql"
|
|||
|
#define EXTWH_FUNC_STR "extwh"
|
|||
|
#define EXTLH_FUNC_STR "extlh"
|
|||
|
#define EXTQH_FUNC_STR "extqh"
|
|||
|
|
|||
|
#define INSBL_FUNC_STR "insbl"
|
|||
|
#define INSWL_FUNC_STR "inswl"
|
|||
|
#define INSLL_FUNC_STR "insll"
|
|||
|
#define INSQL_FUNC_STR "insql"
|
|||
|
#define INSWH_FUNC_STR "inswh"
|
|||
|
#define INSLH_FUNC_STR "inslh"
|
|||
|
#define INSQH_FUNC_STR "insqh"
|
|||
|
|
|||
|
#define MSKBL_FUNC_STR "mskbl"
|
|||
|
#define MSKWL_FUNC_STR "mskwl"
|
|||
|
#define MSKLL_FUNC_STR "mskll"
|
|||
|
#define MSKQL_FUNC_STR "mskql"
|
|||
|
#define MSKWH_FUNC_STR "mskwh"
|
|||
|
#define MSKLH_FUNC_STR "msklh"
|
|||
|
#define MSKQH_FUNC_STR "mskqh"
|
|||
|
|
|||
|
#define ZAP_FUNC_STR "zap"
|
|||
|
#define ZAPNOT_FUNC_STR "zapnot"
|
|||
|
|
|||
|
//
|
|||
|
// Integer multiply operate function codes (in Function, Opcode 13, MUL_OP).
|
|||
|
//
|
|||
|
|
|||
|
#define MULL_FUNC 0x00 // Multiply Longword
|
|||
|
#define MULLV_FUNC 0x40 // Multiply Longword, Integer Overflow Enable
|
|||
|
#define MULQ_FUNC 0x20 // Multiply Quadword
|
|||
|
#define MULQV_FUNC 0x60 // Multiply Quadword, Integer Overflow Enable
|
|||
|
#define UMULH_FUNC 0x30 // Unsinged Multiply Quadword High
|
|||
|
|
|||
|
#define MULL_FUNC_STR "mull"
|
|||
|
#define MULLV_FUNC_STR "mull/v"
|
|||
|
#define MULQ_FUNC_STR "mulq"
|
|||
|
#define MULQV_FUNC_STR "mulq/v"
|
|||
|
#define UMULH_FUNC_STR "umulh"
|
|||
|
|
|||
|
//
|
|||
|
// Sign extend operate function codes (in Function, Opcode 1c, SEXT_OP).
|
|||
|
//
|
|||
|
|
|||
|
#define SEXTB_FUNC 0x00 // sign extend byte
|
|||
|
#define SEXTW_FUNC 0x01 // sign extend word
|
|||
|
#define CTPOP_FUNC 0x30 // count population
|
|||
|
#define CTLZ_FUNC 0x32 // count leading zeros
|
|||
|
#define CTTZ_FUNC 0x33 // count trailing zeros
|
|||
|
|
|||
|
#define SEXTB_FUNC_STR "sextb"
|
|||
|
#define SEXTW_FUNC_STR "sextw"
|
|||
|
#define CTPOP_FUNC_STR "ctpop"
|
|||
|
#define CTLZ_FUNC_STR "ctlz"
|
|||
|
#define CTTZ_FUNC_STR "cttz"
|
|||
|
|
|||
|
//
|
|||
|
// Type (7) Floating-point Operate Instruction Format.
|
|||
|
// Type (8) Floating-point Convert Instruction Format.
|
|||
|
//
|
|||
|
// Type 6 and 7 are the same, except for type 7
|
|||
|
// Fc == F31 (1s) and Fb is the source.
|
|||
|
//
|
|||
|
// 3 2 2 2 2 1 1
|
|||
|
// 1 6 5 1 0 6 5 5 4 0
|
|||
|
// +-----------+---------+---------+---------------------+---------+
|
|||
|
// | opcode | Fa | Fb | function | Fc |
|
|||
|
// +-----------+---------+---------+---------------------+---------+
|
|||
|
//
|
|||
|
|
|||
|
typedef struct _Alpha_FpOp_Format {
|
|||
|
ULONG Fc : 5;
|
|||
|
ULONG Function : 11;
|
|||
|
ULONG Fb : 5;
|
|||
|
ULONG Fa : 5;
|
|||
|
ULONG Opcode : 6;
|
|||
|
} Alpha_FpOp_Format;
|
|||
|
|
|||
|
//
|
|||
|
// Format independent function codes (in Function, Opcode 17)
|
|||
|
//
|
|||
|
|
|||
|
#define CVTLQ_FUNC 0x010
|
|||
|
#define CPYS_FUNC 0x020
|
|||
|
#define CPYSN_FUNC 0x021
|
|||
|
#define CPYSE_FUNC 0x022
|
|||
|
#define MT_FPCR_FUNC 0x024
|
|||
|
#define MF_FPCR_FUNC 0x025
|
|||
|
#define FCMOVEQ_FUNC 0x02A
|
|||
|
#define FCMOVNE_FUNC 0x02B
|
|||
|
#define FCMOVLT_FUNC 0x02C
|
|||
|
#define FCMOVGE_FUNC 0x02D
|
|||
|
#define FCMOVLE_FUNC 0x02E
|
|||
|
#define FCMOVGT_FUNC 0x02F
|
|||
|
#define CVTQL_FUNC 0x030
|
|||
|
#define CVTQLV_FUNC 0x130
|
|||
|
#define CVTQLSV_FUNC 0x530
|
|||
|
|
|||
|
#define CVTLQ_FUNC_STR "cvtlq"
|
|||
|
#define CPYS_FUNC_STR "cpys"
|
|||
|
#define CPYSN_FUNC_STR "cpysn"
|
|||
|
#define CPYSE_FUNC_STR "cpyse"
|
|||
|
#define MT_FPCR_FUNC_STR "mt_fpcr"
|
|||
|
#define MF_FPCR_FUNC_STR "mf_fpcr"
|
|||
|
#define FCMOVEQ_FUNC_STR "fcmoveq"
|
|||
|
#define FCMOVNE_FUNC_STR "fcmovne"
|
|||
|
#define FCMOVLT_FUNC_STR "fcmovlt"
|
|||
|
#define FCMOVGE_FUNC_STR "fcmovge"
|
|||
|
#define FCMOVLE_FUNC_STR "fcmovle"
|
|||
|
#define FCMOVGT_FUNC_STR "fcmovgt"
|
|||
|
#define CVTQL_FUNC_STR "cvtql"
|
|||
|
#define CVTQLV_FUNC_STR "cvtql/v"
|
|||
|
#define CVTQLSV_FUNC_STR "cvtql/sv"
|
|||
|
|
|||
|
//
|
|||
|
// IEEE function codes without flags (in Function, Opcode 16).
|
|||
|
//
|
|||
|
|
|||
|
#define MSK_FP_OP 0x03F
|
|||
|
|
|||
|
#define ADDS_FUNC 0x000
|
|||
|
#define SUBS_FUNC 0x001
|
|||
|
#define MULS_FUNC 0x002
|
|||
|
#define DIVS_FUNC 0x003
|
|||
|
#define ADDT_FUNC 0x020
|
|||
|
#define SUBT_FUNC 0x021
|
|||
|
#define MULT_FUNC 0x022
|
|||
|
#define DIVT_FUNC 0x023
|
|||
|
#define CMPTUN_FUNC 0x024
|
|||
|
#define CMPTEQ_FUNC 0x025
|
|||
|
#define CMPTLT_FUNC 0x026
|
|||
|
#define CMPTLE_FUNC 0x027
|
|||
|
#define CVTTS_FUNC 0x02C
|
|||
|
#define CVTTQ_FUNC 0x02F
|
|||
|
#define CVTQS_FUNC 0x03C
|
|||
|
#define CVTQT_FUNC 0x03E
|
|||
|
|
|||
|
#define ADDS_FUNC_STR "adds"
|
|||
|
#define SUBS_FUNC_STR "subs"
|
|||
|
#define MULS_FUNC_STR "muls"
|
|||
|
#define DIVS_FUNC_STR "divs"
|
|||
|
#define ADDT_FUNC_STR "addt"
|
|||
|
#define SUBT_FUNC_STR "subt"
|
|||
|
#define MULT_FUNC_STR "mult"
|
|||
|
#define DIVT_FUNC_STR "divt"
|
|||
|
#define CMPTUN_FUNC_STR "cmptun"
|
|||
|
#define CMPTEQ_FUNC_STR "cmpteq"
|
|||
|
#define CMPTLT_FUNC_STR "cmptlt"
|
|||
|
#define CMPTLE_FUNC_STR "cmptle"
|
|||
|
#define CVTTS_FUNC_STR "cvtts"
|
|||
|
#define CVTTQ_FUNC_STR "cvttq"
|
|||
|
#define CVTQS_FUNC_STR "cvtqs"
|
|||
|
#define CVTQT_FUNC_STR "cvtqt"
|
|||
|
|
|||
|
//
|
|||
|
// CVTST is a little different.
|
|||
|
//
|
|||
|
|
|||
|
#define CVTST_FUNC 0x2AC
|
|||
|
#define CVTST_S_FUNC 0x6AC
|
|||
|
|
|||
|
#define CVTST_FUNC_STR "cvtst"
|
|||
|
#define CVTST_S_FUNC_STR "cvtst/s"
|
|||
|
|
|||
|
//
|
|||
|
// VAX function codes without flags (in Function, Opcode 15).
|
|||
|
//
|
|||
|
|
|||
|
#define ADDF_FUNC 0x000
|
|||
|
#define CVTDG_FUNC 0x01E
|
|||
|
#define ADDG_FUNC 0x020
|
|||
|
#define CMPGEQ_FUNC 0x025
|
|||
|
#define CMPGLT_FUNC 0x026
|
|||
|
#define CMPGLE_FUNC 0x027
|
|||
|
#define CVTGF_FUNC 0x02C
|
|||
|
#define CVTGD_FUNC 0x02D
|
|||
|
#define CVTQF_FUNC 0x03C
|
|||
|
#define CVTQG_FUNC 0x03E
|
|||
|
#define DIVF_FUNC 0x003
|
|||
|
#define DIVG_FUNC 0x023
|
|||
|
#define MULF_FUNC 0x002
|
|||
|
#define MULG_FUNC 0x022
|
|||
|
#define SUBF_FUNC 0x001
|
|||
|
#define SUBG_FUNC 0x021
|
|||
|
#define CVTGQ_FUNC 0x0AF
|
|||
|
|
|||
|
#define ADDF_FUNC_STR "addf"
|
|||
|
#define CVTDG_FUNC_STR "cvtdg"
|
|||
|
#define ADDG_FUNC_STR "addg"
|
|||
|
#define CMPGEQ_FUNC_STR "cmpgeq"
|
|||
|
#define CMPGLT_FUNC_STR "cmpglt"
|
|||
|
#define CMPGLE_FUNC_STR "cmpgle"
|
|||
|
#define CVTGF_FUNC_STR "cvtgf"
|
|||
|
#define CVTGD_FUNC_STR "cvtgd"
|
|||
|
#define CVTQF_FUNC_STR "cvtqf"
|
|||
|
#define CVTQG_FUNC_STR "cvtqg"
|
|||
|
#define DIVF_FUNC_STR "divf"
|
|||
|
#define DIVG_FUNC_STR "divg"
|
|||
|
#define MULF_FUNC_STR "mulf"
|
|||
|
#define MULG_FUNC_STR "mulg"
|
|||
|
#define SUBF_FUNC_STR "subf"
|
|||
|
#define SUBG_FUNC_STR "subg"
|
|||
|
#define CVTGQ_FUNC_STR "cvtgq"
|
|||
|
|
|||
|
//
|
|||
|
// Define subfields within the 11 bit IEEE floating operate function field.
|
|||
|
//
|
|||
|
|
|||
|
#define FP_FUNCTION_MASK 0x03F // Function code including format
|
|||
|
|
|||
|
//
|
|||
|
// Define the 2 bit format field.
|
|||
|
//
|
|||
|
|
|||
|
#define FP_FORMAT_MASK 0x030
|
|||
|
#define FP_FORMAT_S 0x000 // Single (32 bit floating)
|
|||
|
#define FP_FORMAT_X 0x010 // Extended (128 bit floating)
|
|||
|
#define FP_FORMAT_T 0x020 // Double (64 bit floating)
|
|||
|
#define FP_FORMAT_Q 0x030 // Quad (64 bit integer)
|
|||
|
#define FP_FORMAT_SHIFT 4
|
|||
|
|
|||
|
//
|
|||
|
// Define the 2 bit rounding mode field.
|
|||
|
//
|
|||
|
|
|||
|
#define FP_ROUND_MASK 0x0C0
|
|||
|
#define FP_ROUND_C 0x000 // Chopped
|
|||
|
#define FP_ROUND_M 0x040 // Minus Infinity
|
|||
|
#define FP_ROUND_N 0x080 // Nearest
|
|||
|
#define FP_ROUND_D 0x0C0 // Dynamic
|
|||
|
#define FP_ROUND_SHIFT 6
|
|||
|
|
|||
|
//
|
|||
|
// Define the 3 bit trap enable field.
|
|||
|
//
|
|||
|
|
|||
|
#define FP_TRAP_ENABLE_MASK 0x700
|
|||
|
#define FP_TRAP_ENABLE_NONE 0x000
|
|||
|
#define FP_TRAP_ENABLE_U 0x100 // Underflow
|
|||
|
#define FP_TRAP_ENABLE_I 0x200 // Inexact
|
|||
|
|
|||
|
#define FP_TRAP_ENABLE_S 0x400 // Software Completion
|
|||
|
#define FP_TRAP_ENABLE_SU 0x500
|
|||
|
#define FP_TRAP_ENABLE_SUI 0x700
|
|||
|
|
|||
|
#define FP_TRAP_ENABLE_V 0x100 // Integer Overflow
|
|||
|
#define FP_TRAP_ENABLE_SV 0x500
|
|||
|
#define FP_TRAP_ENABLE_SVI 0x700
|
|||
|
|
|||
|
#define FP_TRAP_ENABLE_SHIFT 8
|
|||
|
|
|||
|
//
|
|||
|
// VAX and IEEE function flags (or'd with VAX and IEEE function code)
|
|||
|
//
|
|||
|
|
|||
|
#define MSK_FP_FLAGS 0x7C0
|
|||
|
|
|||
|
#define C_FLAGS 0x000
|
|||
|
#define M_FLAGS 0x040
|
|||
|
#define NONE_FLAGS 0x080
|
|||
|
#define D_FLAGS 0x0C0
|
|||
|
#define UC_FLAGS 0x100
|
|||
|
#define VC_FLAGS 0x100
|
|||
|
#define UM_FLAGS 0x140
|
|||
|
#define VM_FLAGS 0x140
|
|||
|
#define U_FLAGS 0x180
|
|||
|
#define V_FLAGS 0x180
|
|||
|
#define UD_FLAGS 0x1C0
|
|||
|
#define VD_FLAGS 0x1C0
|
|||
|
#define SC_FLAGS 0x400
|
|||
|
#define S_FLAGS 0x480
|
|||
|
#define SUC_FLAGS 0x500
|
|||
|
#define SVC_FLAGS 0x500
|
|||
|
#define SUM_FLAGS 0x540
|
|||
|
#define SVM_FLAGS 0x540
|
|||
|
#define SU_FLAGS 0x580
|
|||
|
#define SV_FLAGS 0x580
|
|||
|
#define SUD_FLAGS 0x5C0
|
|||
|
#define SVD_FLAGS 0x5C0
|
|||
|
#define SUIC_FLAGS 0x700
|
|||
|
#define SVIC_FLAGS 0x700
|
|||
|
#define SUIM_FLAGS 0x740
|
|||
|
#define SVIM_FLAGS 0x740
|
|||
|
#define SUI_FLAGS 0x780
|
|||
|
#define SVI_FLAGS 0x780
|
|||
|
#define SUID_FLAGS 0x7C0
|
|||
|
#define SVID_FLAGS 0x7C0
|
|||
|
|
|||
|
#define C_FLAGS_STR "/c"
|
|||
|
#define M_FLAGS_STR "/m"
|
|||
|
#define NONE_FLAGS_STR ""
|
|||
|
#define D_FLAGS_STR "/d"
|
|||
|
#define UC_FLAGS_STR "/uc"
|
|||
|
#define VC_FLAGS_STR "/vc"
|
|||
|
#define UM_FLAGS_STR "/um"
|
|||
|
#define VM_FLAGS_STR "/vm"
|
|||
|
#define U_FLAGS_STR "/u"
|
|||
|
#define V_FLAGS_STR "/v"
|
|||
|
#define UD_FLAGS_STR "/ud"
|
|||
|
#define VD_FLAGS_STR "/vd"
|
|||
|
#define SC_FLAGS_STR "/sc"
|
|||
|
#define S_FLAGS_STR "/s"
|
|||
|
#define SUC_FLAGS_STR "/suc"
|
|||
|
#define SVC_FLAGS_STR "/svc"
|
|||
|
#define SUM_FLAGS_STR "/sum"
|
|||
|
#define SVM_FLAGS_STR "/svm"
|
|||
|
#define SU_FLAGS_STR "/su"
|
|||
|
#define SV_FLAGS_STR "/sv"
|
|||
|
#define SUD_FLAGS_STR "/sud"
|
|||
|
#define SVD_FLAGS_STR "/svd"
|
|||
|
#define SUIC_FLAGS_STR "/suic"
|
|||
|
#define SVIC_FLAGS_STR "/svic"
|
|||
|
#define SUIM_FLAGS_STR "/suim"
|
|||
|
#define SVIM_FLAGS_STR "/svim"
|
|||
|
#define SUI_FLAGS_STR "/sui"
|
|||
|
#define SVI_FLAGS_STR "/svi"
|
|||
|
#define SUID_FLAGS_STR "/suid"
|
|||
|
#define SVID_FLAGS_STR "/svid"
|
|||
|
|
|||
|
//
|
|||
|
// Type (9) PALcode Instruction Format.
|
|||
|
//
|
|||
|
// 3 2 2
|
|||
|
// 1 6 5 0
|
|||
|
// +-----------+---------------------------------------------------+
|
|||
|
// | opcode | PALcode func |
|
|||
|
// +-----------+---------------------------------------------------+
|
|||
|
//
|
|||
|
|
|||
|
typedef struct _Alpha_PAL_Format {
|
|||
|
ULONG Function : 26;
|
|||
|
ULONG Opcode : 6;
|
|||
|
} Alpha_PAL_Format;
|
|||
|
|
|||
|
//
|
|||
|
// Call to PAL function codes (in Function, Opcode 0, CALLPAL_OP).
|
|||
|
//
|
|||
|
// N.B. - if new call pal functions are added, they must also be added
|
|||
|
// in genalpha.c, genalpha.c will generate the include file for .s files
|
|||
|
// that will define the call pal mnemonics for assembly language use
|
|||
|
//
|
|||
|
|
|||
|
#define PRIV_PAL_FUNC 0x0
|
|||
|
#define UNPRIV_PAL_FUNC 0x80
|
|||
|
|
|||
|
|
|||
|
//
|
|||
|
// Unprivileged call pal functions.
|
|||
|
//
|
|||
|
|
|||
|
#define BPT_FUNC (UNPRIV_PAL_FUNC | 0x00)
|
|||
|
#define CALLSYS_FUNC (UNPRIV_PAL_FUNC | 0x03)
|
|||
|
#define IMB_FUNC (UNPRIV_PAL_FUNC | 0x06)
|
|||
|
#define GENTRAP_FUNC (UNPRIV_PAL_FUNC | 0xAA)
|
|||
|
#define RDTEB_FUNC (UNPRIV_PAL_FUNC | 0xAB)
|
|||
|
#define KBPT_FUNC (UNPRIV_PAL_FUNC | 0xAC)
|
|||
|
#define CALLKD_FUNC (UNPRIV_PAL_FUNC | 0xAD)
|
|||
|
#define RDTEB64_FUNC (UNPRIV_PAL_FUNC | 0xAE)
|
|||
|
|
|||
|
#define BPT_FUNC_STR "bpt"
|
|||
|
#define CALLSYS_FUNC_STR "callsys"
|
|||
|
#define IMB_FUNC_STR "imb"
|
|||
|
#define RDTEB_FUNC_STR "rdteb"
|
|||
|
#define GENTRAP_FUNC_STR "gentrap"
|
|||
|
#define KBPT_FUNC_STR "kbpt"
|
|||
|
#define CALLKD_FUNC_STR "callkd"
|
|||
|
#define RDTEB64_FUNC_STR "rdteb64"
|
|||
|
|
|||
|
//
|
|||
|
// Priveleged call pal functions.
|
|||
|
//
|
|||
|
|
|||
|
#define HALT_FUNC (PRIV_PAL_FUNC | 0x00)
|
|||
|
#define RESTART_FUNC (PRIV_PAL_FUNC | 0x01)
|
|||
|
#define DRAINA_FUNC (PRIV_PAL_FUNC | 0x02)
|
|||
|
#define REBOOT_FUNC (PRIV_PAL_FUNC | 0x03)
|
|||
|
#define INITPAL_FUNC (PRIV_PAL_FUNC | 0x04)
|
|||
|
#define WRENTRY_FUNC (PRIV_PAL_FUNC | 0x05)
|
|||
|
#define SWPIRQL_FUNC (PRIV_PAL_FUNC | 0x06)
|
|||
|
#define RDIRQL_FUNC (PRIV_PAL_FUNC | 0x07)
|
|||
|
#define DI_FUNC (PRIV_PAL_FUNC | 0X08)
|
|||
|
#define EI_FUNC (PRIV_PAL_FUNC | 0x09)
|
|||
|
#define SWPPAL_FUNC (PRIV_PAL_FUNC | 0x0A)
|
|||
|
#define SSIR_FUNC (PRIV_PAL_FUNC | 0x0C)
|
|||
|
#define CSIR_FUNC (PRIV_PAL_FUNC | 0x0D)
|
|||
|
#define RFE_FUNC (PRIV_PAL_FUNC | 0x0E)
|
|||
|
#define RETSYS_FUNC (PRIV_PAL_FUNC | 0x0F)
|
|||
|
#define SWPCTX_FUNC (PRIV_PAL_FUNC | 0x10)
|
|||
|
#define SWPPROCESS_FUNC (PRIV_PAL_FUNC | 0x11)
|
|||
|
#define RDMCES_FUNC (PRIV_PAL_FUNC | 0x12)
|
|||
|
#define WRMCES_FUNC (PRIV_PAL_FUNC | 0x13)
|
|||
|
#define TBIA_FUNC (PRIV_PAL_FUNC | 0x14)
|
|||
|
#define TBIS_FUNC (PRIV_PAL_FUNC | 0x15)
|
|||
|
#define DTBIS_FUNC (PRIV_PAL_FUNC | 0x16)
|
|||
|
#define TBISASN_FUNC (PRIV_PAL_FUNC | 0x17)
|
|||
|
#define RDKSP_FUNC (PRIV_PAL_FUNC | 0x18)
|
|||
|
#define SWPKSP_FUNC (PRIV_PAL_FUNC | 0x19)
|
|||
|
#define RDPSR_FUNC (PRIV_PAL_FUNC | 0x1A)
|
|||
|
#define RDPCR_FUNC (PRIV_PAL_FUNC | 0x1C)
|
|||
|
#define RDTHREAD_FUNC (PRIV_PAL_FUNC | 0x1E)
|
|||
|
#define TBIM_FUNC (PRIV_PAL_FUNC | 0x20)
|
|||
|
#define TBIMASN_FUNC (PRIV_PAL_FUNC | 0x21)
|
|||
|
#define TBIM64_FUNC (PRIV_PAL_FUNC | 0x22)
|
|||
|
#define TBIS64_FUNC (PRIV_PAL_FUNC | 0x23)
|
|||
|
#define EALNFIX_FUNC (PRIV_PAL_FUNC | 0x24)
|
|||
|
#define DALNFIX_FUNC (PRIV_PAL_FUNC | 0x25)
|
|||
|
#define RDCOUNTERS_FUNC (PRIV_PAL_FUNC | 0x30)
|
|||
|
#define RDSTATE_FUNC (PRIV_PAL_FUNC | 0x31)
|
|||
|
#define WRPERFMON_FUNC (PRIV_PAL_FUNC | 0x32)
|
|||
|
#define CP_SLEEP_FUNC (PRIV_PAL_FUNC | 0x39)
|
|||
|
|
|||
|
#define HALT_FUNC_STR "halt"
|
|||
|
#define RESTART_FUNC_STR "restart"
|
|||
|
#define DRAINA_FUNC_STR "draina"
|
|||
|
#define REBOOT_FUNC_STR "reboot"
|
|||
|
#define INITPAL_FUNC_STR "initpal"
|
|||
|
#define WRENTRY_FUNC_STR "wrentry"
|
|||
|
#define SWPIRQL_FUNC_STR "swpirql"
|
|||
|
#define RDIRQL_FUNC_STR "rdirql"
|
|||
|
#define DI_FUNC_STR "di"
|
|||
|
#define EI_FUNC_STR "ei"
|
|||
|
#define SWPPAL_FUNC_STR "swppal"
|
|||
|
#define SSIR_FUNC_STR "ssir"
|
|||
|
#define CSIR_FUNC_STR "csir"
|
|||
|
#define RFE_FUNC_STR "rfe"
|
|||
|
#define RETSYS_FUNC_STR "retsys"
|
|||
|
#define SWPCTX_FUNC_STR "swpctx"
|
|||
|
#define SWPPROCESS_FUNC_STR "swpprocess"
|
|||
|
#define RDMCES_FUNC_STR "rdmces"
|
|||
|
#define WRMCES_FUNC_STR "wrmces"
|
|||
|
#define TBIA_FUNC_STR "tbia"
|
|||
|
#define TBIS_FUNC_STR "tbis"
|
|||
|
#define DTBIS_FUNC_STR "dtbis"
|
|||
|
#define TBISASN_FUNC_STR "tbisasn"
|
|||
|
#define RDKSP_FUNC_STR "rdksp"
|
|||
|
#define SWPKSP_FUNC_STR "swpksp"
|
|||
|
#define RDPSR_FUNC_STR "rdpsr"
|
|||
|
#define RDPCR_FUNC_STR "rdpcr"
|
|||
|
#define RDTHREAD_FUNC_STR "rdthread"
|
|||
|
#define TBIM_FUNC_STR "tbim"
|
|||
|
#define TBIMASN_FUNC_STR "tbimasn"
|
|||
|
#define TBIM64_FUNC_STR "tbim64"
|
|||
|
#define TBIS64_FUNC_STR "tbis64"
|
|||
|
#define EALNFIX_FUNC_STR "ealnfix"
|
|||
|
#define DALNFIX_FUNC_STR "dalnfix"
|
|||
|
#define RDCOUNTERS_FUNC_STR "rdcounters"
|
|||
|
#define RDSTATE_FUNC_STR "rdstate"
|
|||
|
#define WRPERFMON_FUNC_STR "wrperfmon"
|
|||
|
#define CP_SLEEP_FUNC_STR "cp_sleep"
|
|||
|
|
|||
|
//
|
|||
|
// 21064 (ev4) - specific call pal functions.
|
|||
|
//
|
|||
|
|
|||
|
#define INITPCR_FUNC (PRIV_PAL_FUNC | 0x38)
|
|||
|
|
|||
|
#define INITPCR_FUNC_STR "initpcr"
|
|||
|
|
|||
|
//
|
|||
|
// Type (10) EV4 MTPR/MFPR PAL mode instructions.
|
|||
|
//
|
|||
|
// 3 2 2 2 2 1 1
|
|||
|
// 1 6 5 1 0 6 5 8 7 6 5 4 0
|
|||
|
// +-----------+---------+---------+---------------+-+-+-+---------+
|
|||
|
// | opcode | Ra | Rb | IGN |P|A|I| Index |
|
|||
|
// +-----------+---------+---------+---------------+-+-+-+---------+
|
|||
|
//
|
|||
|
|
|||
|
typedef struct _Alpha_EV4_PR_Format {
|
|||
|
ULONG Index : 5;
|
|||
|
ULONG Ibox : 1;
|
|||
|
ULONG Abox : 1;
|
|||
|
ULONG PalTemp : 1;
|
|||
|
ULONG IGN : 8;
|
|||
|
ULONG Rb : 5;
|
|||
|
ULONG Ra : 5;
|
|||
|
ULONG Opcode : 6;
|
|||
|
} Alpha_EV4_PR_Format;
|
|||
|
|
|||
|
//
|
|||
|
// Type (10) EV5 MTPR/MFPR PAL mode instructions.
|
|||
|
//
|
|||
|
// 3 2 2 2 2 1 1
|
|||
|
// 1 6 5 1 0 6 5 0
|
|||
|
// +-----------+---------+---------+-------------------------------+
|
|||
|
// | opcode | Ra | Rb | Index |
|
|||
|
// +-----------+---------+---------+-------------------------------+
|
|||
|
//
|
|||
|
|
|||
|
typedef struct _Alpha_EV5_PR_Format {
|
|||
|
ULONG Index : 16;
|
|||
|
ULONG Rb : 5;
|
|||
|
ULONG Ra : 5;
|
|||
|
ULONG Opcode : 6;
|
|||
|
} Alpha_EV5_PR_Format;
|
|||
|
|
|||
|
#define MTPR_OP 0x1D
|
|||
|
#define MFPR_OP 0x19
|
|||
|
|
|||
|
#define MTPR_OP_STR "mt"
|
|||
|
#define MFPR_OP_STR "mf"
|
|||
|
|
|||
|
//
|
|||
|
// Type (11) EV4 special memory PAL mode access.
|
|||
|
//
|
|||
|
// 3 2 2 2 2 1 1 1 1 1 1
|
|||
|
// 1 6 5 1 0 6 5 4 3 2 1 0
|
|||
|
// +-----------+---------+---------+-+-+-+-+-----------------------+
|
|||
|
// | opcode | Ra | Rb |P|A|R|Q| Disp |
|
|||
|
// +-----------+---------+---------+-+-+-+-+-----------------------+
|
|||
|
//
|
|||
|
|
|||
|
typedef struct _Alpha_EV4_MEM_Format {
|
|||
|
ULONG Disp : 12;
|
|||
|
ULONG QuadWord : 1;
|
|||
|
ULONG RWcheck : 1;
|
|||
|
ULONG Alt : 1;
|
|||
|
ULONG Physical : 1;
|
|||
|
ULONG Rb : 5;
|
|||
|
ULONG Ra : 5;
|
|||
|
ULONG Opcode : 6;
|
|||
|
} Alpha_EV4_MEM_Format;
|
|||
|
|
|||
|
//
|
|||
|
// Type (11) EV5 special memory PAL mode access.
|
|||
|
//
|
|||
|
// 3 2 2 2 2 1 1 1 1 1 1
|
|||
|
// 1 6 5 1 0 6 5 4 3 2 1 0
|
|||
|
// +-----------+---------+---------+-+-+-+-+-----------------------+
|
|||
|
// | opcode | Ra | Rb |P|A|R|Q| Disp |
|
|||
|
// +-----------+---------+---------+-+-+-+-+-----------------------+
|
|||
|
//
|
|||
|
|
|||
|
typedef struct _Alpha_EV5_MEM_Format {
|
|||
|
ULONG Disp : 10;
|
|||
|
ULONG Lock_Cond: 1;
|
|||
|
ULONG Vpte: 1;
|
|||
|
ULONG QuadWord : 1;
|
|||
|
ULONG RWcheck : 1;
|
|||
|
ULONG Alt : 1;
|
|||
|
ULONG Physical : 1;
|
|||
|
ULONG Rb : 5;
|
|||
|
ULONG Ra : 5;
|
|||
|
ULONG Opcode : 6;
|
|||
|
} Alpha_EV5_MEM_Format;
|
|||
|
|
|||
|
#define HWLD_OP 0x1B
|
|||
|
#define HWST_OP 0x1F
|
|||
|
|
|||
|
#define HWLD_OP_STR "hwld"
|
|||
|
#define HWST_OP_STR "hwst"
|
|||
|
|
|||
|
// Type (12) EV4 PAL mode switch.
|
|||
|
//
|
|||
|
// 3 2 2 2 2 1 1 1 1
|
|||
|
// 1 6 5 1 0 6 5 4 3 0
|
|||
|
// +-----------+---------+---------+-+-+---------------------------+
|
|||
|
// | opcode | Ra | Rb |1|0| IGN |
|
|||
|
// +-----------+---------+---------+-+-+---------------------------+
|
|||
|
|
|||
|
typedef struct _Alpha_EV4_REI_Format {
|
|||
|
ULONG IGN : 14;
|
|||
|
ULONG zero : 1;
|
|||
|
ULONG one : 1;
|
|||
|
ULONG Rb : 5;
|
|||
|
ULONG Ra : 5;
|
|||
|
ULONG Opcode : 6;
|
|||
|
} Alpha_EV4_REI_Format;
|
|||
|
|
|||
|
// Type (12) EV5 PAL mode switch.
|
|||
|
//
|
|||
|
// 3 2 2 2 2 1 1 1 1
|
|||
|
// 1 6 5 1 0 6 5 4 3 0
|
|||
|
// +-----------+---------+---------+-+-+---------------------------+
|
|||
|
// | opcode | Ra | Rb |1|0| IGN |
|
|||
|
// +-----------+---------+---------+-+-+---------------------------+
|
|||
|
|
|||
|
typedef struct _Alpha_EV5_REI_Format {
|
|||
|
ULONG IGN : 14;
|
|||
|
ULONG Type: 2;
|
|||
|
ULONG Rb : 5;
|
|||
|
ULONG Ra : 5;
|
|||
|
ULONG Opcode : 6;
|
|||
|
} Alpha_EV5_REI_Format;
|
|||
|
|
|||
|
#define REI_OP 0x1E
|
|||
|
|
|||
|
#define REI_OP_STR "rei"
|
|||
|
|
|||
|
//
|
|||
|
//
|
|||
|
//
|
|||
|
typedef union _Alpha_Instruction {
|
|||
|
ULONG Long;
|
|||
|
UCHAR Byte[4];
|
|||
|
|
|||
|
Alpha_Memory_Format Memory;
|
|||
|
Alpha_Jump_Format Jump;
|
|||
|
Alpha_Branch_Format Branch;
|
|||
|
Alpha_OpReg_Format OpReg;
|
|||
|
Alpha_OpLit_Format OpLit;
|
|||
|
Alpha_FpOp_Format FpOp;
|
|||
|
Alpha_PAL_Format Pal;
|
|||
|
Alpha_EV4_PR_Format EV4_PR;
|
|||
|
Alpha_EV4_MEM_Format EV4_MEM;
|
|||
|
Alpha_EV4_REI_Format EV4_REI;
|
|||
|
Alpha_EV5_PR_Format EV5_PR;
|
|||
|
Alpha_EV5_MEM_Format EV5_MEM;
|
|||
|
Alpha_EV5_REI_Format EV5_REI;
|
|||
|
} ALPHA_INSTRUCTION, *PALPHA_INSTRUCTION;
|
|||
|
|
|||
|
//
|
|||
|
// Define standard integer register assignments.
|
|||
|
//
|
|||
|
|
|||
|
#define V0_REG 0 // v0 - return value register
|
|||
|
|
|||
|
#define T0_REG 1 // t0 - temporary register
|
|||
|
#define T1_REG 2 // t1 - temporary register
|
|||
|
#define T2_REG 3 // t2 - temporary register
|
|||
|
#define T3_REG 4 // t3 - temporary register
|
|||
|
#define T4_REG 5 // t4 - temporary register
|
|||
|
#define T5_REG 6 // t5 - temporary register
|
|||
|
#define T6_REG 7 // t6 - temporary register
|
|||
|
#define T7_REG 8 // t7 - temporary register
|
|||
|
|
|||
|
#define S0_REG 9 // s0 - saved register
|
|||
|
#define S1_REG 10 // s1 - saved register
|
|||
|
#define S2_REG 11 // s2 - saved register
|
|||
|
#define S3_REG 12 // s3 - saved register
|
|||
|
#define S4_REG 13 // s4 - saved register
|
|||
|
#define S5_REG 14 // s5 - saved register
|
|||
|
|
|||
|
#define S6_REG 15 // s6 - saved register, aka fp
|
|||
|
#define FP_REG 15 // fp - frame pointer register
|
|||
|
|
|||
|
#define A0_REG 16 // a0 - argument register
|
|||
|
#define A1_REG 17 // a1 - argument register
|
|||
|
#define A2_REG 18 // a2 - argument register
|
|||
|
#define A3_REG 19 // a3 - argument register
|
|||
|
#define A4_REG 20 // a4 - argument register
|
|||
|
#define A5_REG 21 // a5 - argument register
|
|||
|
|
|||
|
#define T8_REG 22 // t8 - temporary register
|
|||
|
#define T9_REG 23 // t9 - temporary register
|
|||
|
#define T10_REG 24 // t10 - temporary register
|
|||
|
#define T11_REG 25 // t11 - temporary register
|
|||
|
|
|||
|
#define RA_REG 26 // ra - return address register
|
|||
|
#define T12_REG 27 // t12 - temporary register
|
|||
|
#define AT_REG 28 // at - assembler temporary register
|
|||
|
#define GP_REG 29 // gp - global pointer register
|
|||
|
#define SP_REG 30 // sp - stack pointer register
|
|||
|
#define ZERO_REG 31 // zero - zero register
|
|||
|
|
|||
|
//
|
|||
|
// Define standard floating point register assignments.
|
|||
|
//
|
|||
|
|
|||
|
#define F0_REG 0 // floating return value register (real)
|
|||
|
#define F1_REG 1 // floating return value register (imaginary)
|
|||
|
#define F16_REG 16 // floating argument register
|
|||
|
#define FZERO_REG 31 // floating zero register
|
|||
|
|
|||
|
//
|
|||
|
// Define standard integer register strings
|
|||
|
//
|
|||
|
|
|||
|
#define V0_REG_STR "v0" // - return value register
|
|||
|
|
|||
|
#define T0_REG_STR "t0" // - temporary register
|
|||
|
#define T1_REG_STR "t1" // - temporary register
|
|||
|
#define T2_REG_STR "t2" // - temporary register
|
|||
|
#define T3_REG_STR "t3" // - temporary register
|
|||
|
#define T4_REG_STR "t4" // - temporary register
|
|||
|
#define T5_REG_STR "t5" // - temporary register
|
|||
|
#define T6_REG_STR "t6" // - temporary register
|
|||
|
#define T7_REG_STR "t7" // - temporary register
|
|||
|
|
|||
|
#define S0_REG_STR "s0" // - saved register
|
|||
|
#define S1_REG_STR "s1" // - saved register
|
|||
|
#define S2_REG_STR "s2" // - saved register
|
|||
|
#define S3_REG_STR "s3" // - saved register
|
|||
|
#define S4_REG_STR "s4" // - saved register
|
|||
|
#define S5_REG_STR "s5" // - saved register
|
|||
|
|
|||
|
#define S6_REG_STR "s6" // - saved register, aka fp
|
|||
|
#define FP_REG_STR "fp" // - frame pointer register
|
|||
|
|
|||
|
#define A0_REG_STR "a0" // - argument register
|
|||
|
#define A1_REG_STR "a1" // - argument register
|
|||
|
#define A2_REG_STR "a2" // - argument register
|
|||
|
#define A3_REG_STR "a3" // - argument register
|
|||
|
#define A4_REG_STR "a4" // - argument register
|
|||
|
#define A5_REG_STR "a5" // - argument register
|
|||
|
|
|||
|
#define T8_REG_STR "t8" // - temporary register
|
|||
|
#define T9_REG_STR "t9" // - temporary register
|
|||
|
#define T10_REG_STR "t10" // - temporary register
|
|||
|
#define T11_REG_STR "t11" // - temporary register
|
|||
|
|
|||
|
#define RA_REG_STR "ra" // - return address register
|
|||
|
#define T12_REG_STR "t12" // - temporary register
|
|||
|
#define AT_REG_STR "at" // - assembler temporary register
|
|||
|
#define GP_REG_STR "gp" // - global pointer register
|
|||
|
#define SP_REG_STR "sp" // - stack pointer register
|
|||
|
#define ZERO_REG_STR "zero" // - zero register
|
|||
|
|
|||
|
//
|
|||
|
// Define maximum and minimum single and double exponent values.
|
|||
|
//
|
|||
|
|
|||
|
#define DOUBLE_MAXIMUM_EXPONENT 2047
|
|||
|
#define DOUBLE_MINIMUM_EXPONENT 0
|
|||
|
|
|||
|
#define SINGLE_MAXIMUM_EXPONENT 255
|
|||
|
#define SINGLE_MINIMUM_EXPONENT 0
|
|||
|
|
|||
|
//
|
|||
|
// Define single and double exponent bias values.
|
|||
|
//
|
|||
|
|
|||
|
#define SINGLE_EXPONENT_BIAS 127
|
|||
|
#define DOUBLE_EXPONENT_BIAS 1023
|
|||
|
|
|||
|
//
|
|||
|
// Define the largest single and double values.
|
|||
|
//
|
|||
|
|
|||
|
#define SINGLE_MAXIMUM_VALUE 0x7f7fffff
|
|||
|
|
|||
|
#define DOUBLE_MAXIMUM_VALUE_HIGH 0x7fefffff
|
|||
|
#define DOUBLE_MAXIMUM_VALUE_LOW 0xffffffff
|
|||
|
|
|||
|
//
|
|||
|
// Define single and double quiet and signaling Nan values
|
|||
|
// (these are identical to X86 formats; Mips is different).
|
|||
|
//
|
|||
|
|
|||
|
#define SINGLE_QUIET_NAN_PREFIX 0x7fc00000
|
|||
|
#define SINGLE_SIGNAL_NAN_PREFIX 0x7f800000
|
|||
|
#define SINGLE_QUIET_NAN_VALUE 0xffc00000
|
|||
|
|
|||
|
#define DOUBLE_QUIET_NAN_PREFIX_HIGH 0x7ff80000
|
|||
|
#define DOUBLE_SIGNAL_NAN_PREFIX_HIGH 0x7ff00000
|
|||
|
#define DOUBLE_QUIET_NAN_VALUE_HIGH 0xfff80000
|
|||
|
#define DOUBLE_QUIET_NAN_VALUE_LOW 0x0
|
|||
|
|
|||
|
//
|
|||
|
// Define positive single and double infinity values.
|
|||
|
//
|
|||
|
|
|||
|
#define SINGLE_INFINITY_VALUE 0x7f800000
|
|||
|
|
|||
|
#define DOUBLE_INFINITY_VALUE_HIGH 0x7ff00000
|
|||
|
#define DOUBLE_INFINITY_VALUE_LOW 0x0
|
|||
|
|
|||
|
//
|
|||
|
// Quadword versions of the above.
|
|||
|
//
|
|||
|
|
|||
|
#define DOUBLE_MAXIMUM_VALUE ((ULONGLONG)0x7fefffffffffffff)
|
|||
|
#define DOUBLE_INFINITY_VALUE ((ULONGLONG)0x7ff0000000000000)
|
|||
|
#define DOUBLE_QUIET_NAN_VALUE ((ULONGLONG)0xfff8000000000000)
|
|||
|
|
|||
|
//
|
|||
|
// Define result values for IEEE floating point comparison operations.
|
|||
|
// True is 2.0 and False is 0.0.
|
|||
|
//
|
|||
|
|
|||
|
#define FP_COMPARE_TRUE ((ULONGLONG)0x4000000000000000)
|
|||
|
#define FP_COMPARE_FALSE ((ULONGLONG)0x0000000000000000)
|
|||
|
|
|||
|
//
|
|||
|
// Define Alpha AXP rounding modes.
|
|||
|
//
|
|||
|
|
|||
|
#define ROUND_TO_ZERO 0 // round toward zero
|
|||
|
#define ROUND_TO_MINUS_INFINITY 1 // round toward minus infinity
|
|||
|
#define ROUND_TO_NEAREST 2 // round to nearest representable value
|
|||
|
#define ROUND_TO_PLUS_INFINITY 3 // round toward plus infinity
|
|||
|
|
|||
|
#endif // _ALPHAOPS_
|