|
|
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.