MIPSINST.H
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:12k
源码类别:

Windows编程

开发平台:

Visual C++

  1. /*++ BUILD Version: 0001    // Increment this if a change has global effects
  2. Copyright (c) 1993-1997  Microsoft Corporation
  3. Module Name:
  4.     mipsinst.h
  5. Abstract:
  6.     Mips instruction and floating constant definitions.
  7. Author:
  8.     David N. Cutler (davec) 8-May-1992
  9. Revision History:
  10. --*/
  11. #ifndef _MIPSINST_
  12. #define _MIPSINST_
  13. //
  14. // Define MIPS instruction format structures.
  15. //
  16. typedef union _MIPS_INSTRUCTION {
  17.     ULONG Long;
  18.     UCHAR Byte[4];
  19.     struct {
  20.         ULONG Target : 26;
  21.         ULONG Opcode : 6;
  22.     } j_format;
  23.     struct {
  24.         LONG Simmediate : 16;
  25.         ULONG Rt : 5;
  26.         ULONG Rs : 5;
  27.         ULONG Opcode : 6;
  28.     } i_format;
  29.     struct {
  30.         ULONG Uimmediate : 16;
  31.         ULONG Rt : 5;
  32.         ULONG Rs : 5;
  33.         ULONG Opcode : 6;
  34.     } u_format;
  35.     struct {
  36.         ULONG Function : 6;
  37.         ULONG Re : 5;
  38.         ULONG Rd : 5;
  39.         ULONG Rt : 5;
  40.         ULONG Rs : 5;
  41.         ULONG Opcode : 6;
  42.     } r_format;
  43.     struct {
  44.         ULONG Function : 6;
  45.         ULONG Re : 5;
  46.         ULONG Rd : 5;
  47.         ULONG Rt : 5;
  48.         ULONG Format : 4;
  49.         ULONG Fill1 : 1;
  50.         ULONG Opcode : 6;
  51.     } f_format;
  52.     struct {
  53.         ULONG Function : 6;
  54.         ULONG Fd : 5;
  55.         ULONG Fs : 5;
  56.         ULONG Ft : 5;
  57.         ULONG Format : 4;
  58.         ULONG Fill1 : 1;
  59.         ULONG Opcode : 6;
  60.     } c_format;
  61. } MIPS_INSTRUCTION, *PMIPS_INSTRUCTION;
  62. //
  63. // Define MIPS instruction opcode values.
  64. //
  65. #define SPEC_OP 0x0                     // special opcode - use function field
  66. #define BCOND_OP 0x1                    // condition branch
  67. #define J_OP 0x2                        // unconditional jump
  68. #define JAL_OP 0x3                      // jump and link
  69. #define BEQ_OP 0x4                      // branch equal
  70. #define BNE_OP 0x5                      // branch not equal
  71. #define BLEZ_OP 0x6                     // branch less than or equal
  72. #define BGTZ_OP 0x7                     // branch greater than
  73. #define ADDI_OP 0x8                     // add immediate signed integer
  74. #define ADDIU_OP 0x9                    // add immediate unsigned integer
  75. #define SLTI_OP 0xa                     // set less than signed integer
  76. #define SLTIU_OP 0xb                    // set less than unsigned integer
  77. #define ANDI_OP 0xc                     // and unsigned immediate integer
  78. #define ORI_OP 0xd                      // or unsigned immediate integer
  79. #define XORI_OP 0xe                     // exclusive or unsigned immediate
  80. #define LUI_OP  0xf                     // load upper immediate integer
  81. #define COP0_OP 0x10                    // coprocessor 0 operation
  82. #define COP1_OP 0x11                    // coprocessor 1 operation
  83. #define BEQL_OP 0x14                    // branch equal likely
  84. #define BNEL_OP 0x15                    // branch not equal likely
  85. #define BLEZL_OP 0x16                   // branch less than or equal likely
  86. #define BGTZL_OP 0x17                   // branch greater than likely
  87. #define LDL_OP 0x1a                     // load double left integer
  88. #define LDR_OP 0x1b                     // load double right integer
  89. #define LB_OP 0x20                      // load byte signed integer
  90. #define LH_OP 0x21                      // load halfword signed integer
  91. #define LWL_OP 0x22                     // load word left integer
  92. #define LW_OP 0x23                      // load word integer
  93. #define LBU_OP 0x24                     // load byte unsigned integer
  94. #define LHU_OP 0x25                     // load halfword unsigned integer
  95. #define LWR_OP 0x26                     // load word right integer
  96. #define LWU_OP 0x27                     // load word unsigned integer
  97. #define SB_OP 0x28                      // store byte integer
  98. #define SH_OP 0x29                      // store halfword integer
  99. #define SWL_OP 0x2a                     // store word left integer
  100. #define SW_OP 0x2b                      // store word integer register
  101. #define SDL_OP 0x2c                     // store double left integer
  102. #define SDR_OP 0x2d                     // store double right integer
  103. #define SWR_OP 0x2e                     // store word right integer
  104. #define CACHE_OP 0x2f                   // cache operation
  105. #define LL_OP 0x30                      // load linked integer register
  106. #define LWC1_OP 0x31                    // load word floating
  107. #define LWC2_OP 0x32                    // load word coprocessor 2
  108. #define LLD_OP 0x34                     // load locked double integer
  109. #define LDC1_OP 0x35                    // load word double floating
  110. #define LDC2_OP 0x36                    // load double coprocessor 2
  111. #define LD_OP 0x37                      // load double integer
  112. #define SC_OP 0x38                      // store conditional word integer
  113. #define SWC1_OP 0x39                    // store word floating
  114. #define SWC2_OP 0x3a                    // store double coprocessor 2
  115. #define SDC_OP 0x3c                     // store conditional double integer
  116. #define SDC1_OP 0x3d                    // store double floating
  117. #define SDC2_OP 0x3e                    // store double copreocessor 2
  118. #define SD_OP 0x3f                      // store double integer register
  119. //
  120. // Define special function subopcodes.
  121. //
  122. #define SLL_OP 0x0                      // shift left logical integer
  123. #define SRL_OP 0x2                      // shift right logical integer
  124. #define SRA_OP 0x3                      // shift right arithmetic integer
  125. #define SLLV_OP 0x4                     // shift left logical variable integer
  126. #define SRLV_OP 0x6                     // shift right logical variable integer
  127. #define SRAV_OP 0x7                     // shift right arithmetic variable integer
  128. #define JR_OP 0x8                       // jump register
  129. #define JALR_OP 0x9                     // jump and link register
  130. #define SYSCALL_OP 0xc                  // system call trap
  131. #define BREAK_OP 0xd                    // breakpoint trap
  132. #define MFHI_OP 0x10                    // more from high integer
  133. #define MTHI_OP 0x11                    // move to high integer
  134. #define MFLO_OP 0x12                    // move from low integer
  135. #define MTLO_OP 0x13                    // move to low integer
  136. #define MULT_OP 0x18                    // multiply signed integer
  137. #define MULTU_OP 0x19                   // multiply unsigned integer
  138. #define DIV_OP 0x1a                     // divide signed integer
  139. #define DIVU_OP 0x1b                    // divide unsigned integer
  140. #define ADD_OP 0x20                     // add signed integer
  141. #define ADDU_OP 0x21                    // add unsigned integer
  142. #define SUP_OP 0x22                     // subtract signed integer
  143. #define SUBU_OP 0x23                    // subtract unsigned integer
  144. #define AND_OP 0x24                     // and integer
  145. #define OR_OP 0x25                      // or integer
  146. #define XOR_OP 0x26                     // exclusive or integer
  147. #define NOR_OP 0x27                     // nor integer
  148. #define SLT_OP 0x2a                     // set less signed integer
  149. #define SLTU_OP 0x2b                    // set less unsigned integer
  150. //
  151. // Define branch conditional subopcodes.
  152. //
  153. #define BLTZ_OP 0x0                     // branch less that zero integer
  154. #define BGEZ_OP 0x1                     // branch greater than or equal zero integer
  155. #define BLTZL_OP 0x2                    // branch less that zero integer liekly
  156. #define BGEZL_OP 0x3                    // branch greater than or equal zero integer likely
  157. #define BLTZAL_OP 0x10                  // branch less than zero integer and link
  158. #define BGEZAL_OP 0x11                  // branch greater than or equal zero integer and link
  159. #define BLTZALL_OP 0x12                 // branch less than zero integer and link likely
  160. #define BGEZALL_OP 0x13                 // branch greater than or equal zero integer and link likely
  161. //
  162. // Coprocessor branch true and false subfunctions and mask values.
  163. //
  164. #define COPz_BC_MASK 0x3e10000          // coprocessor z branch condition mask
  165. #define COPz_BF 0x1000000               // coprocessor z branch false subfunction
  166. #define COPz_BT 0x1010000               // coprocessor z branch true subfunction
  167. //
  168. // Define floating coprocessor 1 opcodes.
  169. //
  170. #define FLOAT_ADD 0                     // floating add
  171. #define FLOAT_SUBTRACT 1                // floating subtract
  172. #define FLOAT_MULTIPLY 2                // floating multiply
  173. #define FLOAT_DIVIDE 3                  // floating divide
  174. #define FLOAT_SQUARE_ROOT 4             // floating square root
  175. #define FLOAT_ABSOLUTE 5                // floating absolute value
  176. #define FLOAT_MOVE 6                    // floating move
  177. #define FLOAT_NEGATE 7                  // floating negate
  178. #define FLOAT_ROUND_QUADWORD 8          // floating round to longword
  179. #define FLOAT_TRUNC_QUADWORD 9          // floating truncate to longword
  180. #define FLOAT_CEIL_QUADWORD 10          // floating ceiling
  181. #define FLOAT_FLOOR_QUADWORD 11         // floating floor
  182. #define FLOAT_ROUND_LONGWORD 12         // floating round to longword
  183. #define FLOAT_TRUNC_LONGWORD 13         // floating truncate to longword
  184. #define FLOAT_CEIL_LONGWORD 14          // floating ceiling
  185. #define FLOAT_FLOOR_LONGWORD 15         // floating floor
  186. #define FLOAT_ILLEGAL 16                // illegal floating opcode
  187. #define FLOAT_COMPARE_SINGLE 17         // floating compare single
  188. #define FLOAT_COMPARE_DOUBLE 18         // floating compare double
  189. #define FLOAT_CONVERT_SINGLE 32         // floating convert to single
  190. #define FLOAT_CONVERT_DOUBLE 33         // floating convert to double
  191. #define FLOAT_CONVERT_LONGWORD 36       // floating convert to longword integer
  192. #define FLOAT_CONVERT_QUADWORD 37       // floating convert to quadword integer
  193. #define FLOAT_COMPARE 48                // starting floating compare code
  194. //
  195. // Define floating format values.
  196. //
  197. #define FORMAT_SINGLE 0                 // single floating format
  198. #define FORMAT_DOUBLE 1                 // double floating format
  199. #define FORMAT_LONGWORD 4               // longword integer format
  200. #define FORMAT_QUADWORD 5               // quadword integer format
  201. //
  202. // Define jump indirect return address register.
  203. //
  204. #define JUMP_RA 0x3e00008               // jump indirect return address
  205. //
  206. // Define maximum and minimum single and double exponent values.
  207. //
  208. #define DOUBLE_MAXIMUM_EXPONENT 2047
  209. #define DOUBLE_MINIMUM_EXPONENT 0
  210. #define SINGLE_MAXIMUM_EXPONENT 255
  211. #define SINGLE_MINIMUM_EXPONENT 0
  212. //
  213. // Define single and double exponent bias values.
  214. //
  215. #define SINGLE_EXPONENT_BIAS 127
  216. #define DOUBLE_EXPONENT_BIAS 1023
  217. //
  218. // Define the largest single and double values;
  219. //
  220. #define DOUBLE_MAXIMUM_VALUE 0x7fefffffffffffff
  221. #define DOUBLE_MAXIMUM_VALUE_LOW 0xffffffff
  222. #define DOUBLE_MAXIMUM_VALUE_HIGH 0x7fefffff
  223. #define SINGLE_MAXIMUM_VALUE 0x7f7fffff
  224. //
  225. // Define single and double quite and signaling Nan values.
  226. //
  227. #define DOUBLE_NAN_LOW 0xffffffff
  228. #define DOUBLE_QUIET_NAN 0x7ff7ffff
  229. #define DOUBLE_SIGNAL_NAN 0x7fffffff
  230. #define SINGLE_QUIET_NAN 0x7fbfffff
  231. #define SINGLE_SIGNAL_NAN 0x7fffffff
  232. #define DOUBLE_INTEGER_NAN 0x7fffffffffffffff
  233. #define SINGLE_INTEGER_NAN 0x7fffffff
  234. //
  235. // Define positive single and double infinity values.
  236. //
  237. #define DOUBLE_INFINITY_VALUE 0x7ff0000000000000
  238. #define DOUBLE_INFINITY_VALUE_LOW 0x0
  239. #define DOUBLE_INFINITY_VALUE_HIGH 0x7ff00000
  240. #define SINGLE_INFINITY_VALUE 0x7f800000
  241. //
  242. // Define rounding modes.
  243. //
  244. #define ROUND_TO_NEAREST 0              // round to nearest representable value
  245. #define ROUND_TO_ZERO 1                 // round toward zero
  246. #define ROUND_TO_PLUS_INFINITY 2        // round toward plus infinity
  247. #define ROUND_TO_MINUS_INFINITY 3       // round toward minus infinity
  248. #endif // MIPSINST