diff options
Diffstat (limited to 'public/sdk/inc/alphaops.h')
-rw-r--r-- | public/sdk/inc/alphaops.h | 1237 |
1 files changed, 1237 insertions, 0 deletions
diff --git a/public/sdk/inc/alphaops.h b/public/sdk/inc/alphaops.h new file mode 100644 index 000000000..86fb6fd2b --- /dev/null +++ b/public/sdk/inc/alphaops.h @@ -0,0 +1,1237 @@ +/*++ + +Copyright (c) 1992-1996 Digital Equipment Corporation + +Module Name: + + alphaops.h + +Abstract: + + Alpha AXP instruction and floating constant definitions. + +Author: + +Revision History: + +--*/ + +#ifndef _ALPHAOPS_ +#define _ALPHAOPS_ + +// +// 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_cortn" + +// +// 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 0 +#define SEXTW_FUNC 1 + +#define SEXTB_FUNC_STR "sextb" +#define SEXTW_FUNC_STR "sextw" + +// +// 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 0x03F + +#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 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" + +// +// 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 RDCOUNTERS_FUNC (PRIV_PAL_FUNC | 0x30) +#define RDSTATE_FUNC (PRIV_PAL_FUNC | 0x31) +#define WRPERFMON_FUNC (PRIV_PAL_FUNC | 0x32) + +#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 RDCOUNTERS_FUNC_STR "rdcounters" +#define RDSTATE_FUNC_STR "rdstate" +#define WRPERFMON_FUNC_STR "wrperfmon" + +// +// 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_ |