MIPSINST.H
/*++ BUILD Version: 0001    // Increment this if a change has global effects 
 
Copyright (c) 1993-1997  Microsoft Corporation 
 
Module Name: 
 
    mipsinst.h 
 
Abstract: 
 
    Mips instruction and floating constant definitions. 
 
Author: 
 
    David N. Cutler (davec) 8-May-1992 
 
Revision History: 
 
--*/ 
 
#ifndef _MIPSINST_ 
#define _MIPSINST_ 
  
// 
// Define MIPS instruction format structures. 
// 
 
typedef union _MIPS_INSTRUCTION { 
    ULONG Long; 
    UCHAR Byte[4]; 
 
    struct { 
        ULONG Target : 26; 
        ULONG Opcode : 6; 
    } j_format; 
 
    struct { 
        LONG Simmediate : 16; 
        ULONG Rt : 5; 
        ULONG Rs : 5; 
        ULONG Opcode : 6; 
    } i_format; 
 
    struct { 
        ULONG Uimmediate : 16; 
        ULONG Rt : 5; 
        ULONG Rs : 5; 
        ULONG Opcode : 6; 
    } u_format; 
 
    struct { 
        ULONG Function : 6; 
        ULONG Re : 5; 
        ULONG Rd : 5; 
        ULONG Rt : 5; 
        ULONG Rs : 5; 
        ULONG Opcode : 6; 
    } r_format; 
 
    struct { 
        ULONG Function : 6; 
        ULONG Re : 5; 
        ULONG Rd : 5; 
        ULONG Rt : 5; 
        ULONG Format : 4; 
        ULONG Fill1 : 1; 
        ULONG Opcode : 6; 
    } f_format; 
 
    struct { 
        ULONG Function : 6; 
        ULONG Fd : 5; 
        ULONG Fs : 5; 
        ULONG Ft : 5; 
        ULONG Format : 4; 
        ULONG Fill1 : 1; 
        ULONG Opcode : 6; 
    } c_format; 
 
} MIPS_INSTRUCTION, *PMIPS_INSTRUCTION; 
 
// 
// Define MIPS instruction opcode values. 
// 
 
#define SPEC_OP 0x0                     // special opcode - use function field 
#define BCOND_OP 0x1                    // condition branch 
#define J_OP 0x2                        // unconditional jump 
#define JAL_OP 0x3                      // jump and link 
 
#define BEQ_OP 0x4                      // branch equal 
#define BNE_OP 0x5                      // branch not equal 
#define BLEZ_OP 0x6                     // branch less than or equal 
#define BGTZ_OP 0x7                     // branch greater than 
 
#define ADDI_OP 0x8                     // add immediate signed integer 
#define ADDIU_OP 0x9                    // add immediate unsigned integer 
#define SLTI_OP 0xa                     // set less than signed integer 
#define SLTIU_OP 0xb                    // set less than unsigned integer 
 
#define ANDI_OP 0xc                     // and unsigned immediate integer 
#define ORI_OP 0xd                      // or unsigned immediate integer 
#define XORI_OP 0xe                     // exclusive or unsigned immediate 
#define LUI_OP  0xf                     // load upper immediate integer 
 
#define COP0_OP 0x10                    // coprocessor 0 operation 
#define COP1_OP 0x11                    // coprocessor 1 operation 
 
#define BEQL_OP 0x14                    // branch equal likely 
#define BNEL_OP 0x15                    // branch not equal likely 
#define BLEZL_OP 0x16                   // branch less than or equal likely 
#define BGTZL_OP 0x17                   // branch greater than likely 
 
#define LDL_OP 0x1a                     // load double left integer 
#define LDR_OP 0x1b                     // load double right integer 
 
#define LB_OP 0x20                      // load byte signed integer 
#define LH_OP 0x21                      // load halfword signed integer 
#define LWL_OP 0x22                     // load word left integer 
#define LW_OP 0x23                      // load word integer 
 
#define LBU_OP 0x24                     // load byte unsigned integer 
#define LHU_OP 0x25                     // load halfword unsigned integer 
#define LWR_OP 0x26                     // load word right integer 
#define LWU_OP 0x27                     // load word unsigned integer 
 
