00001 #define sign_extend(N,SIZE) (((int)((N) << (sizeof(unsigned)*8-(SIZE)))) >> (sizeof(unsigned)*8-(SIZE)))
00002 #include <assert.h>
00003 
00004 #line 0 "frontend/machine/sparc/decoder.m"
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 
00028 
00029 
00030 
00031 
00032 
00033 
00034 
00035 
00036 #include <assert.h>
00037 #if defined(_MSC_VER) && _MSC_VER <= 1100
00038 #include "signature.h"
00039 #endif
00040 
00041 #include "decoder.h"
00042 #include "exp.h"
00043 #include "prog.h"
00044 #include "proc.h"
00045 #include "sparcdecoder.h"
00046 #include "rtl.h"
00047 #include "BinaryFile.h"     
00048 #include "boomerang.h"
00049 
00050 #define DIS_ROI     (dis_RegImm(roi))
00051 #define DIS_ADDR    (dis_Eaddr(addr))
00052 #define DIS_RD      (dis_RegLhs(rd))
00053 #define DIS_RDR     (dis_RegRhs(rd))
00054 #define DIS_RS1     (dis_RegRhs(rs1))
00055 #define DIS_FS1S    (dis_RegRhs(fs1s+32))
00056 #define DIS_FS2S    (dis_RegRhs(fs2s+32))
00057 
00058 
00059 #define DIS_FDS     (dis_RegLhs(fds+32))
00060 #define DIS_FS1D    (dis_RegRhs((fs1d>>1)+64))
00061 #define DIS_FS2D    (dis_RegRhs((fs2d>>1)+64))
00062 #define DIS_FDD     (dis_RegLhs((fdd>>1)+64))
00063 #define DIS_FDQ     (dis_RegLhs((fdq>>2)+80))
00064 #define DIS_FS1Q    (dis_RegRhs((fs1q>>2)+80))
00065 #define DIS_FS2Q    (dis_RegRhs((fs2q>>2)+80))
00066 
00067 
00068 
00069 
00070 
00071 
00072 
00073 void SparcDecoder::unused(int x)
00074 {}
00075 
00076 
00077 
00078 
00079 
00080 
00081 
00082 
00083 
00084 RTL* SparcDecoder::createBranchRtl(ADDRESS pc, std::list<Statement*>* stmts, const char* name) {
00085     RTL* res = new RTL(pc, stmts);
00086     BranchStatement* br = new BranchStatement();
00087     res->appendStmt(br);
00088     if (name[0] == 'F') {
00089         
00090         
00091         
00092         if (name[2] == 'U')
00093             name++;             
00094         switch (name[2]) {
00095         case 'E':                           
00096             br->setCondType(BRANCH_JE, true);
00097             break;
00098         case 'L':
00099             if (name[3] == 'G')             
00100                 br->setCondType(BRANCH_JNE, true);
00101             else if (name[3] == 'E')        
00102                 br->setCondType(BRANCH_JSLE, true);
00103             else                            
00104                 br->setCondType(BRANCH_JSL, true);
00105             break;
00106         case 'G':
00107             if (name[3] == 'E')             
00108                 br->setCondType(BRANCH_JSGE, true);
00109             else                            
00110                 br->setCondType(BRANCH_JSG, true);
00111             break;
00112         case 'N':
00113             if (name[3] == 'E')             
00114                 br->setCondType(BRANCH_JNE, true);
00115             
00116             break;
00117         default:
00118             std::cerr << "unknown float branch " << name << std::endl;
00119             delete res;
00120             res = NULL;
00121         }
00122         return res;
00123     }   
00124 
00125     
00126     
00127     
00128     switch(name[1]) {
00129     case 'E':
00130         br->setCondType(BRANCH_JE);           
00131         break;
00132     case 'L':
00133         if (name[2] == 'E') {
00134             if (name[3] == 'U')
00135                 br->setCondType(BRANCH_JULE); 
00136             else
00137                 br->setCondType(BRANCH_JSLE); 
00138         }
00139         else
00140             br->setCondType(BRANCH_JSL);      
00141         break;
00142     case 'N':
00143         
00144         if (name[3] == 'G')
00145             br->setCondType(BRANCH_JMI);      
00146         else
00147             br->setCondType(BRANCH_JNE);      
00148         break;
00149     case 'C':
00150         
00151         if (name[2] == 'C')
00152             br->setCondType(BRANCH_JUGE);     
00153         else
00154             br->setCondType(BRANCH_JUL);      
00155         break;
00156     case 'V':
00157         
00158         if (name[2] == 'C')
00159             std::cerr << "Decoded BVC instruction\n";   
00160         else
00161             std::cerr << "Decoded BVS instruction\n";   
00162         break;
00163     case 'G':   
00164         
00165         if (name[2] == 'E')
00166             br->setCondType(BRANCH_JSGE);     
00167         else if (name[2] == 'U')
00168             br->setCondType(BRANCH_JUG);      
00169         else
00170             br->setCondType(BRANCH_JSG);      
00171         break;
00172     case 'P':   
00173         if (name[2] == 'O') {
00174             br->setCondType(BRANCH_JPOS);         
00175             break;
00176         }
00177         
00178         
00179         
00180         
00181         char temp[8];
00182         temp[0] = 'B';
00183         strcpy(temp+1, name+2);
00184         delete res;
00185         return createBranchRtl(pc, stmts, temp);
00186     default:
00187         std::cerr << "unknown non-float branch " << name << std::endl;
00188     }   
00189     return res;
00190 }
00191 
00192 
00193 
00194 
00195 
00196 
00197 
00198 
00199 
00200 
00201 
00202 
00203 
00204 
00205 
00206 DecodeResult& SparcDecoder::decodeInstruction (ADDRESS pc, int delta) { 
00207     static DecodeResult result;
00208     ADDRESS hostPC = pc+delta;
00209 
00210     
00211     result.reset();
00212 
00213     
00214     std::list<Statement*>* stmts = NULL;
00215 
00216     ADDRESS nextPC = NO_ADDRESS;
00217 
00218 
00219 
00220 #line 212 "frontend/machine/sparc/decoder.m"
00221 { 
00222   dword MATCH_p = 
00223     
00224 #line 212 "frontend/machine/sparc/decoder.m"
00225     hostPC
00226     ;
00227   char *MATCH_name;
00228   static char *MATCH_name_cond_0[] = {
00229     "BPN", "BPE", "BPLE", "BPL", "BPLEU", "BPCS", "BPNEG", "BPVS", "BPA,a", 
00230     "BPNE", "BPG", "BPGE", "BPGU", "BPCC", "BPPOS", "BPVC", 
00231   };
00232   static char *MATCH_name_cond_1[] = {
00233     "BPN,a", "BPE,a", "BPLE,a", "BPL,a", "BPLEU,a", "BPCS,a", "BPNEG,a", 
00234     "BPVS,a", "BA", "BPNE,a", "BPG,a", "BPGE,a", "BPGU,a", "BPCC,a", 
00235     "BPPOS,a", "BPVC,a", 
00236   };
00237   static char *MATCH_name_cond_2[] = {
00238     "BN", "BE", "BLE", "BL", "BLEU", "BCS", "BNEG", "BVS", "BA,a", "BNE", 
00239     "BG", "BGE", "BGU", "BCC", "BPOS", "BVC", 
00240   };
00241   static char *MATCH_name_cond_3[] = {
00242     "BN,a", "BE,a", "BLE,a", "BL,a", "BLEU,a", "BCS,a", "BNEG,a", "BVS,a", 
00243     "FBA", "BNE,a", "BG,a", "BGE,a", "BGU,a", "BCC,a", "BPOS,a", "BVC,a", 
00244   };
00245   static char *MATCH_name_cond_5[] = {
00246     "FBN", "FBNE", "FBLG", "FBUL", "FBL", "FBUG", "FBG", "FBU", "FBA,a", 
00247     "FBE", "FBUE", "FBGE", "FBUGE", "FBLE", "FBULE", "FBO", 
00248   };
00249   static char *MATCH_name_cond_6[] = {
00250     "FBN,a", "FBNE,a", "FBLG,a", "FBUL,a", "FBL,a", "FBUG,a", "FBG,a", 
00251     "FBU,a", "CBA", "FBE,a", "FBUE,a", "FBGE,a", "FBUGE,a", "FBLE,a", 
00252     "FBULE,a", "FBO,a", 
00253   };
00254   static char *MATCH_name_cond_7[] = {
00255     "CBN", "CB123", "CB12", "CB13", "CB1", "CB23", "CB2", "CB3", "CBA,a", 
00256     "CB0", "CB03", "CB02", "CB023", "CB01", "CB013", "CB012", 
00257   };
00258   static char *MATCH_name_cond_8[] = {
00259     "CBN,a", "CB123,a", "CB12,a", "CB13,a", "CB1,a", "CB23,a", "CB2,a", 
00260     "CB3,a", "TA", "CB0,a", "CB03,a", "CB02,a", "CB023,a", "CB01,a", 
00261     "CB013,a", "CB012,a", 
00262   };
00263   static char *MATCH_name_op3_46[] = {
00264     (char *)0, (char *)0, (char *)0, (char *)0, (char *)0, (char *)0, 
00265     (char *)0, (char *)0, (char *)0, (char *)0, (char *)0, (char *)0, 
00266     (char *)0, (char *)0, (char *)0, (char *)0, (char *)0, (char *)0, 
00267     (char *)0, (char *)0, (char *)0, (char *)0, (char *)0, (char *)0, 
00268     (char *)0, (char *)0, (char *)0, (char *)0, (char *)0, (char *)0, 
00269     (char *)0, (char *)0, (char *)0, (char *)0, (char *)0, (char *)0, 
00270     (char *)0, (char *)0, (char *)0, (char *)0, (char *)0, "RDPSR", "RDWIM", 
00271     "RDTBR", 
00272   };
00273   static char *MATCH_name_opf_51[] = {
00274     (char *)0, "FMOVs", (char *)0, (char *)0, (char *)0, "FNEGs", (char *)0, 
00275     (char *)0, (char *)0, "FABSs", (char *)0, (char *)0, (char *)0, 
00276     (char *)0, (char *)0, (char *)0, (char *)0, (char *)0, (char *)0, 
00277     (char *)0, (char *)0, (char *)0, (char *)0, (char *)0, (char *)0, 
00278     (char *)0, (char *)0, (char *)0, (char *)0, (char *)0, (char *)0, 
00279     (char *)0, (char *)0, (char *)0, (char *)0, (char *)0, (char *)0, 
00280     (char *)0, (char *)0, (char *)0, (char *)0, "FSQRTs", "FSQRTd", "FSQRTq", 
00281     (char *)0, (char *)0, (char *)0, (char *)0, (char *)0, (char *)0, 
00282     (char *)0, (char *)0, (char *)0, (char *)0, (char *)0, (char *)0, 
00283     (char *)0, (char *)0, (char *)0, (char *)0, (char *)0, (char *)0, 
00284     (char *)0, (char *)0, (char *)0, "FADDs", "FADDd", "FADDq", (char *)0, 
00285     "FSUBs", "FSUBd", "FSUBq", (char *)0, "FMULs", "FMULd", "FMULq", 
00286     (char *)0, "FDIVs", "FDIVd", "FDIVq", (char *)0, "FCMPs", "FCMPd", 
00287     "FCMPq", (char *)0, "FCMPEs", "FCMPEd", "FCMPEq", (char *)0, (char *)0, 
00288     (char *)0, (char *)0, (char *)0, (char *)0, (char *)0, (char *)0, 
00289     (char *)0, (char *)0, (char *)0, (char *)0, (char *)0, (char *)0, 
00290     (char *)0, (char *)0, (char *)0, (char *)0, (char *)0, (char *)0, 
00291     (char *)0, (char *)0, (char *)0, (char *)0, (char *)0, (char *)0, 
00292     (char *)0, (char *)0, (char *)0, (char *)0, (char *)0, (char *)0, 
00293     (char *)0, (char *)0, (char *)0, (char *)0, (char *)0, (char *)0, 
00294     (char *)0, (char *)0, (char *)0, (char *)0, (char *)0, (char *)0, 
00295     (char *)0, (char *)0, (char *)0, (char *)0, (char *)0, (char *)0, 
00296     (char *)0, (char *)0, (char *)0, (char *)0, (char *)0, (char *)0, 
00297     (char *)0, (char *)0, (char *)0, (char *)0, (char *)0, (char *)0, 
00298     (char *)0, (char *)0, (char *)0, (char *)0, (char *)0, (char *)0, 
00299     (char *)0, (char *)0, (char *)0, (char *)0, (char *)0, (char *)0, 
00300     (char *)0, (char *)0, (char *)0, (char *)0, (char *)0, (char *)0, 
00301     (char *)0, (char *)0, (char *)0, (char *)0, (char *)0, (char *)0, 
00302     (char *)0, (char *)0, (char *)0, (char *)0, (char *)0, (char *)0, 
00303     (char *)0, (char *)0, (char *)0, (char *)0, (char *)0, (char *)0, 
00304     (char *)0, (char *)0, (char *)0, (char *)0, (char *)0, (char *)0, 
00305     (char *)0, (char *)0, (char *)0, (char *)0, "FiTOs", (char *)0, "FdTOs", 
00306     "FqTOs", "FiTOd", "FsTOd", (char *)0, "FqTOd", "FiTOq", "FsTOq", "FdTOq", 
00307     (char *)0, (char *)0, "FsTOi", "FdTOi", "FqTOi", 
00308   };
00309   static char *MATCH_name_cond_53[] = {
00310     "TN", "TE", "TLE", "TL", "TLEU", "TCS", "TNEG", "TVS", (char *)0, "TNE", 
00311     "TG", "TGE", "TGU", "TCC", "TPOS", "TVC", 
00312   };
00313   static char *MATCH_name_i_66[] = {"LDA", "LDF", };
00314   static char *MATCH_name_i_67[] = {"LDUBA", "LDFSR", };
00315   static char *MATCH_name_i_68[] = {"LDUHA", "LDDF", };
00316   static char *MATCH_name_i_69[] = {"LDDA", "STF", };
00317   static char *MATCH_name_i_70[] = {"STA", "STFSR", };
00318   static char *MATCH_name_i_71[] = {"STBA", "STDFQ", };
00319   static char *MATCH_name_i_72[] = {"STHA", "STDF", };
00320   static char *MATCH_name_i_73[] = {"STDA", "LDCSR", };
00321   static char *MATCH_name_i_74[] = {"LDSBA", "STCSR", };
00322   static char *MATCH_name_i_75[] = {"LDSHA", "STDCQ", };
00323   unsigned MATCH_w_32_0;
00324   { 
00325     MATCH_w_32_0 = getDword(MATCH_p); 
00326     
00327       switch((MATCH_w_32_0 >> 30 & 0x3) ) {
00328         case 0: 
00329           
00330             switch((MATCH_w_32_0 >> 22 & 0x7) ) {
00331               case 0: 
00332                 { 
00333                   unsigned n = (MATCH_w_32_0 & 0x3fffff) ;
00334                   nextPC = 4 + MATCH_p; 
00335                   
00336 #line 629 "frontend/machine/sparc/decoder.m"
00337                    
00338 
00339                         unused(n);
00340 
00341                         stmts = NULL;
00342 
00343                         result.valid = false;
00344 
00345                   
00346 
00347                   
00348                   
00349                   
00350                 }
00351                 
00352                 break;
00353               case 1: 
00354                 if ((MATCH_w_32_0 >> 29 & 0x1)  == 1) 
00355                   if ((MATCH_w_32_0 >> 25 & 0xf)  == 8) { 
00356                     MATCH_name = MATCH_name_cond_0[(MATCH_w_32_0 >> 25 & 0xf) 
00357                           ]; 
00358                     goto MATCH_label_d0; 
00359                     
00360                   } 
00361                   else { 
00362                     MATCH_name = MATCH_name_cond_1[(MATCH_w_32_0 >> 25 & 0xf) 
00363                           ]; 
00364                     goto MATCH_label_d0; 
00365                     
00366                   }  
00367                 else 
00368                   if ((MATCH_w_32_0 >> 25 & 0xf)  == 8) { 
00369                     unsigned cc01 = 
00370                       (MATCH_w_32_0 >> 20 & 0x3) ;
00371                     unsigned tgt = 
00372                       4 * sign_extend((MATCH_w_32_0 & 0x7ffff) 
00373                                         , 19) + 
00374                       addressToPC(MATCH_p);
00375                     nextPC = 4 + MATCH_p; 
00376                     
00377 #line 400 "frontend/machine/sparc/decoder.m"
00378                                 
00379 
00380                             unused(cc01);               
00381 
00382                             GotoStatement* jump = new GotoStatement;
00383 
00384                     
00385 
00386                             result.type = SD;
00387 
00388                             result.rtl = new RTL(pc, stmts);
00389 
00390                             result.rtl->appendStmt(jump);
00391 
00392                             jump->setDest(tgt - delta);
00393 
00394                             SHOW_ASM("BPA " << std::hex << tgt-delta)
00395 
00396                             DEBUG_STMTS
00397 
00398                     
00399 
00400                     
00401                     
00402                     
00403                   } 
00404                   else { 
00405                     MATCH_name = MATCH_name_cond_0[(MATCH_w_32_0 >> 25 & 0xf) 
00406                           ]; 
00407                     { 
00408                       char *name = MATCH_name;
00409                       unsigned cc01 = 
00410                         (MATCH_w_32_0 >> 20 & 0x3) ;
00411                       unsigned tgt = 
00412                         4 * sign_extend((MATCH_w_32_0 & 0x7ffff) 
00413                                           , 19) + 
00414                         addressToPC(MATCH_p);
00415                       nextPC = 4 + MATCH_p; 
00416                       
00417 #line 411 "frontend/machine/sparc/decoder.m"
00418                       
00419 
00420                             if (cc01 != 0) {        
00421 
00422                                 result.valid = false;
00423 
00424                                 result.rtl = new RTL;
00425 
00426                                 result.numBytes = 4;
00427 
00428                                 return result;
00429 
00430                             }
00431 
00432                             GotoStatement* jump = 0;
00433 
00434                             RTL* rtl = NULL;
00435 
00436                             if (strcmp(name,"BPN") == 0) {
00437 
00438                                 jump = new GotoStatement;
00439 
00440                                 rtl = new RTL(pc, stmts);
00441 
00442                                 rtl->appendStmt(jump);
00443 
00444                             } else if (strcmp(name,"BPVS") == 0 || strcmp(name,"BPVC") == 0) {
00445 
00446                                 jump = new GotoStatement;
00447 
00448                                 rtl = new RTL(pc, stmts);
00449 
00450                                 rtl->appendStmt(jump);
00451 
00452                             } else {
00453 
00454                                 rtl = createBranchRtl(pc, stmts, name);
00455 
00456                                 
00457 
00458                                 jump = (GotoStatement*)rtl->getList().back();
00459 
00460                             }
00461 
00462                       
00463 
00464                             
00465 
00466                             
00467 
00468                             
00469 
00470                             result.type = SCD;
00471 
00472                             if (strcmp(name, "BPVC") == 0)
00473 
00474                                 result.type = SD;
00475 
00476                             if ((strcmp(name,"BPN") == 0) || (strcmp(name, "BPVS") == 0))
00477 
00478                                 result.type = NCT;
00479 
00480                       
00481 
00482                             result.rtl = rtl;
00483 
00484                             jump->setDest(tgt - delta);
00485 
00486                             SHOW_ASM(name << " " << std::hex << tgt-delta)
00487 
00488                             DEBUG_STMTS
00489 
00490                       
00491 
00492                       
00493                       
00494                       
00495                     }
00496                     
00497                   }  
00498                 break;
00499               case 2: 
00500                 if ((MATCH_w_32_0 >> 29 & 0x1)  == 1) 
00501                   if ((MATCH_w_32_0 >> 25 & 0xf)  == 8) { 
00502                     MATCH_name = MATCH_name_cond_2[(MATCH_w_32_0 >> 25 & 0xf) 
00503                           ]; 
00504                     goto MATCH_label_d2; 
00505                     
00506                   } 
00507                   else { 
00508                     MATCH_name = MATCH_name_cond_3[(MATCH_w_32_0 >> 25 & 0xf) 
00509                           ]; 
00510                     goto MATCH_label_d2; 
00511                     
00512                   }  
00513                 else 
00514                   if ((MATCH_w_32_0 >> 25 & 0xf)  == 8) { 
00515                     MATCH_name = MATCH_name_cond_1[(MATCH_w_32_0 >> 25 & 0xf) 
00516                           ]; 
00517                     goto MATCH_label_d1; 
00518                     
00519                   } 
00520                   else { 
00521                     MATCH_name = MATCH_name_cond_2[(MATCH_w_32_0 >> 25 & 0xf) 
00522                           ]; 
00523                     goto MATCH_label_d1; 
00524                     
00525                   }  
00526                 break;
00527               case 3: case 5: 
00528                 goto MATCH_label_d3; break;
00529               case 4: 
00530                 if ((MATCH_w_32_0 & 0x3fffff)  == 0 && 
00531                   (MATCH_w_32_0 >> 25 & 0x1f)  == 0) { 
00532                   MATCH_name = "NOP"; 
00533                   { 
00534                     char *name = MATCH_name;
00535                     nextPC = 4 + MATCH_p; 
00536                     
00537 #line 481 "frontend/machine/sparc/decoder.m"
00538                     
00539 
00540                             result.type = NOP;
00541 
00542                             stmts = instantiate(pc,  name);
00543 
00544                     
00545 
00546                     
00547                     
00548                     
00549                   }
00550                   
00551                 } 
00552                 else 
00553                   goto MATCH_label_d4;  
00554                 
00555                 break;
00556               case 6: 
00557                 if ((MATCH_w_32_0 >> 29 & 0x1)  == 1) 
00558                   if ((MATCH_w_32_0 >> 25 & 0xf)  == 8) { 
00559                     MATCH_name = MATCH_name_cond_5[(MATCH_w_32_0 >> 25 & 0xf) 
00560                           ]; 
00561                     goto MATCH_label_d2; 
00562                     
00563                   } 
00564                   else { 
00565                     MATCH_name = MATCH_name_cond_6[(MATCH_w_32_0 >> 25 & 0xf) 
00566                           ]; 
00567                     goto MATCH_label_d2; 
00568                     
00569                   }  
00570                 else 
00571                   if ((MATCH_w_32_0 >> 25 & 0xf)  == 8) { 
00572                     MATCH_name = MATCH_name_cond_3[(MATCH_w_32_0 >> 25 & 0xf) 
00573                           ]; 
00574                     goto MATCH_label_d1; 
00575                     
00576                   } 
00577                   else { 
00578                     MATCH_name = MATCH_name_cond_5[(MATCH_w_32_0 >> 25 & 0xf) 
00579                           ]; 
00580                     goto MATCH_label_d1; 
00581                     
00582                   }  
00583                 break;
00584               case 7: 
00585                 if ((MATCH_w_32_0 >> 29 & 0x1)  == 1) 
00586                   if ((MATCH_w_32_0 >> 25 & 0xf)  == 8) { 
00587                     MATCH_name = MATCH_name_cond_7[(MATCH_w_32_0 >> 25 & 0xf) 
00588                           ]; 
00589                     goto MATCH_label_d2; 
00590                     
00591                   } 
00592                   else { 
00593                     MATCH_name = MATCH_name_cond_8[(MATCH_w_32_0 >> 25 & 0xf) 
00594                           ]; 
00595                     goto MATCH_label_d2; 
00596                     
00597                   }  
00598                 else 
00599                   if ((MATCH_w_32_0 >> 25 & 0xf)  == 8) { 
00600                     MATCH_name = MATCH_name_cond_6[(MATCH_w_32_0 >> 25 & 0xf) 
00601                           ]; 
00602                     goto MATCH_label_d1; 
00603                     
00604                   } 
00605                   else { 
00606                     MATCH_name = MATCH_name_cond_7[(MATCH_w_32_0 >> 25 & 0xf) 
00607                           ]; 
00608                     goto MATCH_label_d1; 
00609                     
00610                   }  
00611                 break;
00612               default: assert(0);
00613             }  
00614           break;
00615         case 1: 
00616           { 
00617             unsigned addr = 
00618               4 * sign_extend((MATCH_w_32_0 & 0x3fffffff) , 
00619                           30) + addressToPC(MATCH_p);
00620             nextPC = 4 + MATCH_p; 
00621             
00622 #line 215 "frontend/machine/sparc/decoder.m"
00623             
00624 
00625                     
00626 
00627 
00628 
00629 
00630 
00631                     CallStatement* newCall = new CallStatement;
00632 
00633             
00634 
00635                     
00636 
00637                     ADDRESS nativeDest = addr - delta;
00638 
00639                     newCall->setDest(nativeDest);
00640 
00641                     Proc* destProc = prog->setNewProc(nativeDest);
00642 
00643                     if (destProc == (Proc*)-1) destProc = NULL;
00644 
00645                     newCall->setDestProc(destProc);
00646 
00647                     result.rtl = new RTL(pc, stmts);
00648 
00649                     result.rtl->appendStmt(newCall);
00650 
00651                     result.type = SD;
00652 
00653                     SHOW_ASM("call__ " << std::hex << (nativeDest))
00654 
00655                     DEBUG_STMTS
00656 
00657             
00658 
00659             
00660             
00661             
00662           }
00663           
00664           break;
00665         case 2: 
00666           
00667             switch((MATCH_w_32_0 >> 19 & 0x3f) ) {
00668               case 0: 
00669                 MATCH_name = "ADD"; goto MATCH_label_d5; break;
00670               case 1: 
00671                 MATCH_name = "AND"; goto MATCH_label_d5; break;
00672               case 2: 
00673                 MATCH_name = "OR"; goto MATCH_label_d5; break;
00674               case 3: 
00675                 MATCH_name = "XOR"; goto MATCH_label_d5; break;
00676               case 4: 
00677                 MATCH_name = "SUB"; goto MATCH_label_d5; break;
00678               case 5: 
00679                 MATCH_name = "ANDN"; goto MATCH_label_d5; break;
00680               case 6: 
00681                 MATCH_name = "ORN"; goto MATCH_label_d5; break;
00682               case 7: 
00683                 MATCH_name = "XNOR"; goto MATCH_label_d5; break;
00684               case 8: 
00685                 MATCH_name = "ADDX"; goto MATCH_label_d5; break;
00686               case 9: case 13: case 25: case 29: case 44: case 45: case 46: 
00687               case 47: case 54: case 55: case 59: case 62: case 63: 
00688                 goto MATCH_label_d3; break;
00689               case 10: 
00690                 MATCH_name = "UMUL"; goto MATCH_label_d5; break;
00691               case 11: 
00692                 MATCH_name = "SMUL"; goto MATCH_label_d5; break;
00693               case 12: 
00694                 MATCH_name = "SUBX"; goto MATCH_label_d5; break;
00695               case 14: 
00696                 MATCH_name = "UDIV"; goto MATCH_label_d5; break;
00697               case 15: 
00698                 MATCH_name = "SDIV"; goto MATCH_label_d5; break;
00699               case 16: 
00700                 MATCH_name = "ADDcc"; goto MATCH_label_d5; break;
00701               case 17: 
00702                 MATCH_name = "ANDcc"; goto MATCH_label_d5; break;
00703               case 18: 
00704                 MATCH_name = "ORcc"; goto MATCH_label_d5; break;
00705               case 19: 
00706                 MATCH_name = "XORcc"; goto MATCH_label_d5; break;
00707               case 20: 
00708                 MATCH_name = "SUBcc"; goto MATCH_label_d5; break;
00709               case 21: 
00710                 MATCH_name = "ANDNcc"; goto MATCH_label_d5; break;
00711               case 22: 
00712                 MATCH_name = "ORNcc"; goto MATCH_label_d5; break;
00713               case 23: 
00714                 MATCH_name = "XNORcc"; goto MATCH_label_d5; break;
00715               case 24: 
00716                 MATCH_name = "ADDXcc"; goto MATCH_label_d5; break;
00717               case 26: 
00718                 MATCH_name = "UMULcc"; goto MATCH_label_d5; break;
00719               case 27: 
00720                 MATCH_name = "SMULcc"; goto MATCH_label_d5; break;
00721               case 28: 
00722                 MATCH_name = "SUBXcc"; goto MATCH_label_d5; break;
00723               case 30: 
00724                 MATCH_name = "UDIVcc"; goto MATCH_label_d5; break;
00725               case 31: 
00726                 MATCH_name = "SDIVcc"; goto MATCH_label_d5; break;
00727               case 32: 
00728                 MATCH_name = "TADDcc"; goto MATCH_label_d5; break;
00729               case 33: 
00730                 MATCH_name = "TSUBcc"; goto MATCH_label_d5; break;
00731               case 34: 
00732                 MATCH_name = "TADDccTV"; goto MATCH_label_d5; break;
00733               case 35: 
00734                 MATCH_name = "TSUBccTV"; goto MATCH_label_d5; break;
00735               case 36: 
00736                 MATCH_name = "MULScc"; goto MATCH_label_d5; break;
00737               case 37: 
00738                 MATCH_name = "SLL"; goto MATCH_label_d5; break;
00739               case 38: 
00740                 MATCH_name = "SRL"; goto MATCH_label_d5; break;
00741               case 39: 
00742                 MATCH_name = "SRA"; goto MATCH_label_d5; break;
00743               case 40: 
00744                 if ((MATCH_w_32_0 >> 14 & 0x1f)  == 0) { 
00745                   MATCH_name = "RDY"; 
00746                   { 
00747                     char *name = MATCH_name;
00748                     unsigned rd = (MATCH_w_32_0 >> 25 & 0x1f) ;
00749                     nextPC = 4 + MATCH_p; 
00750                     
00751 #line 533 "frontend/machine/sparc/decoder.m"
00752                      
00753 
00754                             stmts = instantiate(pc,  name, DIS_RD);
00755 
00756                     
00757 
00758                     
00759                     
00760                     
00761                   }
00762                   
00763                 } 
00764                 else 
00765                   goto MATCH_label_d3;  
00766                 
00767                 break;
00768               case 41: 
00769                 MATCH_name = MATCH_name_op3_46[(MATCH_w_32_0 >> 19 & 0x3f) 
00770                       ]; 
00771                 { 
00772                   char *name = MATCH_name;
00773                   unsigned rd = (MATCH_w_32_0 >> 25 & 0x1f) ;
00774                   nextPC = 4 + MATCH_p; 
00775                   
00776 #line 536 "frontend/machine/sparc/decoder.m"
00777                    
00778 
00779                         stmts = instantiate(pc,  name, DIS_RD);
00780 
00781                   
00782 
00783                   
00784                   
00785                   
00786                 }
00787                 
00788                 break;
00789               case 42: 
00790                 MATCH_name = MATCH_name_op3_46[(MATCH_w_32_0 >> 19 & 0x3f) 
00791                       ]; 
00792                 { 
00793                   char *name = MATCH_name;
00794                   unsigned rd = (MATCH_w_32_0 >> 25 & 0x1f) ;
00795                   nextPC = 4 + MATCH_p; 
00796                   
00797 #line 539 "frontend/machine/sparc/decoder.m"
00798                    
00799 
00800                         stmts = instantiate(pc,  name, DIS_RD);
00801 
00802                   
00803 
00804                   
00805                   
00806                   
00807                 }
00808                 
00809                 break;
00810               case 43: 
00811                 MATCH_name = MATCH_name_op3_46[(MATCH_w_32_0 >> 19 & 0x3f) 
00812                       ]; 
00813                 { 
00814                   char *name = MATCH_name;
00815                   unsigned rd = (MATCH_w_32_0 >> 25 & 0x1f) ;
00816                   nextPC = 4 + MATCH_p; 
00817                   
00818 #line 542 "frontend/machine/sparc/decoder.m"
00819                    
00820 
00821                         stmts = instantiate(pc,  name, DIS_RD);
00822 
00823                   
00824 
00825                   
00826                   
00827                   
00828                 }
00829                 
00830                 break;
00831               case 48: 
00832                 if (1 <= (MATCH_w_32_0 >> 25 & 0x1f)  && 
00833                   (MATCH_w_32_0 >> 25 & 0x1f)  < 32) 
00834                   goto MATCH_label_d3;  
00835                 else { 
00836                   MATCH_name = "WRY"; 
00837                   { 
00838                     char *name = MATCH_name;
00839                     unsigned roi = addressToPC(MATCH_p);
00840                     unsigned rs1 = (MATCH_w_32_0 >> 14 & 0x1f) ;
00841                     nextPC = 4 + MATCH_p; 
00842                     
00843 #line 545 "frontend/machine/sparc/decoder.m"
00844                      
00845 
00846                             stmts = instantiate(pc,  name, DIS_RS1, DIS_ROI);
00847 
00848                     
00849 
00850                     
00851                     
00852                     
00853                   }
00854                   
00855                 } 
00856                 
00857                 break;
00858               case 49: 
00859                 MATCH_name = "WRPSR"; 
00860                 { 
00861                   char *name = MATCH_name;
00862                   unsigned roi = addressToPC(MATCH_p);
00863                   unsigned rs1 = (MATCH_w_32_0 >> 14 & 0x1f) ;
00864                   nextPC = 4 + MATCH_p; 
00865                   
00866 #line 548 "frontend/machine/sparc/decoder.m"
00867                    
00868 
00869                         stmts = instantiate(pc,  name, DIS_RS1, DIS_ROI);
00870 
00871                   
00872 
00873                   
00874                   
00875                   
00876                 }
00877                 
00878                 break;
00879               case 50: 
00880                 MATCH_name = "WRWIM"; 
00881                 { 
00882                   char *name = MATCH_name;
00883                   unsigned roi = addressToPC(MATCH_p);
00884                   unsigned rs1 = (MATCH_w_32_0 >> 14 & 0x1f) ;
00885                   nextPC = 4 + MATCH_p; 
00886                   
00887 #line 551 "frontend/machine/sparc/decoder.m"
00888                    
00889 
00890                         stmts = instantiate(pc,  name, DIS_RS1, DIS_ROI);
00891 
00892                   
00893 
00894                   
00895                   
00896                   
00897                 }
00898                 
00899                 break;
00900               case 51: 
00901                 MATCH_name = "WRTBR"; 
00902                 { 
00903                   char *name = MATCH_name;
00904                   unsigned roi = addressToPC(MATCH_p);
00905                   unsigned rs1 = (MATCH_w_32_0 >> 14 & 0x1f) ;
00906                   nextPC = 4 + MATCH_p; 
00907                   
00908 #line 554 "frontend/machine/sparc/decoder.m"
00909                    
00910 
00911                         stmts = instantiate(pc,  name, DIS_RS1, DIS_ROI);
00912 
00913                   
00914 
00915                   
00916                   
00917                   
00918                 }
00919                 
00920                 break;
00921               case 52: 
00922                 if (80 <= (MATCH_w_32_0 >> 5 & 0x1ff)  && 
00923                   (MATCH_w_32_0 >> 5 & 0x1ff)  < 196 || 
00924                   212 <= (MATCH_w_32_0 >> 5 & 0x1ff)  && 
00925                   (MATCH_w_32_0 >> 5 & 0x1ff)  < 512) 
00926                   goto MATCH_label_d3;  
00927                 else 
00928                   switch((MATCH_w_32_0 >> 5 & 0x1ff) ) {
00929                     case 0: case 2: case 3: case 4: case 6: case 7: case 8: 
00930                     case 10: case 11: case 12: case 13: case 14: case 15: 
00931                     case 16: case 17: case 18: case 19: case 20: case 21: 
00932                     case 22: case 23: case 24: case 25: case 26: case 27: 
00933                     case 28: case 29: case 30: case 31: case 32: case 33: 
00934                     case 34: case 35: case 36: case 37: case 38: case 39: 
00935                     case 40: case 44: case 45: case 46: case 47: case 48: 
00936                     case 49: case 50: case 51: case 52: case 53: case 54: 
00937                     case 55: case 56: case 57: case 58: case 59: case 60: 
00938                     case 61: case 62: case 63: case 64: case 68: case 72: 
00939                     case 76: case 197: case 202: case 207: case 208: 
00940                       goto MATCH_label_d3; break;
00941                     case 1: case 5: case 9: case 41: 
00942                       MATCH_name = 
00943                         MATCH_name_opf_51[(MATCH_w_32_0 >> 5 & 0x1ff) 
00944                             ]; 
00945                       { 
00946                         char *name = MATCH_name;
00947                         unsigned fds = 
00948                           (MATCH_w_32_0 >> 25 & 0x1f) ;
00949                         unsigned fs2s = (MATCH_w_32_0 & 0x1f) ;
00950                         nextPC = 4 + MATCH_p; 
00951                         
00952 #line 560 "frontend/machine/sparc/decoder.m"
00953                          
00954 
00955                                 stmts = instantiate(pc,  name, DIS_FS2S, DIS_FDS);
00956 
00957                         
00958 
00959                         
00960                         
00961                         
00962                       }
00963                       
00964                       break;
00965                     case 42: 
00966                       MATCH_name = 
00967                         MATCH_name_opf_51[(MATCH_w_32_0 >> 5 & 0x1ff) 
00968                             ]; 
00969                       { 
00970                         char *name = MATCH_name;
00971                         unsigned fdd = 
00972                           (MATCH_w_32_0 >> 25 & 0x1f) ;
00973                         unsigned fs2d = (MATCH_w_32_0 & 0x1f) ;
00974                         nextPC = 4 + MATCH_p; 
00975                         
00976 #line 611 "frontend/machine/sparc/decoder.m"
00977                         
00978 
00979                                 stmts = instantiate(pc, name, DIS_FS2D, DIS_FDD);
00980 
00981                         
00982 
00983                         
00984                         
00985                         
00986                       }
00987                       
00988                       break;
00989                     case 43: 
00990                       MATCH_name = 
00991                         MATCH_name_opf_51[(MATCH_w_32_0 >> 5 & 0x1ff) 
00992                             ]; 
00993                       { 
00994                         char *name = MATCH_name;
00995                         unsigned fdq = 
00996                           (MATCH_w_32_0 >> 25 & 0x1f) ;
00997                         unsigned fs2q = (MATCH_w_32_0 & 0x1f) ;
00998                         nextPC = 4 + MATCH_p; 
00999                         
01000 #line 614 "frontend/machine/sparc/decoder.m"
01001                         
01002 
01003                                 stmts = instantiate(pc, name, DIS_FS2Q, DIS_FDQ);
01004 
01005                         
01006 
01007                         
01008 
01009                             
01010 
01011                             
01012 
01013                         
01014                         
01015                         
01016                       }
01017                       
01018                       break;
01019                     case 65: case 69: case 73: case 77: 
01020                       MATCH_name = 
01021                         MATCH_name_opf_51[(MATCH_w_32_0 >> 5 & 0x1ff) 
01022                             ]; 
01023                       { 
01024                         char *name = MATCH_name;
01025                         unsigned fds = 
01026                           (MATCH_w_32_0 >> 25 & 0x1f) ;
01027                         unsigned fs1s = 
01028                           (MATCH_w_32_0 >> 14 & 0x1f) ;
01029                         unsigned fs2s = (MATCH_w_32_0 & 0x1f) ;
01030                         nextPC = 4 + MATCH_p; 
01031                         
01032 #line 563 "frontend/machine/sparc/decoder.m"
01033                          
01034 
01035                                 stmts = instantiate(pc,  name, DIS_FS1S, DIS_FS2S, DIS_FDS);
01036 
01037                          
01038 
01039                         
01040                         
01041                         
01042                       }
01043                       
01044                       break;
01045                     case 66: case 70: case 74: case 78: 
01046                       MATCH_name = 
01047                         MATCH_name_opf_51[(MATCH_w_32_0 >> 5 & 0x1ff) 
01048                             ]; 
01049                       { 
01050                         char *name = MATCH_name;
01051                         unsigned fdd = 
01052                           (MATCH_w_32_0 >> 25 & 0x1f) ;
01053                         unsigned fs1d = 
01054                           (MATCH_w_32_0 >> 14 & 0x1f) ;
01055                         unsigned fs2d = (MATCH_w_32_0 & 0x1f) ;
01056                         nextPC = 4 + MATCH_p; 
01057                         
01058 #line 566 "frontend/machine/sparc/decoder.m"
01059                          
01060 
01061                                 stmts = instantiate(pc,  name, DIS_FS1D, DIS_FS2D, DIS_FDD);
01062 
01063                          
01064 
01065                         
01066                         
01067                         
01068                       }
01069                       
01070                       break;
01071                     case 67: case 71: case 75: case 79: 
01072                       MATCH_name = 
01073                         MATCH_name_opf_51[(MATCH_w_32_0 >> 5 & 0x1ff) 
01074                             ]; 
01075                       { 
01076                         char *name = MATCH_name;
01077                         unsigned fdq = 
01078                           (MATCH_w_32_0 >> 25 & 0x1f) ;
01079                         unsigned fs1q = 
01080                           (MATCH_w_32_0 >> 14 & 0x1f) ;
01081                         unsigned fs2q = (MATCH_w_32_0 & 0x1f) ;
01082                         nextPC = 4 + MATCH_p; 
01083                         
01084 #line 569 "frontend/machine/sparc/decoder.m"
01085                          
01086 
01087                                 stmts = instantiate(pc,  name, DIS_FS1Q, DIS_FS2Q, DIS_FDQ);
01088 
01089                          
01090 
01091                         
01092                         
01093                         
01094                       }
01095                       
01096                       break;
01097                     case 196: case 209: 
01098                       MATCH_name = 
01099                         MATCH_name_opf_51[(MATCH_w_32_0 >> 5 & 0x1ff) 
01100                             ]; 
01101                       { 
01102                         char *name = MATCH_name;
01103                         unsigned fds = 
01104                           (MATCH_w_32_0 >> 25 & 0x1f) ;
01105                         unsigned fs2s = (MATCH_w_32_0 & 0x1f) ;
01106                         nextPC = 4 + MATCH_p; 
01107                         
01108 #line 581 "frontend/machine/sparc/decoder.m"
01109                         
01110 
01111                                 stmts = instantiate(pc, name, DIS_FS2S, DIS_FDS);
01112 
01113                         
01114 
01115                             
01116 
01117                         
01118                         
01119                         
01120                       }
01121                       
01122                       break;
01123                     case 198: 
01124                       MATCH_name = 
01125                         MATCH_name_opf_51[(MATCH_w_32_0 >> 5 & 0x1ff) 
01126                             ]; 
01127                       { 
01128                         char *name = MATCH_name;
01129                         unsigned fds = 
01130                           (MATCH_w_32_0 >> 25 & 0x1f) ;
01131                         unsigned fs2d = (MATCH_w_32_0 & 0x1f) ;
01132                         nextPC = 4 + MATCH_p; 
01133                         
01134 #line 597 "frontend/machine/sparc/decoder.m"
01135                         
01136 
01137                                 stmts = instantiate(pc, name, DIS_FS2D, DIS_FDS);
01138 
01139                         
01140 
01141                         
01142                         
01143                         
01144                       }
01145                       
01146                       break;
01147                     case 199: 
01148                       MATCH_name = 
01149                         MATCH_name_opf_51[(MATCH_w_32_0 >> 5 & 0x1ff) 
01150                             ]; 
01151                       { 
01152                         char *name = MATCH_name;
01153                         unsigned fds = 
01154                           (MATCH_w_32_0 >> 25 & 0x1f) ;
01155                         unsigned fs2q = (MATCH_w_32_0 & 0x1f) ;
01156                         nextPC = 4 + MATCH_p; 
01157                         
01158 #line 602 "frontend/machine/sparc/decoder.m"
01159                         
01160 
01161                                 stmts = instantiate(pc, name, DIS_FS2Q, DIS_FDS);
01162 
01163                         
01164 
01165                         
01166                         
01167                         
01168                       }
01169                       
01170                       break;
01171                     case 200: 
01172                       MATCH_name = 
01173                         MATCH_name_opf_51[(MATCH_w_32_0 >> 5 & 0x1ff) 
01174                             ]; 
01175                       { 
01176                         char *name = MATCH_name;
01177                         unsigned fdd = 
01178                           (MATCH_w_32_0 >> 25 & 0x1f) ;
01179                         unsigned fs2s = (MATCH_w_32_0 & 0x1f) ;
01180                         nextPC = 4 + MATCH_p; 
01181                         
01182 #line 584 "frontend/machine/sparc/decoder.m"
01183                         
01184 
01185                                 stmts = instantiate(pc, name, DIS_FS2S, DIS_FDD);
01186 
01187                         
01188                         
01189                         
01190                       }
01191                       
01192                       break;
01193                     case 201: 
01194                       MATCH_name = 
01195                         MATCH_name_opf_51[(MATCH_w_32_0 >> 5 & 0x1ff) 
01196                             ]; 
01197                       { 
01198                         char *name = MATCH_name;
01199                         unsigned fdd = 
01200                           (MATCH_w_32_0 >> 25 & 0x1f) ;
01201                         unsigned fs2s = (MATCH_w_32_0 & 0x1f) ;
01202                         nextPC = 4 + MATCH_p; 
01203                         
01204 #line 594 "frontend/machine/sparc/decoder.m"
01205                         
01206 
01207                                 stmts = instantiate(pc, name, DIS_FS2S, DIS_FDD);
01208 
01209                         
01210                         
01211                         
01212                       }
01213                       
01214                       break;
01215                     case 203: 
01216                       MATCH_name = 
01217                         MATCH_name_opf_51[(MATCH_w_32_0 >> 5 & 0x1ff) 
01218                             ]; 
01219                       { 
01220                         char *name = MATCH_name;
01221                         unsigned fdd = 
01222                           (MATCH_w_32_0 >> 25 & 0x1f) ;
01223                         unsigned fs2q = (MATCH_w_32_0 & 0x1f) ;
01224                         nextPC = 4 + MATCH_p; 
01225                         
01226 #line 607 "frontend/machine/sparc/decoder.m"
01227                         
01228 
01229                                 stmts = instantiate(pc, name, DIS_FS2Q, DIS_FDD);
01230 
01231                         
01232 
01233                         
01234 
01235                         
01236                         
01237                         
01238                       }
01239                       
01240                       break;
01241                     case 204: 
01242                       MATCH_name = 
01243                         MATCH_name_opf_51[(MATCH_w_32_0 >> 5 & 0x1ff) 
01244                             ]; 
01245                       { 
01246                         char *name = MATCH_name;
01247                         unsigned fdq = 
01248                           (MATCH_w_32_0 >> 25 & 0x1f) ;
01249                         unsigned fs2s = (MATCH_w_32_0 & 0x1f) ;
01250                         nextPC = 4 + MATCH_p; 
01251                         
01252 #line 589 "frontend/machine/sparc/decoder.m"
01253                         
01254 
01255                                 stmts = instantiate(pc, name, DIS_FS2S, DIS_FDQ);
01256 
01257                         
01258                         
01259                         
01260                       }
01261                       
01262                       break;
01263                     case 205: 
01264                       MATCH_name = 
01265                         MATCH_name_opf_51[(MATCH_w_32_0 >> 5 & 0x1ff) 
01266                             ]; 
01267                       { 
01268                         char *name = MATCH_name;
01269                         unsigned fdq = 
01270                           (MATCH_w_32_0 >> 25 & 0x1f) ;
01271                         unsigned fs2s = (MATCH_w_32_0 & 0x1f) ;
01272                         nextPC = 4 + MATCH_p; 
01273                         
01274 #line 599 "frontend/machine/sparc/decoder.m"
01275                         
01276 
01277                                 stmts = instantiate(pc, name, DIS_FS2S, DIS_FDQ);
01278 
01279                         
01280                         
01281                         
01282                       }
01283                       
01284                       break;
01285                     case 206: 
01286                       MATCH_name = 
01287                         MATCH_name_opf_51[(MATCH_w_32_0 >> 5 & 0x1ff) 
01288                             ]; 
01289                       { 
01290                         char *name = MATCH_name;
01291                         unsigned fdq = 
01292                           (MATCH_w_32_0 >> 25 & 0x1f) ;
01293                         unsigned fs2d = (MATCH_w_32_0 & 0x1f) ;
01294                         nextPC = 4 + MATCH_p; 
01295                         
01296 #line 604 "frontend/machine/sparc/decoder.m"
01297                         
01298 
01299                                 stmts = instantiate(pc, name, DIS_FS2D, DIS_FDQ);
01300 
01301                         
01302                         
01303                         
01304                       }
01305                       
01306                       break;
01307                     case 210: 
01308                       MATCH_name = 
01309                         MATCH_name_opf_51[(MATCH_w_32_0 >> 5 & 0x1ff) 
01310                             ]; 
01311                       { 
01312                         char *name = MATCH_name;
01313                         unsigned fds = 
01314                           (MATCH_w_32_0 >> 25 & 0x1f) ;
01315                         unsigned fs2d = (MATCH_w_32_0 & 0x1f) ;
01316                         nextPC = 4 + MATCH_p; 
01317                         
01318 #line 587 "frontend/machine/sparc/decoder.m"
01319                         
01320 
01321                                 stmts = instantiate(pc, name, DIS_FS2D, DIS_FDS);
01322 
01323                         
01324 
01325                         
01326                         
01327                         
01328                       }
01329                       
01330                       break;
01331                     case 211: 
01332                       MATCH_name = 
01333                         MATCH_name_opf_51[(MATCH_w_32_0 >> 5 & 0x1ff) 
01334                             ]; 
01335                       { 
01336                         char *name = MATCH_name;
01337                         unsigned fds = 
01338                           (MATCH_w_32_0 >> 25 & 0x1f) ;
01339                         unsigned fs2q = (MATCH_w_32_0 & 0x1f) ;
01340                         nextPC = 4 + MATCH_p; 
01341                         
01342 #line 592 "frontend/machine/sparc/decoder.m"
01343                         
01344 
01345                                 stmts = instantiate(pc, name, DIS_FS2Q, DIS_FDS);
01346 
01347                         
01348 
01349                         
01350                         
01351                         
01352                       }
01353                       
01354                       break;
01355                     default: assert(0);
01356                   }  
01357                 break;
01358               case 53: 
01359                 if (0 <= (MATCH_w_32_0 >> 5 & 0x1ff)  && 
01360                   (MATCH_w_32_0 >> 5 & 0x1ff)  < 81 || 
01361                   88 <= (MATCH_w_32_0 >> 5 & 0x1ff)  && 
01362                   (MATCH_w_32_0 >> 5 & 0x1ff)  < 512) 
01363                   goto MATCH_label_d3;  
01364                 else 
01365                   switch((MATCH_w_32_0 >> 5 & 0x1ff) ) {
01366                     case 84: 
01367                       goto MATCH_label_d3; break;
01368                     case 81: case 85: 
01369                       MATCH_name = 
01370                         MATCH_name_opf_51[(MATCH_w_32_0 >> 5 & 0x1ff) 
01371                             ]; 
01372                       { 
01373                         char *name = MATCH_name;
01374                         unsigned fs1s = 
01375                           (MATCH_w_32_0 >> 14 & 0x1f) ;
01376                         unsigned fs2s = (MATCH_w_32_0 & 0x1f) ;
01377                         nextPC = 4 + MATCH_p; 
01378                         
01379 #line 572 "frontend/machine/sparc/decoder.m"
01380                          
01381 
01382                                 stmts = instantiate(pc,  name, DIS_FS1S, DIS_FS2S);
01383 
01384                         
01385 
01386                         
01387                         
01388                         
01389                       }
01390                       
01391                       break;
01392                     case 82: case 86: 
01393                       MATCH_name = 
01394                         MATCH_name_opf_51[(MATCH_w_32_0 >> 5 & 0x1ff) 
01395                             ]; 
01396                       { 
01397                         char *name = MATCH_name;
01398                         unsigned fs1d = 
01399                           (MATCH_w_32_0 >> 14 & 0x1f) ;
01400                         unsigned fs2d = (MATCH_w_32_0 & 0x1f) ;
01401                         nextPC = 4 + MATCH_p; 
01402                         
01403 #line 575 "frontend/machine/sparc/decoder.m"
01404                          
01405 
01406                                 stmts = instantiate(pc,  name, DIS_FS1D, DIS_FS2D);
01407 
01408                         
01409 
01410                         
01411                         
01412                         
01413                       }
01414                       
01415                       break;
01416                     case 83: case 87: 
01417                       MATCH_name = 
01418                         MATCH_name_opf_51[(MATCH_w_32_0 >> 5 & 0x1ff) 
01419                             ]; 
01420                       { 
01421                         char *name = MATCH_name;
01422                         unsigned fs1q = 
01423                           (MATCH_w_32_0 >> 14 & 0x1f) ;
01424                         unsigned fs2q = (MATCH_w_32_0 & 0x1f) ;
01425                         nextPC = 4 + MATCH_p; 
01426                         
01427 #line 578 "frontend/machine/sparc/decoder.m"
01428                          
01429 
01430                                 stmts = instantiate(pc,  name, DIS_FS1Q, DIS_FS2Q);
01431 
01432                         
01433 
01434                         
01435                         
01436                         
01437                       }
01438                       
01439                       break;
01440                     default: assert(0);
01441                   }  
01442                 break;
01443               case 56: 
01444                 if ((MATCH_w_32_0 >> 13 & 0x1)  == 1) 
01445                   
01446                     switch((MATCH_w_32_0 >> 25 & 0x1f) ) {
01447                       case 0: 
01448                         
01449                           switch((MATCH_w_32_0 >> 14 & 0x1f) ) {
01450                             case 0: case 1: case 2: case 3: case 4: case 5: 
01451                             case 6: case 7: case 8: case 9: case 10: case 11: 
01452                             case 12: case 13: case 14: case 16: case 17: 
01453                             case 18: case 19: case 20: case 21: case 22: 
01454                             case 23: case 24: case 25: case 26: case 27: 
01455                             case 28: case 29: case 30: 
01456                               goto MATCH_label_d6; break;
01457                             case 15: 
01458                               if ((MATCH_w_32_0 & 0x1fff) 
01459                                        == 8) { 
01460                                 nextPC = 4 + MATCH_p; 
01461                                 
01462 #line 262 "frontend/machine/sparc/decoder.m"
01463                                 
01464 
01465                                         
01466 
01467 
01468 
01469 
01470 
01471                                         result.rtl = new RTL(pc, stmts);
01472 
01473                                         result.rtl->appendStmt(new ReturnStatement);
01474 
01475                                         result.type = DD;
01476 
01477                                         SHOW_ASM("retl_")
01478 
01479                                         DEBUG_STMTS
01480 
01481                                 
01482 
01483                                 
01484                                 
01485                                 
01486                               } 
01487                               else 
01488                                 goto MATCH_label_d6;  
01489                               
01490                               break;
01491                             case 31: 
01492                               if ((MATCH_w_32_0 & 0x1fff) 
01493                                        == 8) { 
01494                                 nextPC = 4 + MATCH_p; 
01495                                 
01496 #line 252 "frontend/machine/sparc/decoder.m"
01497                                 
01498 
01499                                         
01500 
01501 
01502 
01503 
01504 
01505                                         result.rtl = new RTL(pc, stmts);
01506 
01507                                         result.rtl->appendStmt(new ReturnStatement);
01508 
01509                                         result.type = DD;
01510 
01511                                         SHOW_ASM("ret_")
01512 
01513                                         DEBUG_STMTS
01514 
01515                                 
01516 
01517                                 
01518                                 
01519                                 
01520                               } 
01521                               else 
01522                                 goto MATCH_label_d6;  
01523                               
01524                               break;
01525                             default: assert(0);
01526                           }  
01527                         break;
01528                       case 1: case 2: case 3: case 4: case 5: case 6: case 7: 
01529                       case 8: case 9: case 10: case 11: case 12: case 13: 
01530                       case 14: case 16: case 17: case 18: case 19: case 20: 
01531                       case 21: case 22: case 23: case 24: case 25: case 26: 
01532                       case 27: case 28: case 29: case 30: case 31: 
01533                         goto MATCH_label_d6; break;
01534                       case 15: 
01535                         goto MATCH_label_d7; break;
01536                       default: assert(0);
01537                     }   
01538                 else 
01539                   if ((MATCH_w_32_0 >> 25 & 0x1f)  == 15) 
01540                     goto MATCH_label_d7;  
01541                   else 
01542                     goto MATCH_label_d6;   
01543                 break;
01544               case 57: 
01545                 MATCH_name = "RETURN"; 
01546                 { 
01547                   char *name = MATCH_name;
01548                   unsigned addr = addressToPC(MATCH_p);
01549                   nextPC = 4 + MATCH_p; 
01550                   
01551 #line 620 "frontend/machine/sparc/decoder.m"
01552                    
01553 
01554                         stmts = instantiate(pc, name, DIS_ADDR);
01555 
01556                         result.rtl = new RTL(pc, stmts);
01557 
01558                         result.rtl->appendStmt(new ReturnStatement);
01559 
01560                         result.type = DD;
01561 
01562                   
01563 
01564                   
01565                   
01566                   
01567                 }
01568                 
01569                 break;
01570               case 58: 
01571                 if (0 <= (MATCH_w_32_0 >> 13 & 0x1)  && 
01572                   (MATCH_w_32_0 >> 13 & 0x1)  < 2 && 
01573                   (MATCH_w_32_0 >> 25 & 0xf)  == 8) { 
01574                   MATCH_name = MATCH_name_cond_8[(MATCH_w_32_0 >> 25 & 0xf) 
01575                         ]; 
01576                   goto MATCH_label_d8; 
01577                   
01578                 } 
01579                 else { 
01580                   MATCH_name = MATCH_name_cond_53[(MATCH_w_32_0 >> 25 & 0xf) 
01581                         ]; 
01582                   goto MATCH_label_d8; 
01583                   
01584                 } 
01585                 
01586                 break;
01587               case 60: 
01588                 { 
01589                   unsigned rd = (MATCH_w_32_0 >> 25 & 0x1f) ;
01590                   unsigned roi = addressToPC(MATCH_p);
01591                   unsigned rs1 = (MATCH_w_32_0 >> 14 & 0x1f) ;
01592                   nextPC = 4 + MATCH_p; 
01593                   
01594 #line 471 "frontend/machine/sparc/decoder.m"
01595                   
01596 
01597                         
01598 
01599                         
01600 
01601                         
01602 
01603                         stmts = instantiate(pc, "SAVE", DIS_RS1, DIS_ROI, DIS_RD);
01604 
01605                   
01606 
01607                   
01608                   
01609                   
01610                 }
01611                 
01612                 break;
01613               case 61: 
01614                 { 
01615                   unsigned rd = (MATCH_w_32_0 >> 25 & 0x1f) ;
01616                   unsigned roi = addressToPC(MATCH_p);
01617                   unsigned rs1 = (MATCH_w_32_0 >> 14 & 0x1f) ;
01618                   nextPC = 4 + MATCH_p; 
01619                   
01620 #line 477 "frontend/machine/sparc/decoder.m"
01621                   
01622 
01623                         
01624 
01625                         stmts = instantiate(pc, "RESTORE", DIS_RS1, DIS_ROI, DIS_RD);
01626 
01627                   
01628 
01629                   
01630                   
01631                   
01632                 }
01633                 
01634                 break;
01635               default: assert(0);
01636             }  
01637           break;
01638         case 3: 
01639           
01640             switch((MATCH_w_32_0 >> 19 & 0x3f) ) {
01641               case 0: 
01642                 MATCH_name = "LD"; goto MATCH_label_d9; break;
01643               case 1: 
01644                 MATCH_name = "LDUB"; goto MATCH_label_d9; break;
01645               case 2: 
01646                 MATCH_name = "LDUH"; goto MATCH_label_d9; break;
01647               case 3: 
01648                 MATCH_name = "LDD"; goto MATCH_label_d9; break;
01649               case 4: 
01650                 MATCH_name = "ST"; goto MATCH_label_d10; break;
01651               case 5: 
01652                 MATCH_name = "STB"; goto MATCH_label_d10; break;
01653               case 6: 
01654                 MATCH_name = "STH"; goto MATCH_label_d10; break;
01655               case 7: 
01656                 MATCH_name = "STD"; goto MATCH_label_d10; break;
01657               case 8: case 11: case 12: case 14: case 24: case 27: case 28: 
01658               case 30: case 34: case 40: case 41: case 42: case 43: case 44: 
01659               case 45: case 46: case 47: case 48: case 50: case 51: case 52: 
01660               case 55: case 56: case 57: case 58: case 59: case 60: case 61: 
01661               case 62: case 63: 
01662                 goto MATCH_label_d3; break;
01663               case 9: 
01664                 MATCH_name = "LDSB"; goto MATCH_label_d9; break;
01665               case 10: 
01666                 MATCH_name = "LDSH"; goto MATCH_label_d9; break;
01667               case 13: 
01668                 MATCH_name = "LDSTUB"; goto MATCH_label_d9; break;
01669               case 15: 
01670                 MATCH_name = "SWAP."; goto MATCH_label_d9; break;
01671               case 16: 
01672                 if ((MATCH_w_32_0 >> 13 & 0x1)  == 0) { 
01673                   MATCH_name = 
01674                     MATCH_name_i_66[(MATCH_w_32_0 >> 13 & 0x1) ]; 
01675                   goto MATCH_label_d11; 
01676                   
01677                 } 
01678                 else 
01679                   goto MATCH_label_d3;  
01680                 
01681                 break;
01682               case 17: 
01683                 if ((MATCH_w_32_0 >> 13 & 0x1)  == 0) { 
01684                   MATCH_name = 
01685                     MATCH_name_i_67[(MATCH_w_32_0 >> 13 & 0x1) ]; 
01686                   goto MATCH_label_d11; 
01687                   
01688                 } 
01689                 else 
01690                   goto MATCH_label_d3;  
01691                 
01692                 break;
01693               case 18: 
01694                 if ((MATCH_w_32_0 >> 13 & 0x1)  == 0) { 
01695                   MATCH_name = 
01696                     MATCH_name_i_68[(MATCH_w_32_0 >> 13 & 0x1) ]; 
01697                   goto MATCH_label_d11; 
01698                   
01699                 } 
01700                 else 
01701                   goto MATCH_label_d3;  
01702                 
01703                 break;
01704               case 19: 
01705                 if ((MATCH_w_32_0 >> 13 & 0x1)  == 0) { 
01706                   MATCH_name = 
01707                     MATCH_name_i_69[(MATCH_w_32_0 >> 13 & 0x1) ]; 
01708                   goto MATCH_label_d11; 
01709                   
01710                 } 
01711                 else 
01712                   goto MATCH_label_d3;  
01713                 
01714                 break;
01715               case 20: 
01716                 if ((MATCH_w_32_0 >> 13 & 0x1)  == 0) { 
01717                   MATCH_name = 
01718                     MATCH_name_i_70[(MATCH_w_32_0 >> 13 & 0x1) ]; 
01719                   goto MATCH_label_d12; 
01720                   
01721                 } 
01722                 else 
01723                   goto MATCH_label_d3;  
01724                 
01725                 break;
01726               case 21: 
01727                 if ((MATCH_w_32_0 >> 13 & 0x1)  == 0) { 
01728                   MATCH_name = 
01729                     MATCH_name_i_71[(MATCH_w_32_0 >> 13 & 0x1) ]; 
01730                   goto MATCH_label_d12; 
01731                   
01732                 } 
01733                 else 
01734                   goto MATCH_label_d3;  
01735                 
01736                 break;
01737               case 22: 
01738                 if ((MATCH_w_32_0 >> 13 & 0x1)  == 0) { 
01739                   MATCH_name = 
01740                     MATCH_name_i_72[(MATCH_w_32_0 >> 13 & 0x1) ]; 
01741                   goto MATCH_label_d12; 
01742                   
01743                 } 
01744                 else 
01745                   goto MATCH_label_d3;  
01746                 
01747                 break;
01748               case 23: 
01749                 if ((MATCH_w_32_0 >> 13 & 0x1)  == 0) { 
01750                   MATCH_name = 
01751                     MATCH_name_i_73[(MATCH_w_32_0 >> 13 & 0x1) ]; 
01752                   goto MATCH_label_d12; 
01753                   
01754                 } 
01755                 else 
01756                   goto MATCH_label_d3;  
01757                 
01758                 break;
01759               case 25: 
01760                 if ((MATCH_w_32_0 >> 13 & 0x1)  == 0) { 
01761                   MATCH_name = 
01762                     MATCH_name_i_74[(MATCH_w_32_0 >> 13 & 0x1) ]; 
01763                   goto MATCH_label_d11; 
01764                   
01765                 } 
01766                 else 
01767                   goto MATCH_label_d3;  
01768                 
01769                 break;
01770               case 26: 
01771                 if ((MATCH_w_32_0 >> 13 & 0x1)  == 0) { 
01772                   MATCH_name = 
01773                     MATCH_name_i_75[(MATCH_w_32_0 >> 13 & 0x1) ]; 
01774                   goto MATCH_label_d11; 
01775                   
01776                 } 
01777                 else 
01778                   goto MATCH_label_d3;  
01779                 
01780                 break;
01781               case 29: 
01782                 if ((MATCH_w_32_0 >> 13 & 0x1)  == 0) { 
01783                   MATCH_name = "LDSTUBA"; 
01784                   goto MATCH_label_d11; 
01785                   
01786                 } 
01787                 else 
01788                   goto MATCH_label_d3;  
01789                 
01790                 break;
01791               case 31: 
01792                 if ((MATCH_w_32_0 >> 13 & 0x1)  == 0) { 
01793                   MATCH_name = "SWAPA"; 
01794                   goto MATCH_label_d11; 
01795                   
01796                 } 
01797                 else 
01798                   goto MATCH_label_d3;  
01799                 
01800                 break;
01801               case 32: 
01802                 if ((MATCH_w_32_0 >> 13 & 0x1)  == 1) { 
01803                   MATCH_name = 
01804                     MATCH_name_i_66[(MATCH_w_32_0 >> 13 & 0x1) ]; 
01805                   goto MATCH_label_d13; 
01806                   
01807                 } 
01808                 else { 
01809                   MATCH_name = "LDF"; 
01810                   goto MATCH_label_d13; 
01811                   
01812                 } 
01813                 
01814                 break;
01815               case 33: 
01816                 if ((MATCH_w_32_0 >> 13 & 0x1)  == 1) { 
01817                   MATCH_name = 
01818                     MATCH_name_i_67[(MATCH_w_32_0 >> 13 & 0x1) ]; 
01819                   goto MATCH_label_d14; 
01820                   
01821                 } 
01822                 else { 
01823                   MATCH_name = "LDFSR"; 
01824                   goto MATCH_label_d14; 
01825                   
01826                 } 
01827                 
01828                 break;
01829               case 35: 
01830                 if ((MATCH_w_32_0 >> 13 & 0x1)  == 1) { 
01831                   MATCH_name = 
01832                     MATCH_name_i_68[(MATCH_w_32_0 >> 13 & 0x1) ]; 
01833                   goto MATCH_label_d15; 
01834                   
01835                 } 
01836                 else { 
01837                   MATCH_name = "LDDF"; 
01838                   goto MATCH_label_d15; 
01839                   
01840                 } 
01841                 
01842                 break;
01843               case 36: 
01844                 if ((MATCH_w_32_0 >> 13 & 0x1)  == 1) { 
01845                   MATCH_name = 
01846                     MATCH_name_i_69[(MATCH_w_32_0 >> 13 & 0x1) ]; 
01847                   goto MATCH_label_d16; 
01848                   
01849                 } 
01850                 else { 
01851                   MATCH_name = "STF"; 
01852                   goto MATCH_label_d16; 
01853                   
01854                 } 
01855                 
01856                 break;
01857               case 37: 
01858                 if ((MATCH_w_32_0 >> 13 & 0x1)  == 1) { 
01859                   MATCH_name = 
01860                     MATCH_name_i_70[(MATCH_w_32_0 >> 13 & 0x1) ]; 
01861                   goto MATCH_label_d17; 
01862                   
01863                 } 
01864                 else { 
01865                   MATCH_name = "STFSR"; 
01866                   goto MATCH_label_d17; 
01867                   
01868                 } 
01869                 
01870                 break;
01871               case 38: 
01872                 if ((MATCH_w_32_0 >> 13 & 0x1)  == 1) { 
01873                   MATCH_name = 
01874                     MATCH_name_i_71[(MATCH_w_32_0 >> 13 & 0x1) ]; 
01875                   goto MATCH_label_d18; 
01876                   
01877                 } 
01878                 else { 
01879                   MATCH_name = "STDFQ"; 
01880                   goto MATCH_label_d18; 
01881                   
01882                 } 
01883                 
01884                 break;
01885               case 39: 
01886                 if ((MATCH_w_32_0 >> 13 & 0x1)  == 1) { 
01887                   MATCH_name = 
01888                     MATCH_name_i_72[(MATCH_w_32_0 >> 13 & 0x1) ]; 
01889                   goto MATCH_label_d19; 
01890                   
01891                 } 
01892                 else { 
01893                   MATCH_name = "STDF"; 
01894                   goto MATCH_label_d19; 
01895                   
01896                 } 
01897                 
01898                 break;
01899               case 49: 
01900                 if ((MATCH_w_32_0 >> 13 & 0x1)  == 1) { 
01901                   MATCH_name = 
01902                     MATCH_name_i_73[(MATCH_w_32_0 >> 13 & 0x1) ]; 
01903                   goto MATCH_label_d20; 
01904                   
01905                 } 
01906                 else { 
01907                   MATCH_name = "LDCSR"; 
01908                   goto MATCH_label_d20; 
01909                   
01910                 } 
01911                 
01912                 break;
01913               case 53: 
01914                 if ((MATCH_w_32_0 >> 13 & 0x1)  == 1) { 
01915                   MATCH_name = 
01916                     MATCH_name_i_74[(MATCH_w_32_0 >> 13 & 0x1) ]; 
01917                   goto MATCH_label_d21; 
01918                   
01919                 } 
01920                 else { 
01921                   MATCH_name = "STCSR"; 
01922                   goto MATCH_label_d21; 
01923                   
01924                 } 
01925                 
01926                 break;
01927               case 54: 
01928                 if ((MATCH_w_32_0 >> 13 & 0x1)  == 1) { 
01929                   MATCH_name = 
01930                     MATCH_name_i_75[(MATCH_w_32_0 >> 13 & 0x1) ]; 
01931                   goto MATCH_label_d22; 
01932                   
01933                 } 
01934                 else { 
01935                   MATCH_name = "STDCQ"; 
01936                   goto MATCH_label_d22; 
01937                   
01938                 } 
01939                 
01940                 break;
01941               default: assert(0);
01942             }  
01943           break;
01944         default: assert(0);
01945       }  
01946     
01947   }goto MATCH_finished_d; 
01948   
01949   MATCH_label_d0: (void)0;  
01950     { 
01951       char *name = MATCH_name;
01952       unsigned cc01 = (MATCH_w_32_0 >> 20 & 0x3) ;
01953       unsigned tgt = 
01954         4 * sign_extend((MATCH_w_32_0 & 0x7ffff) , 19) + 
01955         addressToPC(MATCH_p);
01956       nextPC = 4 + MATCH_p; 
01957       
01958 #line 316 "frontend/machine/sparc/decoder.m"
01959        
01960 
01961             
01962 
01963 
01964 
01965 
01966 
01967       
01968 
01969             
01970 
01971             
01972 
01973             if (cc01 != 0) {        
01974 
01975                 result.valid = false;
01976 
01977                 result.rtl = new RTL;
01978 
01979                 result.numBytes = 4;
01980 
01981                 return result;
01982 
01983             }
01984 
01985             GotoStatement* jump = 0;
01986 
01987             RTL* rtl = NULL;                    
01988 
01989             if (strcmp(name,"BPA,a") == 0 || strcmp(name,"BPN,a") == 0) {
01990 
01991                 jump = new GotoStatement;
01992 
01993                 rtl = new RTL(pc, stmts);
01994 
01995                 rtl->appendStmt(jump);
01996 
01997             } else if (strcmp(name,"BPVS,a") == 0 || strcmp(name,"BPVC,a") == 0) {
01998 
01999                 jump = new GotoStatement;
02000 
02001                 rtl = new RTL(pc, stmts);
02002 
02003                 rtl->appendStmt(jump);
02004 
02005             } else {
02006 
02007                 rtl = createBranchRtl(pc, stmts, name);
02008 
02009                 jump = (GotoStatement*) rtl->getList().back();
02010 
02011             }
02012 
02013       
02014 
02015             
02016 
02017             
02018 
02019             result.type = SCDAN;
02020 
02021             if ((strcmp(name,"BPA,a") == 0) || (strcmp(name, "BPVC,a") == 0)) {
02022 
02023                 result.type = SU;
02024 
02025             } else {
02026 
02027                 result.type = SKIP;
02028 
02029             }
02030 
02031       
02032 
02033             result.rtl = rtl;
02034 
02035             jump->setDest(tgt - delta);
02036 
02037             SHOW_ASM(name << " " << std::hex << tgt-delta)
02038 
02039             DEBUG_STMTS
02040 
02041             
02042 
02043       
02044       
02045       
02046     } 
02047     goto MATCH_finished_d; 
02048     
02049   MATCH_label_d1: (void)0;  
02050     { 
02051       char *name = MATCH_name;
02052       unsigned tgt = 
02053         4 * sign_extend((MATCH_w_32_0 & 0x3fffff) , 22) + 
02054         addressToPC(MATCH_p);
02055       nextPC = 4 + MATCH_p; 
02056       
02057 #line 358 "frontend/machine/sparc/decoder.m"
02058        
02059 
02060             
02061 
02062 
02063 
02064 
02065 
02066             
02067 
02068             
02069 
02070             if (name[0] == 'C') {
02071 
02072                 result.valid = false;
02073 
02074                 result.rtl = new RTL;
02075 
02076                 result.numBytes = 4;
02077 
02078                 return result;
02079 
02080             }
02081 
02082             
02083 
02084             
02085 
02086             GotoStatement* jump = 0;
02087 
02088             RTL* rtl = NULL;
02089 
02090             if (strcmp(name,"BA") == 0 || strcmp(name,"BN") == 0) {
02091 
02092                 jump = new GotoStatement;
02093 
02094                 rtl = new RTL(pc, stmts);
02095 
02096                 rtl->appendStmt(jump);
02097 
02098             } else if (strcmp(name,"BVS") == 0 || strcmp(name,"BVC") == 0) {
02099 
02100                 jump = new GotoStatement;
02101 
02102                 rtl = new RTL(pc, stmts);
02103 
02104                 rtl->appendStmt(jump);
02105 
02106             } else {
02107 
02108                 rtl = createBranchRtl(pc, stmts, name);
02109 
02110                 jump = (BranchStatement*) rtl->getList().back();
02111 
02112             }
02113 
02114       
02115 
02116             
02117 
02118             
02119 
02120             result.type = SCD;
02121 
02122             if ((strcmp(name,"BA") == 0) || (strcmp(name, "BVC") == 0))
02123 
02124                 result.type = SD;
02125 
02126             if ((strcmp(name,"BN") == 0) || (strcmp(name, "BVS") == 0))
02127 
02128                 result.type = NCT;
02129 
02130       
02131 
02132             result.rtl = rtl;
02133 
02134             jump->setDest(tgt - delta);
02135 
02136             SHOW_ASM(name << " " << std::hex << tgt-delta)
02137 
02138             DEBUG_STMTS
02139 
02140       
02141 
02142       
02143       
02144       
02145     } 
02146     goto MATCH_finished_d; 
02147     
02148   MATCH_label_d2: (void)0;  
02149     { 
02150       char *name = MATCH_name;
02151       unsigned tgt = 
02152         4 * sign_extend((MATCH_w_32_0 & 0x3fffff) , 22) + 
02153         addressToPC(MATCH_p);
02154       nextPC = 4 + MATCH_p; 
02155       
02156 #line 272 "frontend/machine/sparc/decoder.m"
02157        
02158 
02159             
02160 
02161 
02162 
02163 
02164 
02165       
02166 
02167             
02168 
02169             
02170 
02171             if (name[0] == 'C') {
02172 
02173                 result.valid = false;
02174 
02175                 result.rtl = new RTL;
02176 
02177                 result.numBytes = 4;
02178 
02179                 return result;
02180 
02181             }
02182 
02183             
02184 
02185             
02186 
02187             GotoStatement* jump = 0;
02188 
02189             RTL* rtl = NULL;                    
02190 
02191             if (strcmp(name,"BA,a") == 0 || strcmp(name,"BN,a") == 0) {
02192 
02193                 jump = new GotoStatement;
02194 
02195                 rtl = new RTL(pc, stmts);
02196 
02197                 rtl->appendStmt(jump);
02198 
02199             } else if (strcmp(name,"BVS,a") == 0 || strcmp(name,"BVC,a") == 0) {
02200 
02201                 jump = new GotoStatement;
02202 
02203                 rtl = new RTL(pc, stmts);
02204 
02205                 rtl->appendStmt(jump);
02206 
02207             } else {
02208 
02209                 rtl = createBranchRtl(pc, stmts, name);
02210 
02211                 jump = (GotoStatement*) rtl->getList().back();
02212 
02213             }
02214 
02215       
02216 
02217             
02218 
02219             
02220 
02221             result.type = SCDAN;
02222 
02223             if ((strcmp(name,"BA,a") == 0) || (strcmp(name, "BVC,a") == 0)) {
02224 
02225                 result.type = SU;
02226 
02227             } else {
02228 
02229                 result.type = SKIP;
02230 
02231             }
02232 
02233       
02234 
02235             result.rtl = rtl;
02236 
02237             jump->setDest(tgt - delta);
02238 
02239             SHOW_ASM(name << " " << std::hex << tgt-delta)
02240 
02241             DEBUG_STMTS
02242 
02243             
02244 
02245       
02246       
02247       
02248     } 
02249     goto MATCH_finished_d; 
02250     
02251   MATCH_label_d3: (void)0;  
02252     { 
02253       unsigned n = MATCH_w_32_0 ;
02254       nextPC = 4 + MATCH_p; 
02255       
02256 #line 634 "frontend/machine/sparc/decoder.m"
02257        
02258 
02259             
02260 
02261             unused(n);
02262 
02263             result.valid = false;
02264 
02265             stmts = NULL;
02266 
02267       
02268 
02269       
02270       
02271       
02272     } 
02273     goto MATCH_finished_d; 
02274     
02275   MATCH_label_d4: (void)0;  
02276     { 
02277       unsigned imm22 = (MATCH_w_32_0 & 0x3fffff)  << 10;
02278       unsigned rd = (MATCH_w_32_0 >> 25 & 0x1f) ;
02279       nextPC = 4 + MATCH_p; 
02280       
02281 #line 485 "frontend/machine/sparc/decoder.m"
02282        
02283 
02284             stmts = instantiate(pc,  "sethi", dis_Num(imm22), DIS_RD);
02285 
02286       
02287 
02288       
02289       
02290       
02291     } 
02292     goto MATCH_finished_d; 
02293     
02294   MATCH_label_d5: (void)0;  
02295     { 
02296       char *name = MATCH_name;
02297       unsigned rd = (MATCH_w_32_0 >> 25 & 0x1f) ;
02298       unsigned roi = addressToPC(MATCH_p);
02299       unsigned rs1 = (MATCH_w_32_0 >> 14 & 0x1f) ;
02300       nextPC = 4 + MATCH_p; 
02301       
02302 #line 557 "frontend/machine/sparc/decoder.m"
02303        
02304 
02305             stmts = instantiate(pc,  name, DIS_RS1, DIS_ROI, DIS_RD);
02306 
02307       
02308 
02309       
02310       
02311       
02312     } 
02313     goto MATCH_finished_d; 
02314     
02315   MATCH_label_d6: (void)0;  
02316     { 
02317       unsigned addr = addressToPC(MATCH_p);
02318       unsigned rd = (MATCH_w_32_0 >> 25 & 0x1f) ;
02319       nextPC = 4 + MATCH_p; 
02320       
02321 #line 448 "frontend/machine/sparc/decoder.m"
02322       
02323 
02324             
02325 
02326 
02327 
02328 
02329 
02330 
02331 
02332             CaseStatement* jump = new CaseStatement;
02333 
02334             
02335 
02336             jump->setIsComputed();
02337 
02338             result.rtl = new RTL(pc, stmts);
02339 
02340             result.rtl->appendStmt(jump);
02341 
02342             result.type = DD;
02343 
02344             jump->setDest(dis_Eaddr(addr));
02345 
02346             unused(rd);
02347 
02348             SHOW_ASM("JMPL ")
02349 
02350             DEBUG_STMTS
02351 
02352       
02353 
02354       
02355 
02356         
02357 
02358         
02359 
02360         
02361 
02362         
02363 
02364         
02365 
02366       
02367 
02368       
02369       
02370       
02371     } 
02372     goto MATCH_finished_d; 
02373     
02374   MATCH_label_d7: (void)0;  
02375     { 
02376       unsigned addr = addressToPC(MATCH_p);
02377       nextPC = 4 + MATCH_p; 
02378       
02379 #line 233 "frontend/machine/sparc/decoder.m"
02380       
02381 
02382             
02383 
02384 
02385 
02386 
02387 
02388             CallStatement* newCall = new CallStatement;
02389 
02390       
02391 
02392             
02393 
02394             newCall->setIsComputed();
02395 
02396       
02397 
02398             
02399 
02400             newCall->setDest(dis_Eaddr(addr));
02401 
02402             result.rtl = new RTL(pc, stmts);
02403 
02404             result.rtl->appendStmt(newCall);
02405 
02406             result.type = DD;
02407 
02408       
02409 
02410             SHOW_ASM("call_ " << dis_Eaddr(addr))
02411 
02412             DEBUG_STMTS
02413 
02414       
02415 
02416       
02417 
02418       
02419       
02420       
02421     } 
02422     goto MATCH_finished_d; 
02423     
02424   MATCH_label_d8: (void)0;  
02425     { 
02426       char *name = MATCH_name;
02427       unsigned addr = addressToPC(MATCH_p);
02428       nextPC = 4 + MATCH_p; 
02429       
02430 #line 626 "frontend/machine/sparc/decoder.m"
02431        
02432 
02433             stmts = instantiate(pc,  name, DIS_ADDR);
02434 
02435       
02436 
02437       
02438       
02439       
02440     } 
02441     goto MATCH_finished_d; 
02442     
02443   MATCH_label_d9: (void)0;  
02444     { 
02445       char *name = MATCH_name;
02446       unsigned addr = addressToPC(MATCH_p);
02447       unsigned rd = (MATCH_w_32_0 >> 25 & 0x1f) ;
02448       nextPC = 4 + MATCH_p; 
02449       
02450 #line 488 "frontend/machine/sparc/decoder.m"
02451        
02452 
02453             stmts = instantiate(pc,  name, DIS_ADDR, DIS_RD);
02454 
02455       
02456 
02457       
02458       
02459       
02460     } 
02461     goto MATCH_finished_d; 
02462     
02463   MATCH_label_d10: (void)0;  
02464     { 
02465       char *name = MATCH_name;
02466       unsigned addr = addressToPC(MATCH_p);
02467       unsigned rd = (MATCH_w_32_0 >> 25 & 0x1f) ;
02468       nextPC = 4 + MATCH_p; 
02469       
02470 #line 501 "frontend/machine/sparc/decoder.m"
02471        
02472 
02473             
02474 
02475             stmts = instantiate(pc,  name, DIS_RDR, DIS_ADDR);
02476 
02477       
02478 
02479       
02480       
02481       
02482     } 
02483     goto MATCH_finished_d; 
02484     
02485   MATCH_label_d11: (void)0;  
02486     { 
02487       char *name = MATCH_name;
02488       unsigned addr = addressToPC(MATCH_p);
02489       unsigned asi = (MATCH_w_32_0 >> 5 & 0xff) ;
02490       unsigned rd = (MATCH_w_32_0 >> 25 & 0x1f) ;
02491       nextPC = 4 + MATCH_p; 
02492       
02493 #line 497 "frontend/machine/sparc/decoder.m"
02494        
02495 
02496             unused(asi);            
02497 
02498             stmts = instantiate(pc,  name, DIS_RD, DIS_ADDR);
02499 
02500       
02501 
02502       
02503       
02504       
02505     } 
02506     goto MATCH_finished_d; 
02507     
02508   MATCH_label_d12: (void)0;  
02509     { 
02510       char *name = MATCH_name;
02511       unsigned addr = addressToPC(MATCH_p);
02512       unsigned asi = (MATCH_w_32_0 >> 5 & 0xff) ;
02513       unsigned rd = (MATCH_w_32_0 >> 25 & 0x1f) ;
02514       nextPC = 4 + MATCH_p; 
02515       
02516 #line 511 "frontend/machine/sparc/decoder.m"
02517        
02518 
02519             unused(asi);            
02520 
02521             stmts = instantiate(pc,  name, DIS_RDR, DIS_ADDR);
02522 
02523       
02524 
02525       
02526       
02527       
02528     } 
02529     goto MATCH_finished_d; 
02530     
02531   MATCH_label_d13: (void)0;  
02532     { 
02533       char *name = MATCH_name;
02534       unsigned addr = addressToPC(MATCH_p);
02535       unsigned fds = (MATCH_w_32_0 >> 25 & 0x1f) ;
02536       nextPC = 4 + MATCH_p; 
02537       
02538 #line 491 "frontend/machine/sparc/decoder.m"
02539        
02540 
02541             stmts = instantiate(pc,  name, DIS_ADDR, DIS_FDS);
02542 
02543       
02544 
02545       
02546       
02547       
02548     } 
02549     goto MATCH_finished_d; 
02550     
02551   MATCH_label_d14: (void)0;  
02552     { 
02553       char *name = MATCH_name;
02554       unsigned addr = addressToPC(MATCH_p);
02555       nextPC = 4 + MATCH_p; 
02556       
02557 #line 515 "frontend/machine/sparc/decoder.m"
02558        
02559 
02560             stmts = instantiate(pc,  name, DIS_ADDR);
02561 
02562       
02563 
02564       
02565       
02566       
02567     } 
02568     goto MATCH_finished_d; 
02569     
02570   MATCH_label_d15: (void)0;  
02571     { 
02572       char *name = MATCH_name;
02573       unsigned addr = addressToPC(MATCH_p);
02574       unsigned fdd = (MATCH_w_32_0 >> 25 & 0x1f) ;
02575       nextPC = 4 + MATCH_p; 
02576       
02577 #line 494 "frontend/machine/sparc/decoder.m"
02578        
02579 
02580             stmts = instantiate(pc,  name, DIS_ADDR, DIS_FDD);
02581 
02582       
02583 
02584       
02585       
02586       
02587     } 
02588     goto MATCH_finished_d; 
02589     
02590   MATCH_label_d16: (void)0;  
02591     { 
02592       char *name = MATCH_name;
02593       unsigned addr = addressToPC(MATCH_p);
02594       unsigned fds = (MATCH_w_32_0 >> 25 & 0x1f) ;
02595       nextPC = 4 + MATCH_p; 
02596       
02597 #line 505 "frontend/machine/sparc/decoder.m"
02598        
02599 
02600             stmts = instantiate(pc,  name, DIS_FDS, DIS_ADDR);
02601 
02602       
02603 
02604       
02605       
02606       
02607     } 
02608     goto MATCH_finished_d; 
02609     
02610   MATCH_label_d17: (void)0;  
02611     { 
02612       char *name = MATCH_name;
02613       unsigned addr = addressToPC(MATCH_p);
02614       nextPC = 4 + MATCH_p; 
02615       
02616 #line 521 "frontend/machine/sparc/decoder.m"
02617        
02618 
02619             stmts = instantiate(pc,  name, DIS_ADDR);
02620 
02621       
02622 
02623       
02624       
02625       
02626     } 
02627     goto MATCH_finished_d; 
02628     
02629   MATCH_label_d18: (void)0;  
02630     { 
02631       char *name = MATCH_name;
02632       unsigned addr = addressToPC(MATCH_p);
02633       nextPC = 4 + MATCH_p; 
02634       
02635 #line 527 "frontend/machine/sparc/decoder.m"
02636        
02637 
02638             stmts = instantiate(pc,  name, DIS_ADDR);
02639 
02640       
02641 
02642       
02643       
02644       
02645     } 
02646     goto MATCH_finished_d; 
02647     
02648   MATCH_label_d19: (void)0;  
02649     { 
02650       char *name = MATCH_name;
02651       unsigned addr = addressToPC(MATCH_p);
02652       unsigned fdd = (MATCH_w_32_0 >> 25 & 0x1f) ;
02653       nextPC = 4 + MATCH_p; 
02654       
02655 #line 508 "frontend/machine/sparc/decoder.m"
02656        
02657 
02658             stmts = instantiate(pc,  name, DIS_FDD, DIS_ADDR);
02659 
02660       
02661 
02662       
02663       
02664       
02665     } 
02666     goto MATCH_finished_d; 
02667     
02668   MATCH_label_d20: (void)0;  
02669     { 
02670       char *name = MATCH_name;
02671       unsigned addr = addressToPC(MATCH_p);
02672       nextPC = 4 + MATCH_p; 
02673       
02674 #line 518 "frontend/machine/sparc/decoder.m"
02675        
02676 
02677             stmts = instantiate(pc,  name, DIS_ADDR);
02678 
02679       
02680 
02681       
02682       
02683       
02684     } 
02685     goto MATCH_finished_d; 
02686     
02687   MATCH_label_d21: (void)0;  
02688     { 
02689       char *name = MATCH_name;
02690       unsigned addr = addressToPC(MATCH_p);
02691       nextPC = 4 + MATCH_p; 
02692       
02693 #line 524 "frontend/machine/sparc/decoder.m"
02694        
02695 
02696             stmts = instantiate(pc,  name, DIS_ADDR);
02697 
02698       
02699 
02700       
02701       
02702       
02703     } 
02704     goto MATCH_finished_d; 
02705     
02706   MATCH_label_d22: (void)0;  
02707     { 
02708       char *name = MATCH_name;
02709       unsigned addr = addressToPC(MATCH_p);
02710       nextPC = 4 + MATCH_p; 
02711       
02712 #line 530 "frontend/machine/sparc/decoder.m"
02713        
02714 
02715             stmts = instantiate(pc,  name, DIS_ADDR);
02716 
02717       
02718 
02719       
02720       
02721       
02722     } 
02723     goto MATCH_finished_d; 
02724     
02725   MATCH_finished_d: (void)0; 
02726   
02727 }
02728 
02729 #line 645 "frontend/machine/sparc/decoder.m"
02730 
02731     result.numBytes = nextPC - hostPC;
02732     if (result.valid && result.rtl == 0)    
02733         result.rtl = new RTL(pc, stmts);
02734 
02735     return result;
02736 }
02737 
02738 
02739 
02740 
02741 
02742 
02743 
02744 
02745 
02746 
02747 
02748 
02749 
02750 Exp* SparcDecoder::dis_RegLhs(unsigned r)
02751 {
02752     return Location::regOf(r);
02753 }
02754 
02755 
02756 
02757 
02758 
02759 
02760 
02761 
02762 
02763 Exp* SparcDecoder::dis_RegRhs(unsigned r)
02764 {
02765     if (r == 0)
02766         return new Const(0);
02767     return Location::regOf(r);
02768 }
02769 
02770 
02771 
02772 
02773 
02774 
02775 
02776 
02777 Exp* SparcDecoder::dis_RegImm(unsigned pc)
02778 {
02779 
02780 
02781 
02782 #line 694 "frontend/machine/sparc/decoder.m"
02783 { 
02784   dword MATCH_p = 
02785     
02786 #line 694 "frontend/machine/sparc/decoder.m"
02787     pc
02788     ;
02789   unsigned MATCH_w_32_0;
02790   { 
02791     MATCH_w_32_0 = getDword(MATCH_p); 
02792     if ((MATCH_w_32_0 >> 13 & 0x1)  == 1) { 
02793       int  i = 
02794         sign_extend((MATCH_w_32_0 & 0x1fff) , 13);
02795       
02796 #line 696 "frontend/machine/sparc/decoder.m"
02797       
02798 
02799             Exp* expr = new Const(i);
02800 
02801             return expr;
02802 
02803       
02804       
02805       
02806     } 
02807     else { 
02808       unsigned rs2 = (MATCH_w_32_0 & 0x1f) ;
02809       
02810 #line 698 "frontend/machine/sparc/decoder.m"
02811       
02812 
02813             return dis_RegRhs(rs2);
02814 
02815       
02816       
02817       
02818     } 
02819     
02820   }goto MATCH_finished_c; 
02821   
02822   MATCH_finished_c: (void)0; 
02823   
02824 }
02825 
02826 #line 702 "frontend/machine/sparc/decoder.m"
02827 }
02828 
02829 
02830 
02831 
02832 
02833 
02834 
02835 
02836 
02837 Exp* SparcDecoder::dis_Eaddr(ADDRESS pc, int ignore )
02838 {
02839     Exp* expr;
02840 
02841 
02842 
02843 #line 715 "frontend/machine/sparc/decoder.m"
02844 { 
02845   dword MATCH_p = 
02846     
02847 #line 715 "frontend/machine/sparc/decoder.m"
02848     pc
02849     ;
02850   unsigned MATCH_w_32_0;
02851   { 
02852     MATCH_w_32_0 = getDword(MATCH_p); 
02853     if ((MATCH_w_32_0 >> 13 & 0x1)  == 1) 
02854       if ((MATCH_w_32_0 >> 14 & 0x1f)  == 0) { 
02855         int  i = 
02856           sign_extend((MATCH_w_32_0 & 0x1fff) , 13);
02857         
02858 #line 722 "frontend/machine/sparc/decoder.m"
02859         
02860 
02861                 expr = new Const((int)i);
02862 
02863         
02864         
02865         
02866       } 
02867       else { 
02868         int  i = 
02869           sign_extend((MATCH_w_32_0 & 0x1fff) , 13);
02870         unsigned rs1 = (MATCH_w_32_0 >> 14 & 0x1f) ;
02871         
02872 #line 725 "frontend/machine/sparc/decoder.m"
02873         
02874 
02875                 expr = new Binary(opPlus,
02876 
02877                     Location::regOf(rs1),
02878 
02879                     new Const((int)i));
02880 
02881         
02882         
02883         
02884       }  
02885     else 
02886       if ((MATCH_w_32_0 & 0x1f)  == 0) { 
02887         unsigned rs1 = (MATCH_w_32_0 >> 14 & 0x1f) ;
02888         
02889 #line 716 "frontend/machine/sparc/decoder.m"
02890         
02891 
02892                 expr = Location::regOf(rs1);
02893 
02894         
02895         
02896         
02897       } 
02898       else { 
02899         unsigned rs1 = (MATCH_w_32_0 >> 14 & 0x1f) ;
02900         unsigned rs2 = (MATCH_w_32_0 & 0x1f) ;
02901         
02902 #line 719 "frontend/machine/sparc/decoder.m"
02903         
02904 
02905                 expr = new Binary(opPlus,
02906 
02907                     Location::regOf(rs1),
02908 
02909                     Location::regOf(rs2));
02910 
02911         
02912         
02913         
02914       }  
02915     
02916   }goto MATCH_finished_b; 
02917   
02918   MATCH_finished_b: (void)0; 
02919   
02920 }
02921 
02922 #line 730 "frontend/machine/sparc/decoder.m"
02923 
02924     return expr;
02925 }
02926 
02927 
02928 
02929 
02930 
02931 
02932 
02933 
02934 bool SparcDecoder::isFuncPrologue(ADDRESS hostPC)
02935 {
02936     return false;
02937 }
02938 
02939 
02940 
02941 
02942 
02943 
02944 
02945 bool SparcDecoder::isRestore(ADDRESS hostPC) {
02946 
02947 
02948 #line 767 "frontend/machine/sparc/decoder.m"
02949 { 
02950   dword MATCH_p = 
02951     
02952 #line 767 "frontend/machine/sparc/decoder.m"
02953     hostPC
02954     ;
02955   unsigned MATCH_w_32_0;
02956   { 
02957     MATCH_w_32_0 = getDword(MATCH_p); 
02958     if ((MATCH_w_32_0 >> 30 & 0x3)  == 2 && 
02959       (MATCH_w_32_0 >> 19 & 0x3f)  == 61 && 
02960       (0 <= (MATCH_w_32_0 >> 13 & 0x1)  && 
02961       (MATCH_w_32_0 >> 13 & 0x1)  < 2)) { 
02962       unsigned a = (MATCH_w_32_0 >> 14 & 0x1f) ;
02963       unsigned b = addressToPC(MATCH_p);
02964       unsigned c = (MATCH_w_32_0 >> 25 & 0x1f) ;
02965       
02966 #line 769 "frontend/machine/sparc/decoder.m"
02967       
02968 
02969                 unused(a);      
02970 
02971                 unused(b);
02972 
02973                 unused(c);
02974 
02975                 return true;
02976 
02977       
02978       
02979       
02980     } 
02981     else 
02982       goto MATCH_label_a0;  
02983     
02984   }goto MATCH_finished_a; 
02985   
02986   MATCH_label_a0: (void)0;  
02987     
02988 #line 773 "frontend/machine/sparc/decoder.m"
02989     
02990                 return false;
02991 
02992     
02993      
02994     goto MATCH_finished_a; 
02995     
02996   MATCH_finished_a: (void)0; 
02997   
02998 }
02999 
03000 #line 777 "frontend/machine/sparc/decoder.m"
03001 }
03002 
03003  
03004 
03005 
03006 
03007 
03008 
03009 
03010 
03011 
03012 
03013 DWord SparcDecoder::getDword(ADDRESS lc)
03014 {
03015     Byte* p = (Byte*)lc;
03016     return (p[0] << 24) + (p[1] << 16) + (p[2] << 8) + p[3];
03017 }
03018 
03019 
03020 
03021 
03022 
03023 
03024 
03025 SparcDecoder::SparcDecoder(Prog* prog) : NJMCDecoder(prog)
03026 {
03027     std::string file = Boomerang::get()->getProgPath() + "frontend/machine/sparc/sparc.ssl";
03028     RTLDict.readSSLFile(file.c_str());
03029 }
03030 
03031 
03032 int SparcDecoder::decodeAssemblyInstruction(unsigned, int)
03033 { return 0; }
03034 
03035 
03036