mc68k/decoder.cpp

Go to the documentation of this file.
00001 /*
00002  * Copyright (C) 2000-2001, The University of Queensland
00003  * Copyright (C) 2000, Sun Microsystems, Inc
00004  *
00005  * See the file "LICENSE.TERMS" for information on usage and
00006  * redistribution of this file, and for a DISCLAIMER OF ALL
00007  * WARRANTIES.
00008  *
00009  */
00010 
00011 #define sign_extend(N,SIZE) (((int)((N) << (sizeof(unsigned)*8-(SIZE)))) >> (sizeof(unsigned)*8-(SIZE)))
00012 #include <assert.h>
00013 
00014 
00015 /*==============================================================================
00016  * FILE:       decoder.m
00017  * OVERVIEW:   Implementation of the higher level mc68000 specific parts of the
00018  *             NJMCDecoder class.
00019  *============================================================================*/
00020 
00021 /* $Revision: 1.1 $
00022  * $Id: decoder.cpp,v 1.1 2002/08/08 05:59:31 quantumg Exp $
00023  * Created by Mike 15 Feb 2000
00024  * 21 Feb 2000 - Mike: support for -(an) and (an)+ (bump and bumpr)
00025  * 21 Mar 2000 - Mike: pPcDisp generates expressions with idCodeAddr
00026  * 24 Mar 2000 - Mike: Converted sizes to bits; initialise size of SemStr
00027  *  1 Aug 00 - Cristina: upgraded to support mltk version Apr 5 14:56:28
00028  *              EDT 2000.  [numBytes] renamed to nextPC as semantics of
00029  *              [numBytes] has changed.  Assignment of (nextPC - hostPC). 
00030 */
00031 
00032 #include "global.h"
00033 #include "decoder.h"
00034 #include "prog.h"
00035 #include "ss.h"
00036 #include "rtl.h"
00037 #include "proc.h"
00038 #include "csr.h"
00039 #include "mc68k.pat.h"
00040 
00041 /**********************************
00042  * NJMCDecoder methods.
00043  **********************************/   
00044 
00045 /*==============================================================================
00046  * FUNCTION:       NJMCDecoder::decodeInstruction
00047  * OVERVIEW:       Decodes a machine instruction and returns an RTL instance. In
00048  *                 most cases a single instruction is decoded. However, if a
00049  *                 higher level construct that may consist of multiple
00050  *                 instructions is matched, then there may be a need to return
00051  *                 more than one RTL. The caller_prologue2 is an example of such
00052  *                 a construct which encloses an abritary instruction that must
00053  *                 be decoded into its own RTL (386 example)
00054  * PARAMETERS:     pc - the native address of the pc
00055  *                 delta - the difference between the above address and the
00056  *                   host address of the pc (i.e. the address that the pc is at
00057  *                   in the loaded object file)
00058  *                 RTLDict - the dictionary of RTL templates used to instantiate
00059  *                   the RTL for the instruction being decoded
00060  *                 proc - the enclosing procedure
00061  *                 pProc - the enclosing procedure
00062  * RETURNS:        a DecodeResult structure containing all the information
00063  *                   gathered during decoding
00064  *============================================================================*/
00065 DecodeResult& NJMCDecoder::decodeInstruction (ADDRESS pc, int delta,
00066     UserProc* proc = NULL)
00067 {
00068     static DecodeResult result;
00069     ADDRESS hostPC = pc + delta;
00070 
00071     // Clear the result structure;
00072     result.reset();
00073 
00074     // The actual list of instantiated RTs
00075     list<RT*>* RTs = NULL;
00076 
00077     // Try matching a logue first
00078     int addr, regs, locals, stackSize, d16, d32, reg;
00079     ADDRESS saveHostPC = hostPC;
00080     Logue* logue;
00081     if ((logue = InstructionPatterns::std_call(csr, hostPC, addr)) != NULL) {
00082         /*
00083          * Direct call
00084          */
00085         HLCall* newCall = new HLCall(pc, 0, RTs);
00086         result.rtl = newCall;
00087         result.numBytes = hostPC - saveHostPC;
00088 
00089         // Set the destination expression
00090         newCall->setDest(addr - delta);
00091         newCall->setPrologue(logue);
00092 
00093         // Save RTL for the latest call
00094         //lastCall = newCall;
00095         SHOW_ASM("std_call "<<addr)
00096     }
00097 
00098     else if ((logue = InstructionPatterns::near_call(csr, hostPC, addr))
00099         != NULL) {
00100         /*
00101          * Call with short displacement (16 bit instruction)
00102          */
00103         HLCall* newCall = new HLCall(pc, 0, RTs);
00104         result.rtl = newCall;
00105         result.numBytes = hostPC - saveHostPC;
00106 
00107         // Set the destination expression
00108         newCall->setDest(addr - delta);
00109         newCall->setPrologue(logue);
00110 
00111         // Save RTL for the latest call
00112         //lastCall = newCall;
00113         SHOW_ASM("near_call " << addr)
00114     }
00115 
00116     else if ((logue = InstructionPatterns::pea_pea_add_rts(csr, hostPC, d32))
00117         != NULL) {
00118         /*
00119          * pea E(pc) pea 4(pc) / addil #d32, (a7) / rts
00120          * Handle as a call
00121          */
00122         HLCall* newCall = new HLCall(pc, 0, RTs);
00123         result.rtl = newCall;
00124         result.numBytes = hostPC - saveHostPC;
00125 
00126         // Set the destination expression. It's d32 past the address of the
00127         // d32 itself, which is pc+10
00128         newCall->setDest(pc + 10 + d32);
00129         newCall->setPrologue(logue);
00130 
00131         // Save RTL for the latest call
00132         //lastCall = newCall;
00133         SHOW_ASM("pea/pea/add/rts " << pc+10+d32)
00134     }
00135 
00136     else if ((logue = InstructionPatterns::pea_add_rts(csr, hostPC, d32))
00137         != NULL) {
00138         /*
00139          * pea 4(pc) / addil #d32, (a7) / rts
00140          * Handle as a call followed by a return
00141          */
00142         HLCall* newCall = new HLCall(pc, 0, RTs);
00143         result.rtl = newCall;
00144         result.numBytes = hostPC - saveHostPC;
00145 
00146         // Set the destination expression. It's d32 past the address of the
00147         // d32 itself, which is pc+6
00148         newCall->setDest(pc + 6 + d32);
00149         newCall->setPrologue(logue);
00150 
00151         // This call effectively is followed by a return
00152         newCall->setReturnAfterCall(true);
00153 
00154         // Save RTL for the latest call
00155         //lastCall = newCall;
00156         SHOW_ASM("pea/add/rts " << pc+6+d32)
00157     }
00158 
00159     else if ((logue = InstructionPatterns::trap_syscall(csr, hostPC, d16))
00160         != NULL) {
00161         /*
00162          * trap / AXXX  (d16 set to the XXX)
00163          * Handle as a library call
00164          */
00165         HLCall* newCall = new HLCall(pc, 0, RTs);
00166         result.rtl = newCall;
00167         result.numBytes = hostPC - saveHostPC;
00168 
00169         // Set the destination expression. For now, we put AAAAA000+d16 there
00170         newCall->setDest(0xAAAAA000 + d16);
00171         newCall->setPrologue(logue);
00172 
00173         SHOW_ASM("trap/syscall " << hex << 0xA000 + d16)
00174     }
00175 
00176 /*
00177  * CALLEE PROLOGUES
00178  */
00179     else if ((logue = InstructionPatterns::link_save(csr, hostPC,
00180         locals, d16)) != NULL)
00181     {
00182         /*
00183          * Standard link with save of registers using movem
00184          */
00185         if (proc != NULL) {
00186 
00187             // Record the prologue of this callee
00188             assert(logue->getType() == Logue::CALLEE_PROLOGUE);
00189             proc->setPrologue((CalleePrologue*)logue);
00190         }
00191         result.rtl = new RTlist(pc, RTs);
00192         result.numBytes = hostPC - saveHostPC;
00193         SHOW_ASM("link_save " << locals)
00194     }
00195 
00196     else if ((logue = InstructionPatterns::link_save1(csr, hostPC,
00197         locals, reg)) != NULL)
00198     {
00199         /*
00200          * Standard link with save of 1 D register using move dn,-(a7)
00201          */
00202         if (proc != NULL) {
00203 
00204             // Record the prologue of this callee
00205             assert(logue->getType() == Logue::CALLEE_PROLOGUE);
00206             proc->setPrologue((CalleePrologue*)logue);
00207         }
00208         result.rtl = new RTlist(pc, RTs);
00209         result.numBytes = hostPC - saveHostPC;
00210         SHOW_ASM("link_save1 " << locals)
00211     }
00212 
00213     else if ((logue = InstructionPatterns::push_lea(csr, hostPC,
00214         locals, reg)) != NULL)
00215     {
00216         /*
00217          * Just save of 1 D register using move dn,-(a7);
00218          * then an lea d16(a7), a7 to allocate the stack
00219          */
00220         //locals = 0;             // No locals for this prologue
00221         if (proc != NULL) {
00222 
00223             // Record the prologue of this callee
00224             assert(logue->getType() == Logue::CALLEE_PROLOGUE);
00225             proc->setPrologue((CalleePrologue*)logue);
00226         }
00227         result.rtl = new RTlist(pc, RTs);
00228         result.numBytes = hostPC - saveHostPC;
00229         SHOW_ASM("push_lea " << locals)
00230     }
00231 
00232     else if ((logue = InstructionPatterns::std_link(csr, hostPC,
00233         locals)) != NULL)
00234     {
00235         /*
00236          * Standard link
00237          */
00238         if (proc != NULL) {
00239 
00240             // Record the prologue of this callee
00241             assert(logue->getType() == Logue::CALLEE_PROLOGUE);
00242             proc->setPrologue((CalleePrologue*)logue);
00243         }
00244         result.rtl = new RTlist(pc, RTs);
00245         result.numBytes = hostPC - saveHostPC;
00246         SHOW_ASM("std_link "<< locals)
00247     }
00248 
00249     else if ((logue = InstructionPatterns::bare_ret(csr, hostPC))
00250         != NULL)
00251     {
00252         /*
00253          * Just a bare rts instruction
00254          */
00255         if (proc != NULL) {
00256 
00257             // Record the prologue of this callee
00258             assert(logue->getType() == Logue::CALLEE_PROLOGUE);
00259             proc->setPrologue((CalleePrologue*)logue);
00260             proc->setEpilogue(new CalleeEpilogue("__dummy",list<string>()));
00261         }
00262         result.rtl = new HLReturn(pc, RTs);
00263         result.numBytes = hostPC - saveHostPC;
00264         SHOW_ASM("bare_ret")
00265     }
00266 
00267     else if ((logue = InstructionPatterns::std_ret(csr, hostPC)) != NULL) {
00268         /*
00269          * An unlink and return
00270          */
00271         if (proc!= NULL) {
00272 
00273             // Record the epilogue of this callee
00274             assert(logue->getType() == Logue::CALLEE_EPILOGUE);
00275             proc->setEpilogue((CalleeEpilogue*)logue);
00276         }
00277 
00278         result.rtl = new HLReturn(pc, RTs);
00279         result.numBytes = hostPC - saveHostPC;
00280         SHOW_ASM("std_ret")
00281     }
00282 
00283     else if ((logue = InstructionPatterns::rest_ret(csr, hostPC, d16)) != NULL)
00284     {
00285         /*
00286          * A restore (movem stack to registers) then return
00287          */
00288         if (proc!= NULL) {
00289 
00290             // Record the epilogue of this callee
00291             assert(logue->getType() == Logue::CALLEE_EPILOGUE);
00292             proc->setEpilogue((CalleeEpilogue*)logue);
00293         }
00294 
00295         result.rtl = new HLReturn(pc, RTs);
00296         result.numBytes = hostPC - saveHostPC;
00297         SHOW_ASM("rest_ret")
00298     }
00299 
00300     else if ((logue = InstructionPatterns::rest1_ret(csr, hostPC, reg)) != NULL)
00301     {
00302         /*
00303          * A pop (move (a7)+ to one D register) then unlink and return
00304          */
00305         if (proc!= NULL) {
00306 
00307             // Record the epilogue of this callee
00308             assert(logue->getType() == Logue::CALLEE_EPILOGUE);
00309             proc->setEpilogue((CalleeEpilogue*)logue);
00310         }
00311 
00312         result.rtl = new HLReturn(pc, RTs);
00313         result.numBytes = hostPC - saveHostPC;
00314         SHOW_ASM("rest1_ret")
00315     }
00316 
00317     else if ((logue = InstructionPatterns::pop_ret(csr, hostPC, reg)) != NULL)
00318     {
00319         /*
00320          * A pop (move (a7)+ to one D register) then just return
00321          */
00322         if (proc!= NULL) {
00323 
00324             // Record the epilogue of this callee
00325             assert(logue->getType() == Logue::CALLEE_EPILOGUE);
00326             proc->setEpilogue((CalleeEpilogue*)logue);
00327         }
00328 
00329         result.rtl = new HLReturn(pc, RTs);
00330         result.numBytes = hostPC - saveHostPC;
00331         SHOW_ASM("pop_ret")
00332     }
00333 
00334     else if ((logue = InstructionPatterns::clear_stack(csr, hostPC, stackSize))
00335         != NULL)
00336     {
00337         /*
00338          * Remove parameters from the stack
00339          */
00340         RTs = instantiate(pc, "clear_stack", dis_Num(stackSize));
00341 
00342         result.rtl = new RTlist(pc, RTs);
00343         result.numBytes = hostPC - saveHostPC;
00344     }
00345 
00346     else {
00347 
00348         ADDRESS nextPC;
00349         int bump = 0, bumpr;
00350         SemStr* ss;
00351 
00352 
00353 
00354 
00355 { 
00356   dword MATCH_p = 
00357     
00358 
00359     hostPC
00360     ;
00361   char *MATCH_name;
00362   static char *MATCH_name_cond_12[] = {
00363     "bra", (char *)0, "bhi", "bls", "bcc", "bcs", "bne", "beq", "bvc", "bvs", 
00364     "bpl", "bmi", "bge", "blt", "bgt", "ble", 
00365   };
00366   unsigned /* [0..65535] */ MATCH_w_16_0;
00367   { 
00368     MATCH_w_16_0 = getWord(MATCH_p); 
00369     
00370       switch((MATCH_w_16_0 >> 12 & 0xf) /* op at 0 */) {
00371         case 0: case 1: case 2: case 3: case 7: case 8: case 9: case 10: 
00372         case 11: case 12: case 13: case 14: case 15: 
00373           goto MATCH_label_de0; break;
00374         case 4: 
00375           if ((MATCH_w_16_0 >> 3 & 0x7) /* adrm at 0 */ == 2) 
00376             if ((MATCH_w_16_0 >> 9 & 0x7) /* reg1 at 0 */ == 7) 
00377               if ((MATCH_w_16_0 >> 8 & 0x1) /* sb at 0 */ == 1) 
00378                 goto MATCH_label_de0;  /*opt-block+*/
00379               else 
00380                 
00381                   switch((MATCH_w_16_0 >> 6 & 0x3) /* sz at 0 */) {
00382                     case 0: case 1: 
00383                       goto MATCH_label_de0; break;
00384                     case 2: 
00385                       { 
00386                         unsigned ea = addressToPC(MATCH_p);
00387                         nextPC = 2 + MATCH_p; 
00388                         
00389 
00390                         
00391 
00392                                     /*
00393 
00394                                      * Register call
00395 
00396                                      */
00397 
00398                                     // Mike: there should probably be a HLNwayCall class for this!
00399 
00400                                     HLCall* newCall = new HLCall(pc, 0, RTs);
00401 
00402                                     // Record the fact that this is a computed call
00403 
00404                                     newCall->setIsComputed();
00405 
00406                                     // Set the destination expression
00407 
00408                                     newCall->setDest(cEA(ea, pc, 32));
00409 
00410                                     result.rtl = newCall;
00411 
00412                                     // Only one instruction, so size of result is size of this decode
00413 
00414                                     result.numBytes = nextPC - hostPC;
00415 
00416                             
00417 
00418                         
00419                         
00420                         
00421                       }
00422                       
00423                       break;
00424                     case 3: 
00425                       { 
00426                         unsigned ea = addressToPC(MATCH_p);
00427                         nextPC = 2 + MATCH_p; 
00428                         
00429 
00430                         
00431 
00432                                     /*
00433 
00434                                      * Register jump
00435 
00436                                      */
00437 
00438                                     HLNwayJump* newJump = new HLNwayJump(pc, RTs);
00439 
00440                                     // Record the fact that this is a computed call
00441 
00442                                     newJump->setIsComputed();
00443 
00444                                     // Set the destination expression
00445 
00446                                     newJump->setDest(cEA(ea, pc, 32));
00447 
00448                                     result.rtl = newJump;
00449 
00450                                     // Only one instruction, so size of result is size of this decode
00451 
00452                                     result.numBytes = nextPC - hostPC;
00453 
00454                                 
00455 
00456                                 /*
00457 
00458                                  * Unconditional branches
00459 
00460                                  */
00461 
00462                         
00463                         
00464                         
00465                       }
00466                       
00467                       break;
00468                     default: assert(0);
00469                   } /* (MATCH_w_16_0 >> 6 & 0x3) -- sz at 0 --*/   
00470             else 
00471               goto MATCH_label_de0;  /*opt-block+*/ 
00472           else 
00473             goto MATCH_label_de0;  /*opt-block+*/
00474           break;
00475         case 5: 
00476           
00477             switch((MATCH_w_16_0 >> 8 & 0xf) /* cond at 0 */) {
00478               case 0: case 1: case 8: case 9: 
00479                 goto MATCH_label_de0; break;
00480               case 2: 
00481                 if (((MATCH_w_16_0 >> 3 & 0x7) /* adrm at 0 */ == 0 || 
00482                   2 <= (MATCH_w_16_0 >> 3 & 0x7) /* adrm at 0 */ && 
00483                   (MATCH_w_16_0 >> 3 & 0x7) /* adrm at 0 */ < 5) && 
00484                   (MATCH_w_16_0 >> 6 & 0x3) /* sz at 0 */ == 3) { 
00485                   MATCH_name = "shi"; 
00486                   { 
00487                     char *name = MATCH_name;
00488                     unsigned ea = addressToPC(MATCH_p);
00489                     nextPC = 2 + MATCH_p; 
00490                     
00491 
00492                     
00493 
00494                                 ss = daEA(ea, pc, bump, bumpr, 1);
00495 
00496                                 RTs = instantiate(pc, name, ss);
00497 
00498                                 SETS(name, ss, HLJCOND_JSG)
00499 
00500                     
00501                     
00502                     
00503                   }
00504                   
00505                 } /*opt-block*/
00506                 else 
00507                   goto MATCH_label_de0;  /*opt-block+*/
00508                 
00509                 break;
00510               case 3: 
00511                 if (((MATCH_w_16_0 >> 3 & 0x7) /* adrm at 0 */ == 0 || 
00512                   2 <= (MATCH_w_16_0 >> 3 & 0x7) /* adrm at 0 */ && 
00513                   (MATCH_w_16_0 >> 3 & 0x7) /* adrm at 0 */ < 5) && 
00514                   (MATCH_w_16_0 >> 6 & 0x3) /* sz at 0 */ == 3) { 
00515                   MATCH_name = "sls"; 
00516                   { 
00517                     char *name = MATCH_name;
00518                     unsigned ea = addressToPC(MATCH_p);
00519                     nextPC = 2 + MATCH_p; 
00520                     
00521 
00522                     
00523 
00524                                 ss = daEA(ea, pc, bump, bumpr, 1);
00525 
00526                                 RTs = instantiate(pc, name, ss);
00527 
00528                                 SETS(name, ss, HLJCOND_JULE)
00529 
00530                     
00531                     
00532                     
00533                   }
00534                   
00535                 } /*opt-block*/
00536                 else 
00537                   goto MATCH_label_de0;  /*opt-block+*/
00538                 
00539                 break;
00540               case 4: 
00541                 if (((MATCH_w_16_0 >> 3 & 0x7) /* adrm at 0 */ == 0 || 
00542                   2 <= (MATCH_w_16_0 >> 3 & 0x7) /* adrm at 0 */ && 
00543                   (MATCH_w_16_0 >> 3 & 0x7) /* adrm at 0 */ < 5) && 
00544                   (MATCH_w_16_0 >> 6 & 0x3) /* sz at 0 */ == 3) { 
00545                   MATCH_name = "scc"; 
00546                   { 
00547                     char *name = MATCH_name;
00548                     unsigned ea = addressToPC(MATCH_p);
00549                     nextPC = 2 + MATCH_p; 
00550                     
00551 
00552                     
00553 
00554                                 ss = daEA(ea, pc, bump, bumpr, 1);
00555 
00556                                 RTs = instantiate(pc, name, ss);
00557 
00558                                 SETS(name, ss, HLJCOND_JUGE)
00559 
00560                     
00561                     
00562                     
00563                   }
00564                   
00565                 } /*opt-block*/
00566                 else 
00567                   goto MATCH_label_de0;  /*opt-block+*/
00568                 
00569                 break;
00570               case 5: 
00571                 if (((MATCH_w_16_0 >> 3 & 0x7) /* adrm at 0 */ == 0 || 
00572                   2 <= (MATCH_w_16_0 >> 3 & 0x7) /* adrm at 0 */ && 
00573                   (MATCH_w_16_0 >> 3 & 0x7) /* adrm at 0 */ < 5) && 
00574                   (MATCH_w_16_0 >> 6 & 0x3) /* sz at 0 */ == 3) { 
00575                   MATCH_name = "scs"; 
00576                   { 
00577                     char *name = MATCH_name;
00578                     unsigned ea = addressToPC(MATCH_p);
00579                     nextPC = 2 + MATCH_p; 
00580                     
00581 
00582                     
00583 
00584                                 ss = daEA(ea, pc, bump, bumpr, 1);
00585 
00586                                 RTs = instantiate(pc, name, ss);
00587 
00588                                 SETS(name, ss, HLJCOND_JUL)
00589 
00590                     
00591                     
00592                     
00593                   }
00594                   
00595                 } /*opt-block*/
00596                 else 
00597                   goto MATCH_label_de0;  /*opt-block+*/
00598                 
00599                 break;
00600               case 6: 
00601                 if (((MATCH_w_16_0 >> 3 & 0x7) /* adrm at 0 */ == 0 || 
00602                   2 <= (MATCH_w_16_0 >> 3 & 0x7) /* adrm at 0 */ && 
00603                   (MATCH_w_16_0 >> 3 & 0x7) /* adrm at 0 */ < 5) && 
00604                   (MATCH_w_16_0 >> 6 & 0x3) /* sz at 0 */ == 3) { 
00605                   MATCH_name = "sne"; 
00606                   { 
00607                     char *name = MATCH_name;
00608                     unsigned ea = addressToPC(MATCH_p);
00609                     nextPC = 2 + MATCH_p; 
00610                     
00611 
00612                     
00613 
00614                                 ss = daEA(ea, pc, bump, bumpr, 1);
00615 
00616                                 RTs = instantiate(pc, name, ss);
00617 
00618                                 SETS(name, ss, HLJCOND_JNE)
00619 
00620                     
00621                     
00622                     
00623                   }
00624                   
00625                 } /*opt-block*/
00626                 else 
00627                   goto MATCH_label_de0;  /*opt-block+*/
00628                 
00629                 break;
00630               case 7: 
00631                 if (((MATCH_w_16_0 >> 3 & 0x7) /* adrm at 0 */ == 0 || 
00632                   2 <= (MATCH_w_16_0 >> 3 & 0x7) /* adrm at 0 */ && 
00633                   (MATCH_w_16_0 >> 3 & 0x7) /* adrm at 0 */ < 5) && 
00634                   (MATCH_w_16_0 >> 6 & 0x3) /* sz at 0 */ == 3) { 
00635                   MATCH_name = "seq"; 
00636                   { 
00637                     char *name = MATCH_name;
00638                     unsigned ea = addressToPC(MATCH_p);
00639                     nextPC = 2 + MATCH_p; 
00640                     
00641 
00642                     
00643 
00644                                 ss = daEA(ea, pc, bump, bumpr, 1);
00645 
00646                                 RTs = instantiate(pc, name, ss);
00647 
00648                                 SETS(name, ss, HLJCOND_JE)
00649 
00650                             //| svc(ea) [name] =>
00651 
00652                             //  ss = daEA(ea, pc, bump, bumpr, 1);
00653 
00654                             //  RTs = instantiate(pc, name, ss);
00655 
00656                             //  SETS(name, ss, HLJCOND_)
00657 
00658                             //| svs(ea) [name] =>
00659 
00660                             //  ss = daEA(ea, pc, bump, bumpr, 1);
00661 
00662                             //  RTs = instantiate(pc, name, ss);
00663 
00664                             //  SETS(name, ss, HLJCOND_)
00665 
00666                     
00667                     
00668                     
00669                   }
00670                   
00671                 } /*opt-block*/
00672                 else 
00673                   goto MATCH_label_de0;  /*opt-block+*/
00674                 
00675                 break;
00676               case 10: 
00677                 if (((MATCH_w_16_0 >> 3 & 0x7) /* adrm at 0 */ == 0 || 
00678                   2 <= (MATCH_w_16_0 >> 3 & 0x7) /* adrm at 0 */ && 
00679                   (MATCH_w_16_0 >> 3 & 0x7) /* adrm at 0 */ < 5) && 
00680                   (MATCH_w_16_0 >> 6 & 0x3) /* sz at 0 */ == 3) { 
00681                   MATCH_name = "spl"; 
00682                   { 
00683                     char *name = MATCH_name;
00684                     unsigned ea = addressToPC(MATCH_p);
00685                     nextPC = 2 + MATCH_p; 
00686                     
00687 
00688                     
00689 
00690                                 ss = daEA(ea, pc, bump, bumpr, 1);
00691 
00692                                 RTs = instantiate(pc, name, ss);
00693 
00694                                 SETS(name, ss, HLJCOND_JPOS)
00695 
00696                     
00697                     
00698                     
00699                   }
00700                   
00701                 } /*opt-block*/
00702                 else 
00703                   goto MATCH_label_de0;  /*opt-block+*/
00704                 
00705                 break;
00706               case 11: 
00707                 if (((MATCH_w_16_0 >> 3 & 0x7) /* adrm at 0 */ == 0 || 
00708                   2 <= (MATCH_w_16_0 >> 3 & 0x7) /* adrm at 0 */ && 
00709                   (MATCH_w_16_0 >> 3 & 0x7) /* adrm at 0 */ < 5) && 
00710                   (MATCH_w_16_0 >> 6 & 0x3) /* sz at 0 */ == 3) { 
00711                   MATCH_name = "smi"; 
00712                   { 
00713                     char *name = MATCH_name;
00714                     unsigned ea = addressToPC(MATCH_p);
00715                     nextPC = 2 + MATCH_p; 
00716                     
00717 
00718                     
00719 
00720                                 ss = daEA(ea, pc, bump, bumpr, 1);
00721 
00722                                 RTs = instantiate(pc, name, ss);
00723 
00724                                 SETS(name, ss, HLJCOND_JMI)
00725 
00726                     
00727                     
00728                     
00729                   }
00730                   
00731                 } /*opt-block*/
00732                 else 
00733                   goto MATCH_label_de0;  /*opt-block+*/
00734                 
00735                 break;
00736               case 12: 
00737                 if (((MATCH_w_16_0 >> 3 & 0x7) /* adrm at 0 */ == 0 || 
00738                   2 <= (MATCH_w_16_0 >> 3 & 0x7) /* adrm at 0 */ && 
00739                   (MATCH_w_16_0 >> 3 & 0x7) /* adrm at 0 */ < 5) && 
00740                   (MATCH_w_16_0 >> 6 & 0x3) /* sz at 0 */ == 3) { 
00741                   MATCH_name = "sge"; 
00742                   { 
00743                     char *name = MATCH_name;
00744                     unsigned ea = addressToPC(MATCH_p);
00745                     nextPC = 2 + MATCH_p; 
00746                     
00747 
00748                     
00749 
00750                                 ss = daEA(ea, pc, bump, bumpr, 1);
00751 
00752                                 RTs = instantiate(pc, name, ss);
00753 
00754                                 SETS(name, ss, HLJCOND_JSGE)
00755 
00756                     
00757                     
00758                     
00759                   }
00760                   
00761                 } /*opt-block*/
00762                 else 
00763                   goto MATCH_label_de0;  /*opt-block+*/
00764                 
00765                 break;
00766               case 13: 
00767                 if (((MATCH_w_16_0 >> 3 & 0x7) /* adrm at 0 */ == 0 || 
00768                   2 <= (MATCH_w_16_0 >> 3 & 0x7) /* adrm at 0 */ && 
00769                   (MATCH_w_16_0 >> 3 & 0x7) /* adrm at 0 */ < 5) && 
00770                   (MATCH_w_16_0 >> 6 & 0x3) /* sz at 0 */ == 3) { 
00771                   MATCH_name = "slt"; 
00772                   { 
00773                     char *name = MATCH_name;
00774                     unsigned ea = addressToPC(MATCH_p);
00775                     nextPC = 2 + MATCH_p; 
00776                     
00777 
00778                     
00779 
00780                                 ss = daEA(ea, pc, bump, bumpr, 1);
00781 
00782                                 RTs = instantiate(pc, name, ss);
00783 
00784                                 SETS(name, ss, HLJCOND_JSL)
00785 
00786                     
00787                     
00788                     
00789                   }
00790                   
00791                 } /*opt-block*/
00792                 else 
00793                   goto MATCH_label_de0;  /*opt-block+*/
00794                 
00795                 break;
00796               case 14: 
00797                 if (((MATCH_w_16_0 >> 3 & 0x7) /* adrm at 0 */ == 0 || 
00798                   2 <= (MATCH_w_16_0 >> 3 & 0x7) /* adrm at 0 */ && 
00799                   (MATCH_w_16_0 >> 3 & 0x7) /* adrm at 0 */ < 5) && 
00800                   (MATCH_w_16_0 >> 6 & 0x3) /* sz at 0 */ == 3) { 
00801                   MATCH_name = "sgt"; 
00802                   { 
00803                     char *name = MATCH_name;
00804                     unsigned ea = addressToPC(MATCH_p);
00805                     nextPC = 2 + MATCH_p; 
00806                     
00807 
00808                     
00809 
00810                                 ss = daEA(ea, pc, bump, bumpr, 1);
00811 
00812                                 RTs = instantiate(pc, name, ss);
00813 
00814                                 SETS(name, ss, HLJCOND_JSG)
00815 
00816                     
00817                     
00818                     
00819                   }
00820                   
00821                 } /*opt-block*/
00822                 else 
00823                   goto MATCH_label_de0;  /*opt-block+*/
00824                 
00825                 break;
00826               case 15: 
00827                 if (((MATCH_w_16_0 >> 3 & 0x7) /* adrm at 0 */ == 0 || 
00828                   2 <= (MATCH_w_16_0 >> 3 & 0x7) /* adrm at 0 */ && 
00829                   (MATCH_w_16_0 >> 3 & 0x7) /* adrm at 0 */ < 5) && 
00830                   (MATCH_w_16_0 >> 6 & 0x3) /* sz at 0 */ == 3) { 
00831                   MATCH_name = "sle"; 
00832                   { 
00833                     char *name = MATCH_name;
00834                     unsigned ea = addressToPC(MATCH_p);
00835                     nextPC = 2 + MATCH_p; 
00836                     
00837 
00838                     
00839 
00840                                 ss = daEA(ea, pc, bump, bumpr, 1);
00841 
00842                                 RTs = instantiate(pc, name, ss);
00843 
00844                                 SETS(name, ss, HLJCOND_JSLE)
00845 
00846                     // HACK: Still need to do .ex versions of set, jsr, jmp
00847 
00848                         
00849 
00850                     
00851                     
00852                     
00853                   }
00854                   
00855                 } /*opt-block*/
00856                 else 
00857                   goto MATCH_label_de0;  /*opt-block+*/
00858                 
00859                 break;
00860               default: assert(0);
00861             } /* (MATCH_w_16_0 >> 8 & 0xf) -- cond at 0 --*/ 
00862           break;
00863         case 6: 
00864           
00865             switch((MATCH_w_16_0 >> 8 & 0xf) /* cond at 0 */) {
00866               case 0: 
00867                 MATCH_name = MATCH_name_cond_12[(MATCH_w_16_0 >> 8 & 0xf) 
00868                       /* cond at 0 */]; 
00869                 { 
00870                   char *name = MATCH_name;
00871                   unsigned d = addressToPC(MATCH_p);
00872                   nextPC = 2 + MATCH_p; 
00873                   
00874 
00875                   
00876 
00877                             ss = BTA(d, result, pc);
00878 
00879                               UNCOND_JUMP(name, nextPC - hostPC, ss);
00880 
00881                     
00882 
00883                         /*
00884 
00885                          * Conditional branches
00886 
00887                          */
00888 
00889                   
00890                   
00891                   
00892                 }
00893                 
00894                 break;
00895               case 1: 
00896                 goto MATCH_label_de0; break;
00897               case 2: 
00898                 MATCH_name = MATCH_name_cond_12[(MATCH_w_16_0 >> 8 & 0xf) 
00899                       /* cond at 0 */]; 
00900                 { 
00901                   char *name = MATCH_name;
00902                   unsigned d = addressToPC(MATCH_p);
00903                   nextPC = 2 + MATCH_p; 
00904                   
00905 
00906                   
00907 
00908                               ss = BTA(d, result, pc);
00909 
00910                             COND_JUMP(name, nextPC - hostPC, ss, HLJCOND_JUG)
00911 
00912                   
00913                   
00914                   
00915                 }
00916                 
00917                 break;
00918               case 3: 
00919                 MATCH_name = MATCH_name_cond_12[(MATCH_w_16_0 >> 8 & 0xf) 
00920                       /* cond at 0 */]; 
00921                 { 
00922                   char *name = MATCH_name;
00923                   unsigned d = addressToPC(MATCH_p);
00924                   nextPC = 2 + MATCH_p; 
00925                   
00926 
00927                   
00928 
00929                               ss = BTA(d, result, pc);
00930 
00931                             COND_JUMP(name, nextPC - hostPC, ss, HLJCOND_JULE)
00932 
00933                   
00934                   
00935                   
00936                 }
00937                 
00938                 break;
00939               case 4: 
00940                 MATCH_name = MATCH_name_cond_12[(MATCH_w_16_0 >> 8 & 0xf) 
00941                       /* cond at 0 */]; 
00942                 { 
00943                   char *name = MATCH_name;
00944                   unsigned d = addressToPC(MATCH_p);
00945                   nextPC = 2 + MATCH_p; 
00946                   
00947 
00948                   
00949 
00950                               ss = BTA(d, result, pc);
00951 
00952                             COND_JUMP(name, nextPC - hostPC, ss, HLJCOND_JUGE)
00953 
00954                   
00955                   
00956                   
00957                 }
00958                 
00959                 break;
00960               case 5: 
00961                 MATCH_name = MATCH_name_cond_12[(MATCH_w_16_0 >> 8 & 0xf) 
00962                       /* cond at 0 */]; 
00963                 { 
00964                   char *name = MATCH_name;
00965                   unsigned d = addressToPC(MATCH_p);
00966                   nextPC = 2 + MATCH_p; 
00967                   
00968 
00969                   
00970 
00971                               ss = BTA(d, result, pc);
00972 
00973                             COND_JUMP(name, nextPC - hostPC, ss, HLJCOND_JUL)
00974 
00975                   
00976                   
00977                   
00978                 }
00979                 
00980                 break;
00981               case 6: 
00982                 MATCH_name = MATCH_name_cond_12[(MATCH_w_16_0 >> 8 & 0xf) 
00983                       /* cond at 0 */]; 
00984                 { 
00985                   char *name = MATCH_name;
00986                   unsigned d = addressToPC(MATCH_p);
00987                   nextPC = 2 + MATCH_p; 
00988                   
00989 
00990                   
00991 
00992                               ss = BTA(d, result, pc);
00993 
00994                             COND_JUMP(name, nextPC - hostPC, ss, HLJCOND_JNE)
00995 
00996                   
00997                   
00998                   
00999                 }
01000                 
01001                 break;
01002               case 7: 
01003                 MATCH_name = MATCH_name_cond_12[(MATCH_w_16_0 >> 8 & 0xf) 
01004                       /* cond at 0 */]; 
01005                 { 
01006                   char *name = MATCH_name;
01007                   unsigned d = addressToPC(MATCH_p);
01008                   nextPC = 2 + MATCH_p; 
01009                   
01010 
01011                   
01012 
01013                               ss = BTA(d, result, pc);
01014 
01015                             COND_JUMP(name, nextPC - hostPC, ss, HLJCOND_JE)
01016 
01017                   
01018                   
01019                   
01020                 }
01021                 
01022                 break;
01023               case 8: 
01024                 MATCH_name = MATCH_name_cond_12[(MATCH_w_16_0 >> 8 & 0xf) 
01025                       /* cond at 0 */]; 
01026                 { 
01027                   char *name = MATCH_name;
01028                   unsigned d = addressToPC(MATCH_p);
01029                   nextPC = 2 + MATCH_p; 
01030                   
01031 
01032                   
01033 
01034                               ss = BTA(d, result, pc);
01035 
01036                             COND_JUMP(name, nextPC - hostPC, ss, (JCOND_TYPE)0)
01037 
01038                   
01039                   
01040                   
01041                 }
01042                 
01043                 break;
01044               case 9: 
01045                 MATCH_name = MATCH_name_cond_12[(MATCH_w_16_0 >> 8 & 0xf) 
01046                       /* cond at 0 */]; 
01047                 { 
01048                   char *name = MATCH_name;
01049                   unsigned d = addressToPC(MATCH_p);
01050                   nextPC = 2 + MATCH_p; 
01051                   
01052 
01053                   
01054 
01055                               ss = BTA(d, result, pc);
01056 
01057                             COND_JUMP(name, nextPC - hostPC, ss, (JCOND_TYPE)0)
01058 
01059                     
01060 
01061                     
01062 
01063                           // MVE: I'm assuming that we won't ever see shi(-(a7)) or the like.
01064 
01065                           // This would unbalance the stack, although it would be legal for
01066 
01067                           // address registers other than a7. For now, we ignore the possibility
01068 
01069                           // of having to bump a register
01070 
01071                   
01072                   
01073                   
01074                 }
01075                 
01076                 break;
01077               case 10: 
01078                 MATCH_name = MATCH_name_cond_12[(MATCH_w_16_0 >> 8 & 0xf) 
01079                       /* cond at 0 */]; 
01080                 { 
01081                   char *name = MATCH_name;
01082                   unsigned d = addressToPC(MATCH_p);
01083                   nextPC = 2 + MATCH_p; 
01084                   
01085 
01086                   
01087 
01088                               ss = BTA(d, result, pc);
01089 
01090                             COND_JUMP(name, nextPC - hostPC, ss, HLJCOND_JPOS)
01091 
01092                   
01093                   
01094                   
01095                 }
01096                 
01097                 break;
01098               case 11: 
01099                 MATCH_name = MATCH_name_cond_12[(MATCH_w_16_0 >> 8 & 0xf) 
01100                       /* cond at 0 */]; 
01101                 { 
01102                   char *name = MATCH_name;
01103                   unsigned d = addressToPC(MATCH_p);
01104                   nextPC = 2 + MATCH_p; 
01105                   
01106 
01107                   
01108 
01109                               ss = BTA(d, result, pc);
01110 
01111                             COND_JUMP(name, nextPC - hostPC, ss, HLJCOND_JMI)
01112 
01113                   
01114                   
01115                   
01116                 }
01117                 
01118                 break;
01119               case 12: 
01120                 MATCH_name = MATCH_name_cond_12[(MATCH_w_16_0 >> 8 & 0xf) 
01121                       /* cond at 0 */]; 
01122                 { 
01123                   char *name = MATCH_name;
01124                   unsigned d = addressToPC(MATCH_p);
01125                   nextPC = 2 + MATCH_p; 
01126                   
01127 
01128                   
01129 
01130                               ss = BTA(d, result, pc);
01131 
01132                             COND_JUMP(name, nextPC - hostPC, ss, HLJCOND_JSGE)
01133 
01134                   
01135                   
01136                   
01137                 }
01138                 
01139                 break;
01140               case 13: 
01141                 MATCH_name = MATCH_name_cond_12[(MATCH_w_16_0 >> 8 & 0xf) 
01142                       /* cond at 0 */]; 
01143                 { 
01144                   char *name = MATCH_name;
01145                   unsigned d = addressToPC(MATCH_p);
01146                   nextPC = 2 + MATCH_p; 
01147                   
01148 
01149                   
01150 
01151                               ss = BTA(d, result, pc);
01152 
01153                             COND_JUMP(name, nextPC - hostPC, ss, HLJCOND_JSL)
01154 
01155                   
01156                   
01157                   
01158                 }
01159                 
01160                 break;
01161               case 14: 
01162                 MATCH_name = MATCH_name_cond_12[(MATCH_w_16_0 >> 8 & 0xf) 
01163                       /* cond at 0 */]; 
01164                 { 
01165                   char *name = MATCH_name;
01166                   unsigned d = addressToPC(MATCH_p);
01167                   nextPC = 2 + MATCH_p; 
01168                   
01169 
01170                   
01171 
01172                               ss = BTA(d, result, pc);
01173 
01174                             COND_JUMP(name, nextPC - hostPC, ss, HLJCOND_JSG)
01175 
01176                   
01177                   
01178                   
01179                 }
01180                 
01181                 break;
01182               case 15: 
01183                 MATCH_name = MATCH_name_cond_12[(MATCH_w_16_0 >> 8 & 0xf) 
01184                       /* cond at 0 */]; 
01185                 { 
01186                   char *name = MATCH_name;
01187                   unsigned d = addressToPC(MATCH_p);
01188                   nextPC = 2 + MATCH_p; 
01189                   
01190 
01191                   
01192 
01193                               ss = BTA(d, result, pc);
01194 
01195                             COND_JUMP(name, nextPC - hostPC, ss, HLJCOND_JSLE)
01196 
01197                   
01198                   
01199                   
01200                 }
01201                 
01202                 break;
01203               default: assert(0);
01204             } /* (MATCH_w_16_0 >> 8 & 0xf) -- cond at 0 --*/ 
01205           break;
01206         default: assert(0);
01207       } /* (MATCH_w_16_0 >> 12 & 0xf) -- op at 0 --*/ 
01208     
01209   }goto MATCH_finished_de; 
01210   
01211   MATCH_label_de0: (void)0; /*placeholder for label*/ 
01212     { 
01213       nextPC = MATCH_p; 
01214       
01215 
01216       
01217                 result.rtl = new RTlist(pc,
01218 
01219                     decodeLowLevelInstruction(hostPC, pc, result));
01220 
01221       
01222       
01223       
01224     } 
01225     goto MATCH_finished_de; 
01226     
01227   MATCH_finished_de: (void)0; /*placeholder for label*/
01228   
01229 }
01230 
01231 
01232     }
01233     return result;
01234 }
01235 
01236 /*==============================================================================
01237  * These are machine specific functions used to decode instruction
01238  * operands into SemStrs.
01239  *============================================================================*/
01240 
01241 /*
01242  * Modified from the original: 
01243  *  m68k_ea.m
01244  *  written by Owen Braun
01245  *  ocbraun@princeton.edu
01246  *  created 4/7/96 11:27 pm
01247  * 
01248  * 4 Feb 2000 - Cristina, removed ObjFile reference for integration w/UQBT 
01249  * 7,9 Feb 2000 - Cristina, changed display format of addressing modes to
01250  *      comply with the Motorola assembly format.
01251  * 8 Feb 2000 - Note that the ML version of the toolkit generates
01252  *      repeated label names for procedures that have more than one
01253  *      matching statement.  Mike's program formats replaces repeated
01254  *      names by unique names.
01255  * 9 Feb 00 - Cristina.  Note that I have *not* tested the indexed 
01256  *      addressing modes as the mc68328 does not support *any* of
01257  *      such addressing modes.  The mc68000 does however. 
01258  * 20 Feb 00 - Cristina: fixed branches
01259  * 21 Feb 00 - Mike: Removed redundant delta from BTA()
01260  * 01 Aug 01 - Mike: Quelled some warnings about "name" not used
01261  */
01262 
01263 
01264 // Branch target
01265 SemStr* NJMCDecoder::BTA(ADDRESS d, DecodeResult& result, ADDRESS pc)
01266 {
01267 
01268   SemStr* ret = new SemStr(32);
01269   ret->push(idIntConst);
01270 
01271 
01272 
01273 
01274 { 
01275   dword MATCH_p = 
01276     
01277 
01278     d
01279     ;
01280   unsigned /* [0..65535] */ MATCH_w_16_0;
01281   unsigned /* [0..65535] */ MATCH_w_16_16;
01282   { 
01283     MATCH_w_16_0 = getWord(MATCH_p); 
01284     if ((MATCH_w_16_0 & 0xff) /* data8 at 0 */ == 0) { 
01285       MATCH_w_16_16 = getWord(2 + MATCH_p); 
01286       { 
01287         int /* [~32768..32767] */ dsp16 = 
01288           sign_extend((MATCH_w_16_16 & 0xffff) /* d16 at 16 */, 16);
01289         
01290 
01291          {
01292 
01293                         ret->push(pc+2 + dsp16);
01294 
01295                         result.numBytes += 2;
01296 
01297                     }
01298 
01299         
01300 
01301         
01302         
01303         
01304       }
01305       
01306     } /*opt-block*/
01307     else { 
01308       unsigned dsp8 = (MATCH_w_16_0 & 0xff) /* data8 at 0 */;
01309       
01310 
01311         {
01312 
01313                       // Casts needed to work around MLTK bug
01314 
01315                       ret->push(pc+2 + (int)(char)dsp8);
01316 
01317                   }
01318 
01319       
01320       
01321       
01322     } /*opt-block*//*opt-block+*/
01323     
01324   }goto MATCH_finished_ce; 
01325   
01326   MATCH_finished_ce: (void)0; /*placeholder for label*/
01327   
01328 }
01329 
01330 
01331     
01332   return ret;
01333 }
01334 
01335 
01336 void NJMCDecoder::pIllegalMode(ADDRESS pc)
01337 {
01338     ostrstream ost;
01339     ost << "Illegal addressing mode at " << hex << pc;
01340     error(str(ost));
01341 }
01342 
01343 SemStr* NJMCDecoder::pDDirect(int r2, int size)
01344 {
01345     SemStr* ret = new SemStr(size);
01346     ret->push(idRegOf);
01347     ret->push(idIntConst);
01348     ret->push(r2);
01349     return ret;
01350 }
01351 
01352 SemStr* NJMCDecoder::pADirect(int r2, int size)
01353 {
01354     SemStr* ret = new SemStr(size);
01355     ret->push(idRegOf);
01356     ret->push(idIntConst);
01357     ret->push(r2 + 8);          // First A register is r[8]
01358     return ret;
01359 }
01360 
01361 SemStr* NJMCDecoder::pIndirect(int r2, int size)
01362 {
01363     SemStr* ret = new SemStr(size);
01364     ret->push(idMemOf);
01365     ret->push(idRegOf);
01366     ret->push(idIntConst);
01367     ret->push(r2 + 8);          // First A register is r[8]
01368     return ret;
01369 }
01370 
01371 SemStr* NJMCDecoder::pPostInc(int r2, int& bump, int& bumpr, int size)
01372 {
01373     // Treat this as (an), set bump to size, and bumpr to r2+8
01374     // Note special semantics when r2 == 7 (stack pointer): if size == 1, then
01375     // the system will change it to 2 to keep the stack word aligned
01376     if ((r2 == 7) && (size == 8)) size = 16;
01377     SemStr* ret = new SemStr(size/8);
01378     ret->push(idMemOf);
01379     ret->push(idRegOf);
01380     ret->push(idIntConst);
01381     ret->push(r2 + 8);          // First A register is r[8]
01382     bump = size/8;              // Amount to bump register by
01383     bumpr = r2 + 8;             // Register to bump
01384     return ret;
01385 }
01386 
01387 SemStr* NJMCDecoder::pPreDec(int r2, int& bump, int& bumpr, int size)
01388 {
01389     // We treat this as -size(an), set bump to -size, and bumpr to r2+8
01390     // Note special semantics when r2 == 7 (stack pointer): if size == 1, then
01391     // the system will change it to 2 to keep the stack word aligned
01392     if ((r2 == 7) && (size == 8)) size = 16;
01393     SemStr* ret = new SemStr(size);
01394     ret->push(idMemOf); ret->push(idPlus);
01395     ret->push(idRegOf);
01396     ret->push(idIntConst);
01397     ret->push(r2 + 8);          // First A register is r[8]
01398     ret->push(idIntConst); ret->push(-size/8);
01399     bump = -size/8;             // Amount to bump register by
01400     bumpr = r2 + 8;             // Register to bump
01401     return ret;
01402 }
01403 
01404 SemStr* NJMCDecoder::alEA(ADDRESS ea, ADDRESS pc, int& bump, int& bumpr,
01405     int size)
01406 {
01407   SemStr* ret = new SemStr(size);
01408 
01409 
01410 
01411 { 
01412   dword MATCH_p = 
01413     
01414 
01415     ea
01416     ;
01417   unsigned /* [0..65535] */ MATCH_w_16_0;
01418   { 
01419     MATCH_w_16_0 = getWord(MATCH_p); 
01420     
01421       switch((MATCH_w_16_0 >> 3 & 0x7) /* adrm at 0 */) {
01422         case 0: 
01423           { 
01424             unsigned reg2 = (MATCH_w_16_0 & 0x7) /* reg2 at 0 */;
01425             
01426 
01427              ret = pDDirect(reg2, size);
01428 
01429             
01430             
01431             
01432           }
01433           
01434           break;
01435         case 1: 
01436           { 
01437             unsigned reg2 = (MATCH_w_16_0 & 0x7) /* reg2 at 0 */;
01438             
01439 
01440              ret = pADirect(reg2, size);
01441 
01442             
01443             
01444             
01445           }
01446           
01447           break;
01448         case 2: 
01449           { 
01450             unsigned reg2 = (MATCH_w_16_0 & 0x7) /* reg2 at 0 */;
01451             
01452 
01453              ret = pIndirect(reg2, size);
01454 
01455             
01456             
01457             
01458           }
01459           
01460           break;
01461         case 3: 
01462           { 
01463             unsigned reg2 = (MATCH_w_16_0 & 0x7) /* reg2 at 0 */;
01464             
01465 
01466              ret = pPostInc(reg2, bump, bumpr, size);
01467 
01468             
01469             
01470             
01471           }
01472           
01473           break;
01474         case 4: 
01475           { 
01476             unsigned reg2 = (MATCH_w_16_0 & 0x7) /* reg2 at 0 */;
01477             
01478 
01479              ret = pPreDec(reg2, bump, bumpr, size);
01480 
01481             
01482             
01483             
01484           }
01485           
01486           break;
01487         case 5: case 6: case 7: 
01488           
01489 
01490           pIllegalMode(pc);
01491 
01492           
01493           
01494           
01495           break;
01496         default: assert(0);
01497       } /* (MATCH_w_16_0 >> 3 & 0x7) -- adrm at 0 --*/ 
01498     
01499   }goto MATCH_finished_be; 
01500   
01501   MATCH_finished_be: (void)0; /*placeholder for label*/
01502   
01503 }
01504 
01505 
01506   return ret;
01507 }
01508 
01509 SemStr* NJMCDecoder::amEA(ADDRESS ea, ADDRESS pc, int& bump, int& bumpr,
01510     int size)
01511 {
01512   SemStr* ret = new SemStr(size);
01513 
01514 
01515 
01516 { 
01517   dword MATCH_p = 
01518     
01519 
01520     ea
01521     ;
01522   unsigned /* [0..65535] */ MATCH_w_16_0;
01523   { 
01524     MATCH_w_16_0 = getWord(MATCH_p); 
01525     
01526       switch((MATCH_w_16_0 >> 3 & 0x7) /* adrm at 0 */) {
01527         case 0: 
01528           { 
01529             unsigned reg2 = (MATCH_w_16_0 & 0x7) /* reg2 at 0 */;
01530             
01531 
01532              ret = pDDirect(reg2, size);
01533 
01534             
01535             
01536             
01537           }
01538           
01539           break;
01540         case 1: 
01541           { 
01542             unsigned reg2 = (MATCH_w_16_0 & 0x7) /* reg2 at 0 */;
01543             
01544 
01545              ret = pADirect(reg2, size);
01546 
01547             
01548             
01549             
01550           }
01551           
01552           break;
01553         case 2: 
01554           { 
01555             unsigned reg2 = (MATCH_w_16_0 & 0x7) /* reg2 at 0 */;
01556             
01557 
01558              ret = pIndirect(reg2, size);
01559 
01560             
01561             
01562             
01563           }
01564           
01565           break;
01566         case 3: 
01567           { 
01568             unsigned reg2 = (MATCH_w_16_0 & 0x7) /* reg2 at 0 */;
01569             
01570 
01571              ret = pPostInc(reg2, bump, bumpr, size);
01572 
01573             
01574             
01575             
01576           }
01577           
01578           break;
01579         case 4: 
01580           { 
01581             unsigned reg2 = (MATCH_w_16_0 & 0x7) /* reg2 at 0 */;
01582             
01583 
01584              ret = pPreDec(reg2, bump, bumpr, size);
01585 
01586             
01587             
01588             
01589           }
01590           
01591           break;
01592         case 5: case 6: case 7: 
01593           
01594 
01595           pIllegalMode(pc);
01596 
01597           
01598           
01599           
01600           break;
01601         default: assert(0);
01602       } /* (MATCH_w_16_0 >> 3 & 0x7) -- adrm at 0 --*/ 
01603     
01604   }goto MATCH_finished_ae; 
01605   
01606   MATCH_finished_ae: (void)0; /*placeholder for label*/
01607   
01608 }
01609 
01610 
01611   return ret;
01612 }
01613 
01614 SemStr* NJMCDecoder::awlEA(ADDRESS ea, ADDRESS pc, int& bump, int& bumpr,
01615     int size)
01616 {
01617   SemStr* ret = new SemStr(size);
01618 
01619 
01620 
01621 { 
01622   dword MATCH_p = 
01623     
01624 
01625     ea
01626     ;
01627   unsigned /* [0..65535] */ MATCH_w_16_0;
01628   { 
01629     MATCH_w_16_0 = getWord(MATCH_p); 
01630     
01631       switch((MATCH_w_16_0 >> 3 & 0x7) /* adrm at 0 */) {
01632         case 0: 
01633           { 
01634             unsigned reg2 = (MATCH_w_16_0 & 0x7) /* reg2 at 0 */;
01635             
01636 
01637              ret = pDDirect(reg2, size);
01638 
01639             
01640             
01641             
01642           }
01643           
01644           break;
01645         case 1: 
01646           { 
01647             unsigned reg2 = (MATCH_w_16_0 & 0x7) /* reg2 at 0 */;
01648             
01649 
01650              ret = pADirect(reg2, size);
01651 
01652             
01653             
01654             
01655           }
01656           
01657           break;
01658         case 2: 
01659           { 
01660             unsigned reg2 = (MATCH_w_16_0 & 0x7) /* reg2 at 0 */;
01661             
01662 
01663              ret = pIndirect(reg2, size);
01664 
01665             
01666             
01667             
01668           }
01669           
01670           break;
01671         case 3: 
01672           { 
01673             unsigned reg2 = (MATCH_w_16_0 & 0x7) /* reg2 at 0 */;
01674             
01675 
01676              ret = pPostInc(reg2, bump, bumpr, size);
01677 
01678             
01679             
01680             
01681           }
01682           
01683           break;
01684         case 4: 
01685           { 
01686             unsigned reg2 = (MATCH_w_16_0 & 0x7) /* reg2 at 0 */;
01687             
01688 
01689              ret = pPreDec(reg2, bump, bumpr, size);
01690 
01691             
01692             
01693             
01694           }
01695           
01696           break;
01697         case 5: case 6: case 7: 
01698           
01699 
01700           pIllegalMode(pc);
01701 
01702           
01703           
01704           
01705           break;
01706         default: assert(0);
01707       } /* (MATCH_w_16_0 >> 3 & 0x7) -- adrm at 0 --*/ 
01708     
01709   }goto MATCH_finished_zd; 
01710   
01711   MATCH_finished_zd: (void)0; /*placeholder for label*/
01712   
01713 }
01714 
01715 
01716   return ret;
01717 }
01718 
01719 SemStr* NJMCDecoder::cEA(ADDRESS ea, ADDRESS pc, int size)
01720 {
01721   SemStr* ret = new SemStr(size);
01722 
01723 
01724 
01725 { 
01726   dword MATCH_p = 
01727     
01728 
01729     ea
01730     ;
01731   unsigned /* [0..65535] */ MATCH_w_16_0;
01732   { 
01733     MATCH_w_16_0 = getWord(MATCH_p); 
01734     if ((MATCH_w_16_0 >> 3 & 0x7) /* adrm at 0 */ == 2) { 
01735       unsigned reg2 = (MATCH_w_16_0 & 0x7) /* reg2 at 0 */;
01736       
01737 
01738        ret = pIndirect(reg2, size);
01739 
01740       
01741       
01742       
01743     } /*opt-block*//*opt-block+*/
01744     else 
01745       
01746 
01747       pIllegalMode(pc);
01748 
01749       
01750        /*opt-block+*/
01751     
01752   }goto MATCH_finished_yd; 
01753   
01754   MATCH_finished_yd: (void)0; /*placeholder for label*/
01755   
01756 }
01757 
01758 
01759   return ret;
01760 }
01761 
01762 SemStr* NJMCDecoder::dEA(ADDRESS ea, ADDRESS pc, int& bump, int& bumpr,
01763     int size)
01764 {
01765   SemStr* ret = new SemStr(size);
01766 
01767 
01768 
01769 { 
01770   dword MATCH_p = 
01771     
01772 
01773     ea
01774     ;
01775   unsigned /* [0..65535] */ MATCH_w_16_0;
01776   { 
01777     MATCH_w_16_0 = getWord(MATCH_p); 
01778     
01779       switch((MATCH_w_16_0 >> 3 & 0x7) /* adrm at 0 */) {
01780         case 0: 
01781           { 
01782             unsigned reg2 = (MATCH_w_16_0 & 0x7) /* reg2 at 0 */;
01783             
01784 
01785              ret = pDDirect(reg2, size);
01786 
01787             
01788             
01789             
01790           }
01791           
01792           break;
01793         case 1: case 5: case 6: case 7: 
01794           
01795 
01796           pIllegalMode(pc);
01797 
01798           
01799           
01800           
01801           break;
01802         case 2: 
01803           { 
01804             unsigned reg2 = (MATCH_w_16_0 & 0x7) /* reg2 at 0 */;
01805             
01806 
01807              ret = pIndirect(reg2, size);
01808 
01809             
01810             
01811             
01812           }
01813           
01814           break;
01815         case 3: 
01816           { 
01817             unsigned reg2 = (MATCH_w_16_0 & 0x7) /* reg2 at 0 */;
01818             
01819 
01820              ret = pPostInc(reg2, bump, bumpr, size);
01821 
01822             
01823             
01824             
01825           }
01826           
01827           break;
01828         case 4: 
01829           { 
01830             unsigned reg2 = (MATCH_w_16_0 & 0x7) /* reg2 at 0 */;
01831             
01832 
01833              ret = pPreDec(reg2, bump, bumpr, size);
01834 
01835             
01836             
01837             
01838           }
01839           
01840           break;
01841         default: assert(0);
01842       } /* (MATCH_w_16_0 >> 3 & 0x7) -- adrm at 0 --*/ 
01843     
01844   }goto MATCH_finished_xd; 
01845   
01846   MATCH_finished_xd: (void)0; /*placeholder for label*/
01847   
01848 }
01849 
01850 
01851   return ret;
01852 }
01853 
01854 SemStr* NJMCDecoder::daEA(ADDRESS ea, ADDRESS pc, int& bump, int& bumpr,
01855     int size)
01856 {
01857   SemStr* ret = new SemStr(size);
01858 
01859 
01860 
01861 { 
01862   dword MATCH_p = 
01863     
01864 
01865     ea
01866     ;
01867   unsigned /* [0..65535] */ MATCH_w_16_0;
01868   { 
01869     MATCH_w_16_0 = getWord(MATCH_p); 
01870     
01871       switch((MATCH_w_16_0 >> 3 & 0x7) /* adrm at 0 */) {
01872         case 0: 
01873           { 
01874             unsigned reg2 = (MATCH_w_16_0 & 0x7) /* reg2 at 0 */;
01875             
01876 
01877              ret = pDDirect(reg2, size);
01878 
01879             
01880             
01881             
01882           }
01883           
01884           break;
01885         case 1: case 5: case 6: case 7: 
01886           
01887 
01888           pIllegalMode(pc);
01889 
01890           
01891           
01892           
01893           break;
01894         case 2: 
01895           { 
01896             unsigned reg2 = (MATCH_w_16_0 & 0x7) /* reg2 at 0 */;
01897             
01898 
01899              ret = pIndirect(reg2, size);
01900 
01901             
01902             
01903             
01904           }
01905           
01906           break;
01907         case 3: 
01908           { 
01909             unsigned reg2 = (MATCH_w_16_0 & 0x7) /* reg2 at 0 */;
01910             
01911 
01912              ret = pPostInc(reg2, bump, bumpr, size);
01913 
01914             
01915             
01916             
01917           }
01918           
01919           break;
01920         case 4: 
01921           { 
01922             unsigned reg2 = (MATCH_w_16_0 & 0x7) /* reg2 at 0 */;
01923             
01924 
01925              ret = pPreDec(reg2, bump, bumpr, size);
01926 
01927             
01928             
01929             
01930           }
01931           
01932           break;
01933         default: assert(0);
01934       } /* (MATCH_w_16_0 >> 3 & 0x7) -- adrm at 0 --*/ 
01935     
01936   }goto MATCH_finished_wd; 
01937   
01938   MATCH_finished_wd: (void)0; /*placeholder for label*/
01939   
01940 }
01941 
01942 
01943   return ret;
01944 }
01945 
01946 SemStr* NJMCDecoder::dBEA(ADDRESS ea, ADDRESS pc, int& bump, int& bumpr,
01947     int size)
01948 {
01949   SemStr* ret = new SemStr(size);
01950 
01951 
01952 
01953 { 
01954   dword MATCH_p = 
01955     
01956 
01957     ea
01958     ;
01959   unsigned /* [0..65535] */ MATCH_w_16_0;
01960   { 
01961     MATCH_w_16_0 = getWord(MATCH_p); 
01962     
01963       switch((MATCH_w_16_0 >> 3 & 0x7) /* adrm at 0 */) {
01964         case 0: 
01965           { 
01966             unsigned reg2 = (MATCH_w_16_0 & 0x7) /* reg2 at 0 */;
01967             
01968 
01969              ret = pDDirect(reg2, size);
01970 
01971             
01972             
01973             
01974           }
01975           
01976           break;
01977         case 1: case 5: case 6: case 7: 
01978           
01979 
01980           pIllegalMode(pc);
01981 
01982           
01983           
01984           
01985           break;
01986         case 2: 
01987           { 
01988             unsigned reg2 = (MATCH_w_16_0 & 0x7) /* reg2 at 0 */;
01989             
01990 
01991              ret = pIndirect(reg2, size);
01992 
01993             
01994             
01995             
01996           }
01997           
01998           break;
01999         case 3: 
02000           { 
02001             unsigned reg2 = (MATCH_w_16_0 & 0x7) /* reg2 at 0 */;
02002             
02003 
02004              ret = pPostInc(reg2, bump, bumpr, size);
02005 
02006             
02007             
02008             
02009           }
02010           
02011           break;
02012         case 4: 
02013           { 
02014             unsigned reg2 = (MATCH_w_16_0 & 0x7) /* reg2 at 0 */;
02015             
02016 
02017              ret = pPreDec(reg2, bump, bumpr, size);
02018 
02019             
02020             
02021             
02022           }
02023           
02024           break;
02025         default: assert(0);
02026       } /* (MATCH_w_16_0 >> 3 & 0x7) -- adrm at 0 --*/ 
02027     
02028   }goto MATCH_finished_vd; 
02029   
02030   MATCH_finished_vd: (void)0; /*placeholder for label*/
02031   
02032 }
02033 
02034 
02035   return ret;
02036 }
02037 
02038 SemStr* NJMCDecoder::dWEA(ADDRESS ea, ADDRESS pc, int& bump, int& bumpr,
02039     int size)
02040 {
02041   SemStr* ret = new SemStr(size);
02042 
02043 
02044 
02045 { 
02046   dword MATCH_p = 
02047     
02048 
02049     ea
02050     ;
02051   unsigned /* [0..65535] */ MATCH_w_16_0;
02052   { 
02053     MATCH_w_16_0 = getWord(MATCH_p); 
02054     
02055       switch((MATCH_w_16_0 >> 3 & 0x7) /* adrm at 0 */) {
02056         case 0: 
02057           { 
02058             unsigned reg2 = (MATCH_w_16_0 & 0x7) /* reg2 at 0 */;
02059             
02060 
02061              ret = pDDirect(reg2, size);
02062 
02063             
02064             
02065             
02066           }
02067           
02068           break;
02069         case 1: case 5: case 6: case 7: 
02070           
02071 
02072           pIllegalMode(pc);
02073 
02074           
02075           
02076           
02077           break;
02078         case 2: 
02079           { 
02080             unsigned reg2 = (MATCH_w_16_0 & 0x7) /* reg2 at 0 */;
02081             
02082 
02083              ret = pIndirect(reg2, size);
02084 
02085             
02086             
02087             
02088           }
02089           
02090           break;
02091         case 3: 
02092           { 
02093             unsigned reg2 = (MATCH_w_16_0 & 0x7) /* reg2 at 0 */;
02094             
02095 
02096              ret = pPostInc(reg2, bump, bumpr, size);
02097 
02098             
02099             
02100             
02101           }
02102           
02103           break;
02104         case 4: 
02105           { 
02106             unsigned reg2 = (MATCH_w_16_0 & 0x7) /* reg2 at 0 */;
02107             
02108 
02109              ret = pPreDec(reg2, bump, bumpr, size);
02110 
02111             
02112             
02113             
02114           }
02115           
02116           break;
02117         default: assert(0);
02118       } /* (MATCH_w_16_0 >> 3 & 0x7) -- adrm at 0 --*/ 
02119     
02120   }goto MATCH_finished_ud; 
02121   
02122   MATCH_finished_ud: (void)0; /*placeholder for label*/
02123   
02124 }
02125 
02126 
02127   return ret;
02128 }
02129 
02130 SemStr* NJMCDecoder::maEA(ADDRESS ea, ADDRESS pc, int& bump, int& bumpr,
02131     int size)
02132 {
02133   SemStr* ret = new SemStr(size);
02134 
02135 
02136 
02137 { 
02138   dword MATCH_p = 
02139     
02140 
02141     ea
02142     ;
02143   unsigned /* [0..65535] */ MATCH_w_16_0;
02144   { 
02145     MATCH_w_16_0 = getWord(MATCH_p); 
02146     
02147       switch((MATCH_w_16_0 >> 3 & 0x7) /* adrm at 0 */) {
02148         case 0: case 1: case 5: case 6: case 7: 
02149           
02150 
02151           pIllegalMode(pc);
02152 
02153           
02154           
02155           
02156           break;
02157         case 2: 
02158           { 
02159             unsigned reg2 = (MATCH_w_16_0 & 0x7) /* reg2 at 0 */;
02160             
02161 
02162              ret = pIndirect(reg2, size);
02163 
02164             
02165             
02166             
02167           }
02168           
02169           break;
02170         case 3: 
02171           { 
02172             unsigned reg2 = (MATCH_w_16_0 & 0x7) /* reg2 at 0 */;
02173             
02174 
02175              ret = pPostInc(reg2, bump, bumpr, size);
02176 
02177             
02178             
02179             
02180           }
02181           
02182           break;
02183         case 4: 
02184           { 
02185             unsigned reg2 = (MATCH_w_16_0 & 0x7) /* reg2 at 0 */;
02186             
02187 
02188              ret = pPreDec(reg2, bump, bumpr, size);
02189 
02190             
02191             
02192             
02193           }
02194           
02195           break;
02196         default: assert(0);
02197       } /* (MATCH_w_16_0 >> 3 & 0x7) -- adrm at 0 --*/ 
02198     
02199   }goto MATCH_finished_td; 
02200   
02201   MATCH_finished_td: (void)0; /*placeholder for label*/
02202   
02203 }
02204 
02205 
02206   return ret;
02207 }
02208 
02209 SemStr* NJMCDecoder::msEA(ADDRESS ea, ADDRESS pc, int& bump, int& bumpr,
02210     int size)
02211 {
02212   SemStr* ret = new SemStr(size);
02213 
02214 
02215 
02216 { 
02217   dword MATCH_p = 
02218     
02219 
02220     ea
02221     ;
02222   unsigned /* [0..65535] */ MATCH_w_16_0;
02223   { 
02224     MATCH_w_16_0 = getWord(MATCH_p); 
02225     
02226       switch((MATCH_w_16_0 >> 3 & 0x7) /* adrm at 0 */) {
02227         case 0: 
02228           { 
02229             unsigned reg2 = (MATCH_w_16_0 & 0x7) /* reg2 at 0 */;
02230             
02231 
02232              ret = pDDirect(reg2, size);
02233 
02234             
02235             
02236             
02237           }
02238           
02239           break;
02240         case 1: 
02241           { 
02242             unsigned reg2 = (MATCH_w_16_0 & 0x7) /* reg2 at 0 */;
02243             
02244 
02245              ret = pADirect(reg2, size);
02246 
02247             
02248             
02249             
02250           }
02251           
02252           break;
02253         case 2: 
02254           { 
02255             unsigned reg2 = (MATCH_w_16_0 & 0x7) /* reg2 at 0 */;
02256             
02257 
02258              ret = pIndirect(reg2, size);
02259 
02260             
02261             
02262             
02263           }
02264           
02265           break;
02266         case 3: 
02267           { 
02268             unsigned reg2 = (MATCH_w_16_0 & 0x7) /* reg2 at 0 */;
02269             
02270 
02271              ret = pPostInc(reg2, bump, bumpr, size);
02272 
02273             
02274             
02275             
02276           }
02277           
02278           break;
02279         case 4: 
02280           { 
02281             unsigned reg2 = (MATCH_w_16_0 & 0x7) /* reg2 at 0 */;
02282             
02283 
02284              ret = pPreDec(reg2, bump, bumpr, size);
02285 
02286             
02287             
02288             
02289           }
02290           
02291           break;
02292         case 5: case 6: case 7: 
02293           
02294 
02295           pIllegalMode(pc);
02296 
02297           
02298           
02299           
02300           break;
02301         default: assert(0);
02302       } /* (MATCH_w_16_0 >> 3 & 0x7) -- adrm at 0 --*/ 
02303     
02304   }goto MATCH_finished_sd; 
02305   
02306   MATCH_finished_sd: (void)0; /*placeholder for label*/
02307   
02308 }
02309 
02310 
02311   return ret;
02312 }
02313 
02314 SemStr* NJMCDecoder::mdEA(ADDRESS ea, ADDRESS pc, int& bump, int& bumpr,
02315     int size)
02316 {
02317   SemStr* ret = new SemStr(size);
02318 
02319 
02320 
02321 { 
02322   dword MATCH_p = 
02323     
02324 
02325     ea
02326     ;
02327   unsigned /* [0..65535] */ MATCH_w_16_0;
02328   { 
02329     MATCH_w_16_0 = getWord(MATCH_p); 
02330     
02331       switch((MATCH_w_16_0 >> 6 & 0x7) /* MDadrm at 0 */) {
02332         case 0: 
02333           { 
02334             unsigned reg1 = (MATCH_w_16_0 >> 9 & 0x7) /* reg1 at 0 */;
02335             
02336 
02337              ret = pDDirect(reg1, size);
02338 
02339             
02340             
02341             
02342           }
02343           
02344           break;
02345         case 1: 
02346           { 
02347             unsigned reg1 = (MATCH_w_16_0 >> 9 & 0x7) /* reg1 at 0 */;
02348             
02349 
02350              ret = pADirect(reg1, size);
02351 
02352             
02353             
02354             
02355           }
02356           
02357           break;
02358         case 2: 
02359           { 
02360             unsigned reg1 = (MATCH_w_16_0 >> 9 & 0x7) /* reg1 at 0 */;
02361             
02362 
02363              ret = pIndirect(reg1, size);
02364 
02365             
02366             
02367             
02368           }
02369           
02370           break;
02371         case 3: 
02372           { 
02373             unsigned reg1 = (MATCH_w_16_0 >> 9 & 0x7) /* reg1 at 0 */;
02374             
02375 
02376              ret = pPostInc(reg1, bump, bumpr, size);
02377 
02378             
02379             
02380             
02381           }
02382           
02383           break;
02384         case 4: 
02385           { 
02386             unsigned reg1 = (MATCH_w_16_0 >> 9 & 0x7) /* reg1 at 0 */;
02387             
02388 
02389              ret = pPreDec(reg1, bump, bumpr, size);
02390 
02391             
02392             
02393             
02394           }
02395           
02396           break;
02397         case 5: case 6: case 7: 
02398           
02399 
02400           pIllegalMode(pc);
02401 
02402           
02403           
02404           
02405           break;
02406         default: assert(0);
02407       } /* (MATCH_w_16_0 >> 6 & 0x7) -- MDadrm at 0 --*/ 
02408     
02409   }goto MATCH_finished_rd; 
02410   
02411   MATCH_finished_rd: (void)0; /*placeholder for label*/
02412   
02413 }
02414 
02415 
02416   return ret;
02417 }
02418 
02419 SemStr* NJMCDecoder::mrEA(ADDRESS ea, ADDRESS pc, int& bump, int& bumpr,
02420     int size)
02421 {
02422   SemStr* ret = new SemStr(size);
02423 
02424 
02425 
02426 { 
02427   dword MATCH_p = 
02428     
02429 
02430     ea
02431     ;
02432   unsigned /* [0..65535] */ MATCH_w_16_0;
02433   { 
02434     MATCH_w_16_0 = getWord(MATCH_p); 
02435     
02436       switch((MATCH_w_16_0 >> 3 & 0x7) /* adrm at 0 */) {
02437         case 0: case 1: case 4: case 5: case 6: case 7: 
02438           
02439 
02440           pIllegalMode(pc);
02441 
02442           
02443           
02444           
02445           break;
02446         case 2: 
02447           { 
02448             unsigned reg2 = (MATCH_w_16_0 & 0x7) /* reg2 at 0 */;
02449             
02450 
02451              ret = pIndirect(reg2, size);
02452 
02453             
02454             
02455             
02456           }
02457           
02458           break;
02459         case 3: 
02460           { 
02461             unsigned reg2 = (MATCH_w_16_0 & 0x7) /* reg2 at 0 */;
02462             
02463 
02464              ret = pPostInc(reg2, bump, bumpr, size);
02465 
02466             
02467             
02468             
02469           }
02470           
02471           break;
02472         default: assert(0);
02473       } /* (MATCH_w_16_0 >> 3 & 0x7) -- adrm at 0 --*/ 
02474     
02475   }goto MATCH_finished_qd; 
02476   
02477   MATCH_finished_qd: (void)0; /*placeholder for label*/
02478   
02479 }
02480 
02481 
02482   return ret;
02483 }
02484 
02485 SemStr* NJMCDecoder::rmEA(ADDRESS ea, ADDRESS pc, int& bump, int& bumpr,
02486     int size)
02487 {
02488   SemStr* ret = new SemStr(size);
02489 
02490 
02491 
02492 { 
02493   dword MATCH_p = 
02494     
02495 
02496     ea
02497     ;
02498   unsigned /* [0..65535] */ MATCH_w_16_0;
02499   { 
02500     MATCH_w_16_0 = getWord(MATCH_p); 
02501     
02502       switch((MATCH_w_16_0 >> 3 & 0x7) /* adrm at 0 */) {
02503         case 0: case 1: case 3: case 5: case 6: case 7: 
02504           
02505 
02506           pIllegalMode(pc);
02507 
02508           
02509           
02510           
02511           break;
02512         case 2: 
02513           { 
02514             unsigned reg2 = (MATCH_w_16_0 & 0x7) /* reg2 at 0 */;
02515             
02516 
02517              ret = pIndirect(reg2, size);
02518 
02519             
02520             
02521             
02522           }
02523           
02524           break;
02525         case 4: 
02526           { 
02527             unsigned reg2 = (MATCH_w_16_0 & 0x7) /* reg2 at 0 */;
02528             
02529 
02530              ret = pPreDec(reg2, bump, bumpr, size);
02531 
02532             
02533             
02534             
02535           }
02536           
02537           break;
02538         default: assert(0);
02539       } /* (MATCH_w_16_0 >> 3 & 0x7) -- adrm at 0 --*/ 
02540     
02541   }goto MATCH_finished_pd; 
02542   
02543   MATCH_finished_pd: (void)0; /*placeholder for label*/
02544   
02545 }
02546 
02547 
02548   return ret;
02549 }
02550 
02551 
02552 SemStr* NJMCDecoder::pADisp(int d16, int r, int size)
02553 {
02554   SemStr* ret = new SemStr(size);
02555   // d16(Ar) -> m[ + r[ int r+8 ] int d16]
02556   ret->push(idMemOf); ret->push(idPlus); ret->push(idRegOf);
02557   ret->push(idIntConst); ret->push(r+8);
02558   ret->push(idIntConst); ret->push(d16);
02559   return ret;
02560 }
02561 
02562 SemStr* NJMCDecoder::pAIndex(int d8, int r, int iT, int iR, int iS, int size)
02563 {
02564     SemStr* ret = new SemStr(size);
02565     // d8(Ar, A/Di.[wl] ->
02566     //   m[ + + r[ int r+8 ] ! size[ 16/32 r[ int iT<<3+iR ]] int i8 ]
02567     ret->push(idMemOf); ret->push(idPlus); ret->push(idPlus);
02568     ret->push(idRegOf); ret->push(idIntConst); ret->push(r+8);
02569     ret->push(idSignExt);
02570     ret->push(idSize);  ret->push(iS == 0 ? 16 : 32);
02571     ret->push(idRegOf); ret->push(idIntConst); ret->push((iT<<3) + iR);
02572     ret->push(idIntConst); ret->push(d8);
02573     return ret;
02574 }
02575 
02576 SemStr* NJMCDecoder::pPcDisp(ADDRESS label, int delta, int size)
02577 {
02578     // Note: label is in the host address space, so need to subtract delta
02579     SemStr* ret = new SemStr(size);
02580     // d16(pc) -> m[ code pc+d16 ]
02581     // Note: we use "code" instead of "int" to flag the fact that this address
02582     // is relative to the pc, and hence needs translation before use in the
02583     // target machine
02584     ret->push(idMemOf); ret->push(idCodeAddr);
02585     ret->push(label - delta);
02586     return ret;
02587 }
02588 
02589 SemStr* NJMCDecoder::pPcIndex(int d8, int iT, int iR, int iS, ADDRESS nextPc, int size)
02590 {
02591     // Note: nextPc is expected to have +2 or +4 etc already added to it!
02592     SemStr* ret = new SemStr(size);
02593     // d8(pc, A/Di.[wl] ->
02594     //   m[ + pc+i8 ! size[ 16/32 r[ int iT<<3+iR ]]]
02595     ret->push(idMemOf); ret->push(idPlus);
02596     ret->push(idIntConst); ret->push(nextPc+d8);
02597     ret->push(idSignExt);
02598     ret->push(idSize);  ret->push(iS == 0 ? 16 : 32);
02599     ret->push(idRegOf); ret->push(idIntConst); ret->push((iT<<3) + iR);
02600     return ret;
02601 }
02602 
02603 SemStr* NJMCDecoder::pAbsW(int d16, int size)
02604 {
02605   // (d16).w  ->  size[ ss m[ int d16 ]]
02606   // Note: d16 should already have been sign extended to 32 bits
02607   SemStr* ret = new SemStr(size);
02608   ret->push(idSize); ret->push(size);
02609   ret->push(idMemOf); ret->push(idIntConst); ret->push(d16);
02610   return ret;
02611 }
02612 
02613 SemStr* NJMCDecoder::pAbsL(int d32, int size)
02614 {
02615   // (d32).w  ->  size[ ss m[ int d32 ]]
02616   SemStr* ret = new SemStr(size);
02617   ret->push(idSize); ret->push(size);
02618   ret->push(idMemOf); ret->push(idIntConst); ret->push(d32);
02619   return ret;
02620 }
02621 
02622 SemStr* NJMCDecoder::pImmB(int d8)
02623 {
02624   // #d8 -> int d8
02625   // Should already be sign extended to 32 bits
02626   SemStr* ret = new SemStr(8);
02627   ret->push(idIntConst); ret->push(d8);
02628   return ret;
02629 }
02630 
02631 SemStr* NJMCDecoder::pImmW(int d16)
02632 {
02633   // #d16 -> int d16
02634   // Should already be sign extended to 32 bits
02635   SemStr* ret = new SemStr(16);
02636   ret->push(idIntConst); ret->push(d16);
02637   return ret;
02638 }
02639 
02640 SemStr* NJMCDecoder::pImmL(int d32)
02641 {
02642   SemStr* ret = new SemStr(32);
02643   ret->push(idIntConst); ret->push(d32);
02644   return ret;
02645 }
02646 
02647 void NJMCDecoder::pNonzeroByte(ADDRESS pc)
02648 {
02649     ostrstream ost;
02650     ost << "Non zero upper byte at " << hex << pc;
02651     error(str(ost));
02652 }
02653 
02654 
02655 SemStr* NJMCDecoder::alEAX(ADDRESS eax, ADDRESS x, DecodeResult& result,
02656     ADDRESS pc, int size)
02657 {
02658   SemStr* ret;
02659   int reg2, mode;
02660 
02661 
02662 
02663 
02664 { 
02665   dword MATCH_p = 
02666     
02667 
02668     eax
02669     ;
02670   unsigned /* [0..65535] */ MATCH_w_16_0;
02671   { 
02672     MATCH_w_16_0 = getWord(MATCH_p); 
02673     
02674       switch((MATCH_w_16_0 >> 3 & 0x7) /* adrm at 0 */) {
02675         case 0: case 1: case 2: case 3: case 4: 
02676           goto MATCH_label_od0; break;
02677         case 5: 
02678           { 
02679             unsigned r2 = (MATCH_w_16_0 & 0x7) /* reg2 at 0 */;
02680             
02681 
02682              { mode = 0; reg2 = r2; result.numBytes += 2;}
02683 
02684             
02685             
02686             
02687           }
02688           
02689           break;
02690         case 6: 
02691           { 
02692             unsigned r2 = (MATCH_w_16_0 & 0x7) /* reg2 at 0 */;
02693             
02694 
02695              { mode = 1; reg2 = r2; result.numBytes += 2;}
02696 
02697             
02698             
02699             
02700           }
02701           
02702           break;
02703         case 7: 
02704           
02705             switch((MATCH_w_16_0 & 0x7) /* reg2 at 0 */) {
02706               case 0: 
02707                 
02708 
02709                  { mode = 4; result.numBytes += 2;}
02710 
02711                 
02712                 
02713                 
02714                 break;
02715               case 1: 
02716                 
02717 
02718                  { mode = 5; result.numBytes += 4;}
02719 
02720                 
02721                 
02722                 
02723                 break;
02724               case 2: case 3: case 4: case 5: case 6: case 7: 
02725                 goto MATCH_label_od0; break;
02726               default: assert(0);
02727             } /* (MATCH_w_16_0 & 0x7) -- reg2 at 0 --*/ 
02728           break;
02729         default: assert(0);
02730       } /* (MATCH_w_16_0 >> 3 & 0x7) -- adrm at 0 --*/ 
02731     
02732   }goto MATCH_finished_od; 
02733   
02734   MATCH_label_od0: (void)0; /*placeholder for label*/ 
02735     
02736 
02737     pIllegalMode(pc);
02738 
02739     
02740      
02741     goto MATCH_finished_od; 
02742     
02743   MATCH_finished_od: (void)0; /*placeholder for label*/
02744   
02745 }
02746 
02747 
02748 
02749   switch (mode) {
02750     case 0 : {
02751 
02752 
02753 
02754 { 
02755   dword MATCH_p = 
02756     
02757 
02758     x
02759     ;
02760   unsigned /* [0..65535] */ MATCH_w_16_0;
02761   { 
02762     MATCH_w_16_0 = getWord(MATCH_p); 
02763     { 
02764       int /* [~32768..32767] */ d16 = 
02765         sign_extend((MATCH_w_16_0 & 0xffff) /* d16 at 0 */, 16);
02766       
02767 
02768        ret = pADisp(d16, reg2, size);
02769 
02770       
02771       
02772       
02773     }
02774     
02775   }goto MATCH_finished_nd; 
02776   
02777   MATCH_finished_nd: (void)0; /*placeholder for label*/
02778   
02779 }
02780 
02781 
02782       break;
02783     }
02784     case 1 : {
02785 
02786 
02787 
02788 { 
02789   dword MATCH_p = 
02790     
02791 
02792     x
02793     ;
02794   unsigned /* [0..65535] */ MATCH_w_16_0;
02795   { 
02796     MATCH_w_16_0 = getWord(MATCH_p); 
02797     { 
02798       int /* [~128..127] */ d8 = 
02799         sign_extend((MATCH_w_16_0 & 0xff) /* disp8 at 0 */, 8);
02800       unsigned iR = (MATCH_w_16_0 >> 12 & 0x7) /* iReg at 0 */;
02801       unsigned iS = (MATCH_w_16_0 >> 11 & 0x1) /* iSize at 0 */;
02802       unsigned iT = (MATCH_w_16_0 >> 15 & 0x1) /* iType at 0 */;
02803       
02804 
02805        ret = pAIndex(d8, reg2, iT, iR, iS, size);
02806 
02807       
02808       
02809       
02810     }
02811     
02812   }goto MATCH_finished_md; 
02813   
02814   MATCH_finished_md: (void)0; /*placeholder for label*/
02815   
02816 }
02817 
02818 
02819       break;
02820     }
02821     case 4 : {
02822 
02823 
02824 
02825 { 
02826   dword MATCH_p = 
02827     
02828 
02829     x
02830     ;
02831   unsigned /* [0..65535] */ MATCH_w_16_0;
02832   { 
02833     MATCH_w_16_0 = getWord(MATCH_p); 
02834     { 
02835       int /* [~32768..32767] */ d16 = 
02836         sign_extend((MATCH_w_16_0 & 0xffff) /* d16 at 0 */, 16);
02837       
02838 
02839        ret = pAbsW(d16, size);
02840 
02841       
02842       
02843       
02844     }
02845     
02846   }goto MATCH_finished_ld; 
02847   
02848   MATCH_finished_ld: (void)0; /*placeholder for label*/
02849   
02850 }
02851 
02852 
02853       break;
02854     }
02855     case 5 : {
02856 
02857 
02858 
02859 { 
02860   dword MATCH_p = 
02861     
02862 
02863     x
02864     ;
02865   unsigned /* [0..65535] */ MATCH_w_16_0;
02866   unsigned /* [0..65535] */ MATCH_w_16_16;
02867   { 
02868     MATCH_w_16_0 = getWord(MATCH_p); 
02869     MATCH_w_16_16 = getWord(2 + MATCH_p); 
02870     { 
02871       unsigned d32 = 
02872         ((MATCH_w_16_0 & 0xffff) /* d16 at 0 */ << 16) + 
02873         (MATCH_w_16_16 & 0xffff) /* d16 at 16 */;
02874       
02875 
02876        ret = pAbsL(d32, size);
02877 
02878       
02879       
02880       
02881     }
02882     
02883   }goto MATCH_finished_kd; 
02884   
02885   MATCH_finished_kd: (void)0; /*placeholder for label*/
02886   
02887 }
02888 
02889 
02890       break;
02891     }
02892     default : pIllegalMode(pc); break;
02893   } 
02894   return ret;
02895 }
02896 
02897 
02898 SemStr* NJMCDecoder::amEAX(ADDRESS eax, ADDRESS x, DecodeResult& result,
02899     ADDRESS pc, int delta, int size)
02900 {
02901   SemStr* ret;
02902   int reg2, mode;
02903 
02904 
02905 
02906 
02907 { 
02908   dword MATCH_p = 
02909     
02910 
02911     eax
02912     ;
02913   unsigned /* [0..65535] */ MATCH_w_16_0;
02914   { 
02915     MATCH_w_16_0 = getWord(MATCH_p); 
02916     
02917       switch((MATCH_w_16_0 >> 3 & 0x7) /* adrm at 0 */) {
02918         case 0: case 1: case 2: case 3: case 4: 
02919           goto MATCH_label_jd0; break;
02920         case 5: 
02921           { 
02922             unsigned r2 = (MATCH_w_16_0 & 0x7) /* reg2 at 0 */;
02923             
02924 
02925              { mode = 0; reg2 = r2; result.numBytes += 2;}
02926 
02927             
02928             
02929             
02930           }
02931           
02932           break;
02933         case 6: 
02934           { 
02935             unsigned r2 = (MATCH_w_16_0 & 0x7) /* reg2 at 0 */;
02936             
02937 
02938              { mode = 1; reg2 = r2; result.numBytes += 2;}
02939 
02940             
02941             
02942             
02943           }
02944           
02945           break;
02946         case 7: 
02947           
02948             switch((MATCH_w_16_0 & 0x7) /* reg2 at 0 */) {
02949               case 0: 
02950                 
02951 
02952                  { mode = 4; result.numBytes += 2;}
02953 
02954                 
02955                 
02956                 
02957                 break;
02958               case 1: 
02959                 
02960 
02961                  { mode = 5; result.numBytes += 4;}
02962 
02963                 
02964                 
02965                 
02966                 break;
02967               case 2: 
02968                 
02969 
02970                  { mode = 2; result.numBytes += 2;}
02971 
02972                 
02973                 
02974                 
02975                 break;
02976               case 3: 
02977                 
02978 
02979                  { mode = 3; result.numBytes += 2;}
02980 
02981                 
02982                 
02983                 
02984                 break;
02985               case 4: 
02986                 
02987                   switch((MATCH_w_16_0 >> 6 & 0x3) /* sz at 0 */) {
02988                     case 0: 
02989                       
02990 
02991                        { mode = 6; result.numBytes += 2;}
02992 
02993                       
02994                       
02995                       
02996                       break;
02997                     case 1: 
02998                       
02999 
03000                        { mode = 7; result.numBytes += 2;}
03001 
03002                       
03003                       
03004                       
03005                       break;
03006                     case 2: 
03007                       
03008 
03009                        { mode = 8; result.numBytes += 4;}
03010 
03011                       
03012                       
03013                       
03014                       break;
03015                     case 3: 
03016                       goto MATCH_label_jd0; break;
03017                     default: assert(0);
03018                   } /* (MATCH_w_16_0 >> 6 & 0x3) -- sz at 0 --*/ 
03019                 break;
03020               case 5: case 6: case 7: 
03021                 goto MATCH_label_jd0; break;
03022               default: assert(0);
03023             } /* (MATCH_w_16_0 & 0x7) -- reg2 at 0 --*/ 
03024           break;
03025         default: assert(0);
03026       } /* (MATCH_w_16_0 >> 3 & 0x7) -- adrm at 0 --*/ 
03027     
03028   }goto MATCH_finished_jd; 
03029   
03030   MATCH_label_jd0: (void)0; /*placeholder for label*/ 
03031     
03032 
03033     pIllegalMode(pc);
03034 
03035     
03036      
03037     goto MATCH_finished_jd; 
03038     
03039   MATCH_finished_jd: (void)0; /*placeholder for label*/
03040   
03041 }
03042 
03043 
03044 
03045   switch (mode) {
03046     case 0 : {
03047 
03048 
03049 
03050 { 
03051   dword MATCH_p = 
03052     
03053 
03054     x
03055     ;
03056   unsigned /* [0..65535] */ MATCH_w_16_0;
03057   { 
03058     MATCH_w_16_0 = getWord(MATCH_p); 
03059     { 
03060       int /* [~32768..32767] */ d16 = 
03061         sign_extend((MATCH_w_16_0 & 0xffff) /* d16 at 0 */, 16);
03062       
03063 
03064        ret = pADisp(d16, reg2, size);
03065 
03066       
03067       
03068       
03069     }
03070     
03071   }goto MATCH_finished_id; 
03072   
03073   MATCH_finished_id: (void)0; /*placeholder for label*/
03074   
03075 }
03076 
03077 
03078       break;
03079     }
03080     case 1 : {
03081 
03082 
03083 
03084 { 
03085   dword MATCH_p = 
03086     
03087 
03088     x
03089     ;
03090   unsigned /* [0..65535] */ MATCH_w_16_0;
03091   { 
03092     MATCH_w_16_0 = getWord(MATCH_p); 
03093     { 
03094       int /* [~128..127] */ d8 = 
03095         sign_extend((MATCH_w_16_0 & 0xff) /* disp8 at 0 */, 8);
03096       unsigned iR = (MATCH_w_16_0 >> 12 & 0x7) /* iReg at 0 */;
03097       unsigned iS = (MATCH_w_16_0 >> 11 & 0x1) /* iSize at 0 */;
03098       unsigned iT = (MATCH_w_16_0 >> 15 & 0x1) /* iType at 0 */;
03099       
03100 
03101        ret = pAIndex(d8, reg2, iT, iR, iS, size);
03102 
03103       
03104       
03105       
03106     }
03107     
03108   }goto MATCH_finished_hd; 
03109   
03110   MATCH_finished_hd: (void)0; /*placeholder for label*/
03111   
03112 }
03113 
03114 
03115       break;
03116     }
03117     case 2 : {
03118 
03119 
03120 
03121 { 
03122   dword MATCH_p = 
03123     
03124 
03125     x
03126     ;
03127   unsigned /* [0..65535] */ MATCH_w_16_0;
03128   { 
03129     MATCH_w_16_0 = getWord(MATCH_p); 
03130     { 
03131       unsigned d16 = 
03132         sign_extend((MATCH_w_16_0 & 0xffff) /* d16 at 0 */, 16) + 
03133         addressToPC(MATCH_p);
03134       
03135 
03136        ret = pPcDisp(d16, delta, size);
03137 
03138       
03139       
03140       
03141     }
03142     
03143   }goto MATCH_finished_gd; 
03144   
03145   MATCH_finished_gd: (void)0; /*placeholder for label*/
03146   
03147 }
03148 
03149 
03150       break;
03151     }
03152     case 3 : {
03153 
03154 
03155 
03156 { 
03157   dword MATCH_p = 
03158     
03159 
03160     x
03161     ;
03162   unsigned /* [0..65535] */ MATCH_w_16_0;
03163   { 
03164     MATCH_w_16_0 = getWord(MATCH_p); 
03165     { 
03166       int /* [~128..127] */ d8 = 
03167         sign_extend((MATCH_w_16_0 & 0xff) /* disp8 at 0 */, 8);
03168       unsigned iR = (MATCH_w_16_0 >> 12 & 0x7) /* iReg at 0 */;
03169       unsigned iS = (MATCH_w_16_0 >> 11 & 0x1) /* iSize at 0 */;
03170       unsigned iT = (MATCH_w_16_0 >> 15 & 0x1) /* iType at 0 */;
03171       
03172 
03173       
03174 
03175               ret = pPcIndex(d8, iT, iR, iS, pc+2, size);
03176 
03177       
03178       
03179       
03180     }
03181     
03182   }goto MATCH_finished_fd; 
03183   
03184   MATCH_finished_fd: (void)0; /*placeholder for label*/
03185   
03186 }
03187 
03188 
03189       break;
03190     }
03191     case 4 : {
03192 
03193 
03194 
03195 { 
03196   dword MATCH_p = 
03197     
03198 
03199     x
03200     ;
03201   unsigned /* [0..65535] */ MATCH_w_16_0;
03202   { 
03203     MATCH_w_16_0 = getWord(MATCH_p); 
03204     { 
03205       int /* [~32768..32767] */ d16 = 
03206         sign_extend((MATCH_w_16_0 & 0xffff) /* d16 at 0 */, 16);
03207       
03208 
03209        ret = pAbsW(d16, size);
03210 
03211       
03212       
03213       
03214     }
03215     
03216   }goto MATCH_finished_ed; 
03217   
03218   MATCH_finished_ed: (void)0; /*placeholder for label*/
03219   
03220 }
03221 
03222 
03223       break;
03224     }
03225     case 5 : {
03226 
03227 
03228 
03229 { 
03230   dword MATCH_p = 
03231     
03232 
03233     x
03234     ;
03235   unsigned /* [0..65535] */ MATCH_w_16_0;
03236   unsigned /* [0..65535] */ MATCH_w_16_16;
03237   { 
03238     MATCH_w_16_0 = getWord(MATCH_p); 
03239     MATCH_w_16_16 = getWord(2 + MATCH_p); 
03240     { 
03241       unsigned d32 = 
03242         ((MATCH_w_16_0 & 0xffff) /* d16 at 0 */ << 16) + 
03243         (MATCH_w_16_16 & 0xffff) /* d16 at 16 */;
03244       
03245 
03246        ret = pAbsL(d32, size);
03247 
03248       
03249       
03250       
03251     }
03252     
03253   }goto MATCH_finished_dd; 
03254   
03255   MATCH_finished_dd: (void)0; /*placeholder for label*/
03256   
03257 }
03258 
03259 
03260       break;
03261     }
03262     case 6 : {
03263 
03264 
03265 
03266 { 
03267   dword MATCH_p = 
03268     
03269 
03270     x
03271     ;
03272   unsigned /* [0..65535] */ MATCH_w_16_0;
03273   { 
03274     MATCH_w_16_0 = getWord(MATCH_p); 
03275     if ((MATCH_w_16_0 >> 12 & 0x7) /* iReg at 0 */ == 0 && 
03276       (MATCH_w_16_0 >> 11 & 0x1) /* iSize at 0 */ == 0 && 
03277       (MATCH_w_16_0 >> 15 & 0x1) /* iType at 0 */ == 0 && 
03278       (1 <= (MATCH_w_16_0 >> 8 & 0x7) /* null at 0 */ && 
03279       (MATCH_w_16_0 >> 8 & 0x7) /* null at 0 */ < 8) || 
03280       (MATCH_w_16_0 >> 12 & 0x7) /* iReg at 0 */ == 0 && 
03281       (MATCH_w_16_0 >> 11 & 0x1) /* iSize at 0 */ == 0 && 
03282       (MATCH_w_16_0 >> 15 & 0x1) /* iType at 0 */ == 1 || 
03283       (MATCH_w_16_0 >> 12 & 0x7) /* iReg at 0 */ == 0 && 
03284       (MATCH_w_16_0 >> 11 & 0x1) /* iSize at 0 */ == 1 || 
03285       1 <= (MATCH_w_16_0 >> 12 & 0x7) /* iReg at 0 */ && 
03286       (MATCH_w_16_0 >> 12 & 0x7) /* iReg at 0 */ < 8) 
03287       goto MATCH_label_cd0;  /*opt-block+*/
03288     else { 
03289       unsigned d8 = (MATCH_w_16_0 & 0xff) /* disp8 at 0 */;
03290       
03291 
03292        ret = pImmB(d8);
03293 
03294       
03295       
03296       
03297     } /*opt-block*//*opt-block+*/
03298     
03299   }goto MATCH_finished_cd; 
03300   
03301   MATCH_label_cd0: (void)0; /*placeholder for label*/ 
03302     
03303 
03304     pNonzeroByte(pc);
03305 
03306     
03307      
03308     goto MATCH_finished_cd; 
03309     
03310   MATCH_finished_cd: (void)0; /*placeholder for label*/
03311   
03312 }
03313 
03314 
03315       break;
03316     }
03317     case 7 : {
03318 
03319 
03320 
03321 { 
03322   dword MATCH_p = 
03323     
03324 
03325     x
03326     ;
03327   unsigned /* [0..65535] */ MATCH_w_16_0;
03328   { 
03329     MATCH_w_16_0 = getWord(MATCH_p); 
03330     { 
03331       unsigned d16 = (MATCH_w_16_0 & 0xffff) /* d16 at 0 */;
03332       
03333 
03334        ret = pImmW(d16);
03335 
03336       
03337       
03338       
03339     }
03340     
03341   }goto MATCH_finished_bd; 
03342   
03343   MATCH_finished_bd: (void)0; /*placeholder for label*/
03344   
03345 }
03346 
03347 
03348       break;
03349     }
03350     case 8 : {
03351 
03352 
03353 
03354 { 
03355   dword MATCH_p = 
03356     
03357 
03358     x
03359     ;
03360   unsigned /* [0..65535] */ MATCH_w_16_0;
03361   unsigned /* [0..65535] */ MATCH_w_16_16;
03362   { 
03363     MATCH_w_16_0 = getWord(MATCH_p); 
03364     MATCH_w_16_16 = getWord(2 + MATCH_p); 
03365     { 
03366       unsigned d32 = 
03367         ((MATCH_w_16_0 & 0xffff) /* d16 at 0 */ << 16) + 
03368         (MATCH_w_16_16 & 0xffff) /* d16 at 16 */;
03369       
03370 
03371        ret = pImmL(d32);
03372 
03373       
03374       
03375       
03376     }
03377     
03378   }goto MATCH_finished_ad; 
03379   
03380   MATCH_finished_ad: (void)0; /*placeholder for label*/
03381   
03382 }
03383 
03384 
03385       break;
03386     }
03387     default : pIllegalMode(pc); break;
03388   } 
03389   return ret;
03390 }
03391 
03392 
03393 SemStr* NJMCDecoder::awlEAX(ADDRESS eax, ADDRESS x, DecodeResult& result,
03394     ADDRESS pc, int delta, int size)
03395 {
03396   SemStr* ret;
03397   int reg2, mode;
03398 
03399 
03400 
03401 
03402 { 
03403   dword MATCH_p = 
03404     
03405 
03406     eax
03407     ;
03408   unsigned /* [0..65535] */ MATCH_w_16_0;
03409   { 
03410     MATCH_w_16_0 = getWord(MATCH_p); 
03411     
03412       switch((MATCH_w_16_0 >> 3 & 0x7) /* adrm at 0 */) {
03413         case 0: case 1: case 2: case 3: case 4: 
03414           goto MATCH_label_zc0; break;
03415         case 5: 
03416           { 
03417             unsigned r2 = (MATCH_w_16_0 & 0x7) /* reg2 at 0 */;
03418             
03419 
03420              { mode = 0; reg2 = r2; result.numBytes += 2;}
03421 
03422             
03423             
03424             
03425           }
03426           
03427           break;
03428         case 6: 
03429           { 
03430             unsigned r2 = (MATCH_w_16_0 & 0x7) /* reg2 at 0 */;
03431             
03432 
03433              { mode = 1; reg2 = r2; result.numBytes += 2;}
03434 
03435             
03436             
03437             
03438           }
03439           
03440           break;
03441         case 7: 
03442           
03443             switch((MATCH_w_16_0 & 0x7) /* reg2 at 0 */) {
03444               case 0: 
03445                 
03446 
03447                  { mode = 4; result.numBytes += 2;}
03448 
03449                 
03450                 
03451                 
03452                 break;
03453               case 1: 
03454                 
03455 
03456                  { mode = 5; result.numBytes += 4;}
03457 
03458                 
03459                 
03460                 
03461                 break;
03462               case 2: 
03463                 
03464 
03465                  { mode = 2; result.numBytes += 2;}
03466 
03467                 
03468                 
03469                 
03470                 break;
03471               case 3: 
03472                 
03473 
03474                  { mode = 3; result.numBytes += 2;}
03475 
03476                 
03477                 
03478                 
03479                 break;
03480               case 4: 
03481                 if ((MATCH_w_16_0 >> 8 & 0x1) /* sb at 0 */ == 1) 
03482                   
03483 
03484                    { mode = 8; result.numBytes += 4;}
03485 
03486                   
03487                    /*opt-block+*/
03488                 else 
03489                   
03490 
03491                    { mode = 7; result.numBytes += 2;}
03492 
03493                   
03494                    /*opt-block+*/
03495                 
03496                 break;
03497               case 5: case 6: case 7: 
03498                 goto MATCH_label_zc0; break;
03499               default: assert(0);
03500             } /* (MATCH_w_16_0 & 0x7) -- reg2 at 0 --*/ 
03501           break;
03502         default: assert(0);
03503       } /* (MATCH_w_16_0 >> 3 & 0x7) -- adrm at 0 --*/ 
03504     
03505   }goto MATCH_finished_zc; 
03506   
03507   MATCH_label_zc0: (void)0; /*placeholder for label*/ 
03508     
03509 
03510     pIllegalMode(pc);
03511 
03512     
03513      
03514     goto MATCH_finished_zc; 
03515     
03516   MATCH_finished_zc: (void)0; /*placeholder for label*/
03517   
03518 }
03519 
03520 
03521 
03522   switch (mode) {
03523     case 0 : {
03524 
03525 
03526 
03527 { 
03528   dword MATCH_p = 
03529     
03530 
03531     x
03532     ;
03533   unsigned /* [0..65535] */ MATCH_w_16_0;
03534   { 
03535     MATCH_w_16_0 = getWord(MATCH_p); 
03536     { 
03537       int /* [~32768..32767] */ d16 = 
03538         sign_extend((MATCH_w_16_0 & 0xffff) /* d16 at 0 */, 16);
03539       
03540 
03541        ret = pADisp(d16, reg2, size);
03542 
03543       
03544       
03545       
03546     }
03547     
03548   }goto MATCH_finished_yc; 
03549   
03550   MATCH_finished_yc: (void)0; /*placeholder for label*/
03551   
03552 }
03553 
03554 
03555       break;
03556     }
03557     case 1 : {
03558 
03559 
03560 
03561 { 
03562   dword MATCH_p = 
03563     
03564 
03565     x
03566     ;
03567   unsigned /* [0..65535] */ MATCH_w_16_0;
03568   { 
03569     MATCH_w_16_0 = getWord(MATCH_p); 
03570     { 
03571       int /* [~128..127] */ d8 = 
03572         sign_extend((MATCH_w_16_0 & 0xff) /* disp8 at 0 */, 8);
03573       unsigned iR = (MATCH_w_16_0 >> 12 & 0x7) /* iReg at 0 */;
03574       unsigned iS = (MATCH_w_16_0 >> 11 & 0x1) /* iSize at 0 */;
03575       unsigned iT = (MATCH_w_16_0 >> 15 & 0x1) /* iType at 0 */;
03576       
03577 
03578        ret = pAIndex(d8, reg2, iT, iR, iS, size);
03579 
03580       
03581       
03582       
03583     }
03584     
03585   }goto MATCH_finished_xc; 
03586   
03587   MATCH_finished_xc: (void)0; /*placeholder for label*/
03588   
03589 }
03590 
03591 
03592       break;
03593     }
03594     case 2 : {
03595 
03596 
03597 
03598 { 
03599   dword MATCH_p = 
03600     
03601 
03602     x
03603     ;
03604   unsigned /* [0..65535] */ MATCH_w_16_0;
03605   { 
03606     MATCH_w_16_0 = getWord(MATCH_p); 
03607     { 
03608       unsigned d16 = 
03609         sign_extend((MATCH_w_16_0 & 0xffff) /* d16 at 0 */, 16) + 
03610         addressToPC(MATCH_p);
03611       
03612 
03613        ret = pPcDisp(d16, delta, size);
03614 
03615       
03616       
03617       
03618     }
03619     
03620   }goto MATCH_finished_wc; 
03621   
03622   MATCH_finished_wc: (void)0; /*placeholder for label*/
03623   
03624 }
03625 
03626 
03627       break;
03628     }
03629     case 3 : {
03630 
03631 
03632 
03633 { 
03634   dword MATCH_p = 
03635     
03636 
03637     x
03638     ;
03639   unsigned /* [0..65535] */ MATCH_w_16_0;
03640   { 
03641     MATCH_w_16_0 = getWord(MATCH_p); 
03642     { 
03643       int /* [~128..127] */ d8 = 
03644         sign_extend((MATCH_w_16_0 & 0xff) /* disp8 at 0 */, 8);
03645       unsigned iR = (MATCH_w_16_0 >> 12 & 0x7) /* iReg at 0 */;
03646       unsigned iS = (MATCH_w_16_0 >> 11 & 0x1) /* iSize at 0 */;
03647       unsigned iT = (MATCH_w_16_0 >> 15 & 0x1) /* iType at 0 */;
03648       
03649 
03650       
03651 
03652               ret = pPcIndex(d8, iT, iR, iS, pc+2, size);
03653 
03654       
03655       
03656       
03657     }
03658     
03659   }goto MATCH_finished_vc; 
03660   
03661   MATCH_finished_vc: (void)0; /*placeholder for label*/
03662   
03663 }
03664 
03665 
03666       break;
03667     }
03668     case 4 : {
03669 
03670 
03671 
03672 { 
03673   dword MATCH_p = 
03674     
03675 
03676     x
03677     ;
03678   unsigned /* [0..65535] */ MATCH_w_16_0;
03679   { 
03680     MATCH_w_16_0 = getWord(MATCH_p); 
03681     { 
03682       int /* [~32768..32767] */ d16 = 
03683         sign_extend((MATCH_w_16_0 & 0xffff) /* d16 at 0 */, 16);
03684       
03685 
03686        ret = pAbsW(d16, size);
03687 
03688       
03689       
03690       
03691     }
03692     
03693   }goto MATCH_finished_uc; 
03694   
03695   MATCH_finished_uc: (void)0; /*placeholder for label*/
03696   
03697 }
03698 
03699 
03700       break;
03701     }
03702     case 5 : {
03703 
03704 
03705 
03706 { 
03707   dword MATCH_p = 
03708     
03709 
03710     x
03711     ;
03712   unsigned /* [0..65535] */ MATCH_w_16_0;
03713   unsigned /* [0..65535] */ MATCH_w_16_16;
03714   { 
03715     MATCH_w_16_0 = getWord(MATCH_p); 
03716     MATCH_w_16_16 = getWord(2 + MATCH_p); 
03717     { 
03718       unsigned d32 = 
03719         ((MATCH_w_16_0 & 0xffff) /* d16 at 0 */ << 16) + 
03720         (MATCH_w_16_16 & 0xffff) /* d16 at 16 */;
03721       
03722 
03723        ret = pAbsL(d32, size);
03724 
03725       
03726       
03727       
03728     }
03729     
03730   }goto MATCH_finished_tc; 
03731   
03732   MATCH_finished_tc: (void)0; /*placeholder for label*/
03733   
03734 }
03735 
03736 
03737       break;
03738     }
03739     case 7 : {
03740 
03741 
03742 
03743 { 
03744   dword MATCH_p = 
03745     
03746 
03747     x
03748     ;
03749   unsigned /* [0..65535] */ MATCH_w_16_0;
03750   { 
03751     MATCH_w_16_0 = getWord(MATCH_p); 
03752     { 
03753       unsigned d16 = (MATCH_w_16_0 & 0xffff) /* d16 at 0 */;
03754       
03755 
03756        ret = pImmW(d16);
03757 
03758       
03759       
03760       
03761     }
03762     
03763   }goto MATCH_finished_sc; 
03764   
03765   MATCH_finished_sc: (void)0; /*placeholder for label*/
03766   
03767 }
03768 
03769 
03770       break;
03771     }
03772     case 8 : {
03773 
03774 
03775 
03776 { 
03777   dword MATCH_p = 
03778     
03779 
03780     x
03781     ;
03782   unsigned /* [0..65535] */ MATCH_w_16_0;
03783   unsigned /* [0..65535] */ MATCH_w_16_16;
03784   { 
03785     MATCH_w_16_0 = getWord(MATCH_p); 
03786     MATCH_w_16_16 = getWord(2 + MATCH_p); 
03787     { 
03788       unsigned d32 = 
03789         ((MATCH_w_16_0 & 0xffff) /* d16 at 0 */ << 16) + 
03790         (MATCH_w_16_16 & 0xffff) /* d16 at 16 */;
03791       
03792 
03793        ret = pImmL(d32);
03794 
03795       
03796       
03797       
03798     }
03799     
03800   }goto MATCH_finished_rc; 
03801   
03802   MATCH_finished_rc: (void)0; /*placeholder for label*/
03803   
03804 }
03805 
03806 
03807       break;
03808     }
03809     default : pIllegalMode(pc); break;
03810   } 
03811   return ret;
03812 }
03813 
03814 
03815 SemStr* NJMCDecoder::cEAX(ADDRESS eax, ADDRESS x, DecodeResult& result,
03816     ADDRESS pc, int delta, int size)
03817 {
03818   SemStr* ret;
03819   int reg2, mode;
03820 
03821 
03822 
03823 
03824 { 
03825   dword MATCH_p = 
03826     
03827 
03828     eax
03829     ;
03830   unsigned /* [0..65535] */ MATCH_w_16_0;
03831   { 
03832     MATCH_w_16_0 = getWord(MATCH_p); 
03833     
03834       switch((MATCH_w_16_0 >> 3 & 0x7) /* adrm at 0 */) {
03835         case 0: case 1: case 2: case 3: case 4: 
03836           goto MATCH_label_qc0; break;
03837         case 5: 
03838           { 
03839             unsigned r2 = (MATCH_w_16_0 & 0x7) /* reg2 at 0 */;
03840             
03841 
03842              { mode = 0; reg2 = r2; result.numBytes += 2;}
03843 
03844             
03845             
03846             
03847           }
03848           
03849           break;
03850         case 6: 
03851           { 
03852             unsigned r2 = (MATCH_w_16_0 & 0x7) /* reg2 at 0 */;
03853             
03854 
03855              { mode = 1; reg2 = r2; result.numBytes += 2;}
03856 
03857             
03858             
03859             
03860           }
03861           
03862           break;
03863         case 7: 
03864           
03865             switch((MATCH_w_16_0 & 0x7) /* reg2 at 0 */) {
03866               case 0: 
03867                 
03868 
03869                  { mode = 4; result.numBytes += 2;}
03870 
03871                 
03872                 
03873                 
03874                 break;
03875               case 1: 
03876                 
03877 
03878                  { mode = 5; result.numBytes += 4;}
03879 
03880                 
03881                 
03882                 
03883                 break;
03884               case 2: 
03885                 
03886 
03887                  { mode = 2; result.numBytes += 2;}
03888 
03889                 
03890                 
03891                 
03892                 break;
03893               case 3: 
03894                 
03895 
03896                  { mode = 3; result.numBytes += 2;}
03897 
03898                 
03899                 
03900                 
03901                 break;
03902               case 4: case 5: case 6: case 7: 
03903                 goto MATCH_label_qc0; break;
03904               default: assert(0);
03905             } /* (MATCH_w_16_0 & 0x7) -- reg2 at 0 --*/ 
03906           break;
03907         default: assert(0);
03908       } /* (MATCH_w_16_0 >> 3 & 0x7) -- adrm at 0 --*/ 
03909     
03910   }goto MATCH_finished_qc; 
03911   
03912   MATCH_label_qc0: (void)0; /*placeholder for label*/ 
03913     
03914 
03915     pIllegalMode(pc);
03916 
03917     
03918      
03919     goto MATCH_finished_qc; 
03920     
03921   MATCH_finished_qc: (void)0; /*placeholder for label*/
03922   
03923 }
03924 
03925 
03926 
03927   switch (mode) {
03928     case 0 : {
03929 
03930 
03931 
03932 { 
03933   dword MATCH_p = 
03934     
03935 
03936     x
03937     ;
03938   unsigned /* [0..65535] */ MATCH_w_16_0;
03939   { 
03940     MATCH_w_16_0 = getWord(MATCH_p); 
03941     { 
03942       int /* [~32768..32767] */ d16 = 
03943         sign_extend((MATCH_w_16_0 & 0xffff) /* d16 at 0 */, 16);
03944       
03945 
03946        ret = pADisp(d16, reg2, size);
03947 
03948       
03949       
03950       
03951     }
03952     
03953   }goto MATCH_finished_pc; 
03954   
03955   MATCH_finished_pc: (void)0; /*placeholder for label*/
03956   
03957 }
03958 
03959 
03960       break;
03961     }
03962     case 1 : {
03963 
03964 
03965 
03966 { 
03967   dword MATCH_p = 
03968     
03969 
03970     x
03971     ;
03972   unsigned /* [0..65535] */ MATCH_w_16_0;
03973   { 
03974     MATCH_w_16_0 = getWord(MATCH_p); 
03975     { 
03976       int /* [~128..127] */ d8 = 
03977         sign_extend((MATCH_w_16_0 & 0xff) /* disp8 at 0 */, 8);
03978       unsigned iR = (MATCH_w_16_0 >> 12 & 0x7) /* iReg at 0 */;
03979       unsigned iS = (MATCH_w_16_0 >> 11 & 0x1) /* iSize at 0 */;
03980       unsigned iT = (MATCH_w_16_0 >> 15 & 0x1) /* iType at 0 */;
03981       
03982 
03983        ret = pAIndex(d8, reg2, iT, iR, iS, size);
03984 
03985       
03986       
03987       
03988     }
03989     
03990   }goto MATCH_finished_oc; 
03991   
03992   MATCH_finished_oc: (void)0; /*placeholder for label*/
03993   
03994 }
03995 
03996 
03997       break;
03998     }
03999     case 2 : {
04000 
04001 
04002 
04003 { 
04004   dword MATCH_p = 
04005     
04006 
04007     x
04008     ;
04009   unsigned /* [0..65535] */ MATCH_w_16_0;
04010   { 
04011     MATCH_w_16_0 = getWord(MATCH_p); 
04012     { 
04013       unsigned label = 
04014         sign_extend((MATCH_w_16_0 & 0xffff) /* d16 at 0 */, 16) + 
04015         addressToPC(MATCH_p);
04016       
04017 
04018        ret = pPcDisp(label, delta, size);
04019 
04020       
04021       
04022       
04023     }
04024     
04025   }goto MATCH_finished_nc; 
04026   
04027   MATCH_finished_nc: (void)0; /*placeholder for label*/
04028   
04029 }
04030 
04031 
04032       break;
04033     }
04034     case 3 : {
04035 
04036 
04037 
04038 { 
04039   dword MATCH_p = 
04040     
04041 
04042     x
04043     ;
04044   unsigned /* [0..65535] */ MATCH_w_16_0;
04045   { 
04046     MATCH_w_16_0 = getWord(MATCH_p); 
04047     { 
04048       int /* [~128..127] */ d8 = 
04049         sign_extend((MATCH_w_16_0 & 0xff) /* disp8 at 0 */, 8);
04050       unsigned iR = (MATCH_w_16_0 >> 12 & 0x7) /* iReg at 0 */;
04051       unsigned iS = (MATCH_w_16_0 >> 11 & 0x1) /* iSize at 0 */;
04052       unsigned iT = (MATCH_w_16_0 >> 15 & 0x1) /* iType at 0 */;
04053       
04054 
04055        ret = pPcIndex(d8, iT, iR, iS, pc+2, size);
04056 
04057       
04058       
04059       
04060     }
04061     
04062   }goto MATCH_finished_mc; 
04063   
04064   MATCH_finished_mc: (void)0; /*placeholder for label*/
04065   
04066 }
04067 
04068 
04069       break;
04070     }
04071     case 4 : {
04072 
04073 
04074 
04075 { 
04076   dword MATCH_p = 
04077     
04078 
04079     x
04080     ;
04081   unsigned /* [0..65535] */ MATCH_w_16_0;
04082   { 
04083     MATCH_w_16_0 = getWord(MATCH_p); 
04084     { 
04085       int /* [~32768..32767] */ d16 = 
04086         sign_extend((MATCH_w_16_0 & 0xffff) /* d16 at 0 */, 16);
04087       
04088 
04089        ret = pAbsW(d16, size);
04090 
04091       
04092       
04093       
04094     }
04095     
04096   }goto MATCH_finished_lc; 
04097   
04098   MATCH_finished_lc: (void)0; /*placeholder for label*/
04099   
04100 }
04101 
04102 
04103       break;
04104     }
04105     case 5 : {
04106 
04107 
04108 
04109 { 
04110   dword MATCH_p = 
04111     
04112 
04113     x
04114     ;
04115   unsigned /* [0..65535] */ MATCH_w_16_0;
04116   unsigned /* [0..65535] */ MATCH_w_16_16;
04117   { 
04118     MATCH_w_16_0 = getWord(MATCH_p); 
04119     MATCH_w_16_16 = getWord(2 + MATCH_p); 
04120     { 
04121       unsigned d32 = 
04122         ((MATCH_w_16_0 & 0xffff) /* d16 at 0 */ << 16) + 
04123         (MATCH_w_16_16 & 0xffff) /* d16 at 16 */;
04124       
04125 
04126        ret = pAbsL(d32, size);
04127 
04128       
04129       
04130       
04131     }
04132     
04133   }goto MATCH_finished_kc; 
04134   
04135   MATCH_finished_kc: (void)0; /*placeholder for label*/
04136   
04137 }
04138 
04139 
04140       break;
04141     }
04142     default : pIllegalMode(pc); break;
04143   }  
04144   return ret;
04145 }
04146 
04147 
04148 SemStr* NJMCDecoder::dEAX(ADDRESS eax, ADDRESS x, DecodeResult& result,
04149     ADDRESS pc, int delta, int size)
04150 {
04151   SemStr* ret;
04152   int reg2, mode;
04153 
04154 
04155 
04156 
04157 { 
04158   dword MATCH_p = 
04159     
04160 
04161     eax
04162     ;
04163   unsigned /* [0..65535] */ MATCH_w_16_0;
04164   { 
04165     MATCH_w_16_0 = getWord(MATCH_p); 
04166     
04167       switch((MATCH_w_16_0 >> 3 & 0x7) /* adrm at 0 */) {
04168         case 0: case 1: case 2: case 3: case 4: 
04169           goto MATCH_label_jc0; break;
04170         case 5: 
04171           { 
04172             unsigned r2 = (MATCH_w_16_0 & 0x7) /* reg2 at 0 */;
04173             
04174 
04175              { mode = 0; reg2 = r2; result.numBytes += 2;}
04176 
04177             
04178             
04179             
04180           }
04181           
04182           break;
04183         case 6: 
04184           { 
04185             unsigned r2 = (MATCH_w_16_0 & 0x7) /* reg2 at 0 */;
04186             
04187 
04188              { mode = 1; reg2 = r2; result.numBytes += 2;}
04189 
04190             
04191             
04192             
04193           }
04194           
04195           break;
04196         case 7: 
04197           
04198             switch((MATCH_w_16_0 & 0x7) /* reg2 at 0 */) {
04199               case 0: 
04200                 
04201 
04202                  { mode = 4; result.numBytes += 2;}
04203 
04204                 
04205                 
04206                 
04207                 break;
04208               case 1: 
04209                 
04210 
04211                  { mode = 5; result.numBytes += 4;}
04212 
04213                 
04214                 
04215                 
04216                 break;
04217               case 2: 
04218                 
04219 
04220                  { mode = 2; result.numBytes += 2;}
04221 
04222                 
04223                 
04224                 
04225                 break;
04226               case 3: 
04227                 
04228 
04229                  { mode = 3; result.numBytes += 2;}
04230 
04231                 
04232                 
04233                 
04234                 break;
04235               case 4: 
04236                 
04237                   switch((MATCH_w_16_0 >> 6 & 0x3) /* sz at 0 */) {
04238                     case 0: 
04239                       
04240 
04241                        { mode = 6; result.numBytes += 2;}
04242 
04243                       
04244                       
04245                       
04246                       break;
04247                     case 1: 
04248                       
04249 
04250                        { mode = 7; result.numBytes += 2;}
04251 
04252                       
04253                       
04254                       
04255                       break;
04256                     case 2: 
04257                       
04258 
04259                        { mode = 8; result.numBytes += 4;}
04260 
04261                       
04262                       
04263                       
04264                       break;
04265                     case 3: 
04266                       goto MATCH_label_jc0; break;
04267                     default: assert(0);
04268                   } /* (MATCH_w_16_0 >> 6 & 0x3) -- sz at 0 --*/ 
04269                 break;
04270               case 5: case 6: case 7: 
04271                 goto MATCH_label_jc0; break;
04272               default: assert(0);
04273             } /* (MATCH_w_16_0 & 0x7) -- reg2 at 0 --*/ 
04274           break;
04275         default: assert(0);
04276       } /* (MATCH_w_16_0 >> 3 & 0x7) -- adrm at 0 --*/ 
04277     
04278   }goto MATCH_finished_jc; 
04279   
04280   MATCH_label_jc0: (void)0; /*placeholder for label*/ 
04281     
04282 
04283     pIllegalMode(pc);
04284 
04285     
04286      
04287     goto MATCH_finished_jc; 
04288     
04289   MATCH_finished_jc: (void)0; /*placeholder for label*/
04290   
04291 }
04292 
04293 
04294 
04295   switch (mode) {
04296     case 0 : {
04297 
04298 
04299 
04300 { 
04301   dword MATCH_p = 
04302     
04303 
04304     x
04305     ;
04306   unsigned /* [0..65535] */ MATCH_w_16_0;
04307   { 
04308     MATCH_w_16_0 = getWord(MATCH_p); 
04309     { 
04310       int /* [~32768..32767] */ d16 = 
04311         sign_extend((MATCH_w_16_0 & 0xffff) /* d16 at 0 */, 16);
04312       
04313 
04314        ret = pADisp(d16, reg2, size);
04315 
04316       
04317       
04318       
04319     }
04320     
04321   }goto MATCH_finished_ic; 
04322   
04323   MATCH_finished_ic: (void)0; /*placeholder for label*/
04324   
04325 }
04326 
04327 
04328       break;
04329     }
04330     case 1 : {
04331 
04332 
04333 
04334 { 
04335   dword MATCH_p = 
04336     
04337 
04338     x
04339     ;
04340   unsigned /* [0..65535] */ MATCH_w_16_0;
04341   { 
04342     MATCH_w_16_0 = getWord(MATCH_p); 
04343     { 
04344       int /* [~128..127] */ d8 = 
04345         sign_extend((MATCH_w_16_0 & 0xff) /* disp8 at 0 */, 8);
04346       unsigned iR = (MATCH_w_16_0 >> 12 & 0x7) /* iReg at 0 */;
04347       unsigned iS = (MATCH_w_16_0 >> 11 & 0x1) /* iSize at 0 */;
04348       unsigned iT = (MATCH_w_16_0 >> 15 & 0x1) /* iType at 0 */;
04349       
04350 
04351        ret = pAIndex(d8, reg2, iT, iR, iS, size);
04352 
04353       
04354       
04355       
04356     }
04357     
04358   }goto MATCH_finished_hc; 
04359   
04360   MATCH_finished_hc: (void)0; /*placeholder for label*/
04361   
04362 }
04363 
04364 
04365       break;
04366     }
04367     case 2 : {
04368 
04369 
04370 
04371 { 
04372   dword MATCH_p = 
04373     
04374 
04375     x
04376     ;
04377   unsigned /* [0..65535] */ MATCH_w_16_0;
04378   { 
04379     MATCH_w_16_0 = getWord(MATCH_p); 
04380     { 
04381       unsigned label = 
04382         sign_extend((MATCH_w_16_0 & 0xffff) /* d16 at 0 */, 16) + 
04383         addressToPC(MATCH_p);
04384       
04385 
04386        ret = pPcDisp(label, delta, size);
04387 
04388       
04389       
04390       
04391     }
04392     
04393   }goto MATCH_finished_gc; 
04394   
04395   MATCH_finished_gc: (void)0; /*placeholder for label*/
04396   
04397 }
04398 
04399 
04400       break;
04401     }
04402     case 3 : {
04403 
04404 
04405 
04406 { 
04407   dword MATCH_p = 
04408     
04409 
04410     x
04411     ;
04412   unsigned /* [0..65535] */ MATCH_w_16_0;
04413   { 
04414     MATCH_w_16_0 = getWord(MATCH_p); 
04415     { 
04416       int /* [~128..127] */ d8 = 
04417         sign_extend((MATCH_w_16_0 & 0xff) /* disp8 at 0 */, 8);
04418       unsigned iR = (MATCH_w_16_0 >> 12 & 0x7) /* iReg at 0 */;
04419       unsigned iS = (MATCH_w_16_0 >> 11 & 0x1) /* iSize at 0 */;
04420       unsigned iT = (MATCH_w_16_0 >> 15 & 0x1) /* iType at 0 */;
04421       
04422 
04423        ret = pPcIndex(d8, iT, iR, iS, pc+2, size);
04424 
04425       
04426       
04427       
04428     }
04429     
04430   }goto MATCH_finished_fc; 
04431   
04432   MATCH_finished_fc: (void)0; /*placeholder for label*/
04433   
04434 }
04435 
04436 
04437       break;
04438     }
04439     case 4 : {
04440 
04441 
04442 
04443 { 
04444   dword MATCH_p = 
04445     
04446 
04447     x
04448     ;
04449   unsigned /* [0..65535] */ MATCH_w_16_0;
04450   { 
04451     MATCH_w_16_0 = getWord(MATCH_p); 
04452     { 
04453       int /* [~32768..32767] */ d16 = 
04454         sign_extend((MATCH_w_16_0 & 0xffff) /* d16 at 0 */, 16);
04455       
04456 
04457        ret = pAbsW(d16, size);
04458 
04459       
04460       
04461       
04462     }
04463     
04464   }goto MATCH_finished_ec; 
04465   
04466   MATCH_finished_ec: (void)0; /*placeholder for label*/
04467   
04468 }
04469 
04470 
04471       break;
04472     }
04473     case 5 : {
04474 
04475 
04476 
04477 { 
04478   dword MATCH_p = 
04479     
04480 
04481     x
04482     ;
04483   unsigned /* [0..65535] */ MATCH_w_16_0;
04484   unsigned /* [0..65535] */ MATCH_w_16_16;
04485   { 
04486     MATCH_w_16_0 = getWord(MATCH_p); 
04487     MATCH_w_16_16 = getWord(2 + MATCH_p); 
04488     { 
04489       unsigned d32 = 
04490         ((MATCH_w_16_0 & 0xffff) /* d16 at 0 */ << 16) + 
04491         (MATCH_w_16_16 & 0xffff) /* d16 at 16 */;
04492       
04493 
04494        ret = pAbsL(d32, size);
04495 
04496       
04497       
04498       
04499     }
04500     
04501   }goto MATCH_finished_dc; 
04502   
04503   MATCH_finished_dc: (void)0; /*placeholder for label*/
04504   
04505 }
04506 
04507 
04508       break;
04509     }
04510     case 6 : {
04511 
04512 
04513 
04514 { 
04515   dword MATCH_p = 
04516     
04517 
04518     x
04519     ;
04520   unsigned /* [0..65535] */ MATCH_w_16_0;
04521   { 
04522     MATCH_w_16_0 = getWord(MATCH_p); 
04523     if ((MATCH_w_16_0 >> 12 & 0x7) /* iReg at 0 */ == 0 && 
04524       (MATCH_w_16_0 >> 11 & 0x1) /* iSize at 0 */ == 0 && 
04525       (MATCH_w_16_0 >> 15 & 0x1) /* iType at 0 */ == 0 && 
04526       (1 <= (MATCH_w_16_0 >> 8 & 0x7) /* null at 0 */ && 
04527       (MATCH_w_16_0 >> 8 & 0x7) /* null at 0 */ < 8) || 
04528       (MATCH_w_16_0 >> 12 & 0x7) /* iReg at 0 */ == 0 && 
04529       (MATCH_w_16_0 >> 11 & 0x1) /* iSize at 0 */ == 0 && 
04530       (MATCH_w_16_0 >> 15 & 0x1) /* iType at 0 */ == 1 || 
04531       (MATCH_w_16_0 >> 12 & 0x7) /* iReg at 0 */ == 0 && 
04532       (MATCH_w_16_0 >> 11 & 0x1) /* iSize at 0 */ == 1 || 
04533       1 <= (MATCH_w_16_0 >> 12 & 0x7) /* iReg at 0 */ && 
04534       (MATCH_w_16_0 >> 12 & 0x7) /* iReg at 0 */ < 8) 
04535       goto MATCH_label_cc0;  /*opt-block+*/
04536     else { 
04537       unsigned d8 = (MATCH_w_16_0 & 0xff) /* disp8 at 0 */;
04538       
04539 
04540        ret = pImmB(d8);
04541 
04542       
04543       
04544       
04545     } /*opt-block*//*opt-block+*/
04546     
04547   }goto MATCH_finished_cc; 
04548   
04549   MATCH_label_cc0: (void)0; /*placeholder for label*/ 
04550     
04551 
04552     pNonzeroByte(pc);
04553 
04554     
04555      
04556     goto MATCH_finished_cc; 
04557     
04558   MATCH_finished_cc: (void)0; /*placeholder for label*/
04559   
04560 }
04561 
04562 
04563       break;
04564     }
04565     case 7 : {
04566 
04567 
04568 
04569 { 
04570   dword MATCH_p = 
04571     
04572 
04573     x
04574     ;
04575   unsigned /* [0..65535] */ MATCH_w_16_0;
04576   { 
04577     MATCH_w_16_0 = getWord(MATCH_p); 
04578     { 
04579       unsigned d16 = (MATCH_w_16_0 & 0xffff) /* d16 at 0 */;
04580       
04581 
04582        ret = pImmW(d16);
04583 
04584       
04585       
04586       
04587     }
04588     
04589   }goto MATCH_finished_bc; 
04590   
04591   MATCH_finished_bc: (void)0; /*placeholder for label*/
04592   
04593 }
04594 
04595 
04596       break;
04597     }
04598     case 8 : {
04599 
04600 
04601 
04602 { 
04603   dword MATCH_p = 
04604     
04605 
04606     x
04607     ;
04608   unsigned /* [0..65535] */ MATCH_w_16_0;
04609   unsigned /* [0..65535] */ MATCH_w_16_16;
04610   { 
04611     MATCH_w_16_0 = getWord(MATCH_p); 
04612     MATCH_w_16_16 = getWord(2 + MATCH_p); 
04613     { 
04614       unsigned d32 = 
04615         ((MATCH_w_16_0 & 0xffff) /* d16 at 0 */ << 16) + 
04616         (MATCH_w_16_16 & 0xffff) /* d16 at 16 */;
04617       
04618 
04619        ret = pImmL(d32);
04620 
04621       
04622       
04623       
04624     }
04625     
04626   }goto MATCH_finished_ac; 
04627   
04628   MATCH_finished_ac: (void)0; /*placeholder for label*/
04629   
04630 }
04631 
04632 
04633       break;
04634     }
04635     default : pIllegalMode(pc); break;
04636   }  
04637   return ret;
04638 }
04639 
04640 
04641 SemStr* NJMCDecoder::daEAX(ADDRESS eax, ADDRESS x, DecodeResult& result,
04642     ADDRESS pc, int size)
04643 {
04644   SemStr* ret;
04645   int reg2, mode;
04646 
04647 
04648 
04649 
04650 { 
04651   dword MATCH_p = 
04652     
04653 
04654     eax
04655     ;
04656   unsigned /* [0..65535] */ MATCH_w_16_0;
04657   { 
04658     MATCH_w_16_0 = getWord(MATCH_p); 
04659     
04660       switch((MATCH_w_16_0 >> 3 & 0x7) /* adrm at 0 */) {
04661         case 0: case 1: case 2: case 3: case 4: 
04662           goto MATCH_label_zb0; break;
04663         case 5: 
04664           { 
04665             unsigned r2 = (MATCH_w_16_0 & 0x7) /* reg2 at 0 */;
04666             
04667 
04668              { mode = 0; reg2 = r2; result.numBytes += 2;}
04669 
04670             
04671             
04672             
04673           }
04674           
04675           break;
04676         case 6: 
04677           { 
04678             unsigned r2 = (MATCH_w_16_0 & 0x7) /* reg2 at 0 */;
04679             
04680 
04681              { mode = 1; reg2 = r2; result.numBytes += 2;}
04682 
04683             
04684             
04685             
04686           }
04687           
04688           break;
04689         case 7: 
04690           
04691             switch((MATCH_w_16_0 & 0x7) /* reg2 at 0 */) {
04692               case 0: 
04693                 
04694 
04695                  { mode = 4; result.numBytes += 2;}
04696 
04697                 
04698                 
04699                 
04700                 break;
04701               case 1: 
04702                 
04703 
04704                  { mode = 5; result.numBytes += 4;}
04705 
04706                 
04707                 
04708                 
04709                 break;
04710               case 2: case 3: case 4: case 5: case 6: case 7: 
04711                 goto MATCH_label_zb0; break;
04712               default: assert(0);
04713             } /* (MATCH_w_16_0 & 0x7) -- reg2 at 0 --*/ 
04714           break;
04715         default: assert(0);
04716       } /* (MATCH_w_16_0 >> 3 & 0x7) -- adrm at 0 --*/ 
04717     
04718   }goto MATCH_finished_zb; 
04719   
04720   MATCH_label_zb0: (void)0; /*placeholder for label*/ 
04721     
04722 
04723     pIllegalMode(pc);
04724 
04725     
04726      
04727     goto MATCH_finished_zb; 
04728     
04729   MATCH_finished_zb: (void)0; /*placeholder for label*/
04730   
04731 }
04732 
04733 
04734 
04735   switch (mode) {
04736     case 0 : {
04737 
04738 
04739 
04740 { 
04741   dword MATCH_p = 
04742     
04743 
04744     x
04745     ;
04746   unsigned /* [0..65535] */ MATCH_w_16_0;
04747   { 
04748     MATCH_w_16_0 = getWord(MATCH_p); 
04749     { 
04750       int /* [~32768..32767] */ d16 = 
04751         sign_extend((MATCH_w_16_0 & 0xffff) /* d16 at 0 */, 16);
04752       
04753 
04754        ret = pADisp(d16, reg2, size);
04755 
04756       
04757       
04758       
04759     }
04760     
04761   }goto MATCH_finished_yb; 
04762   
04763   MATCH_finished_yb: (void)0; /*placeholder for label*/
04764   
04765 }
04766 
04767 
04768       break;
04769     }
04770     case 1 : {
04771 
04772 
04773 
04774 { 
04775   dword MATCH_p = 
04776     
04777 
04778     x
04779     ;
04780   unsigned /* [0..65535] */ MATCH_w_16_0;
04781   { 
04782     MATCH_w_16_0 = getWord(MATCH_p); 
04783     { 
04784       int /* [~128..127] */ d8 = 
04785         sign_extend((MATCH_w_16_0 & 0xff) /* disp8 at 0 */, 8);
04786       unsigned iR = (MATCH_w_16_0 >> 12 & 0x7) /* iReg at 0 */;
04787       unsigned iS = (MATCH_w_16_0 >> 11 & 0x1) /* iSize at 0 */;
04788       unsigned iT = (MATCH_w_16_0 >> 15 & 0x1) /* iType at 0 */;
04789       
04790 
04791        ret = pAIndex(d8, reg2, iT, iR, iS, size);
04792 
04793       
04794       
04795       
04796     }
04797     
04798   }goto MATCH_finished_xb; 
04799   
04800   MATCH_finished_xb: (void)0; /*placeholder for label*/
04801   
04802 }
04803 
04804 
04805       break;
04806     }
04807     case 4 : {
04808 
04809 
04810 
04811 { 
04812   dword MATCH_p = 
04813     
04814 
04815     x
04816     ;
04817   unsigned /* [0..65535] */ MATCH_w_16_0;
04818   { 
04819     MATCH_w_16_0 = getWord(MATCH_p); 
04820     { 
04821       int /* [~32768..32767] */ d16 = 
04822         sign_extend((MATCH_w_16_0 & 0xffff) /* d16 at 0 */, 16);
04823       
04824 
04825        ret = pAbsW(d16, size);
04826 
04827       
04828       
04829       
04830     }
04831     
04832   }goto MATCH_finished_wb; 
04833   
04834   MATCH_finished_wb: (void)0; /*placeholder for label*/
04835   
04836 }
04837 
04838 
04839       break;
04840     }
04841     case 5 : {
04842 
04843 
04844 
04845 { 
04846   dword MATCH_p = 
04847     
04848 
04849     x
04850     ;
04851   unsigned /* [0..65535] */ MATCH_w_16_0;
04852   unsigned /* [0..65535] */ MATCH_w_16_16;
04853   { 
04854     MATCH_w_16_0 = getWord(MATCH_p); 
04855     MATCH_w_16_16 = getWord(2 + MATCH_p); 
04856     { 
04857       unsigned d32 = 
04858         ((MATCH_w_16_0 & 0xffff) /* d16 at 0 */ << 16) + 
04859         (MATCH_w_16_16 & 0xffff) /* d16 at 16 */;
04860       
04861 
04862        ret = pAbsL(d32, size);
04863 
04864       
04865       
04866       
04867     }
04868     
04869   }goto MATCH_finished_vb; 
04870   
04871   MATCH_finished_vb: (void)0; /*placeholder for label*/
04872   
04873 }
04874 
04875 
04876       break;
04877     }
04878     default : pIllegalMode(pc); break;
04879   } 
04880   return ret;
04881 }
04882 
04883 
04884 SemStr* NJMCDecoder::dBEAX(ADDRESS eax, ADDRESS x, DecodeResult& result,
04885     ADDRESS pc, int delta, int size)
04886 {
04887   SemStr* ret;
04888   int reg2, mode;
04889 
04890 
04891 
04892 
04893 { 
04894   dword MATCH_p = 
04895     
04896 
04897     eax
04898     ;
04899   unsigned /* [0..65535] */ MATCH_w_16_0;
04900   { 
04901     MATCH_w_16_0 = getWord(MATCH_p); 
04902     
04903       switch((MATCH_w_16_0 >> 3 & 0x7) /* adrm at 0 */) {
04904         case 0: case 1: case 2: case 3: case 4: 
04905           goto MATCH_label_ub0; break;
04906         case 5: 
04907           { 
04908             unsigned r2 = (MATCH_w_16_0 & 0x7) /* reg2 at 0 */;
04909             
04910 
04911              { mode = 0; reg2 = r2; result.numBytes += 2;}
04912 
04913             
04914             
04915             
04916           }
04917           
04918           break;
04919         case 6: 
04920           { 
04921             unsigned r2 = (MATCH_w_16_0 & 0x7) /* reg2 at 0 */;
04922             
04923 
04924              { mode = 1; reg2 = r2; result.numBytes += 2;}
04925 
04926             
04927             
04928             
04929           }
04930           
04931           break;
04932         case 7: 
04933           
04934             switch((MATCH_w_16_0 & 0x7) /* reg2 at 0 */) {
04935               case 0: 
04936                 
04937 
04938                  { mode = 4; result.numBytes += 2;}
04939 
04940                 
04941                 
04942                 
04943                 break;
04944               case 1: 
04945                 
04946 
04947                  { mode = 5; result.numBytes += 4;}
04948 
04949                 
04950                 
04951                 
04952                 break;
04953               case 2: 
04954                 
04955 
04956                  { mode = 2; result.numBytes += 2;}
04957 
04958                 
04959                 
04960                 
04961                 break;
04962               case 3: 
04963                 
04964 
04965                  { mode = 3; result.numBytes += 2;}
04966 
04967                 
04968                 
04969                 
04970                 break;
04971               case 4: 
04972                 
04973 
04974                  { mode = 6; result.numBytes += 2;}
04975 
04976                 
04977                 
04978                 
04979                 break;
04980               case 5: case 6: case 7: 
04981                 goto MATCH_label_ub0; break;
04982               default: assert(0);
04983             } /* (MATCH_w_16_0 & 0x7) -- reg2 at 0 --*/ 
04984           break;
04985         default: assert(0);
04986       } /* (MATCH_w_16_0 >> 3 & 0x7) -- adrm at 0 --*/ 
04987     
04988   }goto MATCH_finished_ub; 
04989   
04990   MATCH_label_ub0: (void)0; /*placeholder for label*/ 
04991     
04992 
04993     pIllegalMode(pc);
04994 
04995     
04996      
04997     goto MATCH_finished_ub; 
04998     
04999   MATCH_finished_ub: (void)0; /*placeholder for label*/
05000   
05001 }
05002 
05003 
05004 
05005   switch (mode) {
05006     case 0 : {
05007 
05008 
05009 
05010 { 
05011   dword MATCH_p = 
05012     
05013 
05014     x
05015     ;
05016   unsigned /* [0..65535] */ MATCH_w_16_0;
05017   { 
05018     MATCH_w_16_0 = getWord(MATCH_p); 
05019     { 
05020       int /* [~32768..32767] */ d16 = 
05021         sign_extend((MATCH_w_16_0 & 0xffff) /* d16 at 0 */, 16);
05022       
05023 
05024        ret = pADisp(d16, reg2, size);
05025 
05026       
05027       
05028       
05029     }
05030     
05031   }goto MATCH_finished_tb; 
05032   
05033   MATCH_finished_tb: (void)0; /*placeholder for label*/
05034   
05035 }
05036 
05037 
05038       break;
05039     }
05040     case 1 : {
05041 
05042 
05043 
05044 { 
05045   dword MATCH_p = 
05046     
05047 
05048     x
05049     ;
05050   unsigned /* [0..65535] */ MATCH_w_16_0;
05051   { 
05052     MATCH_w_16_0 = getWord(MATCH_p); 
05053     { 
05054       int /* [~128..127] */ d8 = 
05055         sign_extend((MATCH_w_16_0 & 0xff) /* disp8 at 0 */, 8);
05056       unsigned iR = (MATCH_w_16_0 >> 12 & 0x7) /* iReg at 0 */;
05057       unsigned iS = (MATCH_w_16_0 >> 11 & 0x1) /* iSize at 0 */;
05058       unsigned iT = (MATCH_w_16_0 >> 15 & 0x1) /* iType at 0 */;
05059       
05060 
05061        ret = pAIndex(d8, reg2, iT, iR, iS, size);
05062 
05063       
05064       
05065       
05066     }
05067     
05068   }goto MATCH_finished_sb; 
05069   
05070   MATCH_finished_sb: (void)0; /*placeholder for label*/
05071   
05072 }
05073 
05074 
05075       break;
05076     }
05077     case 2 : {
05078 
05079 
05080 
05081 { 
05082   dword MATCH_p = 
05083     
05084 
05085     x
05086     ;
05087   unsigned /* [0..65535] */ MATCH_w_16_0;
05088   { 
05089     MATCH_w_16_0 = getWord(MATCH_p); 
05090     { 
05091       unsigned label = 
05092         sign_extend((MATCH_w_16_0 & 0xffff) /* d16 at 0 */, 16) + 
05093         addressToPC(MATCH_p);
05094       
05095 
05096        ret = pPcDisp(label, delta, size);
05097 
05098       
05099       
05100       
05101     }
05102     
05103   }goto MATCH_finished_rb; 
05104   
05105   MATCH_finished_rb: (void)0; /*placeholder for label*/
05106   
05107 }
05108 
05109 
05110       break;
05111     }
05112     case 3 : {
05113 
05114 
05115 
05116 { 
05117   dword MATCH_p = 
05118     
05119 
05120     x
05121     ;
05122   unsigned /* [0..65535] */ MATCH_w_16_0;
05123   { 
05124     MATCH_w_16_0 = getWord(MATCH_p); 
05125     { 
05126       int /* [~128..127] */ d8 = 
05127         sign_extend((MATCH_w_16_0 & 0xff) /* disp8 at 0 */, 8);
05128       unsigned iR = (MATCH_w_16_0 >> 12 & 0x7) /* iReg at 0 */;
05129       unsigned iS = (MATCH_w_16_0 >> 11 & 0x1) /* iSize at 0 */;
05130       unsigned iT = (MATCH_w_16_0 >> 15 & 0x1) /* iType at 0 */;
05131       
05132 
05133       
05134 
05135               ret = pPcIndex(d8, iT, iR, iS, pc+2, size);
05136 
05137       
05138       
05139       
05140     }
05141     
05142   }goto MATCH_finished_qb; 
05143   
05144   MATCH_finished_qb: (void)0; /*placeholder for label*/
05145   
05146 }
05147 
05148 
05149       break;
05150     }
05151     case 4 : {
05152 
05153 
05154 
05155 { 
05156   dword MATCH_p = 
05157     
05158 
05159     x
05160     ;
05161   unsigned /* [0..65535] */ MATCH_w_16_0;
05162   { 
05163     MATCH_w_16_0 = getWord(MATCH_p); 
05164     { 
05165       int /* [~32768..32767] */ d16 = 
05166         sign_extend((MATCH_w_16_0 & 0xffff) /* d16 at 0 */, 16);
05167       
05168 
05169        ret = pAbsW(d16, size);
05170 
05171       
05172       
05173       
05174     }
05175     
05176   }goto MATCH_finished_pb; 
05177   
05178   MATCH_finished_pb: (void)0; /*placeholder for label*/
05179   
05180 }
05181 
05182 
05183       break;
05184     }
05185     case 5 : {
05186 
05187 
05188 
05189 { 
05190   dword MATCH_p = 
05191     
05192 
05193     x
05194     ;
05195   unsigned /* [0..65535] */ MATCH_w_16_0;
05196   unsigned /* [0..65535] */ MATCH_w_16_16;
05197   { 
05198     MATCH_w_16_0 = getWord(MATCH_p); 
05199     MATCH_w_16_16 = getWord(2 + MATCH_p); 
05200     { 
05201       unsigned d32 = 
05202         ((MATCH_w_16_0 & 0xffff) /* d16 at 0 */ << 16) + 
05203         (MATCH_w_16_16 & 0xffff) /* d16 at 16 */;
05204       
05205 
05206        ret = pAbsL(d32, size);
05207 
05208       
05209       
05210       
05211     }
05212     
05213   }goto MATCH_finished_ob; 
05214   
05215   MATCH_finished_ob: (void)0; /*placeholder for label*/
05216   
05217 }
05218 
05219 
05220       break;
05221     }
05222     case 6 : {
05223 
05224 
05225 
05226 { 
05227   dword MATCH_p = 
05228     
05229 
05230     x
05231     ;
05232   unsigned /* [0..65535] */ MATCH_w_16_0;
05233   { 
05234     MATCH_w_16_0 = getWord(MATCH_p); 
05235     if ((MATCH_w_16_0 >> 12 & 0x7) /* iReg at 0 */ == 0 && 
05236       (MATCH_w_16_0 >> 11 & 0x1) /* iSize at 0 */ == 0 && 
05237       (MATCH_w_16_0 >> 15 & 0x1) /* iType at 0 */ == 0 && 
05238       (1 <= (MATCH_w_16_0 >> 8 & 0x7) /* null at 0 */ && 
05239       (MATCH_w_16_0 >> 8 & 0x7) /* null at 0 */ < 8) || 
05240       (MATCH_w_16_0 >> 12 & 0x7) /* iReg at 0 */ == 0 && 
05241       (MATCH_w_16_0 >> 11 & 0x1) /* iSize at 0 */ == 0 && 
05242       (MATCH_w_16_0 >> 15 & 0x1) /* iType at 0 */ == 1 || 
05243       (MATCH_w_16_0 >> 12 & 0x7) /* iReg at 0 */ == 0 && 
05244       (MATCH_w_16_0 >> 11 & 0x1) /* iSize at 0 */ == 1 || 
05245       1 <= (MATCH_w_16_0 >> 12 & 0x7) /* iReg at 0 */ && 
05246       (MATCH_w_16_0 >> 12 & 0x7) /* iReg at 0 */ < 8) 
05247       goto MATCH_label_nb0;  /*opt-block+*/
05248     else { 
05249       unsigned d8 = (MATCH_w_16_0 & 0xff) /* disp8 at 0 */;
05250       
05251 
05252        ret = pImmB(d8);
05253 
05254       
05255       
05256       
05257     } /*opt-block*//*opt-block+*/
05258     
05259   }goto MATCH_finished_nb; 
05260   
05261   MATCH_label_nb0: (void)0; /*placeholder for label*/ 
05262     
05263 
05264     pNonzeroByte(pc);
05265 
05266     
05267      
05268     goto MATCH_finished_nb; 
05269     
05270   MATCH_finished_nb: (void)0; /*placeholder for label*/
05271   
05272 }
05273 
05274 
05275       break;
05276     }
05277     default : pIllegalMode(pc); break;
05278   } 
05279   return ret;
05280 }
05281 
05282 
05283 SemStr* NJMCDecoder::dWEAX(ADDRESS eax, ADDRESS x, DecodeResult& result,
05284     ADDRESS pc, int delta, int size)
05285 {
05286   SemStr* ret;
05287   int reg2, mode;
05288 
05289 
05290 
05291 
05292 { 
05293   dword MATCH_p = 
05294     
05295 
05296     eax
05297     ;
05298   unsigned /* [0..65535] */ MATCH_w_16_0;
05299   { 
05300     MATCH_w_16_0 = getWord(MATCH_p); 
05301     
05302       switch((MATCH_w_16_0 >> 3 & 0x7) /* adrm at 0 */) {
05303         case 0: case 1: case 2: case 3: case 4: 
05304           goto MATCH_label_mb0; break;
05305         case 5: 
05306           { 
05307             unsigned r2 = (MATCH_w_16_0 & 0x7) /* reg2 at 0 */;
05308             
05309 
05310              { mode = 0; reg2 = r2; result.numBytes += 2;}
05311 
05312             
05313             
05314             
05315           }
05316           
05317           break;
05318         case 6: 
05319           { 
05320             unsigned r2 = (MATCH_w_16_0 & 0x7) /* reg2 at 0 */;
05321             
05322 
05323              { mode = 1; reg2 = r2; result.numBytes += 2;}
05324 
05325             
05326             
05327             
05328           }
05329           
05330           break;
05331         case 7: 
05332           
05333             switch((MATCH_w_16_0 & 0x7) /* reg2 at 0 */) {
05334               case 0: 
05335                 
05336 
05337                  { mode = 4; result.numBytes += 2;}
05338 
05339                 
05340                 
05341                 
05342                 break;
05343               case 1: 
05344                 
05345 
05346                  { mode = 5; result.numBytes += 4;}
05347 
05348                 
05349                 
05350                 
05351                 break;
05352               case 2: 
05353                 
05354 
05355                  { mode = 2; result.numBytes += 2;}
05356 
05357                 
05358                 
05359                 
05360                 break;
05361               case 3: 
05362                 
05363 
05364                  { mode = 3; result.numBytes += 2;}
05365 
05366                 
05367                 
05368                 
05369                 break;
05370               case 4: 
05371                 
05372 
05373                  { mode = 7; result.numBytes += 2;}
05374 
05375                 
05376                 
05377                 
05378                 break;
05379               case 5: case 6: case 7: 
05380                 goto MATCH_label_mb0; break;
05381               default: assert(0);
05382             } /* (MATCH_w_16_0 & 0x7) -- reg2 at 0 --*/ 
05383           break;
05384         default: assert(0);
05385       } /* (MATCH_w_16_0 >> 3 & 0x7) -- adrm at 0 --*/ 
05386     
05387   }goto MATCH_finished_mb; 
05388   
05389   MATCH_label_mb0: (void)0; /*placeholder for label*/ 
05390     
05391 
05392     pIllegalMode(pc);
05393 
05394     
05395      
05396     goto MATCH_finished_mb; 
05397     
05398   MATCH_finished_mb: (void)0; /*placeholder for label*/
05399   
05400 }
05401 
05402 
05403 
05404   switch (mode) {
05405     case 0 : {
05406 
05407 
05408 
05409 { 
05410   dword MATCH_p = 
05411     
05412 
05413     x
05414     ;
05415   unsigned /* [0..65535] */ MATCH_w_16_0;
05416   { 
05417     MATCH_w_16_0 = getWord(MATCH_p); 
05418     { 
05419       int /* [~32768..32767] */ d16 = 
05420         sign_extend((MATCH_w_16_0 & 0xffff) /* d16 at 0 */, 16);
05421       
05422 
05423        ret = pADisp(d16, reg2, size);
05424 
05425       
05426       
05427       
05428     }
05429     
05430   }goto MATCH_finished_lb; 
05431   
05432   MATCH_finished_lb: (void)0; /*placeholder for label*/
05433   
05434 }
05435 
05436 
05437       break;
05438     }
05439     case 1 : {
05440 
05441 
05442 
05443 { 
05444   dword MATCH_p = 
05445     
05446 
05447     x
05448     ;
05449   unsigned /* [0..65535] */ MATCH_w_16_0;
05450   { 
05451     MATCH_w_16_0 = getWord(MATCH_p); 
05452     { 
05453       int /* [~128..127] */ d8 = 
05454         sign_extend((MATCH_w_16_0 & 0xff) /* disp8 at 0 */, 8);
05455       unsigned iR = (MATCH_w_16_0 >> 12 & 0x7) /* iReg at 0 */;
05456       unsigned iS = (MATCH_w_16_0 >> 11 & 0x1) /* iSize at 0 */;
05457       unsigned iT = (MATCH_w_16_0 >> 15 & 0x1) /* iType at 0 */;
05458       
05459 
05460        ret = pAIndex(d8, reg2, iT, iR, iS, size);
05461 
05462       
05463       
05464       
05465     }
05466     
05467   }goto MATCH_finished_kb; 
05468   
05469   MATCH_finished_kb: (void)0; /*placeholder for label*/
05470   
05471 }
05472 
05473 
05474       break;
05475     }
05476     case 2 : {
05477 
05478 
05479 
05480 { 
05481   dword MATCH_p = 
05482     
05483 
05484     x
05485     ;
05486   unsigned /* [0..65535] */ MATCH_w_16_0;
05487   { 
05488     MATCH_w_16_0 = getWord(MATCH_p); 
05489     { 
05490       unsigned label = 
05491         sign_extend((MATCH_w_16_0 & 0xffff) /* d16 at 0 */, 16) + 
05492         addressToPC(MATCH_p);
05493       
05494 
05495        ret = pPcDisp(label, delta, size);
05496 
05497       
05498       
05499       
05500     }
05501     
05502   }goto MATCH_finished_jb; 
05503   
05504   MATCH_finished_jb: (void)0; /*placeholder for label*/
05505   
05506 }
05507 
05508 
05509       break;
05510     }
05511     case 3 : {
05512 
05513 
05514 
05515 { 
05516   dword MATCH_p = 
05517     
05518 
05519     x
05520     ;
05521   unsigned /* [0..65535] */ MATCH_w_16_0;
05522   { 
05523     MATCH_w_16_0 = getWord(MATCH_p); 
05524     { 
05525       int /* [~128..127] */ d8 = 
05526         sign_extend((MATCH_w_16_0 & 0xff) /* disp8 at 0 */, 8);
05527       unsigned iR = (MATCH_w_16_0 >> 12 & 0x7) /* iReg at 0 */;
05528       unsigned iS = (MATCH_w_16_0 >> 11 & 0x1) /* iSize at 0 */;
05529       unsigned iT = (MATCH_w_16_0 >> 15 & 0x1) /* iType at 0 */;
05530       
05531 
05532       
05533 
05534               ret = pPcIndex(d8, iT, iR, iS, pc+2, size);
05535 
05536       
05537       
05538       
05539     }
05540     
05541   }goto MATCH_finished_ib; 
05542   
05543   MATCH_finished_ib: (void)0; /*placeholder for label*/
05544   
05545 }
05546 
05547 
05548       break;
05549     }
05550     case 4 : {
05551 
05552 
05553 
05554 { 
05555   dword MATCH_p = 
05556     
05557 
05558     x
05559     ;
05560   unsigned /* [0..65535] */ MATCH_w_16_0;
05561   { 
05562     MATCH_w_16_0 = getWord(MATCH_p); 
05563     { 
05564       int /* [~32768..32767] */ d16 = 
05565         sign_extend((MATCH_w_16_0 & 0xffff) /* d16 at 0 */, 16);
05566       
05567 
05568        ret = pAbsW(d16, size);
05569 
05570       
05571       
05572       
05573     }
05574     
05575   }goto MATCH_finished_hb; 
05576   
05577   MATCH_finished_hb: (void)0; /*placeholder for label*/
05578   
05579 }
05580 
05581 
05582       break;
05583     }
05584     case 5 : {
05585 
05586 
05587 
05588 { 
05589   dword MATCH_p = 
05590     
05591 
05592     x
05593     ;
05594   unsigned /* [0..65535] */ MATCH_w_16_0;
05595   unsigned /* [0..65535] */ MATCH_w_16_16;
05596   { 
05597     MATCH_w_16_0 = getWord(MATCH_p); 
05598     MATCH_w_16_16 = getWord(2 + MATCH_p); 
05599     { 
05600       unsigned d32 = 
05601         ((MATCH_w_16_0 & 0xffff) /* d16 at 0 */ << 16) + 
05602         (MATCH_w_16_16 & 0xffff) /* d16 at 16 */;
05603       
05604 
05605        ret = pAbsL(d32, size);
05606 
05607       
05608       
05609       
05610     }
05611     
05612   }goto MATCH_finished_gb; 
05613   
05614   MATCH_finished_gb: (void)0; /*placeholder for label*/
05615   
05616 }
05617 
05618 
05619       break;
05620     }
05621     case 7 : {
05622 
05623 
05624 
05625 { 
05626   dword MATCH_p = 
05627     
05628 
05629     x
05630     ;
05631   unsigned /* [0..65535] */ MATCH_w_16_0;
05632   { 
05633     MATCH_w_16_0 = getWord(MATCH_p); 
05634     { 
05635       unsigned d16 = (MATCH_w_16_0 & 0xffff) /* d16 at 0 */;
05636       
05637 
05638        ret = pImmW(d16);
05639 
05640       
05641       
05642       
05643     }
05644     
05645   }goto MATCH_finished_fb; 
05646   
05647   MATCH_finished_fb: (void)0; /*placeholder for label*/
05648   
05649 }
05650 
05651 
05652       break;
05653     }
05654     default : pIllegalMode(pc); break;
05655   } 
05656   return ret;
05657 }
05658 
05659 
05660 SemStr* NJMCDecoder::maEAX(ADDRESS eax, ADDRESS x, DecodeResult& result,
05661     ADDRESS pc, int size)
05662 {
05663   SemStr* ret;
05664   int reg2, mode;
05665 
05666 
05667 
05668 
05669 { 
05670   dword MATCH_p = 
05671     
05672 
05673     eax
05674     ;
05675   unsigned /* [0..65535] */ MATCH_w_16_0;
05676   { 
05677     MATCH_w_16_0 = getWord(MATCH_p); 
05678     
05679       switch((MATCH_w_16_0 >> 3 & 0x7) /* adrm at 0 */) {
05680         case 0: case 1: case 2: case 3: case 4: 
05681           goto MATCH_label_eb0; break;
05682         case 5: 
05683           { 
05684             unsigned r2 = (MATCH_w_16_0 & 0x7) /* reg2 at 0 */;
05685             
05686 
05687              { mode = 0; reg2 = r2; result.numBytes += 2;}
05688 
05689             
05690             
05691             
05692           }
05693           
05694           break;
05695         case 6: 
05696           { 
05697             unsigned r2 = (MATCH_w_16_0 & 0x7) /* reg2 at 0 */;
05698             
05699 
05700              { mode = 1; reg2 = r2; result.numBytes += 2;}
05701 
05702             
05703             
05704             
05705           }
05706           
05707           break;
05708         case 7: 
05709           
05710             switch((MATCH_w_16_0 & 0x7) /* reg2 at 0 */) {
05711               case 0: 
05712                 
05713 
05714                  { mode = 4; result.numBytes += 2;}
05715 
05716                 
05717                 
05718                 
05719                 break;
05720               case 1: 
05721                 
05722 
05723                  { mode = 5; result.numBytes += 4;}
05724 
05725                 
05726                 
05727                 
05728                 break;
05729               case 2: case 3: case 4: case 5: case 6: case 7: 
05730                 goto MATCH_label_eb0; break;
05731               default: assert(0);
05732             } /* (MATCH_w_16_0 & 0x7) -- reg2 at 0 --*/ 
05733           break;
05734         default: assert(0);
05735       } /* (MATCH_w_16_0 >> 3 & 0x7) -- adrm at 0 --*/ 
05736     
05737   }goto MATCH_finished_eb; 
05738   
05739   MATCH_label_eb0: (void)0; /*placeholder for label*/ 
05740     
05741 
05742     pIllegalMode(pc);
05743 
05744     
05745      
05746     goto MATCH_finished_eb; 
05747     
05748   MATCH_finished_eb: (void)0; /*placeholder for label*/
05749   
05750 }
05751 
05752 
05753 
05754   switch (mode) {
05755     case 0 : {
05756 
05757 
05758 
05759 { 
05760   dword MATCH_p = 
05761     
05762 
05763     x
05764     ;
05765   unsigned /* [0..65535] */ MATCH_w_16_0;
05766   { 
05767     MATCH_w_16_0 = getWord(MATCH_p); 
05768     { 
05769       int /* [~32768..32767] */ d16 = 
05770         sign_extend((MATCH_w_16_0 & 0xffff) /* d16 at 0 */, 16);
05771       
05772 
05773        ret = pADisp(d16, reg2, size);
05774 
05775       
05776       
05777       
05778     }
05779     
05780   }goto MATCH_finished_db; 
05781   
05782   MATCH_finished_db: (void)0; /*placeholder for label*/
05783   
05784 }
05785 
05786 
05787       break;
05788     }
05789     case 1 : {
05790 
05791 
05792 
05793 { 
05794   dword MATCH_p = 
05795     
05796 
05797     x
05798     ;
05799   unsigned /* [0..65535] */ MATCH_w_16_0;
05800   { 
05801     MATCH_w_16_0 = getWord(MATCH_p); 
05802     { 
05803       int /* [~128..127] */ d8 = 
05804         sign_extend((MATCH_w_16_0 & 0xff) /* disp8 at 0 */, 8);
05805       unsigned iR = (MATCH_w_16_0 >> 12 & 0x7) /* iReg at 0 */;
05806       unsigned iS = (MATCH_w_16_0 >> 11 & 0x1) /* iSize at 0 */;
05807       unsigned iT = (MATCH_w_16_0 >> 15 & 0x1) /* iType at 0 */;
05808       
05809 
05810        ret = pAIndex(d8, reg2, iT, iR, iS, size);
05811 
05812       
05813       
05814       
05815     }
05816     
05817   }goto MATCH_finished_cb; 
05818   
05819   MATCH_finished_cb: (void)0; /*placeholder for label*/
05820   
05821 }
05822 
05823 
05824       break;
05825     }
05826     case 4 : {
05827 
05828 
05829 
05830 { 
05831   dword MATCH_p = 
05832     
05833 
05834     x
05835     ;
05836   unsigned /* [0..65535] */ MATCH_w_16_0;
05837   { 
05838     MATCH_w_16_0 = getWord(MATCH_p); 
05839     { 
05840       int /* [~32768..32767] */ d16 = 
05841         sign_extend((MATCH_w_16_0 & 0xffff) /* d16 at 0 */, 16);
05842       
05843 
05844        ret = pAbsW(d16, size);
05845 
05846       
05847       
05848       
05849     }
05850     
05851   }goto MATCH_finished_bb; 
05852   
05853   MATCH_finished_bb: (void)0; /*placeholder for label*/
05854   
05855 }
05856 
05857 
05858       break;
05859     }
05860     case 5 : {
05861 
05862 
05863 
05864 { 
05865   dword MATCH_p = 
05866     
05867 
05868     x
05869     ;
05870   unsigned /* [0..65535] */ MATCH_w_16_0;
05871   unsigned /* [0..65535] */ MATCH_w_16_16;
05872   { 
05873     MATCH_w_16_0 = getWord(MATCH_p); 
05874     MATCH_w_16_16 = getWord(2 + MATCH_p); 
05875     { 
05876       unsigned d32 = 
05877         ((MATCH_w_16_0 & 0xffff) /* d16 at 0 */ << 16) + 
05878         (MATCH_w_16_16 & 0xffff) /* d16 at 16 */;
05879       
05880 
05881        ret = pAbsL(d32, size);
05882 
05883       
05884       
05885       
05886     }
05887     
05888   }goto MATCH_finished_ab; 
05889   
05890   MATCH_finished_ab: (void)0; /*placeholder for label*/
05891   
05892 }
05893 
05894 
05895       break;
05896     }
05897     default : pIllegalMode(pc); break;
05898   } 
05899   return ret;
05900 }
05901 
05902 
05903 SemStr* NJMCDecoder::msEAX(ADDRESS eax, ADDRESS x, DecodeResult& result,
05904     ADDRESS pc, int delta, int size)
05905 {
05906   SemStr* ret;
05907   int reg2, mode;
05908 
05909 
05910 
05911 
05912 { 
05913   dword MATCH_p = 
05914     
05915 
05916     eax
05917     ;
05918   unsigned /* [0..65535] */ MATCH_w_16_0;
05919   { 
05920     MATCH_w_16_0 = getWord(MATCH_p); 
05921     
05922       switch((MATCH_w_16_0 >> 3 & 0x7) /* adrm at 0 */) {
05923         case 0: case 1: case 2: case 3: case 4: 
05924           goto MATCH_label_z0; break;
05925         case 5: 
05926           { 
05927             unsigned r2 = (MATCH_w_16_0 & 0x7) /* reg2 at 0 */;
05928             
05929 
05930              { mode = 0; reg2 = r2; result.numBytes += 2;}
05931 
05932             
05933             
05934             
05935           }
05936           
05937           break;
05938         case 6: 
05939           { 
05940             unsigned r2 = (MATCH_w_16_0 & 0x7) /* reg2 at 0 */;
05941             
05942 
05943              { mode = 1; reg2 = r2; result.numBytes += 2;}
05944 
05945             
05946             
05947             
05948           }
05949           
05950           break;
05951         case 7: 
05952           
05953             switch((MATCH_w_16_0 & 0x7) /* reg2 at 0 */) {
05954               case 0: 
05955                 
05956 
05957                  { mode = 4; result.numBytes += 2;}
05958 
05959                 
05960                 
05961                 
05962                 break;
05963               case 1: case 5: case 6: case 7: 
05964                 goto MATCH_label_z0; break;
05965               case 2: 
05966                 
05967 
05968                  { mode = 2; result.numBytes += 2;}
05969 
05970                 
05971                 
05972                 
05973                 break;
05974               case 3: 
05975                 
05976 
05977                  { mode = 3; result.numBytes += 2;}
05978 
05979                 
05980                 
05981                 
05982                 break;
05983               case 4: 
05984                 
05985                   switch((MATCH_w_16_0 >> 12 & 0xf) /* op at 0 */) {
05986                     case 0: case 2: case 4: case 5: case 6: case 7: case 8: 
05987                     case 9: case 10: case 11: case 12: case 13: case 14: 
05988                     case 15: 
05989                       goto MATCH_label_z0; break;
05990                     case 1: 
05991                       
05992 
05993                        { mode = 6; result.numBytes += 2;}
05994 
05995                       
05996                       
05997                       
05998                       break;
05999                     case 3: 
06000                       
06001 
06002                        { mode = 7; result.numBytes += 2;}
06003 
06004                       
06005                       
06006                       
06007                       break;
06008                     default: assert(0);
06009                   } /* (MATCH_w_16_0 >> 12 & 0xf) -- op at 0 --*/ 
06010                 break;
06011               default: assert(0);
06012             } /* (MATCH_w_16_0 & 0x7) -- reg2 at 0 --*/ 
06013           break;
06014         default: assert(0);
06015       } /* (MATCH_w_16_0 >> 3 & 0x7) -- adrm at 0 --*/ 
06016     
06017   }goto MATCH_finished_z; 
06018   
06019   MATCH_label_z0: (void)0; /*placeholder for label*/ 
06020     
06021 
06022     pIllegalMode(pc);
06023 
06024     
06025      
06026     goto MATCH_finished_z; 
06027     
06028   MATCH_finished_z: (void)0; /*placeholder for label*/
06029   
06030 }
06031 
06032 
06033 
06034   switch (mode) {
06035     case 0 : {
06036 
06037 
06038 
06039 { 
06040   dword MATCH_p = 
06041     
06042 
06043     x
06044     ;
06045   unsigned /* [0..65535] */ MATCH_w_16_0;
06046   { 
06047     MATCH_w_16_0 = getWord(MATCH_p); 
06048     { 
06049       int /* [~32768..32767] */ d16 = 
06050         sign_extend((MATCH_w_16_0 & 0xffff) /* d16 at 0 */, 16);
06051       
06052 
06053        ret = pADisp(d16, reg2, size);
06054 
06055       
06056       
06057       
06058     }
06059     
06060   }goto MATCH_finished_y; 
06061   
06062   MATCH_finished_y: (void)0; /*placeholder for label*/
06063   
06064 }
06065 
06066 
06067       break;
06068     }
06069     case 1 : {
06070 
06071 
06072 
06073 { 
06074   dword MATCH_p = 
06075     
06076 
06077     x
06078     ;
06079   unsigned /* [0..65535] */ MATCH_w_16_0;
06080   { 
06081     MATCH_w_16_0 = getWord(MATCH_p); 
06082     { 
06083       int /* [~128..127] */ d8 = 
06084         sign_extend((MATCH_w_16_0 & 0xff) /* disp8 at 0 */, 8);
06085       unsigned iR = (MATCH_w_16_0 >> 12 & 0x7) /* iReg at 0 */;
06086       unsigned iS = (MATCH_w_16_0 >> 11 & 0x1) /* iSize at 0 */;
06087       unsigned iT = (MATCH_w_16_0 >> 15 & 0x1) /* iType at 0 */;
06088       
06089 
06090        ret = pAIndex(d8, reg2, iT, iR, iS, size);
06091 
06092       
06093       
06094       
06095     }
06096     
06097   }goto MATCH_finished_x; 
06098   
06099   MATCH_finished_x: (void)0; /*placeholder for label*/
06100   
06101 }
06102 
06103 
06104       break;
06105     }
06106     case 2 : {
06107 
06108 
06109 
06110 { 
06111   dword MATCH_p = 
06112     
06113 
06114     x
06115     ;
06116   unsigned /* [0..65535] */ MATCH_w_16_0;
06117   { 
06118     MATCH_w_16_0 = getWord(MATCH_p); 
06119     { 
06120       unsigned label = 
06121         sign_extend((MATCH_w_16_0 & 0xffff) /* d16 at 0 */, 16) + 
06122         addressToPC(MATCH_p);
06123       
06124 
06125        ret = pPcDisp(label, delta, size);
06126 
06127       
06128       
06129       
06130     }
06131     
06132   }goto MATCH_finished_w; 
06133   
06134   MATCH_finished_w: (void)0; /*placeholder for label*/
06135   
06136 }
06137 
06138 
06139       break;
06140     }
06141     case 3 : {
06142 
06143 
06144 
06145 { 
06146   dword MATCH_p = 
06147     
06148 
06149     x
06150     ;
06151   unsigned /* [0..65535] */ MATCH_w_16_0;
06152   { 
06153     MATCH_w_16_0 = getWord(MATCH_p); 
06154     { 
06155       int /* [~128..127] */ d8 = 
06156         sign_extend((MATCH_w_16_0 & 0xff) /* disp8 at 0 */, 8);
06157       unsigned iR = (MATCH_w_16_0 >> 12 & 0x7) /* iReg at 0 */;
06158       unsigned iS = (MATCH_w_16_0 >> 11 & 0x1) /* iSize at 0 */;
06159       unsigned iT = (MATCH_w_16_0 >> 15 & 0x1) /* iType at 0 */;
06160       
06161 
06162       
06163 
06164               ret = pPcIndex(d8, iT, iR, iS, pc+2, size);
06165 
06166       
06167       
06168       
06169     }
06170     
06171   }goto MATCH_finished_v; 
06172   
06173   MATCH_finished_v: (void)0; /*placeholder for label*/
06174   
06175 }
06176 
06177 
06178       break;
06179     }
06180     case 4 : {
06181 
06182 
06183 
06184 { 
06185   dword MATCH_p = 
06186     
06187 
06188     x
06189     ;
06190   unsigned /* [0..65535] */ MATCH_w_16_0;
06191   { 
06192     MATCH_w_16_0 = getWord(MATCH_p); 
06193     { 
06194       int /* [~32768..32767] */ d16 = 
06195         sign_extend((MATCH_w_16_0 & 0xffff) /* d16 at 0 */, 16);
06196       
06197 
06198        ret = pAbsW(d16, size);
06199 
06200       
06201       
06202       
06203     }
06204     
06205   }goto MATCH_finished_u; 
06206   
06207   MATCH_finished_u: (void)0; /*placeholder for label*/
06208   
06209 }
06210 
06211 
06212       break;
06213     }
06214     case 6 : {
06215 
06216 
06217 
06218 { 
06219   dword MATCH_p = 
06220     
06221 
06222     x
06223     ;
06224   unsigned /* [0..65535] */ MATCH_w_16_0;
06225   { 
06226     MATCH_w_16_0 = getWord(MATCH_p); 
06227     if ((MATCH_w_16_0 >> 12 & 0x7) /* iReg at 0 */ == 0 && 
06228       (MATCH_w_16_0 >> 11 & 0x1) /* iSize at 0 */ == 0 && 
06229       (MATCH_w_16_0 >> 15 & 0x1) /* iType at 0 */ == 0 && 
06230       (1 <= (MATCH_w_16_0 >> 8 & 0x7) /* null at 0 */ && 
06231       (MATCH_w_16_0 >> 8 & 0x7) /* null at 0 */ < 8) || 
06232       (MATCH_w_16_0 >> 12 & 0x7) /* iReg at 0 */ == 0 && 
06233       (MATCH_w_16_0 >> 11 & 0x1) /* iSize at 0 */ == 0 && 
06234       (MATCH_w_16_0 >> 15 & 0x1) /* iType at 0 */ == 1 || 
06235       (MATCH_w_16_0 >> 12 & 0x7) /* iReg at 0 */ == 0 && 
06236       (MATCH_w_16_0 >> 11 & 0x1) /* iSize at 0 */ == 1 || 
06237       1 <= (MATCH_w_16_0 >> 12 & 0x7) /* iReg at 0 */ && 
06238       (MATCH_w_16_0 >> 12 & 0x7) /* iReg at 0 */ < 8) 
06239       goto MATCH_label_t0;  /*opt-block+*/
06240     else { 
06241       unsigned d8 = (MATCH_w_16_0 & 0xff) /* disp8 at 0 */;
06242       
06243 
06244        ret = pImmB(d8);
06245 
06246       
06247       
06248       
06249     } /*opt-block*//*opt-block+*/
06250     
06251   }goto MATCH_finished_t; 
06252   
06253   MATCH_label_t0: (void)0; /*placeholder for label*/ 
06254     
06255 
06256     pNonzeroByte(pc);
06257 
06258     
06259      
06260     goto MATCH_finished_t; 
06261     
06262   MATCH_finished_t: (void)0; /*placeholder for label*/
06263   
06264 }
06265 
06266 
06267       break;
06268     }
06269     case 7 : {
06270 
06271 
06272 
06273 { 
06274   dword MATCH_p = 
06275     
06276 
06277     x
06278     ;
06279   unsigned /* [0..65535] */ MATCH_w_16_0;
06280   { 
06281     MATCH_w_16_0 = getWord(MATCH_p); 
06282     { 
06283       unsigned d16 = (MATCH_w_16_0 & 0xffff) /* d16 at 0 */;
06284       
06285 
06286        ret = pImmW(d16);
06287 
06288       
06289       
06290       
06291     }
06292     
06293   }goto MATCH_finished_s; 
06294   
06295   MATCH_finished_s: (void)0; /*placeholder for label*/
06296   
06297 }
06298 
06299 
06300       break;
06301     }
06302     default : pIllegalMode(pc); break;
06303   } 
06304   return ret;
06305 }
06306 
06307 
06308 SemStr* NJMCDecoder::msEAXL(ADDRESS eaxl, int d32, DecodeResult& result,
06309     ADDRESS pc, int size)
06310 {
06311   SemStr* ret;
06312   int reg2, mode;
06313 
06314 
06315 
06316 
06317 { 
06318   dword MATCH_p = 
06319     
06320 
06321     eaxl
06322     ;
06323   unsigned /* [0..65535] */ MATCH_w_16_0;
06324   { 
06325     MATCH_w_16_0 = getWord(MATCH_p); 
06326     
06327       switch((MATCH_w_16_0 & 0x7) /* reg2 at 0 */) {
06328         case 0: case 2: case 3: case 5: case 6: case 7: 
06329           goto MATCH_label_r0; break;
06330         case 1: 
06331           if ((MATCH_w_16_0 >> 3 & 0x7) /* adrm at 0 */ == 7) 
06332             
06333 
06334              { mode = 5; result.numBytes += 4;}
06335 
06336             
06337              /*opt-block+*/
06338           else 
06339             goto MATCH_label_r0;  /*opt-block+*/
06340           
06341           break;
06342         case 4: 
06343           if ((MATCH_w_16_0 >> 12 & 0xf) /* op at 0 */ == 2 && 
06344             (MATCH_w_16_0 >> 3 & 0x7) /* adrm at 0 */ == 7) 
06345             
06346 
06347              { mode = 8; result.numBytes += 4;}
06348 
06349             
06350              /*opt-block+*/
06351           else 
06352             goto MATCH_label_r0;  /*opt-block+*/
06353           
06354           break;
06355         default: assert(0);
06356       } /* (MATCH_w_16_0 & 0x7) -- reg2 at 0 --*/ 
06357     
06358   }goto MATCH_finished_r; 
06359   
06360   MATCH_label_r0: (void)0; /*placeholder for label*/ 
06361     
06362 
06363     pIllegalMode(pc);
06364 
06365     
06366      
06367     goto MATCH_finished_r; 
06368     
06369   MATCH_finished_r: (void)0; /*placeholder for label*/
06370   
06371 }
06372 
06373 
06374 
06375   switch (mode) {
06376     case 5 : {
06377       ret = pAbsL(d32, size);
06378       break;
06379     }
06380     case 8 : {
06381       ret = pImmL(d32);
06382       break;
06383     }
06384     default : pIllegalMode(pc); break;
06385   } 
06386   return ret;
06387 }
06388 
06389 
06390 SemStr* NJMCDecoder::mdEAX(ADDRESS eax, ADDRESS x, DecodeResult& result,
06391     ADDRESS pc, int size)
06392 {
06393   SemStr* ret;
06394   int reg1, mode;
06395 
06396 
06397 
06398 
06399 { 
06400   dword MATCH_p = 
06401     
06402 
06403     eax
06404     ;
06405   unsigned /* [0..65535] */ MATCH_w_16_0;
06406   { 
06407     MATCH_w_16_0 = getWord(MATCH_p); 
06408     
06409       switch((MATCH_w_16_0 >> 6 & 0x7) /* MDadrm at 0 */) {
06410         case 0: case 1: case 2: case 3: case 4: case 7: 
06411           if ((MATCH_w_16_0 >> 8 & 0x1) /* sb at 0 */ == 1) 
06412             if ((MATCH_w_16_0 >> 6 & 0x3) /* sz at 0 */ == 3) 
06413               
06414                 switch((MATCH_w_16_0 >> 9 & 0x7) /* reg1 at 0 */) {
06415                   case 0: 
06416                     
06417 
06418                      { mode = 4; result.numBytes += 2;}
06419 
06420                     
06421                     
06422                     
06423                     break;
06424                   case 1: 
06425                     
06426 
06427                      { mode = 5; result.numBytes += 4;}
06428 
06429                     
06430                     
06431                     
06432                     break;
06433                   case 2: case 3: case 4: case 5: case 6: case 7: 
06434                     goto MATCH_label_q0; break;
06435                   default: assert(0);
06436                 } /* (MATCH_w_16_0 >> 9 & 0x7) -- reg1 at 0 --*/  
06437             else 
06438               goto MATCH_label_q0;  /*opt-block+*/ 
06439           else 
06440             goto MATCH_label_q0;  /*opt-block+*/
06441           break;
06442         case 5: 
06443           { 
06444             unsigned r1 = (MATCH_w_16_0 >> 9 & 0x7) /* reg1 at 0 */;
06445             
06446 
06447              { mode = 0; reg1 = r1; result.numBytes += 2;}
06448 
06449             
06450             
06451             
06452           }
06453           
06454           break;
06455         case 6: 
06456           { 
06457             unsigned r1 = (MATCH_w_16_0 >> 9 & 0x7) /* reg1 at 0 */;
06458             
06459 
06460              { mode = 1; reg1 = r1; result.numBytes += 2;}
06461 
06462             
06463             
06464             
06465           }
06466           
06467           break;
06468         default: assert(0);
06469       } /* (MATCH_w_16_0 >> 6 & 0x7) -- MDadrm at 0 --*/ 
06470     
06471   }goto MATCH_finished_q; 
06472   
06473   MATCH_label_q0: (void)0; /*placeholder for label*/ 
06474     
06475 
06476     pIllegalMode(pc);
06477 
06478     
06479      
06480     goto MATCH_finished_q; 
06481     
06482   MATCH_finished_q: (void)0; /*placeholder for label*/
06483   
06484 }
06485 
06486 
06487 
06488   switch (mode) {
06489     case 0 : {
06490 
06491 
06492 
06493 { 
06494   dword MATCH_p = 
06495     
06496 
06497     x
06498     ;
06499   unsigned /* [0..65535] */ MATCH_w_16_0;
06500   { 
06501     MATCH_w_16_0 = getWord(MATCH_p); 
06502     { 
06503       int /* [~32768..32767] */ d16 = 
06504         sign_extend((MATCH_w_16_0 & 0xffff) /* d16 at 0 */, 16);
06505       
06506 
06507        ret = pADisp(d16, reg1, size);
06508 
06509       
06510       
06511       
06512     }
06513     
06514   }goto MATCH_finished_p; 
06515   
06516   MATCH_finished_p: (void)0; /*placeholder for label*/
06517   
06518 }
06519 
06520 
06521       break;
06522     }
06523     case 1 : {
06524 
06525 
06526 
06527 { 
06528   dword MATCH_p = 
06529     
06530 
06531     x
06532     ;
06533   unsigned /* [0..65535] */ MATCH_w_16_0;
06534   { 
06535     MATCH_w_16_0 = getWord(MATCH_p); 
06536     { 
06537       int /* [~128..127] */ d8 = 
06538         sign_extend((MATCH_w_16_0 & 0xff) /* disp8 at 0 */, 8);
06539       unsigned iR = (MATCH_w_16_0 >> 12 & 0x7) /* iReg at 0 */;
06540       unsigned iS = (MATCH_w_16_0 >> 11 & 0x1) /* iSize at 0 */;
06541       unsigned iT = (MATCH_w_16_0 >> 15 & 0x1) /* iType at 0 */;
06542       
06543 
06544        ret = pAIndex(d8, reg1, iT, iR, iS, size);
06545 
06546       
06547       
06548       
06549     }
06550     
06551   }goto MATCH_finished_o; 
06552   
06553   MATCH_finished_o: (void)0; /*placeholder for label*/
06554   
06555 }
06556 
06557 
06558       break;
06559     }
06560     case 4 : {
06561 
06562 
06563 
06564 { 
06565   dword MATCH_p = 
06566     
06567 
06568     x
06569     ;
06570   unsigned /* [0..65535] */ MATCH_w_16_0;
06571   { 
06572     MATCH_w_16_0 = getWord(MATCH_p); 
06573     { 
06574       unsigned d16 = (MATCH_w_16_0 & 0xffff) /* d16 at 0 */;
06575       
06576 
06577        ret = pAbsW(d16, size);
06578 
06579       
06580       
06581       
06582     }
06583     
06584   }goto MATCH_finished_n; 
06585   
06586   MATCH_finished_n: (void)0; /*placeholder for label*/
06587   
06588 }
06589 
06590 
06591       break;
06592     }
06593     case 5 : {
06594 
06595 
06596 
06597 { 
06598   dword MATCH_p = 
06599     
06600 
06601     x
06602     ;
06603   unsigned /* [0..65535] */ MATCH_w_16_0;
06604   unsigned /* [0..65535] */ MATCH_w_16_16;
06605   { 
06606     MATCH_w_16_0 = getWord(MATCH_p); 
06607     MATCH_w_16_16 = getWord(2 + MATCH_p); 
06608     { 
06609       unsigned d32 = 
06610         ((MATCH_w_16_0 & 0xffff) /* d16 at 0 */ << 16) + 
06611         (MATCH_w_16_16 & 0xffff) /* d16 at 16 */;
06612       
06613 
06614        ret = pAbsL(d32, size);
06615 
06616       
06617       
06618       
06619     }
06620     
06621   }goto MATCH_finished_m; 
06622   
06623   MATCH_finished_m: (void)0; /*placeholder for label*/
06624   
06625 }
06626 
06627 
06628       break;
06629     }
06630     default : pIllegalMode(pc); break;
06631   } 
06632   return ret;
06633 }
06634 
06635 
06636 SemStr* NJMCDecoder::mrEAX(ADDRESS eax, ADDRESS x, DecodeResult& result,
06637     ADDRESS pc, int delta, int size)
06638 {
06639   SemStr* ret;
06640   int reg2, mode;
06641 
06642 
06643 
06644 
06645 { 
06646   dword MATCH_p = 
06647     
06648 
06649     eax
06650     ;
06651   unsigned /* [0..65535] */ MATCH_w_16_0;
06652   { 
06653     MATCH_w_16_0 = getWord(MATCH_p); 
06654     
06655       switch((MATCH_w_16_0 >> 3 & 0x7) /* adrm at 0 */) {
06656         case 0: case 1: case 2: case 3: case 4: 
06657           goto MATCH_label_l0; break;
06658         case 5: 
06659           { 
06660             unsigned r2 = (MATCH_w_16_0 & 0x7) /* reg2 at 0 */;
06661             
06662 
06663              { mode = 0; reg2 = r2; result.numBytes += 2;}
06664 
06665             
06666             
06667             
06668           }
06669           
06670           break;
06671         case 6: 
06672           { 
06673             unsigned r2 = (MATCH_w_16_0 & 0x7) /* reg2 at 0 */;
06674             
06675 
06676              { mode = 1; reg2 = r2; result.numBytes += 2;}
06677 
06678             
06679             
06680             
06681           }
06682           
06683           break;
06684         case 7: 
06685           
06686             switch((MATCH_w_16_0 & 0x7) /* reg2 at 0 */) {
06687               case 0: 
06688                 
06689 
06690                  { mode = 4; result.numBytes += 2;}
06691 
06692                 
06693                 
06694                 
06695                 break;
06696               case 1: 
06697                 
06698 
06699                  { mode = 5; result.numBytes += 4;}
06700 
06701                 
06702                 
06703                 
06704                 break;
06705               case 2: 
06706                 
06707 
06708                  { mode = 2; result.numBytes += 2;}
06709 
06710                 
06711                 
06712                 
06713                 break;
06714               case 3: 
06715                 
06716 
06717                  { mode = 3; result.numBytes += 2;}
06718 
06719                 
06720                 
06721                 
06722                 break;
06723               case 4: case 5: case 6: case 7: 
06724                 goto MATCH_label_l0; break;
06725               default: assert(0);
06726             } /* (MATCH_w_16_0 & 0x7) -- reg2 at 0 --*/ 
06727           break;
06728         default: assert(0);
06729       } /* (MATCH_w_16_0 >> 3 & 0x7) -- adrm at 0 --*/ 
06730     
06731   }goto MATCH_finished_l; 
06732   
06733   MATCH_label_l0: (void)0; /*placeholder for label*/ 
06734     
06735 
06736     pIllegalMode(pc);
06737 
06738     
06739      
06740     goto MATCH_finished_l; 
06741     
06742   MATCH_finished_l: (void)0; /*placeholder for label*/
06743   
06744 }
06745 
06746 
06747 
06748   switch (mode) {
06749     case 0 : {
06750 
06751 
06752 
06753 { 
06754   dword MATCH_p = 
06755     
06756 
06757     x
06758     ;
06759   unsigned /* [0..65535] */ MATCH_w_16_0;
06760   { 
06761     MATCH_w_16_0 = getWord(MATCH_p); 
06762     { 
06763       int /* [~32768..32767] */ d16 = 
06764         sign_extend((MATCH_w_16_0 & 0xffff) /* d16 at 0 */, 16);
06765       
06766 
06767        ret = pADisp(d16, reg2, size);
06768 
06769       
06770       
06771       
06772     }
06773     
06774   }goto MATCH_finished_k; 
06775   
06776   MATCH_finished_k: (void)0; /*placeholder for label*/
06777   
06778 }
06779 
06780 
06781       break;
06782     }
06783     case 1 : {
06784 
06785 
06786 
06787 { 
06788   dword MATCH_p = 
06789     
06790 
06791     x
06792     ;
06793   unsigned /* [0..65535] */ MATCH_w_16_0;
06794   { 
06795     MATCH_w_16_0 = getWord(MATCH_p); 
06796     { 
06797       int /* [~128..127] */ d8 = 
06798         sign_extend((MATCH_w_16_0 & 0xff) /* disp8 at 0 */, 8);
06799       unsigned iR = (MATCH_w_16_0 >> 12 & 0x7) /* iReg at 0 */;
06800       unsigned iS = (MATCH_w_16_0 >> 11 & 0x1) /* iSize at 0 */;
06801       unsigned iT = (MATCH_w_16_0 >> 15 & 0x1) /* iType at 0 */;
06802       
06803 
06804        ret = pAIndex(d8, reg2, iT, iR, iS, size);
06805 
06806       
06807       
06808       
06809     }
06810     
06811   }goto MATCH_finished_j; 
06812   
06813   MATCH_finished_j: (void)0; /*placeholder for label*/
06814   
06815 }
06816 
06817 
06818       break;
06819     }
06820     case 2 : {
06821 
06822 
06823 
06824 { 
06825   dword MATCH_p = 
06826     
06827 
06828     x
06829     ;
06830   unsigned /* [0..65535] */ MATCH_w_16_0;
06831   { 
06832     MATCH_w_16_0 = getWord(MATCH_p); 
06833     { 
06834       unsigned label = 
06835         sign_extend((MATCH_w_16_0 & 0xffff) /* d16 at 0 */, 16) + 
06836         addressToPC(MATCH_p);
06837       
06838 
06839        ret = pPcDisp(label, delta, size);
06840 
06841       
06842       
06843       
06844     }
06845     
06846   }goto MATCH_finished_i; 
06847   
06848   MATCH_finished_i: (void)0; /*placeholder for label*/
06849   
06850 }
06851 
06852 
06853       break;
06854     }
06855     case 3 : {
06856 
06857 
06858 
06859 { 
06860   dword MATCH_p = 
06861     
06862 
06863     x
06864     ;
06865   unsigned /* [0..65535] */ MATCH_w_16_0;
06866   { 
06867     MATCH_w_16_0 = getWord(MATCH_p); 
06868     { 
06869       int /* [~128..127] */ d8 = 
06870         sign_extend((MATCH_w_16_0 & 0xff) /* disp8 at 0 */, 8);
06871       unsigned iR = (MATCH_w_16_0 >> 12 & 0x7) /* iReg at 0 */;
06872       unsigned iS = (MATCH_w_16_0 >> 11 & 0x1) /* iSize at 0 */;
06873       unsigned iT = (MATCH_w_16_0 >> 15 & 0x1) /* iType at 0 */;
06874       
06875 
06876       
06877 
06878               ret = pPcIndex(d8, iT, iR, iS, pc+2, size);
06879 
06880       
06881       
06882       
06883     }
06884     
06885   }goto MATCH_finished_h; 
06886   
06887   MATCH_finished_h: (void)0; /*placeholder for label*/
06888   
06889 }
06890 
06891 
06892       break;
06893     }
06894     case 4 : {
06895 
06896 
06897 
06898 { 
06899   dword MATCH_p = 
06900     
06901 
06902     x
06903     ;
06904   unsigned /* [0..65535] */ MATCH_w_16_0;
06905   { 
06906     MATCH_w_16_0 = getWord(MATCH_p); 
06907     { 
06908       int /* [~32768..32767] */ d16 = 
06909         sign_extend((MATCH_w_16_0 & 0xffff) /* d16 at 0 */, 16);
06910       
06911 
06912        ret = pAbsW(d16, size);
06913 
06914       
06915       
06916       
06917     }
06918     
06919   }goto MATCH_finished_g; 
06920   
06921   MATCH_finished_g: (void)0; /*placeholder for label*/
06922   
06923 }
06924 
06925 
06926       break;
06927     }
06928     case 5 : {
06929 
06930 
06931 
06932 { 
06933   dword MATCH_p = 
06934     
06935 
06936     x
06937     ;
06938   unsigned /* [0..65535] */ MATCH_w_16_0;
06939   unsigned /* [0..65535] */ MATCH_w_16_16;
06940   { 
06941     MATCH_w_16_0 = getWord(MATCH_p); 
06942     MATCH_w_16_16 = getWord(2 + MATCH_p); 
06943     { 
06944       unsigned d32 = 
06945         ((MATCH_w_16_0 & 0xffff) /* d16 at 0 */ << 16) + 
06946         (MATCH_w_16_16 & 0xffff) /* d16 at 16 */;
06947       
06948 
06949        ret = pAbsL(d32, size);
06950 
06951       
06952       
06953       
06954     }
06955     
06956   }goto MATCH_finished_f; 
06957   
06958   MATCH_finished_f: (void)0; /*placeholder for label*/
06959   
06960 }
06961 
06962 
06963       break;
06964     }
06965     default : pIllegalMode(pc); break;
06966   } 
06967   return ret;
06968 }
06969 
06970 
06971 SemStr* NJMCDecoder::rmEAX(ADDRESS eax, ADDRESS x, DecodeResult& result,
06972     ADDRESS pc, int size)
06973 {
06974   SemStr* ret;
06975   int reg2, mode;
06976 
06977 
06978 
06979 
06980 { 
06981   dword MATCH_p = 
06982     
06983 
06984     eax
06985     ;
06986   unsigned /* [0..65535] */ MATCH_w_16_0;
06987   { 
06988     MATCH_w_16_0 = getWord(MATCH_p); 
06989     
06990       switch((MATCH_w_16_0 >> 3 & 0x7) /* adrm at 0 */) {
06991         case 0: case 1: case 2: case 3: case 4: 
06992           goto MATCH_label_e0; break;
06993         case 5: 
06994           { 
06995             unsigned r2 = (MATCH_w_16_0 & 0x7) /* reg2 at 0 */;
06996             
06997 
06998              { mode = 0; reg2 = r2; result.numBytes += 2;}
06999 
07000             
07001             
07002             
07003           }
07004           
07005           break;
07006         case 6: 
07007           { 
07008             unsigned r2 = (MATCH_w_16_0 & 0x7) /* reg2 at 0 */;
07009             
07010 
07011              { mode = 1; reg2 = r2; result.numBytes += 2;}
07012 
07013             
07014             
07015             
07016           }
07017           
07018           break;
07019         case 7: 
07020           
07021             switch((MATCH_w_16_0 & 0x7) /* reg2 at 0 */) {
07022               case 0: 
07023                 
07024 
07025                  { mode = 4; result.numBytes += 2;}
07026 
07027                 
07028                 
07029                 
07030                 break;
07031               case 1: 
07032                 
07033 
07034                  { mode = 5; result.numBytes += 4;}
07035 
07036                 
07037                 
07038                 
07039                 break;
07040               case 2: case 3: case 4: case 5: case 6: case 7: 
07041                 goto MATCH_label_e0; break;
07042               default: assert(0);
07043             } /* (MATCH_w_16_0 & 0x7) -- reg2 at 0 --*/ 
07044           break;
07045         default: assert(0);
07046       } /* (MATCH_w_16_0 >> 3 & 0x7) -- adrm at 0 --*/ 
07047     
07048   }goto MATCH_finished_e; 
07049   
07050   MATCH_label_e0: (void)0; /*placeholder for label*/ 
07051     
07052 
07053     pIllegalMode(pc);
07054 
07055     
07056      
07057     goto MATCH_finished_e; 
07058     
07059   MATCH_finished_e: (void)0; /*placeholder for label*/
07060   
07061 }
07062 
07063 
07064 
07065   switch (mode) {
07066     case 0 : {
07067 
07068 
07069 
07070 { 
07071   dword MATCH_p = 
07072     
07073 
07074     x
07075     ;
07076   unsigned /* [0..65535] */ MATCH_w_16_0;
07077   { 
07078     MATCH_w_16_0 = getWord(MATCH_p); 
07079     { 
07080       int /* [~32768..32767] */ d16 = 
07081         sign_extend((MATCH_w_16_0 & 0xffff) /* d16 at 0 */, 16);
07082       
07083 
07084        ret = pADisp(d16, reg2, size);
07085 
07086       
07087       
07088       
07089     }
07090     
07091   }goto MATCH_finished_d; 
07092   
07093   MATCH_finished_d: (void)0; /*placeholder for label*/
07094   
07095 }
07096 
07097 
07098       break;
07099     }
07100     case 1 : {
07101 
07102 
07103 
07104 { 
07105   dword MATCH_p = 
07106     
07107 
07108     x
07109     ;
07110   unsigned /* [0..65535] */ MATCH_w_16_0;
07111   { 
07112     MATCH_w_16_0 = getWord(MATCH_p); 
07113     { 
07114       int /* [~128..127] */ d8 = 
07115         sign_extend((MATCH_w_16_0 & 0xff) /* disp8 at 0 */, 8);
07116       unsigned iR = (MATCH_w_16_0 >> 12 & 0x7) /* iReg at 0 */;
07117       unsigned iS = (MATCH_w_16_0 >> 11 & 0x1) /* iSize at 0 */;
07118       unsigned iT = (MATCH_w_16_0 >> 15 & 0x1) /* iType at 0 */;
07119       
07120 
07121        ret = pAIndex(d8, reg2, iT, iR, iS, size);
07122 
07123       
07124       
07125       
07126     }
07127     
07128   }goto MATCH_finished_c; 
07129   
07130   MATCH_finished_c: (void)0; /*placeholder for label*/
07131   
07132 }
07133 
07134 
07135       break;
07136     }
07137     case 4 : {
07138 
07139 
07140 
07141 { 
07142   dword MATCH_p = 
07143     
07144 
07145     x
07146     ;
07147   unsigned /* [0..65535] */ MATCH_w_16_0;
07148   { 
07149     MATCH_w_16_0 = getWord(MATCH_p); 
07150     { 
07151       int /* [~32768..32767] */ d16 = 
07152         sign_extend((MATCH_w_16_0 & 0xffff) /* d16 at 0 */, 16);
07153       
07154 
07155        ret = pAbsW(d16, size);
07156 
07157       
07158       
07159       
07160     }
07161     
07162   }goto MATCH_finished_b; 
07163   
07164   MATCH_finished_b: (void)0; /*placeholder for label*/
07165   
07166 }
07167 
07168 
07169       break;
07170     }
07171     case 5 : {
07172 
07173 
07174 
07175 { 
07176   dword MATCH_p = 
07177     
07178 
07179     x
07180     ;
07181   unsigned /* [0..65535] */ MATCH_w_16_0;
07182   unsigned /* [0..65535] */ MATCH_w_16_16;
07183   { 
07184     MATCH_w_16_0 = getWord(MATCH_p); 
07185     MATCH_w_16_16 = getWord(2 + MATCH_p); 
07186     { 
07187       unsigned d32 = 
07188         ((MATCH_w_16_0 & 0xffff) /* d16 at 0 */ << 16) + 
07189         (MATCH_w_16_16 & 0xffff) /* d16 at 16 */;
07190       
07191 
07192        ret = pAbsL(d32, size);
07193 
07194       
07195       
07196       
07197     }
07198     
07199   }goto MATCH_finished_a; 
07200   
07201   MATCH_finished_a: (void)0; /*placeholder for label*/
07202   
07203 }
07204 
07205 
07206       break;
07207     }
07208     default : pIllegalMode(pc); break;
07209   } 
07210   return ret;
07211 }
07212 
07213 /*==============================================================================
07214  * FUNCTION:      isFuncPrologue()
07215  * OVERVIEW:      Check to see if the instructions at the given offset match
07216  *                  any callee prologue, i.e. does it look like this offset
07217  *                  is a pointer to a function?
07218  * PARAMETERS:    hostPC - pointer to the code in question (native address)
07219  * RETURNS:       True if a match found
07220  *============================================================================*/
07221 bool isFuncPrologue(ADDRESS hostPC)
07222 {
07223     int locals, reg, d16;
07224 
07225     if ((InstructionPatterns::link_save(prog.csrSrc, hostPC, locals, d16))
07226         != NULL)
07227             return true;
07228     if ((InstructionPatterns::link_save1(prog.csrSrc, hostPC, locals, reg))
07229         != NULL)
07230             return true;
07231     if ((InstructionPatterns::push_lea(prog.csrSrc, hostPC, locals, reg))
07232         != NULL)
07233             return true;
07234     if ((InstructionPatterns::std_link(prog.csrSrc, hostPC, locals)) != NULL)
07235         return true;
07236 
07237     return false;
07238 }
07239 
07240 
07241 

Generated on Tue Sep 19 21:18:16 2006 for Boomerang by  doxygen 1.4.6