#define SB_OP 0x28                      // store byte integer 
#define SH_OP 0x29                      // store halfword integer 
#define SWL_OP 0x2a                     // store word left integer 
#define SW_OP 0x2b                      // store word integer register 
 
#define SDL_OP 0x2c                     // store double left integer 
#define SDR_OP 0x2d                     // store double right integer 
#define SWR_OP 0x2e                     // store word right integer 
#define CACHE_OP 0x2f                   // cache operation 
 
#define LL_OP 0x30                      // load linked integer register 
#define LWC1_OP 0x31                    // load word floating 
#define LWC2_OP 0x32                    // load word coprocessor 2 
 
#define LLD_OP 0x34                     // load locked double integer 
#define LDC1_OP 0x35                    // load word double floating 
#define LDC2_OP 0x36                    // load double coprocessor 2 
#define LD_OP 0x37                      // load double integer 
 
#define SC_OP 0x38                      // store conditional word integer 
#define SWC1_OP 0x39                    // store word floating 
#define SWC2_OP 0x3a                    // store double coprocessor 2 
 
#define SDC_OP 0x3c                     // store conditional double integer 
#define SDC1_OP 0x3d                    // store double floating 
#define SDC2_OP 0x3e                    // store double copreocessor 2 
#define SD_OP 0x3f                      // store double integer register 
 
// 
// Define special function subopcodes. 
// 
 
#define SLL_OP 0x0                      // shift left logical integer 
#define SRL_OP 0x2                      // shift right logical integer 
#define SRA_OP 0x3                      // shift right arithmetic integer 
 
#define SLLV_OP 0x4                     // shift left logical variable integer 
#define SRLV_OP 0x6                     // shift right logical variable integer 
#define SRAV_OP 0x7                     // shift right arithmetic variable integer 
 
#define JR_OP 0x8                       // jump register 
#define JALR_OP 0x9                     // jump and link register 
 
#define SYSCALL_OP 0xc                  // system call trap 
#define BREAK_OP 0xd                    // breakpoint trap 
 
#define MFHI_OP 0x10                    // more from high integer 
#define MTHI_OP 0x11                    // move to high integer 
#define MFLO_OP 0x12                    // move from low integer 
#define MTLO_OP 0x13                    // move to low integer 
 
#define MULT_OP 0x18                    // multiply signed integer 
#define MULTU_OP 0x19                   // multiply unsigned integer 
#define DIV_OP 0x1a                     // divide signed integer 
#define DIVU_OP 0x1b                    // divide unsigned integer 
 
#define ADD_OP 0x20                     // add signed integer 
#define ADDU_OP 0x21                    // add unsigned integer 
#define SUP_OP 0x22                     // subtract signed integer 
#define SUBU_OP 0x23                    // subtract unsigned integer 
 
#define AND_OP 0x24                     // and integer 
#define OR_OP 0x25                      // or integer 
#define XOR_OP 0x26                     // exclusive or integer 
#define NOR_OP 0x27                     // nor integer 
 
#define SLT_OP 0x2a                     // set less signed integer 
#define SLTU_OP 0x2b                    // set less unsigned integer 
 
// 
// Define branch conditional subopcodes. 
// 
 
#define BLTZ_OP 0x0                     // branch less that zero integer 
#define BGEZ_OP 0x1                     // branch greater than or equal zero integer 
#define BLTZL_OP 0x2                    // branch less that zero integer liekly 
#define BGEZL_OP 0x3                    // branch greater than or equal zero integer likely 
 
#define BLTZAL_OP 0x10                  // branch less than zero integer and link 
#define BGEZAL_OP 0x11                  // branch greater than or equal zero integer and link 
#define BLTZALL_OP 0x12                 // branch less than zero integer and link likely 
#define BGEZALL_OP 0x13                 // branch greater than or equal zero integer and link likely 
 
// 
// Coprocessor branch true and false subfunctions and mask values. 
// 
 
#define COPz_BC_MASK 0x3e10000          // coprocessor z branch condition mask 
#define COPz_BF 0x1000000               // coprocessor z branch false subfunction 
#define COPz_BT 0x1010000               // coprocessor z branch true subfunction 
 
