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