Annotation of mstools/samples/sdktools/image/drwatson/alpha/optable.c, revision 1.1.1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.