// 
// Define floating coprocessor 1 opcodes. 
// 
 
#define FLOAT_ADD 0                     // floating add 
#define FLOAT_SUBTRACT 1                // floating subtract 
#define FLOAT_MULTIPLY 2                // floating multiply 
#define FLOAT_DIVIDE 3                  // floating divide 
#define FLOAT_SQUARE_ROOT 4             // floating square root 
#define FLOAT_ABSOLUTE 5                // floating absolute value 
#define FLOAT_MOVE 6                    // floating move 
#define FLOAT_NEGATE 7                  // floating negate 
 
#define FLOAT_ROUND_QUADWORD 8          // floating round to longword 
#define FLOAT_TRUNC_QUADWORD 9          // floating truncate to longword 
#define FLOAT_CEIL_QUADWORD 10          // floating ceiling 
#define FLOAT_FLOOR_QUADWORD 11         // floating floor 
 
#define FLOAT_ROUND_LONGWORD 12         // floating round to longword 
#define FLOAT_TRUNC_LONGWORD 13         // floating truncate to longword 
#define FLOAT_CEIL_LONGWORD 14          // floating ceiling 
#define FLOAT_FLOOR_LONGWORD 15         // floating floor 
 
#define FLOAT_ILLEGAL 16                // illegal floating opcode 
 
#define FLOAT_COMPARE_SINGLE 17         // floating compare single 
#define FLOAT_COMPARE_DOUBLE 18         // floating compare double 
 
#define FLOAT_CONVERT_SINGLE 32         // floating convert to single 
#define FLOAT_CONVERT_DOUBLE 33         // floating convert to double 
 
#define FLOAT_CONVERT_LONGWORD 36       // floating convert to longword integer 
#define FLOAT_CONVERT_QUADWORD 37       // floating convert to quadword integer 
 
#define FLOAT_COMPARE 48                // starting floating compare code 
 
// 
// Define floating format values. 
// 
 
#define FORMAT_SINGLE 0                 // single floating format 
#define FORMAT_DOUBLE 1                 // double floating format 
#define FORMAT_LONGWORD 4               // longword integer format 
#define FORMAT_QUADWORD 5               // quadword integer format 
 
// 
// Define jump indirect return address register. 
// 
 
#define JUMP_RA 0x3e00008               // jump indirect return address 
 
// 
// 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 DOUBLE_MAXIMUM_VALUE 0x7fefffffffffffff 
#define DOUBLE_MAXIMUM_VALUE_LOW 0xffffffff 
#define DOUBLE_MAXIMUM_VALUE_HIGH 0x7fefffff 
#define SINGLE_MAXIMUM_VALUE 0x7f7fffff 
 
// 
// Define single and double quite and signaling Nan values. 
// 
 
#define DOUBLE_NAN_LOW 0xffffffff 
#define DOUBLE_QUIET_NAN 0x7ff7ffff 
#define DOUBLE_SIGNAL_NAN 0x7fffffff 
#define SINGLE_QUIET_NAN 0x7fbfffff 
#define SINGLE_SIGNAL_NAN 0x7fffffff 
#define DOUBLE_INTEGER_NAN 0x7fffffffffffffff 
#define SINGLE_INTEGER_NAN 0x7fffffff 
 
// 
// Define positive single and double infinity values. 
// 
 
#define DOUBLE_INFINITY_VALUE 0x7ff0000000000000 
#define DOUBLE_INFINITY_VALUE_LOW 0x0 
#define DOUBLE_INFINITY_VALUE_HIGH 0x7ff00000 
#define SINGLE_INFINITY_VALUE 0x7f800000 
 
// 
// Define rounding modes. 
// 
 
#define ROUND_TO_NEAREST 0              // round to nearest representable value 
#define ROUND_TO_ZERO 1                 // round toward zero 
#define ROUND_TO_PLUS_INFINITY 2        // round toward plus infinity 
#define ROUND_TO_MINUS_INFINITY 3       // round toward minus infinity 
 
#endif // MIPSINST