windows-nt/Source/XPSP1/NT/public/sdk/inc/alphaops.h
2020-09-26 16:20:57 +08:00

1260 lines
42 KiB
C
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*++
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_