alphaopt.c
Upload User: caisha3
Upload Date: 2013-09-21
Package Size: 208739k
Code Size: 45k
Category:

Windows Develop

Development Platform:

Visual C++

  1. /*++
  2. Copyright (c) 1993  Digital Equipment Corporation
  3. Module Name:
  4.     optable.c
  5. Abstract:
  6.     Declaration for -
  7.     Table of operations, their names and charactersitics
  8.     Used by ntsd, windbg and acc's dissassembler
  9. Author:
  10.     Miche Baker-Harvey (mbh) 10-Jan-1993
  11. Revision History:
  12.     Nigel Haslock (haslock) 5-Sept-1995
  13.         Added EV56 instructions for Byte and Word aligned memory access
  14. --*/
  15. #include "precomp.h"
  16. #pragma hdrstop
  17. #include "alphaops.h"
  18. #include "alphaopt.h"
  19. #include "alphaasm.h"
  20. #define DEFINE_STRINGS
  21. #include "alphastr.h"
  22. // for strcmp
  23. #include <string.h>
  24. // for fVerboseOutput
  25. BOOLEAN fVerboseOutput = FALSE;
  26. #define NOFNCTBL (PVOID) 0
  27. #define NOSIZE (ULONG)0
  28. //
  29. // These fields are used to find the beginning of the sections
  30. // containing different "ENTRY_TYPE"s
  31. //
  32. POPTBLENTRY InvalidTab;
  33. POPTBLENTRY NonTerminalTab;
  34. POPTBLENTRY TerminalTab;
  35. POPTBLENTRY FunctionTab;
  36. ULONG        InvalidTabSize;
  37. ULONG        NonTerminalTabSize;
  38. ULONG        TerminalTabSize;
  39. ULONG        FunctionTabSize;
  40. //
  41. // THE OPCODE TABLE ITSELF
  42. //
  43. // The opcode table "opTable" describes each opcode and function.
  44. // There is an entry for each opcode, and for each function.
  45. //
  46. // The table is organized as follows:
  47. //                invalid-ops,
  48. //                non-terminal-ops,
  49. //                terminal-ops,
  50. //                functions,
  51. //
  52. //    This organization is NOT required:
  53. //           no assumptions are made on it.
  54. //
  55. //    Searches based on opcode must search
  56. //             INVALID, TERMINAL and NON_TERMINAL
  57. //
  58. //    Searches based on instruction name must search
  59. //             TERMINAL and FUNCTION
  60. //
  61. //
  62. OPTBLENTRY opTable[] = {
  63.       //
  64.       // First, the INVALID_ETYPE section.
  65.       // (opcode searches begin here)
  66.       //
  67. { "?Opc01", ParseUnknown, _01_OP, NO_FUNC, ALPHA_UNKNOWN, INVALID_ETYPE},
  68. { "?Opc02", ParseUnknown, _02_OP, NO_FUNC, ALPHA_UNKNOWN, INVALID_ETYPE},
  69. { "?Opc03", ParseUnknown, _03_OP, NO_FUNC, ALPHA_UNKNOWN, INVALID_ETYPE},
  70. { "?Opc04", ParseUnknown, _04_OP, NO_FUNC, ALPHA_UNKNOWN, INVALID_ETYPE},
  71. { "?Opc05", ParseUnknown, _05_OP, NO_FUNC, ALPHA_UNKNOWN, INVALID_ETYPE},
  72. { "?Opc06", ParseUnknown, _06_OP, NO_FUNC, ALPHA_UNKNOWN, INVALID_ETYPE},
  73. { "?Opc07", ParseUnknown, _07_OP, NO_FUNC, ALPHA_UNKNOWN, INVALID_ETYPE},
  74. //{ "?Opc0A", ParseUnknown, _0A_OP, NO_FUNC, ALPHA_UNKNOWN, INVALID_ETYPE},
  75. //{ "?Opc0C", ParseUnknown, _0C_OP, NO_FUNC, ALPHA_UNKNOWN, INVALID_ETYPE},
  76. //{ "?Opc0D", ParseUnknown, _0D_OP, NO_FUNC, ALPHA_UNKNOWN, INVALID_ETYPE},
  77. //{ "?Opc0E", ParseUnknown, _0E_OP, NO_FUNC, ALPHA_UNKNOWN, INVALID_ETYPE},
  78. { "?Opc14", ParseUnknown, _14_OP, NO_FUNC, ALPHA_UNKNOWN, INVALID_ETYPE},
  79. //{ "?Opc1C", ParseUnknown, _1C_OP, NO_FUNC, ALPHA_UNKNOWN, INVALID_ETYPE},
  80. //
  81. //         This is what hasn't been done yet -
  82. //  the EV4 stuff - there are no names for it
  83. //  in the alphaops.h header file.  Should we
  84. //  put them there?  Should they be elsewhere?
  85. //  Do we want to assemble them?
  86. //
  87. // For the moment, just pretend they are invalid.  They never
  88. // come up for all practical purposes, anyway.
  89. //
  90. { "MFPR", ParseUnknown, MFPR_OP, NO_FUNC,
  91.                                       ALPHA_EV4_PR, INVALID_ETYPE },
  92. { "MTPR", ParseUnknown, MTPR_OP, NO_FUNC,
  93.                                       ALPHA_EV4_PR, INVALID_ETYPE },
  94.       //
  95.       // Secondly, the NON_TERMINAL_ETYPE section
  96.       //
  97. {  NOFNCTBL, NOSIZE, CALLPAL_OP, NO_FUNC,
  98.                                    ALPHA_CALLPAL, NON_TERMINAL_ETYPE },
  99. {  NOFNCTBL, NOSIZE, ARITH_OP, NO_FUNC,
  100.                                    ALPHA_OPERATE, NON_TERMINAL_ETYPE },
  101. {  NOFNCTBL, NOSIZE, BIT_OP, NO_FUNC,
  102.                                    ALPHA_OPERATE, NON_TERMINAL_ETYPE },
  103. {  NOFNCTBL, NOSIZE, BYTE_OP, NO_FUNC,
  104.                                    ALPHA_OPERATE, NON_TERMINAL_ETYPE },
  105. {  NOFNCTBL, NOSIZE, SEXT_OP, NO_FUNC,
  106.                                    ALPHA_OPERATE, NON_TERMINAL_ETYPE },
  107. {  NOFNCTBL, NOSIZE, MUL_OP, NO_FUNC,
  108.                                    ALPHA_OPERATE, NON_TERMINAL_ETYPE },
  109. {  NOFNCTBL, NOSIZE, MEMSPC_OP, NO_FUNC,
  110.                                    ALPHA_MEMSPC,  NON_TERMINAL_ETYPE },
  111. {  NOFNCTBL, NOSIZE, JMP_OP, NO_FUNC,
  112.                                    ALPHA_JUMP,    NON_TERMINAL_ETYPE },
  113. {  NOFNCTBL, NOSIZE, VAXFP_OP, NO_FUNC,
  114.                                    ALPHA_FP_OPERATE, NON_TERMINAL_ETYPE },
  115. {  NOFNCTBL, NOSIZE, IEEEFP_OP, NO_FUNC,
  116.                                    ALPHA_FP_OPERATE, NON_TERMINAL_ETYPE },
  117. {  NOFNCTBL, NOSIZE, FPOP_OP,    NO_FUNC,
  118.                                    ALPHA_FP_OPERATE, NON_TERMINAL_ETYPE },
  119.       //
  120.       // Thirdly, the TERMINAL_ETYPE section
  121.       // (everything from here on has an instruction name)
  122.       //
  123. { szLda,   ParseIntMemory, LDA_OP,  NO_FUNC, ALPHA_MEMORY, TERMINAL_ETYPE },
  124. { szLdah,  ParseIntMemory, LDAH_OP, NO_FUNC, ALPHA_MEMORY, TERMINAL_ETYPE },
  125. { szLdl,   ParseIntMemory, LDL_OP,  NO_FUNC, ALPHA_MEMORY, TERMINAL_ETYPE },
  126. { szLdq,   ParseIntMemory, LDQ_OP,  NO_FUNC, ALPHA_MEMORY, TERMINAL_ETYPE },
  127. { szLdf,   ParseFltMemory, LDF_OP,  NO_FUNC, ALPHA_FP_MEMORY, TERMINAL_ETYPE },
  128. { szLdg,   ParseFltMemory, LDG_OP,  NO_FUNC, ALPHA_FP_MEMORY, TERMINAL_ETYPE },
  129. { szLds,   ParseFltMemory, LDS_OP,  NO_FUNC, ALPHA_FP_MEMORY, TERMINAL_ETYPE },
  130. { szLdt,   ParseFltMemory, LDT_OP,  NO_FUNC, ALPHA_FP_MEMORY, TERMINAL_ETYPE },
  131. { szLdq_u, ParseIntMemory, LDQ_U_OP,NO_FUNC, ALPHA_MEMORY, TERMINAL_ETYPE },
  132. { szLdl_l, ParseIntMemory, LDL_L_OP,NO_FUNC, ALPHA_MEMORY, TERMINAL_ETYPE },
  133. { szLdq_l, ParseIntMemory, LDQ_L_OP,NO_FUNC, ALPHA_MEMORY, TERMINAL_ETYPE },
  134. { szLdbu,  ParseIntMemory, LDBU_OP, NO_FUNC, ALPHA_MEMORY, TERMINAL_ETYPE },
  135. { szLdbu,  ParseIntMemory, LDWU_OP, NO_FUNC, ALPHA_MEMORY, TERMINAL_ETYPE },
  136. { szStl,   ParseIntMemory, STL_OP,  NO_FUNC, ALPHA_MEMORY, TERMINAL_ETYPE },
  137. { szStq,   ParseIntMemory, STQ_OP,  NO_FUNC, ALPHA_MEMORY, TERMINAL_ETYPE },
  138. { szStf,   ParseFltMemory, STF_OP,  NO_FUNC, ALPHA_FP_MEMORY, TERMINAL_ETYPE },
  139. { szStg,   ParseFltMemory, STG_OP,  NO_FUNC, ALPHA_FP_MEMORY, TERMINAL_ETYPE },
  140. { szSts,   ParseFltMemory, STS_OP,  NO_FUNC, ALPHA_FP_MEMORY, TERMINAL_ETYPE },
  141. { szStt,   ParseFltMemory, STT_OP,  NO_FUNC, ALPHA_FP_MEMORY, TERMINAL_ETYPE },
  142. { szStq_u, ParseIntMemory, STQ_U_OP,NO_FUNC, ALPHA_MEMORY, TERMINAL_ETYPE },
  143. { szStl_c, ParseIntMemory, STL_C_OP,NO_FUNC, ALPHA_MEMORY, TERMINAL_ETYPE },
  144. { szStq_c, ParseIntMemory, STQ_C_OP,NO_FUNC, ALPHA_MEMORY, TERMINAL_ETYPE },
  145. { szStb,   ParseIntMemory, STB_OP,  NO_FUNC, ALPHA_MEMORY, TERMINAL_ETYPE },
  146. { szStw,   ParseIntMemory, STW_OP,  NO_FUNC, ALPHA_MEMORY, TERMINAL_ETYPE },
  147. { szBeq,   ParseIntBranch, BEQ_OP,  NO_FUNC, ALPHA_BRANCH, TERMINAL_ETYPE },
  148. { szBne,   ParseIntBranch, BNE_OP,  NO_FUNC, ALPHA_BRANCH, TERMINAL_ETYPE },
  149. { szBlt,   ParseIntBranch, BLT_OP,  NO_FUNC, ALPHA_BRANCH, TERMINAL_ETYPE },
  150. { szBle,   ParseIntBranch, BLE_OP,  NO_FUNC, ALPHA_BRANCH, TERMINAL_ETYPE },
  151. { szBgt,   ParseIntBranch, BGT_OP,  NO_FUNC, ALPHA_BRANCH, TERMINAL_ETYPE },
  152. { szBge,   ParseIntBranch, BGE_OP,  NO_FUNC, ALPHA_BRANCH, TERMINAL_ETYPE },
  153. { szBlbc,  ParseIntBranch, BLBC_OP, NO_FUNC, ALPHA_BRANCH, TERMINAL_ETYPE },
  154. { szBlbs,  ParseIntBranch, BLBS_OP, NO_FUNC, ALPHA_BRANCH, TERMINAL_ETYPE },
  155. { szBr,    ParseIntBranch, BR_OP,   NO_FUNC, ALPHA_BRANCH, TERMINAL_ETYPE },
  156. { szBsr,   ParseIntBranch, BSR_OP,  NO_FUNC, ALPHA_BRANCH, TERMINAL_ETYPE },
  157. { szFbeq,  ParseFltBranch, FBEQ_OP, NO_FUNC, ALPHA_FP_BRANCH, TERMINAL_ETYPE },
  158. { szFbne,  ParseFltBranch, FBNE_OP, NO_FUNC, ALPHA_FP_BRANCH, TERMINAL_ETYPE },
  159. { szFblt,  ParseFltBranch, FBLT_OP, NO_FUNC, ALPHA_FP_BRANCH, TERMINAL_ETYPE },
  160. { szFble,  ParseFltBranch, FBLE_OP, NO_FUNC, ALPHA_FP_BRANCH, TERMINAL_ETYPE },
  161. { szFbgt,  ParseFltBranch, FBGT_OP, NO_FUNC, ALPHA_FP_BRANCH, TERMINAL_ETYPE },
  162. { szFbge,  ParseFltBranch, FBGE_OP, NO_FUNC, ALPHA_FP_BRANCH, TERMINAL_ETYPE },
  163. { "REI",   ParseUnknown, PAL1B_OP, NO_FUNC, ALPHA_EV4_REI, TERMINAL_ETYPE},
  164. { "HW_LD", ParseUnknown, PAL1E_OP, NO_FUNC, ALPHA_EV4_MEM, TERMINAL_ETYPE},
  165. { "HW_ST", ParseUnknown, PAL1F_OP, NO_FUNC, ALPHA_EV4_MEM, TERMINAL_ETYPE},
  166.       //
  167.       // Fourthly, (and finally) the FUNCTION_ETYPE section
  168.       // (opcode searches needn't include this section)
  169.       //
  170.            //
  171.            // The memory-special functions
  172.            //
  173. { szMb,   ParseMemSpec, MEMSPC_OP, MB_FUNC,    ALPHA_MEMSPC, FUNCTION_ETYPE },
  174. { szWmb,  ParseMemSpec, MEMSPC_OP, WMB_FUNC,   ALPHA_MEMSPC, FUNCTION_ETYPE },
  175. { szMb2,  ParseMemSpec, MEMSPC_OP, MB2_FUNC,   ALPHA_MEMSPC, FUNCTION_ETYPE },
  176. { szMb3,  ParseMemSpec, MEMSPC_OP, MB3_FUNC,   ALPHA_MEMSPC, FUNCTION_ETYPE },
  177. { szFetch,ParseMemSpec, MEMSPC_OP, FETCH_FUNC, ALPHA_MEMSPC, FUNCTION_ETYPE },
  178. { szFetch_m,ParseMemSpec,MEMSPC_OP,FETCH_M_FUNC,ALPHA_MEMSPC,FUNCTION_ETYPE },
  179. { szRs,   ParseMemSpec, MEMSPC_OP, RS_FUNC,    ALPHA_MEMSPC, FUNCTION_ETYPE },
  180. { szTrapb,ParseMemSpec, MEMSPC_OP, TRAPB_FUNC, ALPHA_MEMSPC, FUNCTION_ETYPE },
  181. { szExcb, ParseMemSpec, MEMSPC_OP, EXCB_FUNC,  ALPHA_MEMSPC, FUNCTION_ETYPE },
  182. { szRpcc, ParseMemSpec, MEMSPC_OP, RPCC_FUNC,  ALPHA_MEMSPC, FUNCTION_ETYPE },
  183. { szRc,   ParseMemSpec, MEMSPC_OP, RC_FUNC,    ALPHA_MEMSPC, FUNCTION_ETYPE },
  184.            //
  185.            // The jump functions
  186.            //
  187. { szJmp,  ParseJump,  JMP_OP, JMP_FUNC, ALPHA_JUMP, FUNCTION_ETYPE },
  188. { szJsr,  ParseJump,  JMP_OP, JSR_FUNC, ALPHA_JUMP, FUNCTION_ETYPE },
  189. { szRet,  ParseJump,  JMP_OP, RET_FUNC, ALPHA_JUMP, FUNCTION_ETYPE },
  190. { szJsr_co,  ParseJump,  JMP_OP, JSR_CO_FUNC, ALPHA_JUMP, FUNCTION_ETYPE },
  191.            //
  192.            // The arithmetic ops, which are ALPHA_OPERATE
  193.            //
  194. { szAddl,   ParseIntOp, ARITH_OP, ADDL_FUNC,  ALPHA_OPERATE, FUNCTION_ETYPE },
  195. { szAddlv,  ParseIntOp, ARITH_OP, ADDLV_FUNC, ALPHA_OPERATE, FUNCTION_ETYPE },
  196. { szAddq,   ParseIntOp, ARITH_OP, ADDQ_FUNC,  ALPHA_OPERATE, FUNCTION_ETYPE },
  197. { szAddqv,  ParseIntOp, ARITH_OP, ADDQV_FUNC, ALPHA_OPERATE, FUNCTION_ETYPE },
  198. { szSubl,   ParseIntOp, ARITH_OP, SUBL_FUNC,  ALPHA_OPERATE, FUNCTION_ETYPE },
  199. { szSublv,  ParseIntOp, ARITH_OP, SUBLV_FUNC, ALPHA_OPERATE, FUNCTION_ETYPE },
  200. { szSubq,   ParseIntOp, ARITH_OP, SUBQ_FUNC,  ALPHA_OPERATE, FUNCTION_ETYPE },
  201. { szSubqv,  ParseIntOp, ARITH_OP, SUBQV_FUNC, ALPHA_OPERATE, FUNCTION_ETYPE },
  202. { szCmpeq,  ParseIntOp, ARITH_OP, CMPEQ_FUNC,  ALPHA_OPERATE, FUNCTION_ETYPE },
  203. { szCmplt,  ParseIntOp, ARITH_OP, CMPLT_FUNC,  ALPHA_OPERATE, FUNCTION_ETYPE },
  204. { szCmple,  ParseIntOp, ARITH_OP, CMPLE_FUNC,  ALPHA_OPERATE, FUNCTION_ETYPE },
  205. { szCmpult, ParseIntOp, ARITH_OP, CMPULT_FUNC, ALPHA_OPERATE, FUNCTION_ETYPE },
  206. { szCmpule, ParseIntOp, ARITH_OP, CMPULE_FUNC, ALPHA_OPERATE, FUNCTION_ETYPE },
  207. { szCmpbge, ParseIntOp, ARITH_OP, CMPBGE_FUNC, ALPHA_OPERATE, FUNCTION_ETYPE },
  208. { szS4addl, ParseIntOp, ARITH_OP, S4ADDL_FUNC, ALPHA_OPERATE, FUNCTION_ETYPE },
  209. { szS4addq, ParseIntOp, ARITH_OP, S4ADDQ_FUNC, ALPHA_OPERATE, FUNCTION_ETYPE },
  210. { szS4subl, ParseIntOp, ARITH_OP, S4SUBL_FUNC, ALPHA_OPERATE, FUNCTION_ETYPE },
  211. { szS4subq, ParseIntOp, ARITH_OP, S4SUBQ_FUNC, ALPHA_OPERATE, FUNCTION_ETYPE },
  212. { szS8addl, ParseIntOp, ARITH_OP, S8ADDL_FUNC, ALPHA_OPERATE, FUNCTION_ETYPE },
  213. { szS8addq, ParseIntOp, ARITH_OP, S8ADDQ_FUNC, ALPHA_OPERATE, FUNCTION_ETYPE },
  214. { szS8subl, ParseIntOp, ARITH_OP, S8SUBL_FUNC, ALPHA_OPERATE, FUNCTION_ETYPE },
  215. { szS8subq, ParseIntOp, ARITH_OP, S8SUBQ_FUNC, ALPHA_OPERATE, FUNCTION_ETYPE },
  216.            //
  217.            // The bit ops, which are ALPHA_OPERATE
  218.            //
  219. { szAnd,   ParseIntOp, BIT_OP, AND_FUNC,   ALPHA_OPERATE, FUNCTION_ETYPE },
  220. { szBic,   ParseIntOp, BIT_OP, BIC_FUNC,   ALPHA_OPERATE, FUNCTION_ETYPE },
  221. { szBis,   ParseIntOp, BIT_OP, BIS_FUNC,   ALPHA_OPERATE, FUNCTION_ETYPE },
  222. { szOrnot, ParseIntOp, BIT_OP, ORNOT_FUNC, ALPHA_OPERATE, FUNCTION_ETYPE },
  223. { szXor,   ParseIntOp, BIT_OP, XOR_FUNC,   ALPHA_OPERATE, FUNCTION_ETYPE },
  224. { szEqv,   ParseIntOp, BIT_OP, EQV_FUNC,   ALPHA_OPERATE, FUNCTION_ETYPE },
  225. { szCmoveq,  ParseIntOp, BIT_OP, CMOVEQ_FUNC,  ALPHA_OPERATE, FUNCTION_ETYPE },
  226. { szCmovne,  ParseIntOp, BIT_OP, CMOVNE_FUNC,  ALPHA_OPERATE, FUNCTION_ETYPE },
  227. { szCmovlbs, ParseIntOp, BIT_OP, CMOVLBS_FUNC, ALPHA_OPERATE, FUNCTION_ETYPE },
  228. { szCmovlt,  ParseIntOp, BIT_OP, CMOVLT_FUNC,  ALPHA_OPERATE, FUNCTION_ETYPE },
  229. { szCmovge,  ParseIntOp, BIT_OP, CMOVGE_FUNC,  ALPHA_OPERATE, FUNCTION_ETYPE },
  230. { szCmovlbc, ParseIntOp, BIT_OP, CMOVLBC_FUNC, ALPHA_OPERATE, FUNCTION_ETYPE },
  231. { szCmovle,  ParseIntOp, BIT_OP, CMOVLE_FUNC,  ALPHA_OPERATE, FUNCTION_ETYPE },
  232. { szCmovgt,  ParseIntOp, BIT_OP, CMOVGT_FUNC,  ALPHA_OPERATE, FUNCTION_ETYPE },
  233.            //
  234.            // The byte ops, which are ALPHA_OPERATE
  235.            //
  236. { szSll,    ParseIntOp, BYTE_OP, SLL_FUNC,    ALPHA_OPERATE, FUNCTION_ETYPE },
  237. { szSra,    ParseIntOp, BYTE_OP, SRA_FUNC,    ALPHA_OPERATE, FUNCTION_ETYPE },
  238. { szSrl,    ParseIntOp, BYTE_OP, SRL_FUNC,    ALPHA_OPERATE, FUNCTION_ETYPE },
  239. { szExtbl,  ParseIntOp, BYTE_OP, EXTBL_FUNC,  ALPHA_OPERATE, FUNCTION_ETYPE },
  240. { szExtwl,  ParseIntOp, BYTE_OP, EXTWL_FUNC,  ALPHA_OPERATE, FUNCTION_ETYPE },
  241. { szExtll,  ParseIntOp, BYTE_OP, EXTLL_FUNC,  ALPHA_OPERATE, FUNCTION_ETYPE },
  242. { szExtql,  ParseIntOp, BYTE_OP, EXTQL_FUNC,  ALPHA_OPERATE, FUNCTION_ETYPE },
  243. { szExtwh,  ParseIntOp, BYTE_OP, EXTWH_FUNC,  ALPHA_OPERATE, FUNCTION_ETYPE },
  244. { szExtlh,  ParseIntOp, BYTE_OP, EXTLH_FUNC,  ALPHA_OPERATE, FUNCTION_ETYPE },
  245. { szExtqh,  ParseIntOp, BYTE_OP, EXTQH_FUNC,  ALPHA_OPERATE, FUNCTION_ETYPE },
  246. { szInsbl,  ParseIntOp, BYTE_OP, INSBL_FUNC,  ALPHA_OPERATE, FUNCTION_ETYPE },
  247. { szInswl,  ParseIntOp, BYTE_OP, INSWL_FUNC,  ALPHA_OPERATE, FUNCTION_ETYPE },
  248. { szInsll,  ParseIntOp, BYTE_OP, INSLL_FUNC,  ALPHA_OPERATE, FUNCTION_ETYPE },
  249. { szInsql,  ParseIntOp, BYTE_OP, INSQL_FUNC,  ALPHA_OPERATE, FUNCTION_ETYPE },
  250. { szInswh,  ParseIntOp, BYTE_OP, INSWH_FUNC,  ALPHA_OPERATE, FUNCTION_ETYPE },
  251. { szInslh,  ParseIntOp, BYTE_OP, INSLH_FUNC,  ALPHA_OPERATE, FUNCTION_ETYPE },
  252. { szInsqh,  ParseIntOp, BYTE_OP, INSQH_FUNC,  ALPHA_OPERATE, FUNCTION_ETYPE },
  253. { szMskbl,  ParseIntOp, BYTE_OP, MSKBL_FUNC,  ALPHA_OPERATE, FUNCTION_ETYPE },
  254. { szMskwl,  ParseIntOp, BYTE_OP, MSKWL_FUNC,  ALPHA_OPERATE, FUNCTION_ETYPE },
  255. { szMskll,  ParseIntOp, BYTE_OP, MSKLL_FUNC,  ALPHA_OPERATE, FUNCTION_ETYPE },
  256. { szMskql,  ParseIntOp, BYTE_OP, MSKQL_FUNC,  ALPHA_OPERATE, FUNCTION_ETYPE },
  257. { szMskwh,  ParseIntOp, BYTE_OP, MSKWH_FUNC,  ALPHA_OPERATE, FUNCTION_ETYPE },
  258. { szMsklh,  ParseIntOp, BYTE_OP, MSKLH_FUNC,  ALPHA_OPERATE, FUNCTION_ETYPE },
  259. { szMskqh,  ParseIntOp, BYTE_OP, MSKQH_FUNC,  ALPHA_OPERATE, FUNCTION_ETYPE },
  260. { szZap,    ParseIntOp, BYTE_OP, ZAP_FUNC,    ALPHA_OPERATE, FUNCTION_ETYPE },
  261. { szZapnot, ParseIntOp, BYTE_OP, ZAPNOT_FUNC, ALPHA_OPERATE, FUNCTION_ETYPE },
  262.            //
  263.            // The multiply ops, which are ALPHA_OPERATE
  264.            //
  265. { szMull,   ParseIntOp,  MUL_OP, MULL_FUNC,  ALPHA_OPERATE, FUNCTION_ETYPE },
  266. { szMulqv,  ParseIntOp,  MUL_OP, MULQV_FUNC, ALPHA_OPERATE, FUNCTION_ETYPE },
  267. { szMullv,  ParseIntOp,  MUL_OP, MULLV_FUNC, ALPHA_OPERATE, FUNCTION_ETYPE },
  268. { szUmulh,  ParseIntOp,  MUL_OP, UMULH_FUNC, ALPHA_OPERATE, FUNCTION_ETYPE },
  269. { szMulq,   ParseIntOp,  MUL_OP, MULQ_FUNC,  ALPHA_OPERATE, FUNCTION_ETYPE },
  270.            //
  271.            // The SEXT ops, which are ALPHA_OPERATE
  272.            //
  273. { szSextb,  ParseIntOp, SEXT_OP, SEXTB_FUNC,  ALPHA_OPERATE, FUNCTION_ETYPE },
  274. { szSextw,  ParseIntOp, SEXT_OP, SEXTW_FUNC,  ALPHA_OPERATE, FUNCTION_ETYPE },
  275.            //
  276.            // The call pal functions
  277.            //
  278. { szBpt,       ParsePal, CALLPAL_OP,  BPT_FUNC,
  279.                                   ALPHA_CALLPAL, FUNCTION_ETYPE },
  280. { szCallsys,   ParsePal, CALLPAL_OP, CALLSYS_FUNC,
  281.                                   ALPHA_CALLPAL, FUNCTION_ETYPE },
  282. { szImb,       ParsePal, CALLPAL_OP, IMB_FUNC,
  283.                                   ALPHA_CALLPAL, FUNCTION_ETYPE },
  284. { szRdteb,     ParsePal, CALLPAL_OP, RDTEB_FUNC,
  285.                                   ALPHA_CALLPAL, FUNCTION_ETYPE },
  286. { szGentrap,   ParsePal, CALLPAL_OP, GENTRAP_FUNC,
  287.                                   ALPHA_CALLPAL, FUNCTION_ETYPE },
  288. { szKbpt,      ParsePal, CALLPAL_OP, KBPT_FUNC,
  289.                                   ALPHA_CALLPAL, FUNCTION_ETYPE },
  290. { szCallKD,    ParsePal, CALLPAL_OP, CALLKD_FUNC,
  291.                                   ALPHA_CALLPAL, FUNCTION_ETYPE },
  292. { szHalt, ParsePal, CALLPAL_OP, HALT_FUNC,
  293.                                   ALPHA_CALLPAL, FUNCTION_ETYPE },
  294. { szRestart, ParsePal, CALLPAL_OP, RESTART_FUNC,
  295.                                   ALPHA_CALLPAL, FUNCTION_ETYPE },
  296. { szDraina, ParsePal, CALLPAL_OP, DRAINA_FUNC,
  297.                                   ALPHA_CALLPAL, FUNCTION_ETYPE },
  298. { szInitpal, ParsePal, CALLPAL_OP, INITPAL_FUNC,
  299.                                   ALPHA_CALLPAL, FUNCTION_ETYPE },
  300. { szWrentry, ParsePal, CALLPAL_OP, WRENTRY_FUNC,
  301.                                   ALPHA_CALLPAL, FUNCTION_ETYPE },
  302. { szSwpirql, ParsePal, CALLPAL_OP, SWPIRQL_FUNC,
  303.                                   ALPHA_CALLPAL, FUNCTION_ETYPE },
  304. { szRdirql, ParsePal, CALLPAL_OP, RDIRQL_FUNC,
  305.                                   ALPHA_CALLPAL, FUNCTION_ETYPE },
  306. { szDi, ParsePal, CALLPAL_OP, DI_FUNC,
  307.                                   ALPHA_CALLPAL, FUNCTION_ETYPE },
  308. { szEi, ParsePal, CALLPAL_OP, EI_FUNC,
  309.                                   ALPHA_CALLPAL, FUNCTION_ETYPE },
  310. { szSwppal, ParsePal, CALLPAL_OP, SWPPAL_FUNC,
  311.                                   ALPHA_CALLPAL, FUNCTION_ETYPE },
  312. { szSsir, ParsePal, CALLPAL_OP, SSIR_FUNC,
  313.                                   ALPHA_CALLPAL, FUNCTION_ETYPE },
  314. { szCsir, ParsePal, CALLPAL_OP, CSIR_FUNC,
  315.                                   ALPHA_CALLPAL, FUNCTION_ETYPE },
  316. { szRfe, ParsePal, CALLPAL_OP, RFE_FUNC,
  317.                                   ALPHA_CALLPAL, FUNCTION_ETYPE },
  318. { szRetsys, ParsePal, CALLPAL_OP, RETSYS_FUNC,
  319.                                   ALPHA_CALLPAL, FUNCTION_ETYPE },
  320. { szSwpctx, ParsePal, CALLPAL_OP, SWPCTX_FUNC,
  321.                                   ALPHA_CALLPAL, FUNCTION_ETYPE },
  322. { szSwpprocess, ParsePal, CALLPAL_OP, SWPPROCESS_FUNC,
  323.                                   ALPHA_CALLPAL, FUNCTION_ETYPE },
  324. { szRdmces, ParsePal, CALLPAL_OP, RDMCES_FUNC,
  325.                                   ALPHA_CALLPAL, FUNCTION_ETYPE },
  326. { szWrmces, ParsePal, CALLPAL_OP, WRMCES_FUNC,
  327.                                   ALPHA_CALLPAL, FUNCTION_ETYPE },
  328. { szTbia, ParsePal, CALLPAL_OP, TBIA_FUNC,
  329.                                   ALPHA_CALLPAL, FUNCTION_ETYPE },
  330. { szTbis, ParsePal, CALLPAL_OP, TBIS_FUNC,
  331.                                   ALPHA_CALLPAL, FUNCTION_ETYPE },
  332. { szDtbis, ParsePal, CALLPAL_OP, DTBIS_FUNC,
  333.                                   ALPHA_CALLPAL, FUNCTION_ETYPE },
  334. { szRdksp, ParsePal, CALLPAL_OP, RDKSP_FUNC,
  335.                                   ALPHA_CALLPAL, FUNCTION_ETYPE },
  336. { szSwpksp, ParsePal, CALLPAL_OP, SWPKSP_FUNC,
  337.                                   ALPHA_CALLPAL, FUNCTION_ETYPE },
  338. { szRdpsr, ParsePal, CALLPAL_OP, RDPSR_FUNC,
  339.                                   ALPHA_CALLPAL, FUNCTION_ETYPE },
  340. { szRdpcr, ParsePal, CALLPAL_OP, RDPCR_FUNC,
  341.                                   ALPHA_CALLPAL, FUNCTION_ETYPE },
  342. { szRdthread, ParsePal, CALLPAL_OP, RDTHREAD_FUNC,
  343.                                   ALPHA_CALLPAL, FUNCTION_ETYPE },
  344. { szRdcounters, ParsePal, CALLPAL_OP, RDCOUNTERS_FUNC,
  345.                                   ALPHA_CALLPAL, FUNCTION_ETYPE },
  346. { szRdstate, ParsePal, CALLPAL_OP, RDSTATE_FUNC,
  347.                                   ALPHA_CALLPAL, FUNCTION_ETYPE },
  348. { szInitpcr, ParsePal, CALLPAL_OP, INITPCR_FUNC,
  349.                                   ALPHA_CALLPAL, FUNCTION_ETYPE },
  350. { szWrperfmon, ParsePal, CALLPAL_OP, WRPERFMON_FUNC,
  351.                                   ALPHA_CALLPAL, FUNCTION_ETYPE },
  352. { szMt, ParsePal, CALLPAL_OP, MTPR_OP,
  353.                                   ALPHA_CALLPAL, FUNCTION_ETYPE },
  354. { szMf, ParsePal, CALLPAL_OP, MFPR_OP,
  355.                                   ALPHA_CALLPAL, FUNCTION_ETYPE },
  356. { szHwld, ParsePal, CALLPAL_OP, HWLD_OP,
  357.                                   ALPHA_CALLPAL, FUNCTION_ETYPE },
  358. { szHwst, ParsePal, CALLPAL_OP, HWST_OP,
  359.                                   ALPHA_CALLPAL, FUNCTION_ETYPE },
  360. { szRei, ParsePal, CALLPAL_OP, REI_OP,
  361.                                   ALPHA_CALLPAL, FUNCTION_ETYPE },
  362.            //
  363.            // The VAX Floating point functions
  364.            //
  365. { szAddf,   ParseUnknown, VAXFP_OP, ADDF_FUNC,
  366.                                     ALPHA_FP_OPERATE, FUNCTION_ETYPE },
  367. { szCvtdg,  ParseUnknown, VAXFP_OP, CVTDG_FUNC,
  368.                                     ALPHA_FP_CONVERT, FUNCTION_ETYPE },
  369. { szAddg,   ParseUnknown, VAXFP_OP, ADDG_FUNC,
  370.                                     ALPHA_FP_OPERATE, FUNCTION_ETYPE },
  371. { szCmpgeq, ParseUnknown, VAXFP_OP, CMPGEQ_FUNC,
  372.                                     ALPHA_FP_OPERATE, FUNCTION_ETYPE },
  373. { szCmpglt, ParseUnknown, VAXFP_OP, CMPGLT_FUNC,
  374.                                     ALPHA_FP_OPERATE, FUNCTION_ETYPE },
  375. { szCmpgle, ParseUnknown, VAXFP_OP, CMPGLE_FUNC,
  376.                                     ALPHA_FP_OPERATE, FUNCTION_ETYPE },
  377. { szCvtgf,  ParseUnknown, VAXFP_OP, CVTGF_FUNC,
  378.                                     ALPHA_FP_CONVERT, FUNCTION_ETYPE },
  379. { szCvtgd,  ParseUnknown, VAXFP_OP, CVTGD_FUNC,
  380.                                     ALPHA_FP_CONVERT, FUNCTION_ETYPE },
  381. { szCvtqf,  ParseUnknown, VAXFP_OP, CVTQF_FUNC,
  382.                                     ALPHA_FP_CONVERT, FUNCTION_ETYPE },
  383. { szCvtqg,  ParseUnknown, VAXFP_OP, CVTQG_FUNC,
  384.                                     ALPHA_FP_CONVERT, FUNCTION_ETYPE },
  385. { szDivf,   ParseUnknown, VAXFP_OP, DIVF_FUNC,
  386.                                     ALPHA_FP_OPERATE, FUNCTION_ETYPE },
  387. { szDivg,   ParseUnknown, VAXFP_OP, DIVG_FUNC,
  388.                                     ALPHA_FP_OPERATE, FUNCTION_ETYPE },
  389. { szMulf,   ParseUnknown, VAXFP_OP, MULF_FUNC,
  390.                                     ALPHA_FP_OPERATE, FUNCTION_ETYPE },
  391. { szMulg,   ParseUnknown, VAXFP_OP, MULG_FUNC,
  392.                                     ALPHA_FP_OPERATE, FUNCTION_ETYPE },
  393. { szSubf,   ParseUnknown, VAXFP_OP, SUBF_FUNC,
  394.                                     ALPHA_FP_OPERATE, FUNCTION_ETYPE },
  395. { szSubg,   ParseUnknown, VAXFP_OP, SUBG_FUNC,
  396.                                     ALPHA_FP_OPERATE, FUNCTION_ETYPE },
  397. { szCvtgq,  ParseUnknown, VAXFP_OP, CVTGQ_FUNC,
  398.                                     ALPHA_FP_CONVERT, FUNCTION_ETYPE },
  399.            //
  400.            // The IEEE Floating point functions
  401.            //
  402. { szAdds,   ParseUnknown, IEEEFP_OP, ADDS_FUNC,
  403.                                      ALPHA_FP_OPERATE, FUNCTION_ETYPE },
  404. { szSubs,   ParseUnknown, IEEEFP_OP, SUBS_FUNC,
  405.                                      ALPHA_FP_OPERATE, FUNCTION_ETYPE },
  406. { szMuls,   ParseUnknown, IEEEFP_OP, MULS_FUNC,
  407.                                      ALPHA_FP_OPERATE, FUNCTION_ETYPE },
  408. { szDivs,   ParseUnknown, IEEEFP_OP, DIVS_FUNC,
  409.                                      ALPHA_FP_OPERATE, FUNCTION_ETYPE },
  410. { szAddt,   ParseUnknown, IEEEFP_OP, ADDT_FUNC,
  411.                                      ALPHA_FP_OPERATE, FUNCTION_ETYPE },
  412. { szSubt,   ParseUnknown, IEEEFP_OP, SUBT_FUNC,
  413.                                      ALPHA_FP_OPERATE, FUNCTION_ETYPE },
  414. { szMult,   ParseUnknown, IEEEFP_OP, MULT_FUNC,
  415.                                      ALPHA_FP_OPERATE, FUNCTION_ETYPE },
  416. { szDivt,   ParseUnknown, IEEEFP_OP, DIVT_FUNC,
  417.                                      ALPHA_FP_OPERATE, FUNCTION_ETYPE },
  418. { szCmptun, ParseUnknown, IEEEFP_OP, CMPTUN_FUNC,
  419.                                      ALPHA_FP_OPERATE, FUNCTION_ETYPE },
  420. { szCmpteq, ParseUnknown, IEEEFP_OP, CMPTEQ_FUNC,
  421.                                      ALPHA_FP_OPERATE, FUNCTION_ETYPE },
  422. { szCmptlt, ParseUnknown, IEEEFP_OP, CMPTLT_FUNC,
  423.                                      ALPHA_FP_OPERATE, FUNCTION_ETYPE },
  424. { szCmptle, ParseUnknown, IEEEFP_OP, CMPTLE_FUNC,
  425.                                      ALPHA_FP_OPERATE, FUNCTION_ETYPE },
  426. { szCvtts,  ParseUnknown, IEEEFP_OP, CVTTS_FUNC,
  427.                                      ALPHA_FP_CONVERT, FUNCTION_ETYPE },
  428. { szCvttq,  ParseUnknown, IEEEFP_OP, CVTTQ_FUNC,
  429.                                      ALPHA_FP_CONVERT, FUNCTION_ETYPE },
  430. { szCvtqs,  ParseUnknown, IEEEFP_OP, CVTQS_FUNC,
  431.                                      ALPHA_FP_CONVERT, FUNCTION_ETYPE },
  432. { szCvtqt,  ParseUnknown, IEEEFP_OP, CVTQT_FUNC,
  433.                                      ALPHA_FP_CONVERT, FUNCTION_ETYPE },
  434.            //
  435.            // The Common Floating point functions
  436.            //
  437. { szCvtlq,    ParseUnknown,  FPOP_OP, CVTLQ_FUNC,
  438.                                      ALPHA_FP_CONVERT, FUNCTION_ETYPE },
  439. { szCpys,     ParseUnknown,  FPOP_OP, CPYS_FUNC,
  440.                                      ALPHA_FP_OPERATE, FUNCTION_ETYPE },
  441. { szCpysn,    ParseUnknown,  FPOP_OP, CPYSN_FUNC,
  442.                                      ALPHA_FP_OPERATE, FUNCTION_ETYPE },
  443. { szCpyse,    ParseUnknown,  FPOP_OP, CPYSE_FUNC,
  444.                                      ALPHA_FP_OPERATE, FUNCTION_ETYPE },
  445. { szMt_fpcr,  ParseUnknown,  FPOP_OP, MT_FPCR_FUNC,
  446.                                      ALPHA_FP_OPERATE, FUNCTION_ETYPE },
  447. { szMf_fpcr,  ParseUnknown,  FPOP_OP, MF_FPCR_FUNC,
  448.                                      ALPHA_FP_OPERATE, FUNCTION_ETYPE },
  449. { szFcmoveq,  ParseUnknown,  FPOP_OP, FCMOVEQ_FUNC,
  450.                                      ALPHA_FP_OPERATE, FUNCTION_ETYPE },
  451. { szFcmovne,  ParseUnknown,  FPOP_OP, FCMOVNE_FUNC,
  452.                                      ALPHA_FP_OPERATE, FUNCTION_ETYPE },
  453. { szFcmovlt,  ParseUnknown,  FPOP_OP, FCMOVLT_FUNC,
  454.                                      ALPHA_FP_OPERATE, FUNCTION_ETYPE },
  455. { szFcmovge,  ParseUnknown,  FPOP_OP, FCMOVGE_FUNC,
  456.                                      ALPHA_FP_OPERATE, FUNCTION_ETYPE },
  457. { szFcmovle,  ParseUnknown,  FPOP_OP, FCMOVLE_FUNC,
  458.                                      ALPHA_FP_OPERATE, FUNCTION_ETYPE },
  459. { szFcmovgt,  ParseUnknown,  FPOP_OP, FCMOVGT_FUNC,
  460.                                      ALPHA_FP_OPERATE, FUNCTION_ETYPE },
  461. { szCvtql,    ParseUnknown,  FPOP_OP, CVTQL_FUNC,
  462.                                      ALPHA_FP_CONVERT, FUNCTION_ETYPE },
  463. { szCvtqlv,   ParseUnknown,  FPOP_OP, CVTQLV_FUNC,
  464.                                      ALPHA_FP_CONVERT, FUNCTION_ETYPE },
  465. { szCvtqlsv,  ParseUnknown,  FPOP_OP, CVTQLSV_FUNC,
  466.                                      ALPHA_FP_CONVERT, FUNCTION_ETYPE },
  467. };       // end of opTable
  468. #define SEARCHNUM  sizeof(opTable) / sizeof(OPTBLENTRY)
  469. //
  470. // Here are the tables of Floating Point flags.
  471. //
  472. FPFLAGS ConvertFlags[] = {
  473.     { NONE_FLAGS, NONE_FLAGS_STR },
  474.     { C_FLAGS, C_FLAGS_STR },
  475.     { V_FLAGS, V_FLAGS_STR },
  476.     { VC_FLAGS, VC_FLAGS_STR },
  477.     { SV_FLAGS, SV_FLAGS_STR },
  478.     { SVC_FLAGS, SVC_FLAGS_STR },
  479.     { SVI_FLAGS, SVI_FLAGS_STR },
  480.     { SVIC_FLAGS, SVIC_FLAGS_STR },
  481.     { D_FLAGS, D_FLAGS_STR },
  482.     { VD_FLAGS, VD_FLAGS_STR },
  483.     { SVD_FLAGS, SVD_FLAGS_STR },
  484.     { SVID_FLAGS, SVID_FLAGS_STR },
  485.     { M_FLAGS, M_FLAGS_STR },
  486.     { VM_FLAGS, VM_FLAGS_STR },
  487.     { SVM_FLAGS, SVM_FLAGS_STR },
  488.     { SVIM_FLAGS, SVIM_FLAGS_STR },
  489.     { S_FLAGS, S_FLAGS_STR },
  490.     { SC_FLAGS, SC_FLAGS_STR },
  491.     { FPFLAGS_NOT_AN_ENTRY, "" }
  492. };
  493. FPFLAGS FloatOpFlags[] = {
  494.     { C_FLAGS, C_FLAGS_STR },
  495.     { M_FLAGS, M_FLAGS_STR },
  496.     { NONE_FLAGS, NONE_FLAGS_STR },
  497.     { D_FLAGS, D_FLAGS_STR },
  498.     { UC_FLAGS, UC_FLAGS_STR },
  499.     { UM_FLAGS, UM_FLAGS_STR },
  500.     { U_FLAGS, U_FLAGS_STR },
  501.     { UD_FLAGS, UD_FLAGS_STR },
  502.     { SC_FLAGS, SC_FLAGS_STR },
  503.     { S_FLAGS, S_FLAGS_STR },
  504.     { SUC_FLAGS, SUC_FLAGS_STR },
  505.     { SUM_FLAGS, SUM_FLAGS_STR },
  506.     { SU_FLAGS, SU_FLAGS_STR },
  507.     { SUD_FLAGS, SUD_FLAGS_STR },
  508.     { SUIC_FLAGS, SUIC_FLAGS_STR },
  509.     { SUIM_FLAGS, SUIM_FLAGS_STR },
  510.     { SUI_FLAGS, SUI_FLAGS_STR },
  511.     { SUID_FLAGS, SUID_FLAGS_STR },
  512.     { FPFLAGS_NOT_AN_ENTRY, "" }
  513. };
  514. /*** findNameEntry - find POPTBLENTRY based on name
  515. *
  516. *   Purpose:
  517. *       This routine is used to determine if the opTable has
  518. *       been initialized.  If a routine fails, it calls this
  519. *       initialization check.  If the table is not initialized,
  520. *       we initialize it, and try again.
  521. *
  522. *   Input:
  523. *       VOID
  524. *
  525. *   Returns:
  526. *       TRUE  - means table was already initialized; real failure
  527. *       FALSE - just now initialized table; try again
  528. *
  529. *************************************************************************/
  530. BOOLEAN
  531. opTableInitialized()
  532. {
  533.     static BOOLEAN opTableInitialized = FALSE;
  534.     if (opTableInitialized == TRUE) {
  535.          return TRUE;
  536.     }
  537.     //
  538.     // it wasn't initialized yet; do so now.
  539.     //
  540.     opTableInit();
  541.     opTableInitialized = TRUE;
  542.     return FALSE;
  543. }
  544. /*** findNameEntry - find POPTBLENTRY based on name
  545. *
  546. *   Purpose:
  547. *       Search the opTable for a match with the token
  548. *       pointed by *pszOp.  Must search through the
  549. *       TERMINAL and the FUNCTION tables
  550. *
  551. *   Input:
  552. *       *pszOp - string to search as mnemonic
  553. *
  554. *   Returns:
  555. *       Pointer to entry in the opTable
  556. *
  557. *************************************************************************/
  558. POPTBLENTRY
  559. findStringEntry (PUCHAR pszOp)
  560. {
  561.     POPTBLENTRY pEntry;
  562.     for (pEntry = TerminalTab;
  563.          pEntry < &TerminalTab[TerminalTabSize];
  564.          pEntry++) {
  565.         if (!strcmp(pszOp, pEntry->pszAlphaName))
  566.                 return(pEntry);
  567.     }
  568.     for (pEntry = FunctionTab;
  569.          pEntry < &FunctionTab[FunctionTabSize];
  570.          pEntry++) {
  571.         if (!strcmp(pszOp, pEntry->pszAlphaName))
  572.                 return(pEntry);
  573.     }
  574.     if (opTableInitialized() == FALSE) {
  575.         return findStringEntry(pszOp);
  576.     }
  577.     return((POPTBLENTRY)-1);
  578. }
  579. /* findOpCodeEntry - find POPTBLENTRY based on opcode
  580. *
  581. *   Purpose:
  582. *       Search the opTable for a match with the opcode
  583. *       Must search through the
  584. *       INVALID, TERMINAL and NON_TERMINAL tables
  585. *
  586. *   Input:
  587. *       pOpEntry - pointer to NON_TERMINAL_ETYPE in opTable
  588. *       function - the function value to be looked up
  589. *
  590. *   Output:
  591. *       pointer to string mnemonic for the function
  592. *
  593. ***********************************************************************/
  594. POPTBLENTRY
  595. findOpCodeEntry(ULONG opcode)
  596. {
  597.     POPTBLENTRY pEntry;
  598.     for (pEntry = TerminalTab;
  599.          pEntry < &TerminalTab[TerminalTabSize];
  600.          pEntry++) {
  601.         if (pEntry->opCode == opcode)
  602.                 return(pEntry);
  603.     }
  604.     for (pEntry = NonTerminalTab;
  605.          pEntry < &NonTerminalTab[NonTerminalTabSize];
  606.          pEntry++) {
  607.         if (pEntry->opCode == opcode)
  608.                 return(pEntry);
  609.     }
  610.     for (pEntry = InvalidTab;
  611.          pEntry < &InvalidTab[InvalidTabSize];
  612.          pEntry++) {
  613.         if (pEntry->opCode == opcode)
  614.                 return(pEntry);
  615.     }
  616.     if (opTableInitialized() == FALSE) {
  617.         return findOpCodeEntry(opcode);
  618.     }
  619.     return((POPTBLENTRY)-1);
  620. }
  621. /*** findTypeFromOpcode - find the instruction type
  622. *
  623. *   Purpose:
  624. *       This routine finds the type of the instruction (ALPHA_*)
  625. *       from the opcode.  It returns a single value so that it
  626. *       can be called from other dll's without passing storage.
  627. *
  628. *   Input:
  629. *       the opcode number.
  630. *
  631. *   Output:
  632. *       the type of the opcode (ALPHA_* in alphaops.h)
  633. *
  634. *   Errors:
  635. *       returns ALPHA_UNKNOWN for an invalid opcode
  636. *
  637. *   Exceptions:
  638. *       None.
  639. *
  640. *
  641. *************************************************************************/
  642. ULONG
  643. findTypeFromOpcode(ULONG opcode)
  644. {
  645.     POPTBLENTRY pEntry;
  646.     pEntry = findOpCodeEntry(opcode);
  647.     if (pEntry != (POPTBLENTRY)(-1)) {
  648.         return(pEntry->iType);
  649.     } else {
  650.         return(ALPHA_UNKNOWN);
  651.     }
  652. }
  653. /*** findNonTerminalEntry - find pointer to set of functions
  654. *
  655. *   Purpose:
  656. *       This routine finds the entry in the table which the is
  657. *       nonterminal entry for an opcode.
  658. *
  659. *   Input:
  660. *       The type of function that is interesting
  661. *
  662. *   Output:
  663. *       Pointer to the nonterminal entry in opTable
  664. *
  665. *   Errors:
  666. *       If the entry is not found, a message is printed, and the
  667. *       routine exits.
  668. *
  669. *   Exceptions:
  670. *       None.
  671. *
  672. *   Note:
  673. *       This routine is called BEFORE NonTerminalTable is established!
  674. *       (it's used to set up these tables, in fact).
  675. *
  676. *************************************************************************/
  677. POPTBLENTRY
  678. findNonTerminalEntry(ULONG opCode)
  679. {
  680.     ULONG index;
  681.     for ( index = 0 ; index < SEARCHNUM; index++ ) {
  682.         if ( ( opTable[index].eType == NON_TERMINAL_ETYPE ) &&
  683.              ( opTable[index].opCode == opCode ) ) {
  684.                  return(&opTable[index]);
  685.         }
  686.     }
  687.     // Should return before here
  688.     assert( 0 );
  689.     return NULL;
  690. }
  691. /* findFuncName - get string name for a function
  692. *
  693. *   Purpose:
  694. *       to get function name, given the function number, and a
  695. *       pointer to the opTable entry for the NON_TERMINAL_ETYPE
  696. *       opcode associated with the function
  697. *
  698. *   Input:
  699. *       pOpEntry - pointer to NON_TERMINAL_ETYPE in opTable
  700. *       function - the function value to be looked up
  701. *
  702. *   Output:
  703. *       pointer to string mnemonic for the function
  704. *
  705. ***********************************************************************/
  706. char *
  707. findFuncName(POPTBLENTRY pEntry, ULONG function)
  708. {
  709.     int cIndex;
  710.     POPTBLENTRY pFncEntry;
  711.     pFncEntry = pEntry->funcTable;
  712.     cIndex = (int)pEntry->funcTableSize;
  713.     //
  714.     // make sure that this entry pts to a function table
  715.     //
  716.     if (pEntry->eType != NON_TERMINAL_ETYPE) {
  717.         return("???");
  718.     }
  719.     while(cIndex-- > 0) {
  720.         if (function == pFncEntry->funcCode)
  721.             return(pFncEntry->pszAlphaName);
  722.         pFncEntry++;
  723.     };
  724.     return("???");
  725. }
  726. /** findFlagName - get the string associated with a flag
  727. *
  728. *    Purpose - return a string associated with the flags for a
  729. *              floating point instruction
  730. *
  731. *    Input:
  732. *      flag    - the flags on the opcode
  733. *      opcode  - the opcode; if it's Cvt*, we use different flags
  734. *
  735. *    Output:
  736. *      pointer to string describing flags, or "/???"
  737. *
  738. ***************/
  739. char *
  740. findFlagName(ULONG flag, ULONG function)
  741. {
  742.      PFPFLAGS table;
  743.      if ((function == CVTTQ_FUNC) || (function == CVTGQ_FUNC)) {
  744.          table = ConvertFlags;
  745.      } else {
  746.          table = FloatOpFlags;
  747.      }
  748.      while (table->flags != FPFLAGS_NOT_AN_ENTRY) {
  749.          if (table->flags == flag) {
  750.               return(table->flagname);
  751.          }
  752.          table++;
  753.     }
  754.     // no match found
  755.     //
  756.     return("/???");
  757. }
  758. /*** opTableInit - initialize fields used in and with the opTable
  759. *
  760. *   Purpose:
  761. *       This routine is called once, and sets up pointers to the
  762. *       subtables embedded in the opTable, such as AddOpTab, and
  763. *       sizes for these subtables.  It also checks that all like
  764. *       instructions are grouped together in the table, which is
  765. *       the only requirement on it.
  766. *
  767. *   Input:
  768. *       None.
  769. *
  770. *   Output:
  771. *       None.
  772. *
  773. *   Errors:
  774. *       If the table is not properly organized (four types separated,
  775. *       and the functions for a single opcode grouped), this prints a
  776. *       messages and fails
  777. *
  778. *   Exceptions:
  779. *       None.
  780. *
  781. *************************************************************************/
  782. void
  783. opTableInit()
  784. {
  785.     ULONG typesDone[4] = {0,0,0,0};
  786.     ULONG palDone, arithDone, bitDone, byteDone, jmpDone;
  787.     ULONG fpopDone, vaxDone, IEEEDone, mulDone, memSpcDone;
  788.     ULONG        index;
  789.     POPTBLENTRY  entry;
  790.     ENTRY_TYPE   curType = NOT_AN_ETYPE;
  791.     ULONG        curFunc = NO_FUNC;    // OPCODE field in func entry
  792.     //
  793.     // To set the end of the table, and its size, without having
  794.     // nested case statements, maintain pointers to the entry and
  795.     // function tables we are currently walking through
  796.     //
  797.     PULONG        curTypeSize,       curFuncSize;
  798.     POPTBLENTRY * curTypeTable,    * curFuncTable;
  799.     //
  800.     // these will be reset before they are needed, but not before
  801.     // they are used.
  802.     //
  803.     curTypeTable = (POPTBLENTRY *)&curTypeTable;
  804.     curTypeSize  = (PULONG)&curTypeSize;
  805.     curFuncTable = (POPTBLENTRY *)&curFuncTable;
  806.     curFuncSize  = (PULONG)&curFuncSize;
  807.     palDone = arithDone = bitDone = byteDone = jmpDone = 0;
  808.     fpopDone = vaxDone = IEEEDone = mulDone = memSpcDone = 0;
  809.     for (index = 0 ; index < SEARCHNUM; index++) {
  810.         entry = &opTable[index];
  811.         switch(entry->eType) {
  812.          case INVALID_ETYPE:
  813.              if (curType == entry->eType)
  814.                  continue;
  815.              //
  816.              // The entries must be together; if this is a
  817.              // new type, we must never have seen it before
  818.              //
  819.              //
  820.              // Finish off the old tables
  821.              //
  822.              *curTypeSize = (ULONG)(entry - *curTypeTable);
  823.              if (curType == FUNCTION_ETYPE) {
  824.                  *curFuncSize = (ULONG)(entry - *curFuncTable);
  825.              }
  826.              //
  827.              // Set up the new table
  828.              //
  829.              InvalidTab = entry;
  830.              curTypeSize = &InvalidTabSize;
  831.              curTypeTable = &InvalidTab;
  832.              curType = INVALID_ETYPE;
  833.              typesDone[INVALID_ETYPE] = 1;
  834.              break;
  835.          case NON_TERMINAL_ETYPE:
  836.              if (curType == entry->eType)
  837.                  continue;
  838.              *curTypeSize = (ULONG)(entry - *curTypeTable);
  839.              if (curType == FUNCTION_ETYPE) {
  840.                  *curFuncSize = (ULONG)(entry - *curFuncTable);
  841.              }
  842.              NonTerminalTab = entry;
  843.              curTypeSize = &NonTerminalTabSize;
  844.              curTypeTable = &NonTerminalTab;
  845.              curType = NON_TERMINAL_ETYPE;
  846.              typesDone[NON_TERMINAL_ETYPE] = 1;
  847.              break;
  848.          case TERMINAL_ETYPE:
  849.              if (curType == entry->eType)
  850.                  continue;
  851.              *curTypeSize = (ULONG)(entry - *curTypeTable);
  852.              if (curType == FUNCTION_ETYPE) {
  853.                  *curFuncSize = (ULONG)(entry - *curFuncTable);
  854.              }
  855.              TerminalTab = entry;
  856.              curTypeSize = &TerminalTabSize;
  857.              curTypeTable = &TerminalTab;
  858.              curType = TERMINAL_ETYPE;
  859.              typesDone[TERMINAL_ETYPE] = 1;
  860.              break;
  861.          case FUNCTION_ETYPE:
  862.              if (entry->opCode == curFunc)
  863.                       continue;
  864.              //
  865.              // Take care of a new eType table; this exactly
  866.              // parallels the three cases above (*_ETYPE)
  867.              //
  868.              if (curType != FUNCTION_ETYPE) {
  869.                  *curTypeSize = (ULONG)(entry - *curTypeTable);
  870.                  FunctionTab = entry;
  871.                  curTypeSize = &FunctionTabSize;
  872.                  curTypeTable = &FunctionTab;
  873.                  curType = FUNCTION_ETYPE;
  874.                  typesDone[FUNCTION_ETYPE] = 1;
  875.              }
  876.              //
  877.              // Next, handle a new function table when this is a new
  878.              // function (==> when this is the first entry in the
  879.              // FunctionTab)
  880.              //
  881.              switch(entry->opCode) {
  882.              POPTBLENTRY e;
  883.              case CALLPAL_OP:
  884.                  *curFuncSize = (ULONG)(entry - *curFuncTable);
  885.                  e = findNonTerminalEntry(CALLPAL_OP);
  886.                  e->funcTable = entry;
  887.                  curFuncSize = &(e->funcTableSize);
  888.                  curFuncTable = &(e->funcTable);
  889.                  curFunc = CALLPAL_OP;
  890.                  palDone = 1;
  891.                  break;
  892.              case ARITH_OP:
  893.                  *curFuncSize = (ULONG)(entry - *curFuncTable);
  894.                  e = findNonTerminalEntry(ARITH_OP);
  895.                  e->funcTable = entry;
  896.                  curFuncSize = &(e->funcTableSize);
  897.                  curFuncTable = &(e->funcTable);
  898.                  curFunc = ARITH_OP;
  899.                  arithDone = 1;
  900.                  break;
  901.              case BIT_OP:
  902.                  *curFuncSize = (ULONG)(entry - *curFuncTable);
  903.                  e = findNonTerminalEntry(BIT_OP);
  904.                  e->funcTable = entry;
  905.                  curFuncSize = &(e->funcTableSize);
  906.                  curFuncTable = &(e->funcTable);
  907.                  curFunc = BIT_OP;
  908.                  bitDone = 1;
  909.                  break;
  910.              case BYTE_OP:
  911.                  *curFuncSize = (ULONG)(entry - *curFuncTable);
  912.                  e = findNonTerminalEntry(BYTE_OP);
  913.                  e->funcTable = entry;
  914.                  curFuncSize = &(e->funcTableSize);
  915.                  curFuncTable = &(e->funcTable);
  916.                  curFunc = BYTE_OP;
  917.                  byteDone = 1;
  918.                  break;
  919.              case SEXT_OP:
  920.                  *curFuncSize = (ULONG)(entry - *curFuncTable);
  921.                  e = findNonTerminalEntry(SEXT_OP);
  922.                  e->funcTable = entry;
  923.                  curFuncSize = &(e->funcTableSize);
  924.                  curFuncTable = &(e->funcTable);
  925.                  curFunc = SEXT_OP;
  926.                  byteDone = 1;
  927.                  break;
  928.              case MUL_OP:
  929.                  *curFuncSize = (ULONG)(entry - *curFuncTable);
  930.                  e = findNonTerminalEntry(MUL_OP);
  931.                  e->funcTable = entry;
  932.                  curFuncSize = &(e->funcTableSize);
  933.                  curFuncTable = &(e->funcTable);
  934.                  curFunc = MUL_OP;
  935.                  mulDone = 1;
  936.                  break;
  937.              case MEMSPC_OP:
  938.                  *curFuncSize = (ULONG)(entry - *curFuncTable);
  939.                  e = findNonTerminalEntry(MEMSPC_OP);
  940.                  e->funcTable = entry;
  941.                  curFuncSize = &(e->funcTableSize);
  942.                  curFuncTable = &(e->funcTable);
  943.                  curFunc = MEMSPC_OP;
  944.                  memSpcDone = 1;
  945.                  break;
  946.              case JMP_OP:
  947.                  *curFuncSize = (ULONG)(entry - *curFuncTable);
  948.                  e = findNonTerminalEntry(JMP_OP);
  949.                  e->funcTable = entry;
  950.                  curFuncSize = &(e->funcTableSize);
  951.                  curFuncTable = &(e->funcTable);
  952.                  curFunc = JMP_OP;
  953.                  jmpDone = 1;
  954.                  break;
  955.              case VAXFP_OP:
  956.                  *curFuncSize = (ULONG)(entry - *curFuncTable);
  957.                  e = findNonTerminalEntry(VAXFP_OP);
  958.                  e->funcTable = entry;
  959.                  curFuncSize = &(e->funcTableSize);
  960.                  curFuncTable = &(e->funcTable);
  961.                  curFunc = VAXFP_OP;
  962.                  vaxDone = 1;
  963.                  break;
  964.              case IEEEFP_OP:
  965.                  *curFuncSize = (ULONG)(entry - *curFuncTable);
  966.                  e = findNonTerminalEntry(IEEEFP_OP);
  967.                  e->funcTable = entry;
  968.                  curFuncSize = &(e->funcTableSize);
  969.                  curFuncTable = &(e->funcTable);
  970.                  curFunc = IEEEFP_OP;
  971.                  IEEEDone = 1;
  972.                  break;
  973.              case FPOP_OP:
  974.                  *curFuncSize = (ULONG)(entry - *curFuncTable);
  975.                  e = findNonTerminalEntry(FPOP_OP);
  976.                  e->funcTable = entry;
  977.                  curFuncSize = &(e->funcTableSize);
  978.                  curFuncTable = &(e->funcTable);
  979.                  curFunc = FPOP_OP;
  980.                  fpopDone = 1;
  981.                  break;
  982.              default:
  983.                  break;
  984.             }  // end of Function table switch
  985.             break;
  986.         default:
  987.             break;
  988.         }      // end of etype table switch
  989.     }          // end of For switch
  990.     //
  991.     // close out the size of the last tables
  992.     //
  993.     if (curType == FUNCTION_ETYPE) {
  994.         *curFuncSize = (ULONG)(&opTable[SEARCHNUM] - *curFuncTable);
  995.     }
  996.     *curTypeSize = (ULONG)(&opTable[SEARCHNUM] - *curTypeTable);
  997. }              // end of opTableInit
  998. /*******************************************
  999. //
  1000. // These routines are part of the assembler, which is not
  1001. // yet referenced in windbg, so these are place holders till then
  1002. //
  1003. ULONG ParseIntMemory (PUCHAR a, PUCHAR * b, POPTBLENTRY c, PULONG d)
  1004. {
  1005.    return(0);
  1006. }
  1007. ULONG ParseFltMemory (PUCHAR a, PUCHAR * b, POPTBLENTRY c, PULONG d)
  1008. {
  1009.    return(0);
  1010. }
  1011. ULONG ParseMemSpec   (PUCHAR a, PUCHAR * b, POPTBLENTRY c, PULONG d)
  1012. {
  1013.    return(0);
  1014. }
  1015. ULONG ParseJump      (PUCHAR a, PUCHAR * b, POPTBLENTRY c, PULONG d)
  1016. {
  1017.    return(0);
  1018. }
  1019. ULONG ParseIntBranch (PUCHAR a, PUCHAR * b, POPTBLENTRY c, PULONG d)
  1020. {
  1021.    return(0);
  1022. }
  1023. ULONG ParseFltBranch (PUCHAR a, PUCHAR * b, POPTBLENTRY c, PULONG d)
  1024. {
  1025.    return(0);
  1026. }
  1027. ULONG ParseIntOp     (PUCHAR a, PUCHAR * b, POPTBLENTRY c, PULONG d)
  1028. {
  1029.    return(0);
  1030. }
  1031. ULONG ParsePal       (PUCHAR a, PUCHAR * b, POPTBLENTRY c, PULONG d)
  1032. {
  1033.    return(0);
  1034. }
  1035. ULONG ParseUnknown   (PUCHAR a, PUCHAR * b, POPTBLENTRY c, PULONG d)
  1036. {
  1037.    return(0);
  1038. }
  1039. *******************************************/