00001 
00002 
00003 
00004 
00005 
00006 
00007 
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 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 
00028 
00029 
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 
00043    
00044 
00045 
00046 
00047 
00048 
00049 
00050 
00051 
00052 
00053 
00054 
00055 
00056 
00057 
00058 
00059 
00060 
00061 
00062 
00063 
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     
00072     result.reset();
00073 
00074     
00075     list<RT*>* RTs = NULL;
00076 
00077     
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 
00084 
00085         HLCall* newCall = new HLCall(pc, 0, RTs);
00086         result.rtl = newCall;
00087         result.numBytes = hostPC - saveHostPC;
00088 
00089         
00090         newCall->setDest(addr - delta);
00091         newCall->setPrologue(logue);
00092 
00093         
00094         
00095         SHOW_ASM("std_call "<<addr)
00096     }
00097 
00098     else if ((logue = InstructionPatterns::near_call(csr, hostPC, addr))
00099         != NULL) {
00100         
00101 
00102 
00103         HLCall* newCall = new HLCall(pc, 0, RTs);
00104         result.rtl = newCall;
00105         result.numBytes = hostPC - saveHostPC;
00106 
00107         
00108         newCall->setDest(addr - delta);
00109         newCall->setPrologue(logue);
00110 
00111         
00112         
00113         SHOW_ASM("near_call " << addr)
00114     }
00115 
00116     else if ((logue = InstructionPatterns::pea_pea_add_rts(csr, hostPC, d32))
00117         != NULL) {
00118         
00119 
00120 
00121 
00122         HLCall* newCall = new HLCall(pc, 0, RTs);
00123         result.rtl = newCall;
00124         result.numBytes = hostPC - saveHostPC;
00125 
00126         
00127         
00128         newCall->setDest(pc + 10 + d32);
00129         newCall->setPrologue(logue);
00130 
00131         
00132         
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 
00140 
00141 
00142         HLCall* newCall = new HLCall(pc, 0, RTs);
00143         result.rtl = newCall;
00144         result.numBytes = hostPC - saveHostPC;
00145 
00146         
00147         
00148         newCall->setDest(pc + 6 + d32);
00149         newCall->setPrologue(logue);
00150 
00151         
00152         newCall->setReturnAfterCall(true);
00153 
00154         
00155         
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 
00163 
00164 
00165         HLCall* newCall = new HLCall(pc, 0, RTs);
00166         result.rtl = newCall;
00167         result.numBytes = hostPC - saveHostPC;
00168 
00169         
00170         newCall->setDest(0xAAAAA000 + d16);
00171         newCall->setPrologue(logue);
00172 
00173         SHOW_ASM("trap/syscall " << hex << 0xA000 + d16)
00174     }
00175 
00176 
00177 
00178 
00179     else if ((logue = InstructionPatterns::link_save(csr, hostPC,
00180         locals, d16)) != NULL)
00181     {
00182         
00183 
00184 
00185         if (proc != NULL) {
00186 
00187             
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 
00201 
00202         if (proc != NULL) {
00203 
00204             
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 
00218 
00219 
00220         
00221         if (proc != NULL) {
00222 
00223             
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 
00237 
00238         if (proc != NULL) {
00239 
00240             
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 
00254 
00255         if (proc != NULL) {
00256 
00257             
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 
00270 
00271         if (proc!= NULL) {
00272 
00273             
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 
00287 
00288         if (proc!= NULL) {
00289 
00290             
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 
00304 
00305         if (proc!= NULL) {
00306 
00307             
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 
00321 
00322         if (proc!= NULL) {
00323 
00324             
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 
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  MATCH_w_16_0;
00367   { 
00368     MATCH_w_16_0 = getWord(MATCH_p); 
00369     
00370       switch((MATCH_w_16_0 >> 12 & 0xf) ) {
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)  == 2) 
00376             if ((MATCH_w_16_0 >> 9 & 0x7)  == 7) 
00377               if ((MATCH_w_16_0 >> 8 & 0x1)  == 1) 
00378                 goto MATCH_label_de0;  
00379               else 
00380                 
00381                   switch((MATCH_w_16_0 >> 6 & 0x3) ) {
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 
00395 
00396 
00397 
00398                                     
00399 
00400                                     HLCall* newCall = new HLCall(pc, 0, RTs);
00401 
00402                                     
00403 
00404                                     newCall->setIsComputed();
00405 
00406                                     
00407 
00408                                     newCall->setDest(cEA(ea, pc, 32));
00409 
00410                                     result.rtl = newCall;
00411 
00412                                     
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 
00435 
00436 
00437 
00438                                     HLNwayJump* newJump = new HLNwayJump(pc, RTs);
00439 
00440                                     
00441 
00442                                     newJump->setIsComputed();
00443 
00444                                     
00445 
00446                                     newJump->setDest(cEA(ea, pc, 32));
00447 
00448                                     result.rtl = newJump;
00449 
00450                                     
00451 
00452                                     result.numBytes = nextPC - hostPC;
00453 
00454                                 
00455 
00456                                 
00457 
00458 
00459 
00460 
00461 
00462                         
00463                         
00464                         
00465                       }
00466                       
00467                       break;
00468                     default: assert(0);
00469                   }    
00470             else 
00471               goto MATCH_label_de0;   
00472           else 
00473             goto MATCH_label_de0;  
00474           break;
00475         case 5: 
00476           
00477             switch((MATCH_w_16_0 >> 8 & 0xf) ) {
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)  == 0 || 
00482                   2 <= (MATCH_w_16_0 >> 3 & 0x7)  && 
00483                   (MATCH_w_16_0 >> 3 & 0x7)  < 5) && 
00484                   (MATCH_w_16_0 >> 6 & 0x3)  == 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                 } 
00506                 else 
00507                   goto MATCH_label_de0;  
00508                 
00509                 break;
00510               case 3: 
00511                 if (((MATCH_w_16_0 >> 3 & 0x7)  == 0 || 
00512                   2 <= (MATCH_w_16_0 >> 3 & 0x7)  && 
00513                   (MATCH_w_16_0 >> 3 & 0x7)  < 5) && 
00514                   (MATCH_w_16_0 >> 6 & 0x3)  == 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                 } 
00536                 else 
00537                   goto MATCH_label_de0;  
00538                 
00539                 break;
00540               case 4: 
00541                 if (((MATCH_w_16_0 >> 3 & 0x7)  == 0 || 
00542                   2 <= (MATCH_w_16_0 >> 3 & 0x7)  && 
00543                   (MATCH_w_16_0 >> 3 & 0x7)  < 5) && 
00544                   (MATCH_w_16_0 >> 6 & 0x3)  == 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                 } 
00566                 else 
00567                   goto MATCH_label_de0;  
00568                 
00569                 break;
00570               case 5: 
00571                 if (((MATCH_w_16_0 >> 3 & 0x7)  == 0 || 
00572                   2 <= (MATCH_w_16_0 >> 3 & 0x7)  && 
00573                   (MATCH_w_16_0 >> 3 & 0x7)  < 5) && 
00574                   (MATCH_w_16_0 >> 6 & 0x3)  == 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                 } 
00596                 else 
00597                   goto MATCH_label_de0;  
00598                 
00599                 break;
00600               case 6: 
00601                 if (((MATCH_w_16_0 >> 3 & 0x7)  == 0 || 
00602                   2 <= (MATCH_w_16_0 >> 3 & 0x7)  && 
00603                   (MATCH_w_16_0 >> 3 & 0x7)  < 5) && 
00604                   (MATCH_w_16_0 >> 6 & 0x3)  == 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                 } 
00626                 else 
00627                   goto MATCH_label_de0;  
00628                 
00629                 break;
00630               case 7: 
00631                 if (((MATCH_w_16_0 >> 3 & 0x7)  == 0 || 
00632                   2 <= (MATCH_w_16_0 >> 3 & 0x7)  && 
00633                   (MATCH_w_16_0 >> 3 & 0x7)  < 5) && 
00634                   (MATCH_w_16_0 >> 6 & 0x3)  == 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                             
00651 
00652                             
00653 
00654                             
00655 
00656                             
00657 
00658                             
00659 
00660                             
00661 
00662                             
00663 
00664                             
00665 
00666                     
00667                     
00668                     
00669                   }
00670                   
00671                 } 
00672                 else 
00673                   goto MATCH_label_de0;  
00674                 
00675                 break;
00676               case 10: 
00677                 if (((MATCH_w_16_0 >> 3 & 0x7)  == 0 || 
00678                   2 <= (MATCH_w_16_0 >> 3 & 0x7)  && 
00679                   (MATCH_w_16_0 >> 3 & 0x7)  < 5) && 
00680                   (MATCH_w_16_0 >> 6 & 0x3)  == 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                 } 
00702                 else 
00703                   goto MATCH_label_de0;  
00704                 
00705                 break;
00706               case 11: 
00707                 if (((MATCH_w_16_0 >> 3 & 0x7)  == 0 || 
00708                   2 <= (MATCH_w_16_0 >> 3 & 0x7)  && 
00709                   (MATCH_w_16_0 >> 3 & 0x7)  < 5) && 
00710                   (MATCH_w_16_0 >> 6 & 0x3)  == 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                 } 
00732                 else 
00733                   goto MATCH_label_de0;  
00734                 
00735                 break;
00736               case 12: 
00737                 if (((MATCH_w_16_0 >> 3 & 0x7)  == 0 || 
00738                   2 <= (MATCH_w_16_0 >> 3 & 0x7)  && 
00739                   (MATCH_w_16_0 >> 3 & 0x7)  < 5) && 
00740                   (MATCH_w_16_0 >> 6 & 0x3)  == 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                 } 
00762                 else 
00763                   goto MATCH_label_de0;  
00764                 
00765                 break;
00766               case 13: 
00767                 if (((MATCH_w_16_0 >> 3 & 0x7)  == 0 || 
00768                   2 <= (MATCH_w_16_0 >> 3 & 0x7)  && 
00769                   (MATCH_w_16_0 >> 3 & 0x7)  < 5) && 
00770                   (MATCH_w_16_0 >> 6 & 0x3)  == 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                 } 
00792                 else 
00793                   goto MATCH_label_de0;  
00794                 
00795                 break;
00796               case 14: 
00797                 if (((MATCH_w_16_0 >> 3 & 0x7)  == 0 || 
00798                   2 <= (MATCH_w_16_0 >> 3 & 0x7)  && 
00799                   (MATCH_w_16_0 >> 3 & 0x7)  < 5) && 
00800                   (MATCH_w_16_0 >> 6 & 0x3)  == 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                 } 
00822                 else 
00823                   goto MATCH_label_de0;  
00824                 
00825                 break;
00826               case 15: 
00827                 if (((MATCH_w_16_0 >> 3 & 0x7)  == 0 || 
00828                   2 <= (MATCH_w_16_0 >> 3 & 0x7)  && 
00829                   (MATCH_w_16_0 >> 3 & 0x7)  < 5) && 
00830                   (MATCH_w_16_0 >> 6 & 0x3)  == 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                     
00847 
00848                         
00849 
00850                     
00851                     
00852                     
00853                   }
00854                   
00855                 } 
00856                 else 
00857                   goto MATCH_label_de0;  
00858                 
00859                 break;
00860               default: assert(0);
00861             }  
00862           break;
00863         case 6: 
00864           
00865             switch((MATCH_w_16_0 >> 8 & 0xf) ) {
00866               case 0: 
00867                 MATCH_name = MATCH_name_cond_12[(MATCH_w_16_0 >> 8 & 0xf) 
00868                       ]; 
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 
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                       ]; 
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                       ]; 
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                       ]; 
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                       ]; 
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                       ]; 
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                       ]; 
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                       ]; 
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                       ]; 
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                           
01064 
01065                           
01066 
01067                           
01068 
01069                           
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                       ]; 
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                       ]; 
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                       ]; 
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                       ]; 
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                       ]; 
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                       ]; 
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             }  
01205           break;
01206         default: assert(0);
01207       }  
01208     
01209   }goto MATCH_finished_de; 
01210   
01211   MATCH_label_de0: (void)0;  
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; 
01228   
01229 }
01230 
01231 
01232     }
01233     return result;
01234 }
01235 
01236 
01237 
01238 
01239 
01240 
01241 
01242 
01243 
01244 
01245 
01246 
01247 
01248 
01249 
01250 
01251 
01252 
01253 
01254 
01255 
01256 
01257 
01258 
01259 
01260 
01261 
01262 
01263 
01264 
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  MATCH_w_16_0;
01281   unsigned  MATCH_w_16_16;
01282   { 
01283     MATCH_w_16_0 = getWord(MATCH_p); 
01284     if ((MATCH_w_16_0 & 0xff)  == 0) { 
01285       MATCH_w_16_16 = getWord(2 + MATCH_p); 
01286       { 
01287         int  dsp16 = 
01288           sign_extend((MATCH_w_16_16 & 0xffff) , 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     } 
01307     else { 
01308       unsigned dsp8 = (MATCH_w_16_0 & 0xff) ;
01309       
01310 
01311         {
01312 
01313                       
01314 
01315                       ret->push(pc+2 + (int)(char)dsp8);
01316 
01317                   }
01318 
01319       
01320       
01321       
01322     } 
01323     
01324   }goto MATCH_finished_ce; 
01325   
01326   MATCH_finished_ce: (void)0; 
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);          
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);          
01368     return ret;
01369 }
01370 
01371 SemStr* NJMCDecoder::pPostInc(int r2, int& bump, int& bumpr, int size)
01372 {
01373     
01374     
01375     
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);          
01382     bump = size/8;              
01383     bumpr = r2 + 8;             
01384     return ret;
01385 }
01386 
01387 SemStr* NJMCDecoder::pPreDec(int r2, int& bump, int& bumpr, int size)
01388 {
01389     
01390     
01391     
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);          
01398     ret->push(idIntConst); ret->push(-size/8);
01399     bump = -size/8;             
01400     bumpr = r2 + 8;             
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  MATCH_w_16_0;
01418   { 
01419     MATCH_w_16_0 = getWord(MATCH_p); 
01420     
01421       switch((MATCH_w_16_0 >> 3 & 0x7) ) {
01422         case 0: 
01423           { 
01424             unsigned reg2 = (MATCH_w_16_0 & 0x7) ;
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) ;
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) ;
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) ;
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) ;
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       }  
01498     
01499   }goto MATCH_finished_be; 
01500   
01501   MATCH_finished_be: (void)0; 
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  MATCH_w_16_0;
01523   { 
01524     MATCH_w_16_0 = getWord(MATCH_p); 
01525     
01526       switch((MATCH_w_16_0 >> 3 & 0x7) ) {
01527         case 0: 
01528           { 
01529             unsigned reg2 = (MATCH_w_16_0 & 0x7) ;
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) ;
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) ;
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) ;
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) ;
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       }  
01603     
01604   }goto MATCH_finished_ae; 
01605   
01606   MATCH_finished_ae: (void)0; 
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  MATCH_w_16_0;
01628   { 
01629     MATCH_w_16_0 = getWord(MATCH_p); 
01630     
01631       switch((MATCH_w_16_0 >> 3 & 0x7) ) {
01632         case 0: 
01633           { 
01634             unsigned reg2 = (MATCH_w_16_0 & 0x7) ;
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) ;
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) ;
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) ;
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) ;
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       }  
01708     
01709   }goto MATCH_finished_zd; 
01710   
01711   MATCH_finished_zd: (void)0; 
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  MATCH_w_16_0;
01732   { 
01733     MATCH_w_16_0 = getWord(MATCH_p); 
01734     if ((MATCH_w_16_0 >> 3 & 0x7)  == 2) { 
01735       unsigned reg2 = (MATCH_w_16_0 & 0x7) ;
01736       
01737 
01738        ret = pIndirect(reg2, size);
01739 
01740       
01741       
01742       
01743     } 
01744     else 
01745       
01746 
01747       pIllegalMode(pc);
01748 
01749       
01750        
01751     
01752   }goto MATCH_finished_yd; 
01753   
01754   MATCH_finished_yd: (void)0; 
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  MATCH_w_16_0;
01776   { 
01777     MATCH_w_16_0 = getWord(MATCH_p); 
01778     
01779       switch((MATCH_w_16_0 >> 3 & 0x7) ) {
01780         case 0: 
01781           { 
01782             unsigned reg2 = (MATCH_w_16_0 & 0x7) ;
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) ;
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) ;
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) ;
01831             
01832 
01833              ret = pPreDec(reg2, bump, bumpr, size);
01834 
01835             
01836             
01837             
01838           }
01839           
01840           break;
01841         default: assert(0);
01842       }  
01843     
01844   }goto MATCH_finished_xd; 
01845   
01846   MATCH_finished_xd: (void)0; 
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  MATCH_w_16_0;
01868   { 
01869     MATCH_w_16_0 = getWord(MATCH_p); 
01870     
01871       switch((MATCH_w_16_0 >> 3 & 0x7) ) {
01872         case 0: 
01873           { 
01874             unsigned reg2 = (MATCH_w_16_0 & 0x7) ;
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) ;
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) ;
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) ;
01923             
01924 
01925              ret = pPreDec(reg2, bump, bumpr, size);
01926 
01927             
01928             
01929             
01930           }
01931           
01932           break;
01933         default: assert(0);
01934       }  
01935     
01936   }goto MATCH_finished_wd; 
01937   
01938   MATCH_finished_wd: (void)0; 
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  MATCH_w_16_0;
01960   { 
01961     MATCH_w_16_0 = getWord(MATCH_p); 
01962     
01963       switch((MATCH_w_16_0 >> 3 & 0x7) ) {
01964         case 0: 
01965           { 
01966             unsigned reg2 = (MATCH_w_16_0 & 0x7) ;
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) ;
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) ;
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) ;
02015             
02016 
02017              ret = pPreDec(reg2, bump, bumpr, size);
02018 
02019             
02020             
02021             
02022           }
02023           
02024           break;
02025         default: assert(0);
02026       }  
02027     
02028   }goto MATCH_finished_vd; 
02029   
02030   MATCH_finished_vd: (void)0; 
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  MATCH_w_16_0;
02052   { 
02053     MATCH_w_16_0 = getWord(MATCH_p); 
02054     
02055       switch((MATCH_w_16_0 >> 3 & 0x7) ) {
02056         case 0: 
02057           { 
02058             unsigned reg2 = (MATCH_w_16_0 & 0x7) ;
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) ;
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) ;
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) ;
02107             
02108 
02109              ret = pPreDec(reg2, bump, bumpr, size);
02110 
02111             
02112             
02113             
02114           }
02115           
02116           break;
02117         default: assert(0);
02118       }  
02119     
02120   }goto MATCH_finished_ud; 
02121   
02122   MATCH_finished_ud: (void)0; 
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  MATCH_w_16_0;
02144   { 
02145     MATCH_w_16_0 = getWord(MATCH_p); 
02146     
02147       switch((MATCH_w_16_0 >> 3 & 0x7) ) {
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) ;
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) ;
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) ;
02186             
02187 
02188              ret = pPreDec(reg2, bump, bumpr, size);
02189 
02190             
02191             
02192             
02193           }
02194           
02195           break;
02196         default: assert(0);
02197       }  
02198     
02199   }goto MATCH_finished_td; 
02200   
02201   MATCH_finished_td: (void)0; 
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  MATCH_w_16_0;
02223   { 
02224     MATCH_w_16_0 = getWord(MATCH_p); 
02225     
02226       switch((MATCH_w_16_0 >> 3 & 0x7) ) {
02227         case 0: 
02228           { 
02229             unsigned reg2 = (MATCH_w_16_0 & 0x7) ;
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) ;
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) ;
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) ;
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) ;
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       }  
02303     
02304   }goto MATCH_finished_sd; 
02305   
02306   MATCH_finished_sd: (void)0; 
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  MATCH_w_16_0;
02328   { 
02329     MATCH_w_16_0 = getWord(MATCH_p); 
02330     
02331       switch((MATCH_w_16_0 >> 6 & 0x7) ) {
02332         case 0: 
02333           { 
02334             unsigned reg1 = (MATCH_w_16_0 >> 9 & 0x7) ;
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) ;
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) ;
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) ;
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) ;
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       }  
02408     
02409   }goto MATCH_finished_rd; 
02410   
02411   MATCH_finished_rd: (void)0; 
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  MATCH_w_16_0;
02433   { 
02434     MATCH_w_16_0 = getWord(MATCH_p); 
02435     
02436       switch((MATCH_w_16_0 >> 3 & 0x7) ) {
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) ;
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) ;
02462             
02463 
02464              ret = pPostInc(reg2, bump, bumpr, size);
02465 
02466             
02467             
02468             
02469           }
02470           
02471           break;
02472         default: assert(0);
02473       }  
02474     
02475   }goto MATCH_finished_qd; 
02476   
02477   MATCH_finished_qd: (void)0; 
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  MATCH_w_16_0;
02499   { 
02500     MATCH_w_16_0 = getWord(MATCH_p); 
02501     
02502       switch((MATCH_w_16_0 >> 3 & 0x7) ) {
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) ;
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) ;
02528             
02529 
02530              ret = pPreDec(reg2, bump, bumpr, size);
02531 
02532             
02533             
02534             
02535           }
02536           
02537           break;
02538         default: assert(0);
02539       }  
02540     
02541   }goto MATCH_finished_pd; 
02542   
02543   MATCH_finished_pd: (void)0; 
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   
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     
02566     
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     
02579     SemStr* ret = new SemStr(size);
02580     
02581     
02582     
02583     
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     
02592     SemStr* ret = new SemStr(size);
02593     
02594     
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   
02606   
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   
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   
02625   
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   
02634   
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  MATCH_w_16_0;
02671   { 
02672     MATCH_w_16_0 = getWord(MATCH_p); 
02673     
02674       switch((MATCH_w_16_0 >> 3 & 0x7) ) {
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) ;
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) ;
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) ) {
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             }  
02728           break;
02729         default: assert(0);
02730       }  
02731     
02732   }goto MATCH_finished_od; 
02733   
02734   MATCH_label_od0: (void)0;  
02735     
02736 
02737     pIllegalMode(pc);
02738 
02739     
02740      
02741     goto MATCH_finished_od; 
02742     
02743   MATCH_finished_od: (void)0; 
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  MATCH_w_16_0;
02761   { 
02762     MATCH_w_16_0 = getWord(MATCH_p); 
02763     { 
02764       int  d16 = 
02765         sign_extend((MATCH_w_16_0 & 0xffff) , 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; 
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  MATCH_w_16_0;
02795   { 
02796     MATCH_w_16_0 = getWord(MATCH_p); 
02797     { 
02798       int  d8 = 
02799         sign_extend((MATCH_w_16_0 & 0xff) , 8);
02800       unsigned iR = (MATCH_w_16_0 >> 12 & 0x7) ;
02801       unsigned iS = (MATCH_w_16_0 >> 11 & 0x1) ;
02802       unsigned iT = (MATCH_w_16_0 >> 15 & 0x1) ;
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; 
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  MATCH_w_16_0;
02832   { 
02833     MATCH_w_16_0 = getWord(MATCH_p); 
02834     { 
02835       int  d16 = 
02836         sign_extend((MATCH_w_16_0 & 0xffff) , 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; 
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  MATCH_w_16_0;
02866   unsigned  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)  << 16) + 
02873         (MATCH_w_16_16 & 0xffff) ;
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; 
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  MATCH_w_16_0;
02914   { 
02915     MATCH_w_16_0 = getWord(MATCH_p); 
02916     
02917       switch((MATCH_w_16_0 >> 3 & 0x7) ) {
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) ;
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) ;
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) ) {
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) ) {
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                   }  
03019                 break;
03020               case 5: case 6: case 7: 
03021                 goto MATCH_label_jd0; break;
03022               default: assert(0);
03023             }  
03024           break;
03025         default: assert(0);
03026       }  
03027     
03028   }goto MATCH_finished_jd; 
03029   
03030   MATCH_label_jd0: (void)0;  
03031     
03032 
03033     pIllegalMode(pc);
03034 
03035     
03036      
03037     goto MATCH_finished_jd; 
03038     
03039   MATCH_finished_jd: (void)0; 
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  MATCH_w_16_0;
03057   { 
03058     MATCH_w_16_0 = getWord(MATCH_p); 
03059     { 
03060       int  d16 = 
03061         sign_extend((MATCH_w_16_0 & 0xffff) , 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; 
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  MATCH_w_16_0;
03091   { 
03092     MATCH_w_16_0 = getWord(MATCH_p); 
03093     { 
03094       int  d8 = 
03095         sign_extend((MATCH_w_16_0 & 0xff) , 8);
03096       unsigned iR = (MATCH_w_16_0 >> 12 & 0x7) ;
03097       unsigned iS = (MATCH_w_16_0 >> 11 & 0x1) ;
03098       unsigned iT = (MATCH_w_16_0 >> 15 & 0x1) ;
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; 
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  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) , 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; 
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  MATCH_w_16_0;
03163   { 
03164     MATCH_w_16_0 = getWord(MATCH_p); 
03165     { 
03166       int  d8 = 
03167         sign_extend((MATCH_w_16_0 & 0xff) , 8);
03168       unsigned iR = (MATCH_w_16_0 >> 12 & 0x7) ;
03169       unsigned iS = (MATCH_w_16_0 >> 11 & 0x1) ;
03170       unsigned iT = (MATCH_w_16_0 >> 15 & 0x1) ;
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; 
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  MATCH_w_16_0;
03202   { 
03203     MATCH_w_16_0 = getWord(MATCH_p); 
03204     { 
03205       int  d16 = 
03206         sign_extend((MATCH_w_16_0 & 0xffff) , 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; 
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  MATCH_w_16_0;
03236   unsigned  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)  << 16) + 
03243         (MATCH_w_16_16 & 0xffff) ;
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; 
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  MATCH_w_16_0;
03273   { 
03274     MATCH_w_16_0 = getWord(MATCH_p); 
03275     if ((MATCH_w_16_0 >> 12 & 0x7)  == 0 && 
03276       (MATCH_w_16_0 >> 11 & 0x1)  == 0 && 
03277       (MATCH_w_16_0 >> 15 & 0x1)  == 0 && 
03278       (1 <= (MATCH_w_16_0 >> 8 & 0x7)  && 
03279       (MATCH_w_16_0 >> 8 & 0x7)  < 8) || 
03280       (MATCH_w_16_0 >> 12 & 0x7)  == 0 && 
03281       (MATCH_w_16_0 >> 11 & 0x1)  == 0 && 
03282       (MATCH_w_16_0 >> 15 & 0x1)  == 1 || 
03283       (MATCH_w_16_0 >> 12 & 0x7)  == 0 && 
03284       (MATCH_w_16_0 >> 11 & 0x1)  == 1 || 
03285       1 <= (MATCH_w_16_0 >> 12 & 0x7)  && 
03286       (MATCH_w_16_0 >> 12 & 0x7)  < 8) 
03287       goto MATCH_label_cd0;  
03288     else { 
03289       unsigned d8 = (MATCH_w_16_0 & 0xff) ;
03290       
03291 
03292        ret = pImmB(d8);
03293 
03294       
03295       
03296       
03297     } 
03298     
03299   }goto MATCH_finished_cd; 
03300   
03301   MATCH_label_cd0: (void)0;  
03302     
03303 
03304     pNonzeroByte(pc);
03305 
03306     
03307      
03308     goto MATCH_finished_cd; 
03309     
03310   MATCH_finished_cd: (void)0; 
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  MATCH_w_16_0;
03328   { 
03329     MATCH_w_16_0 = getWord(MATCH_p); 
03330     { 
03331       unsigned d16 = (MATCH_w_16_0 & 0xffff) ;
03332       
03333 
03334        ret = pImmW(d16);
03335 
03336       
03337       
03338       
03339     }
03340     
03341   }goto MATCH_finished_bd; 
03342   
03343   MATCH_finished_bd: (void)0; 
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  MATCH_w_16_0;
03361   unsigned  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)  << 16) + 
03368         (MATCH_w_16_16 & 0xffff) ;
03369       
03370 
03371        ret = pImmL(d32);
03372 
03373       
03374       
03375       
03376     }
03377     
03378   }goto MATCH_finished_ad; 
03379   
03380   MATCH_finished_ad: (void)0; 
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  MATCH_w_16_0;
03409   { 
03410     MATCH_w_16_0 = getWord(MATCH_p); 
03411     
03412       switch((MATCH_w_16_0 >> 3 & 0x7) ) {
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) ;
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) ;
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) ) {
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)  == 1) 
03482                   
03483 
03484                    { mode = 8; result.numBytes += 4;}
03485 
03486                   
03487                    
03488                 else 
03489                   
03490 
03491                    { mode = 7; result.numBytes += 2;}
03492 
03493                   
03494                    
03495                 
03496                 break;
03497               case 5: case 6: case 7: 
03498                 goto MATCH_label_zc0; break;
03499               default: assert(0);
03500             }  
03501           break;
03502         default: assert(0);
03503       }  
03504     
03505   }goto MATCH_finished_zc; 
03506   
03507   MATCH_label_zc0: (void)0;  
03508     
03509 
03510     pIllegalMode(pc);
03511 
03512     
03513      
03514     goto MATCH_finished_zc; 
03515     
03516   MATCH_finished_zc: (void)0; 
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  MATCH_w_16_0;
03534   { 
03535     MATCH_w_16_0 = getWord(MATCH_p); 
03536     { 
03537       int  d16 = 
03538         sign_extend((MATCH_w_16_0 & 0xffff) , 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; 
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  MATCH_w_16_0;
03568   { 
03569     MATCH_w_16_0 = getWord(MATCH_p); 
03570     { 
03571       int  d8 = 
03572         sign_extend((MATCH_w_16_0 & 0xff) , 8);
03573       unsigned iR = (MATCH_w_16_0 >> 12 & 0x7) ;
03574       unsigned iS = (MATCH_w_16_0 >> 11 & 0x1) ;
03575       unsigned iT = (MATCH_w_16_0 >> 15 & 0x1) ;
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; 
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  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) , 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; 
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  MATCH_w_16_0;
03640   { 
03641     MATCH_w_16_0 = getWord(MATCH_p); 
03642     { 
03643       int  d8 = 
03644         sign_extend((MATCH_w_16_0 & 0xff) , 8);
03645       unsigned iR = (MATCH_w_16_0 >> 12 & 0x7) ;
03646       unsigned iS = (MATCH_w_16_0 >> 11 & 0x1) ;
03647       unsigned iT = (MATCH_w_16_0 >> 15 & 0x1) ;
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; 
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  MATCH_w_16_0;
03679   { 
03680     MATCH_w_16_0 = getWord(MATCH_p); 
03681     { 
03682       int  d16 = 
03683         sign_extend((MATCH_w_16_0 & 0xffff) , 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; 
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  MATCH_w_16_0;
03713   unsigned  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)  << 16) + 
03720         (MATCH_w_16_16 & 0xffff) ;
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; 
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  MATCH_w_16_0;
03750   { 
03751     MATCH_w_16_0 = getWord(MATCH_p); 
03752     { 
03753       unsigned d16 = (MATCH_w_16_0 & 0xffff) ;
03754       
03755 
03756        ret = pImmW(d16);
03757 
03758       
03759       
03760       
03761     }
03762     
03763   }goto MATCH_finished_sc; 
03764   
03765   MATCH_finished_sc: (void)0; 
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  MATCH_w_16_0;
03783   unsigned  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)  << 16) + 
03790         (MATCH_w_16_16 & 0xffff) ;
03791       
03792 
03793        ret = pImmL(d32);
03794 
03795       
03796       
03797       
03798     }
03799     
03800   }goto MATCH_finished_rc; 
03801   
03802   MATCH_finished_rc: (void)0; 
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  MATCH_w_16_0;
03831   { 
03832     MATCH_w_16_0 = getWord(MATCH_p); 
03833     
03834       switch((MATCH_w_16_0 >> 3 & 0x7) ) {
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) ;
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) ;
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) ) {
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             }  
03906           break;
03907         default: assert(0);
03908       }  
03909     
03910   }goto MATCH_finished_qc; 
03911   
03912   MATCH_label_qc0: (void)0;  
03913     
03914 
03915     pIllegalMode(pc);
03916 
03917     
03918      
03919     goto MATCH_finished_qc; 
03920     
03921   MATCH_finished_qc: (void)0; 
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  MATCH_w_16_0;
03939   { 
03940     MATCH_w_16_0 = getWord(MATCH_p); 
03941     { 
03942       int  d16 = 
03943         sign_extend((MATCH_w_16_0 & 0xffff) , 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; 
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  MATCH_w_16_0;
03973   { 
03974     MATCH_w_16_0 = getWord(MATCH_p); 
03975     { 
03976       int  d8 = 
03977         sign_extend((MATCH_w_16_0 & 0xff) , 8);
03978       unsigned iR = (MATCH_w_16_0 >> 12 & 0x7) ;
03979       unsigned iS = (MATCH_w_16_0 >> 11 & 0x1) ;
03980       unsigned iT = (MATCH_w_16_0 >> 15 & 0x1) ;
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; 
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  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) , 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; 
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  MATCH_w_16_0;
04045   { 
04046     MATCH_w_16_0 = getWord(MATCH_p); 
04047     { 
04048       int  d8 = 
04049         sign_extend((MATCH_w_16_0 & 0xff) , 8);
04050       unsigned iR = (MATCH_w_16_0 >> 12 & 0x7) ;
04051       unsigned iS = (MATCH_w_16_0 >> 11 & 0x1) ;
04052       unsigned iT = (MATCH_w_16_0 >> 15 & 0x1) ;
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; 
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  MATCH_w_16_0;
04082   { 
04083     MATCH_w_16_0 = getWord(MATCH_p); 
04084     { 
04085       int  d16 = 
04086         sign_extend((MATCH_w_16_0 & 0xffff) , 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; 
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  MATCH_w_16_0;
04116   unsigned  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)  << 16) + 
04123         (MATCH_w_16_16 & 0xffff) ;
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; 
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  MATCH_w_16_0;
04164   { 
04165     MATCH_w_16_0 = getWord(MATCH_p); 
04166     
04167       switch((MATCH_w_16_0 >> 3 & 0x7) ) {
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) ;
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) ;
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) ) {
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) ) {
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                   }  
04269                 break;
04270               case 5: case 6: case 7: 
04271                 goto MATCH_label_jc0; break;
04272               default: assert(0);
04273             }  
04274           break;
04275         default: assert(0);
04276       }  
04277     
04278   }goto MATCH_finished_jc; 
04279   
04280   MATCH_label_jc0: (void)0;  
04281     
04282 
04283     pIllegalMode(pc);
04284 
04285     
04286      
04287     goto MATCH_finished_jc; 
04288     
04289   MATCH_finished_jc: (void)0; 
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  MATCH_w_16_0;
04307   { 
04308     MATCH_w_16_0 = getWord(MATCH_p); 
04309     { 
04310       int  d16 = 
04311         sign_extend((MATCH_w_16_0 & 0xffff) , 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; 
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  MATCH_w_16_0;
04341   { 
04342     MATCH_w_16_0 = getWord(MATCH_p); 
04343     { 
04344       int  d8 = 
04345         sign_extend((MATCH_w_16_0 & 0xff) , 8);
04346       unsigned iR = (MATCH_w_16_0 >> 12 & 0x7) ;
04347       unsigned iS = (MATCH_w_16_0 >> 11 & 0x1) ;
04348       unsigned iT = (MATCH_w_16_0 >> 15 & 0x1) ;
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; 
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  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) , 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; 
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  MATCH_w_16_0;
04413   { 
04414     MATCH_w_16_0 = getWord(MATCH_p); 
04415     { 
04416       int  d8 = 
04417         sign_extend((MATCH_w_16_0 & 0xff) , 8);
04418       unsigned iR = (MATCH_w_16_0 >> 12 & 0x7) ;
04419       unsigned iS = (MATCH_w_16_0 >> 11 & 0x1) ;
04420       unsigned iT = (MATCH_w_16_0 >> 15 & 0x1) ;
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; 
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  MATCH_w_16_0;
04450   { 
04451     MATCH_w_16_0 = getWord(MATCH_p); 
04452     { 
04453       int  d16 = 
04454         sign_extend((MATCH_w_16_0 & 0xffff) , 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; 
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  MATCH_w_16_0;
04484   unsigned  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)  << 16) + 
04491         (MATCH_w_16_16 & 0xffff) ;
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; 
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  MATCH_w_16_0;
04521   { 
04522     MATCH_w_16_0 = getWord(MATCH_p); 
04523     if ((MATCH_w_16_0 >> 12 & 0x7)  == 0 && 
04524       (MATCH_w_16_0 >> 11 & 0x1)  == 0 && 
04525       (MATCH_w_16_0 >> 15 & 0x1)  == 0 && 
04526       (1 <= (MATCH_w_16_0 >> 8 & 0x7)  && 
04527       (MATCH_w_16_0 >> 8 & 0x7)  < 8) || 
04528       (MATCH_w_16_0 >> 12 & 0x7)  == 0 && 
04529       (MATCH_w_16_0 >> 11 & 0x1)  == 0 && 
04530       (MATCH_w_16_0 >> 15 & 0x1)  == 1 || 
04531       (MATCH_w_16_0 >> 12 & 0x7)  == 0 && 
04532       (MATCH_w_16_0 >> 11 & 0x1)  == 1 || 
04533       1 <= (MATCH_w_16_0 >> 12 & 0x7)  && 
04534       (MATCH_w_16_0 >> 12 & 0x7)  < 8) 
04535       goto MATCH_label_cc0;  
04536     else { 
04537       unsigned d8 = (MATCH_w_16_0 & 0xff) ;
04538       
04539 
04540        ret = pImmB(d8);
04541 
04542       
04543       
04544       
04545     } 
04546     
04547   }goto MATCH_finished_cc; 
04548   
04549   MATCH_label_cc0: (void)0;  
04550     
04551 
04552     pNonzeroByte(pc);
04553 
04554     
04555      
04556     goto MATCH_finished_cc; 
04557     
04558   MATCH_finished_cc: (void)0; 
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  MATCH_w_16_0;
04576   { 
04577     MATCH_w_16_0 = getWord(MATCH_p); 
04578     { 
04579       unsigned d16 = (MATCH_w_16_0 & 0xffff) ;
04580       
04581 
04582        ret = pImmW(d16);
04583 
04584       
04585       
04586       
04587     }
04588     
04589   }goto MATCH_finished_bc; 
04590   
04591   MATCH_finished_bc: (void)0; 
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  MATCH_w_16_0;
04609   unsigned  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)  << 16) + 
04616         (MATCH_w_16_16 & 0xffff) ;
04617       
04618 
04619        ret = pImmL(d32);
04620 
04621       
04622       
04623       
04624     }
04625     
04626   }goto MATCH_finished_ac; 
04627   
04628   MATCH_finished_ac: (void)0; 
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  MATCH_w_16_0;
04657   { 
04658     MATCH_w_16_0 = getWord(MATCH_p); 
04659     
04660       switch((MATCH_w_16_0 >> 3 & 0x7) ) {
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) ;
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) ;
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) ) {
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             }  
04714           break;
04715         default: assert(0);
04716       }  
04717     
04718   }goto MATCH_finished_zb; 
04719   
04720   MATCH_label_zb0: (void)0;  
04721     
04722 
04723     pIllegalMode(pc);
04724 
04725     
04726      
04727     goto MATCH_finished_zb; 
04728     
04729   MATCH_finished_zb: (void)0; 
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  MATCH_w_16_0;
04747   { 
04748     MATCH_w_16_0 = getWord(MATCH_p); 
04749     { 
04750       int  d16 = 
04751         sign_extend((MATCH_w_16_0 & 0xffff) , 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; 
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  MATCH_w_16_0;
04781   { 
04782     MATCH_w_16_0 = getWord(MATCH_p); 
04783     { 
04784       int  d8 = 
04785         sign_extend((MATCH_w_16_0 & 0xff) , 8);
04786       unsigned iR = (MATCH_w_16_0 >> 12 & 0x7) ;
04787       unsigned iS = (MATCH_w_16_0 >> 11 & 0x1) ;
04788       unsigned iT = (MATCH_w_16_0 >> 15 & 0x1) ;
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; 
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  MATCH_w_16_0;
04818   { 
04819     MATCH_w_16_0 = getWord(MATCH_p); 
04820     { 
04821       int  d16 = 
04822         sign_extend((MATCH_w_16_0 & 0xffff) , 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; 
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  MATCH_w_16_0;
04852   unsigned  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)  << 16) + 
04859         (MATCH_w_16_16 & 0xffff) ;
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; 
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  MATCH_w_16_0;
04900   { 
04901     MATCH_w_16_0 = getWord(MATCH_p); 
04902     
04903       switch((MATCH_w_16_0 >> 3 & 0x7) ) {
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) ;
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) ;
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) ) {
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             }  
04984           break;
04985         default: assert(0);
04986       }  
04987     
04988   }goto MATCH_finished_ub; 
04989   
04990   MATCH_label_ub0: (void)0;  
04991     
04992 
04993     pIllegalMode(pc);
04994 
04995     
04996      
04997     goto MATCH_finished_ub; 
04998     
04999   MATCH_finished_ub: (void)0; 
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  MATCH_w_16_0;
05017   { 
05018     MATCH_w_16_0 = getWord(MATCH_p); 
05019     { 
05020       int  d16 = 
05021         sign_extend((MATCH_w_16_0 & 0xffff) , 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; 
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  MATCH_w_16_0;
05051   { 
05052     MATCH_w_16_0 = getWord(MATCH_p); 
05053     { 
05054       int  d8 = 
05055         sign_extend((MATCH_w_16_0 & 0xff) , 8);
05056       unsigned iR = (MATCH_w_16_0 >> 12 & 0x7) ;
05057       unsigned iS = (MATCH_w_16_0 >> 11 & 0x1) ;
05058       unsigned iT = (MATCH_w_16_0 >> 15 & 0x1) ;
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; 
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  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) , 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; 
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  MATCH_w_16_0;
05123   { 
05124     MATCH_w_16_0 = getWord(MATCH_p); 
05125     { 
05126       int  d8 = 
05127         sign_extend((MATCH_w_16_0 & 0xff) , 8);
05128       unsigned iR = (MATCH_w_16_0 >> 12 & 0x7) ;
05129       unsigned iS = (MATCH_w_16_0 >> 11 & 0x1) ;
05130       unsigned iT = (MATCH_w_16_0 >> 15 & 0x1) ;
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; 
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  MATCH_w_16_0;
05162   { 
05163     MATCH_w_16_0 = getWord(MATCH_p); 
05164     { 
05165       int  d16 = 
05166         sign_extend((MATCH_w_16_0 & 0xffff) , 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; 
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  MATCH_w_16_0;
05196   unsigned  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)  << 16) + 
05203         (MATCH_w_16_16 & 0xffff) ;
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; 
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  MATCH_w_16_0;
05233   { 
05234     MATCH_w_16_0 = getWord(MATCH_p); 
05235     if ((MATCH_w_16_0 >> 12 & 0x7)  == 0 && 
05236       (MATCH_w_16_0 >> 11 & 0x1)  == 0 && 
05237       (MATCH_w_16_0 >> 15 & 0x1)  == 0 && 
05238       (1 <= (MATCH_w_16_0 >> 8 & 0x7)  && 
05239       (MATCH_w_16_0 >> 8 & 0x7)  < 8) || 
05240       (MATCH_w_16_0 >> 12 & 0x7)  == 0 && 
05241       (MATCH_w_16_0 >> 11 & 0x1)  == 0 && 
05242       (MATCH_w_16_0 >> 15 & 0x1)  == 1 || 
05243       (MATCH_w_16_0 >> 12 & 0x7)  == 0 && 
05244       (MATCH_w_16_0 >> 11 & 0x1)  == 1 || 
05245       1 <= (MATCH_w_16_0 >> 12 & 0x7)  && 
05246       (MATCH_w_16_0 >> 12 & 0x7)  < 8) 
05247       goto MATCH_label_nb0;  
05248     else { 
05249       unsigned d8 = (MATCH_w_16_0 & 0xff) ;
05250       
05251 
05252        ret = pImmB(d8);
05253 
05254       
05255       
05256       
05257     } 
05258     
05259   }goto MATCH_finished_nb; 
05260   
05261   MATCH_label_nb0: (void)0;  
05262     
05263 
05264     pNonzeroByte(pc);
05265 
05266     
05267      
05268     goto MATCH_finished_nb; 
05269     
05270   MATCH_finished_nb: (void)0; 
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  MATCH_w_16_0;
05299   { 
05300     MATCH_w_16_0 = getWord(MATCH_p); 
05301     
05302       switch((MATCH_w_16_0 >> 3 & 0x7) ) {
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) ;
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) ;
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) ) {
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             }  
05383           break;
05384         default: assert(0);
05385       }  
05386     
05387   }goto MATCH_finished_mb; 
05388   
05389   MATCH_label_mb0: (void)0;  
05390     
05391 
05392     pIllegalMode(pc);
05393 
05394     
05395      
05396     goto MATCH_finished_mb; 
05397     
05398   MATCH_finished_mb: (void)0; 
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  MATCH_w_16_0;
05416   { 
05417     MATCH_w_16_0 = getWord(MATCH_p); 
05418     { 
05419       int  d16 = 
05420         sign_extend((MATCH_w_16_0 & 0xffff) , 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; 
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  MATCH_w_16_0;
05450   { 
05451     MATCH_w_16_0 = getWord(MATCH_p); 
05452     { 
05453       int  d8 = 
05454         sign_extend((MATCH_w_16_0 & 0xff) , 8);
05455       unsigned iR = (MATCH_w_16_0 >> 12 & 0x7) ;
05456       unsigned iS = (MATCH_w_16_0 >> 11 & 0x1) ;
05457       unsigned iT = (MATCH_w_16_0 >> 15 & 0x1) ;
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; 
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  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) , 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; 
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  MATCH_w_16_0;
05522   { 
05523     MATCH_w_16_0 = getWord(MATCH_p); 
05524     { 
05525       int  d8 = 
05526         sign_extend((MATCH_w_16_0 & 0xff) , 8);
05527       unsigned iR = (MATCH_w_16_0 >> 12 & 0x7) ;
05528       unsigned iS = (MATCH_w_16_0 >> 11 & 0x1) ;
05529       unsigned iT = (MATCH_w_16_0 >> 15 & 0x1) ;
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; 
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  MATCH_w_16_0;
05561   { 
05562     MATCH_w_16_0 = getWord(MATCH_p); 
05563     { 
05564       int  d16 = 
05565         sign_extend((MATCH_w_16_0 & 0xffff) , 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; 
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  MATCH_w_16_0;
05595   unsigned  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)  << 16) + 
05602         (MATCH_w_16_16 & 0xffff) ;
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; 
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  MATCH_w_16_0;
05632   { 
05633     MATCH_w_16_0 = getWord(MATCH_p); 
05634     { 
05635       unsigned d16 = (MATCH_w_16_0 & 0xffff) ;
05636       
05637 
05638        ret = pImmW(d16);
05639 
05640       
05641       
05642       
05643     }
05644     
05645   }goto MATCH_finished_fb; 
05646   
05647   MATCH_finished_fb: (void)0; 
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  MATCH_w_16_0;
05676   { 
05677     MATCH_w_16_0 = getWord(MATCH_p); 
05678     
05679       switch((MATCH_w_16_0 >> 3 & 0x7) ) {
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) ;
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) ;
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) ) {
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             }  
05733           break;
05734         default: assert(0);
05735       }  
05736     
05737   }goto MATCH_finished_eb; 
05738   
05739   MATCH_label_eb0: (void)0;  
05740     
05741 
05742     pIllegalMode(pc);
05743 
05744     
05745      
05746     goto MATCH_finished_eb; 
05747     
05748   MATCH_finished_eb: (void)0; 
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  MATCH_w_16_0;
05766   { 
05767     MATCH_w_16_0 = getWord(MATCH_p); 
05768     { 
05769       int  d16 = 
05770         sign_extend((MATCH_w_16_0 & 0xffff) , 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; 
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  MATCH_w_16_0;
05800   { 
05801     MATCH_w_16_0 = getWord(MATCH_p); 
05802     { 
05803       int  d8 = 
05804         sign_extend((MATCH_w_16_0 & 0xff) , 8);
05805       unsigned iR = (MATCH_w_16_0 >> 12 & 0x7) ;
05806       unsigned iS = (MATCH_w_16_0 >> 11 & 0x1) ;
05807       unsigned iT = (MATCH_w_16_0 >> 15 & 0x1) ;
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; 
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  MATCH_w_16_0;
05837   { 
05838     MATCH_w_16_0 = getWord(MATCH_p); 
05839     { 
05840       int  d16 = 
05841         sign_extend((MATCH_w_16_0 & 0xffff) , 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; 
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  MATCH_w_16_0;
05871   unsigned  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)  << 16) + 
05878         (MATCH_w_16_16 & 0xffff) ;
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; 
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  MATCH_w_16_0;
05919   { 
05920     MATCH_w_16_0 = getWord(MATCH_p); 
05921     
05922       switch((MATCH_w_16_0 >> 3 & 0x7) ) {
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) ;
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) ;
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) ) {
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) ) {
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                   }  
06010                 break;
06011               default: assert(0);
06012             }  
06013           break;
06014         default: assert(0);
06015       }  
06016     
06017   }goto MATCH_finished_z; 
06018   
06019   MATCH_label_z0: (void)0;  
06020     
06021 
06022     pIllegalMode(pc);
06023 
06024     
06025      
06026     goto MATCH_finished_z; 
06027     
06028   MATCH_finished_z: (void)0; 
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  MATCH_w_16_0;
06046   { 
06047     MATCH_w_16_0 = getWord(MATCH_p); 
06048     { 
06049       int  d16 = 
06050         sign_extend((MATCH_w_16_0 & 0xffff) , 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; 
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  MATCH_w_16_0;
06080   { 
06081     MATCH_w_16_0 = getWord(MATCH_p); 
06082     { 
06083       int  d8 = 
06084         sign_extend((MATCH_w_16_0 & 0xff) , 8);
06085       unsigned iR = (MATCH_w_16_0 >> 12 & 0x7) ;
06086       unsigned iS = (MATCH_w_16_0 >> 11 & 0x1) ;
06087       unsigned iT = (MATCH_w_16_0 >> 15 & 0x1) ;
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; 
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  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) , 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; 
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  MATCH_w_16_0;
06152   { 
06153     MATCH_w_16_0 = getWord(MATCH_p); 
06154     { 
06155       int  d8 = 
06156         sign_extend((MATCH_w_16_0 & 0xff) , 8);
06157       unsigned iR = (MATCH_w_16_0 >> 12 & 0x7) ;
06158       unsigned iS = (MATCH_w_16_0 >> 11 & 0x1) ;
06159       unsigned iT = (MATCH_w_16_0 >> 15 & 0x1) ;
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; 
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  MATCH_w_16_0;
06191   { 
06192     MATCH_w_16_0 = getWord(MATCH_p); 
06193     { 
06194       int  d16 = 
06195         sign_extend((MATCH_w_16_0 & 0xffff) , 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; 
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  MATCH_w_16_0;
06225   { 
06226     MATCH_w_16_0 = getWord(MATCH_p); 
06227     if ((MATCH_w_16_0 >> 12 & 0x7)  == 0 && 
06228       (MATCH_w_16_0 >> 11 & 0x1)  == 0 && 
06229       (MATCH_w_16_0 >> 15 & 0x1)  == 0 && 
06230       (1 <= (MATCH_w_16_0 >> 8 & 0x7)  && 
06231       (MATCH_w_16_0 >> 8 & 0x7)  < 8) || 
06232       (MATCH_w_16_0 >> 12 & 0x7)  == 0 && 
06233       (MATCH_w_16_0 >> 11 & 0x1)  == 0 && 
06234       (MATCH_w_16_0 >> 15 & 0x1)  == 1 || 
06235       (MATCH_w_16_0 >> 12 & 0x7)  == 0 && 
06236       (MATCH_w_16_0 >> 11 & 0x1)  == 1 || 
06237       1 <= (MATCH_w_16_0 >> 12 & 0x7)  && 
06238       (MATCH_w_16_0 >> 12 & 0x7)  < 8) 
06239       goto MATCH_label_t0;  
06240     else { 
06241       unsigned d8 = (MATCH_w_16_0 & 0xff) ;
06242       
06243 
06244        ret = pImmB(d8);
06245 
06246       
06247       
06248       
06249     } 
06250     
06251   }goto MATCH_finished_t; 
06252   
06253   MATCH_label_t0: (void)0;  
06254     
06255 
06256     pNonzeroByte(pc);
06257 
06258     
06259      
06260     goto MATCH_finished_t; 
06261     
06262   MATCH_finished_t: (void)0; 
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  MATCH_w_16_0;
06280   { 
06281     MATCH_w_16_0 = getWord(MATCH_p); 
06282     { 
06283       unsigned d16 = (MATCH_w_16_0 & 0xffff) ;
06284       
06285 
06286        ret = pImmW(d16);
06287 
06288       
06289       
06290       
06291     }
06292     
06293   }goto MATCH_finished_s; 
06294   
06295   MATCH_finished_s: (void)0; 
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  MATCH_w_16_0;
06324   { 
06325     MATCH_w_16_0 = getWord(MATCH_p); 
06326     
06327       switch((MATCH_w_16_0 & 0x7) ) {
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)  == 7) 
06332             
06333 
06334              { mode = 5; result.numBytes += 4;}
06335 
06336             
06337              
06338           else 
06339             goto MATCH_label_r0;  
06340           
06341           break;
06342         case 4: 
06343           if ((MATCH_w_16_0 >> 12 & 0xf)  == 2 && 
06344             (MATCH_w_16_0 >> 3 & 0x7)  == 7) 
06345             
06346 
06347              { mode = 8; result.numBytes += 4;}
06348 
06349             
06350              
06351           else 
06352             goto MATCH_label_r0;  
06353           
06354           break;
06355         default: assert(0);
06356       }  
06357     
06358   }goto MATCH_finished_r; 
06359   
06360   MATCH_label_r0: (void)0;  
06361     
06362 
06363     pIllegalMode(pc);
06364 
06365     
06366      
06367     goto MATCH_finished_r; 
06368     
06369   MATCH_finished_r: (void)0; 
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  MATCH_w_16_0;
06406   { 
06407     MATCH_w_16_0 = getWord(MATCH_p); 
06408     
06409       switch((MATCH_w_16_0 >> 6 & 0x7) ) {
06410         case 0: case 1: case 2: case 3: case 4: case 7: 
06411           if ((MATCH_w_16_0 >> 8 & 0x1)  == 1) 
06412             if ((MATCH_w_16_0 >> 6 & 0x3)  == 3) 
06413               
06414                 switch((MATCH_w_16_0 >> 9 & 0x7) ) {
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                 }   
06437             else 
06438               goto MATCH_label_q0;   
06439           else 
06440             goto MATCH_label_q0;  
06441           break;
06442         case 5: 
06443           { 
06444             unsigned r1 = (MATCH_w_16_0 >> 9 & 0x7) ;
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) ;
06458             
06459 
06460              { mode = 1; reg1 = r1; result.numBytes += 2;}
06461 
06462             
06463             
06464             
06465           }
06466           
06467           break;
06468         default: assert(0);
06469       }  
06470     
06471   }goto MATCH_finished_q; 
06472   
06473   MATCH_label_q0: (void)0;  
06474     
06475 
06476     pIllegalMode(pc);
06477 
06478     
06479      
06480     goto MATCH_finished_q; 
06481     
06482   MATCH_finished_q: (void)0; 
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  MATCH_w_16_0;
06500   { 
06501     MATCH_w_16_0 = getWord(MATCH_p); 
06502     { 
06503       int  d16 = 
06504         sign_extend((MATCH_w_16_0 & 0xffff) , 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; 
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  MATCH_w_16_0;
06534   { 
06535     MATCH_w_16_0 = getWord(MATCH_p); 
06536     { 
06537       int  d8 = 
06538         sign_extend((MATCH_w_16_0 & 0xff) , 8);
06539       unsigned iR = (MATCH_w_16_0 >> 12 & 0x7) ;
06540       unsigned iS = (MATCH_w_16_0 >> 11 & 0x1) ;
06541       unsigned iT = (MATCH_w_16_0 >> 15 & 0x1) ;
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; 
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  MATCH_w_16_0;
06571   { 
06572     MATCH_w_16_0 = getWord(MATCH_p); 
06573     { 
06574       unsigned d16 = (MATCH_w_16_0 & 0xffff) ;
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; 
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  MATCH_w_16_0;
06604   unsigned  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)  << 16) + 
06611         (MATCH_w_16_16 & 0xffff) ;
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; 
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  MATCH_w_16_0;
06652   { 
06653     MATCH_w_16_0 = getWord(MATCH_p); 
06654     
06655       switch((MATCH_w_16_0 >> 3 & 0x7) ) {
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) ;
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) ;
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) ) {
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             }  
06727           break;
06728         default: assert(0);
06729       }  
06730     
06731   }goto MATCH_finished_l; 
06732   
06733   MATCH_label_l0: (void)0;  
06734     
06735 
06736     pIllegalMode(pc);
06737 
06738     
06739      
06740     goto MATCH_finished_l; 
06741     
06742   MATCH_finished_l: (void)0; 
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  MATCH_w_16_0;
06760   { 
06761     MATCH_w_16_0 = getWord(MATCH_p); 
06762     { 
06763       int  d16 = 
06764         sign_extend((MATCH_w_16_0 & 0xffff) , 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; 
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  MATCH_w_16_0;
06794   { 
06795     MATCH_w_16_0 = getWord(MATCH_p); 
06796     { 
06797       int  d8 = 
06798         sign_extend((MATCH_w_16_0 & 0xff) , 8);
06799       unsigned iR = (MATCH_w_16_0 >> 12 & 0x7) ;
06800       unsigned iS = (MATCH_w_16_0 >> 11 & 0x1) ;
06801       unsigned iT = (MATCH_w_16_0 >> 15 & 0x1) ;
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; 
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  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) , 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; 
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  MATCH_w_16_0;
06866   { 
06867     MATCH_w_16_0 = getWord(MATCH_p); 
06868     { 
06869       int  d8 = 
06870         sign_extend((MATCH_w_16_0 & 0xff) , 8);
06871       unsigned iR = (MATCH_w_16_0 >> 12 & 0x7) ;
06872       unsigned iS = (MATCH_w_16_0 >> 11 & 0x1) ;
06873       unsigned iT = (MATCH_w_16_0 >> 15 & 0x1) ;
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; 
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  MATCH_w_16_0;
06905   { 
06906     MATCH_w_16_0 = getWord(MATCH_p); 
06907     { 
06908       int  d16 = 
06909         sign_extend((MATCH_w_16_0 & 0xffff) , 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; 
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  MATCH_w_16_0;
06939   unsigned  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)  << 16) + 
06946         (MATCH_w_16_16 & 0xffff) ;
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; 
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  MATCH_w_16_0;
06987   { 
06988     MATCH_w_16_0 = getWord(MATCH_p); 
06989     
06990       switch((MATCH_w_16_0 >> 3 & 0x7) ) {
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) ;
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) ;
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) ) {
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             }  
07044           break;
07045         default: assert(0);
07046       }  
07047     
07048   }goto MATCH_finished_e; 
07049   
07050   MATCH_label_e0: (void)0;  
07051     
07052 
07053     pIllegalMode(pc);
07054 
07055     
07056      
07057     goto MATCH_finished_e; 
07058     
07059   MATCH_finished_e: (void)0; 
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  MATCH_w_16_0;
07077   { 
07078     MATCH_w_16_0 = getWord(MATCH_p); 
07079     { 
07080       int  d16 = 
07081         sign_extend((MATCH_w_16_0 & 0xffff) , 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; 
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  MATCH_w_16_0;
07111   { 
07112     MATCH_w_16_0 = getWord(MATCH_p); 
07113     { 
07114       int  d8 = 
07115         sign_extend((MATCH_w_16_0 & 0xff) , 8);
07116       unsigned iR = (MATCH_w_16_0 >> 12 & 0x7) ;
07117       unsigned iS = (MATCH_w_16_0 >> 11 & 0x1) ;
07118       unsigned iT = (MATCH_w_16_0 >> 15 & 0x1) ;
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; 
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  MATCH_w_16_0;
07148   { 
07149     MATCH_w_16_0 = getWord(MATCH_p); 
07150     { 
07151       int  d16 = 
07152         sign_extend((MATCH_w_16_0 & 0xffff) , 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; 
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  MATCH_w_16_0;
07182   unsigned  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)  << 16) + 
07189         (MATCH_w_16_16 & 0xffff) ;
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; 
07202   
07203 }
07204 
07205 
07206       break;
07207     }
07208     default : pIllegalMode(pc); break;
07209   } 
07210   return ret;
07211 }
07212 
07213 
07214 
07215 
07216 
07217 
07218 
07219 
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