Main Page | Class Hierarchy | Alphabetical List | Compound List | File List | Compound Members | File Members

IA64Wrt.C

Go to the documentation of this file.
00001 #include "lego.H"
00002 #include <stdio.h>
00003 #include <string.h>
00004 #include <stl.h>
00005 
00006 
00007 legoOpcode *Opcode;
00008 FILE *fp;
00009 
00010 void WriteDirective(legoOp *op)
00011 {
00012         attrList *alc;
00013         attrs *a;
00014         char *directive;
00015         
00016         alc = op->GetOpAttrListPtr();
00017         
00018         for(; alc != NULL; alc = alc->GetNextListPtr())
00019         {
00020          a = alc->GetAttrPtr();
00021          if(!a) continue;
00022                 
00023          if(a->GetAttrType() == ATTR_LC)
00024          {
00025                 for(a = alc->GetAttrPtr(); a != NULL; 
00026                         a = a->GetNextLcEntryPtr())
00027                 {
00028                         if(strncmp(a->GetAttrString(), 
00029                         "directive:", 10) == 0)
00030                         {
00031                                 directive = a->GetAttrString() + 
00032                                         strlen("directive:");
00033                                 fprintf(fp, "\t%s", directive);
00034                         }
00035                 }
00036          }
00037                 
00038         }
00039 }
00040 
00041 void WriteEndpDirective(legoProc *proc)
00042 {
00043         attrList *alc;
00044         attrs *a;
00045         char *directive;
00046         
00047         alc = proc->GetRegionAttrListPtr();
00048         
00049         for(; alc != NULL; alc = alc->GetNextListPtr())
00050         {
00051          a = alc->GetAttrPtr();
00052          if(!a) continue;
00053                 
00054          if(a->GetAttrType() == ATTR_LC)
00055          {
00056                 for(a = alc->GetAttrPtr(); a != NULL; 
00057                         a = a->GetNextLcEntryPtr())
00058                 {
00059                         if(strncmp(a->GetAttrString(), 
00060                         "endp_directive:", 15) == 0)
00061                         {
00062                                 directive = a->GetAttrString() + 
00063                                         strlen("endp_directive:");
00064                                 fprintf(fp, "\t%s", directive);
00065                         }
00066                 }
00067          }
00068                 
00069         }
00070 }
00071 
00072 void WriteJTBL(legoOp *op)
00073 {
00074         attrList *alc;
00075         attrs *a;
00076         char *directive;
00077         
00078         alc = op->GetOpAttrListPtr();
00079         
00080         for(; alc != NULL; alc = alc->GetNextListPtr())
00081         {
00082          a = alc->GetAttrPtr();
00083          if(!a) continue;
00084                 
00085          if(a->GetAttrType() == ATTR_LC)
00086          {
00087                 for(a = alc->GetAttrPtr(); a != NULL; 
00088                         a = a->GetNextLcEntryPtr())
00089                 {
00090                         if(strncmp(a->GetAttrString(), "IA_jtbl:.section", 16) == 0)
00091                         {
00092                             directive = a->GetAttrString() + strlen("IA_jtbl:");
00093                             fprintf(fp, "\t%s", directive);                         
00094                         }
00095                         if((strncmp(a->GetAttrString(), "IA_jtbl:", 8) == 0) &&
00096                                 strstr(a->GetAttrString(), "pcrel") != NULL)
00097                         {
00098                             //output the tbl name
00099                             attrList *alist;
00100                             for(alist = op->GetOpAttrListPtr(); alist != NULL;
00101                                     alist = alist->GetNextListPtr())
00102                             {
00103                                 if(alist->GetAttrType() == ATTR_TBLNAME)
00104                                 {
00105                                     fprintf(fp, ".%s:\n",
00106                                             alist->GetTableName());
00107                                 }
00108                             }
00109                             //output the table
00110                             directive = a->GetAttrString() + strlen("IA_jtbl:");
00111                             fprintf(fp, "%s", directive);
00112                         }
00113                 }
00114          }
00115                 
00116         }
00117 }
00118 
00119 
00120 
00121 void WritePredicateOprd(legoOp *op)
00122 {
00123         legoOprd *pred;
00124         
00125         for(pred = op->GetPredOprdPtr(); pred != NULL;
00126                 pred = pred->GetNextOprdPtr())
00127                 {
00128                         if(pred->GetOprdType() == OT_REG)
00129                         {
00130                                 fprintf(fp, "(p%d) ", 
00131                                 pred->GetOprdRegNum());
00132                         }
00133                                         
00134                 }
00135 }
00136 
00137 void WriteBrOp(legoOp *op, legoProc * Proc)
00138 {
00139         branchQuals br;
00140         legoOprd *src, *dest;
00141         
00142         br = Opcode->GetBranchQuals();
00143         
00144         fprintf(fp, "br");
00145         
00146         switch(br.type)
00147         {
00148                 case BT_COND:   fprintf(fp, ".cond");
00149                                 break;
00150                 case BT_RET:    fprintf(fp, ".ret");
00151                                 break;
00152                 case BT_CALL:   fprintf(fp,".call");
00153                                 break;
00154                 case BT_NONE:   break;
00155                 
00156         }
00157         
00158         switch(br.predict)
00159         {
00160                 case BH_SNT:    fprintf(fp, ".spnt");
00161                                 break;
00162                 case BH_ST:     fprintf(fp, ".sptk");
00163                                 break;
00164                 case BH_DNT:    fprintf(fp, ".dpnt");
00165                                 break;
00166                 case BH_DT:     fprintf(fp, ".dptk");
00167                                 break;
00168                 case BH_NONE:   break;
00169         }
00170         
00171         switch(br.prefetch)
00172         {
00173                 case BPH_MANY:  fprintf(fp, ".many");
00174                                 break;
00175                 case BPH_FEW:   fprintf(fp, ".few");
00176                                 break;
00177                 case BPH_NONE:  break;
00178         }
00179         
00180         switch(br.dealloc)
00181         {
00182                 case BDH_CLR:   fprintf(fp, ".clr");
00183                                 break;
00184                 case BDH_NONE:  break;
00185         }
00186         fprintf(fp, " ");
00187         bool dest_exist = false; //HZ: check whether there is a dest of the br
00188         for(dest = op->GetDestOprdPtr(); dest != NULL;
00189                 dest = dest->GetNextOprdPtr())
00190         {
00191             dest_exist = true;
00192                 switch(dest->GetOprdType())
00193                 {
00194                         case OT_REG:    fprintf(fp, " b%d", 
00195                                         dest->GetOprdRegNum());
00196                                         break;
00197                         case OT_LITERAL_S: fprintf(fp, " %s", 
00198                                            dest->GetLiteralString());
00199                                            break;
00200                         default:        break;
00201                                         //LegoFatal("IA64Write", 
00202                                         //"Br have dest oprd that is not a reg.or a literal string");
00203                                         //exit(1);
00204                 }
00205         }
00206             
00207         //for(src = op->GetSrcOprdPtr(); src != NULL; 
00208         //      src = src->GetNextOprdPtr())
00209         src = op->GetSrcOprdPtr();
00210         if(src != NULL) //HZ: should only be 1 src oprd
00211         {
00212             if(dest_exist)
00213                 fprintf(fp, " = ");
00214             
00215             switch(src->GetOprdType())
00216                 {
00217                         case OT_REG:    fprintf(fp, "b%d", 
00218                                         src->GetOprdRegNum());
00219                                         break;
00220                         case OT_LITERAL_S: fprintf(fp, "%s", 
00221                                            src->GetLiteralString());
00222                                            break;
00223                         case OT_LITERAL_CB:
00224                                                 //HZ: due to the legoIA64 lexer, all labels start with a capital
00225                                                 //letter
00226                                                 //Also, IA64 assembler requires unique label name in the file
00227                                                 //(legoModule) scope instead of function (legoProc) scope.
00228                                                 //So, add function name to disambiguate.
00229                                            fprintf(fp, ".C_%s_B%d", Proc->GetProcName(), src->GetLiteralControlBlock());                   
00230                                            break;
00231                         default:        LegoFatal("IA64Write", 
00232                                         "Br have src oprd that is not a reg.or a literal string");
00233                                         exit(1);
00234                 }
00235         }
00236         
00237         fprintf(fp,"\n");
00238 }
00239 
00240 void WriteCmpOprd(legoOp *op)
00241 {
00242         legoOprd *dest, *src;
00243         int counter;
00244         
00245         for(dest = op->GetDestOprdPtr(), counter=0; dest != NULL;
00246                 dest = dest->GetNextOprdPtr())
00247         {
00248                 if(dest->GetOprdFileType() == FT_PR &&
00249                         dest->GetOprdType() == OT_REG)
00250                 {
00251                         if(counter > 0)
00252                         fprintf(fp, " p%d", dest->GetOprdRegNum());
00253                         else
00254                         {
00255                                 fprintf(fp, " p%d,", 
00256                                 dest->GetOprdRegNum());
00257                                 counter++;
00258                         }
00259                 }
00260                 else
00261                 {
00262                         LegoFatal("IA64Write", 
00263                         "Cmp have dest oprd that is not a predicate reg.");
00264                         exit(1);
00265                 } 
00266         }
00267         
00268         for(src = op->GetSrcOprdPtr(), counter = 0; src != NULL; 
00269                 src = src->GetNextOprdPtr())
00270         {
00271                 switch(src->GetOprdType())
00272                 {
00273                         case OT_REG:    switch(counter)
00274                                         {
00275                                                 case 0: fprintf(fp, " = r%d,", 
00276                                                         src->GetOprdRegNum());
00277                                                         counter++;
00278                                                         break;
00279                                                 case 1: fprintf(fp, " r%d", 
00280                                                         src->GetOprdRegNum());
00281                                                         break;
00282                                                 default: LegoFatal("IA64Write", 
00283                                                         "Cmp have a 3rd src oprd");
00284                                                         exit(1);
00285                                         }
00286                                         break;
00287                         case OT_LITERAL_S: switch(counter)
00288                                            {
00289                                                 case 0: fprintf(fp, " = %s,", 
00290                                                         src->GetLiteralString());
00291                                                         counter++;
00292                                                         break;
00293                                                 case 1: fprintf(fp, " %s", 
00294                                                         src->GetLiteralString());
00295                                                         break;
00296                                                 default: LegoFatal("IA64Write", 
00297                                                         "Cmp have a 3rd src oprd");
00298                                                         exit(1);
00299                                            }
00300                                            break;
00301                         case OT_LITERAL_LLNG: switch(counter)
00302                                            {
00303                                                 case 0: fprintf(fp, " = %lld,", 
00304                                                         src->GetLiteralLongLong());
00305                                                         counter++;
00306                                                         break;
00307                                                 case 1: fprintf(fp, " %lld", 
00308                                                         src->GetLiteralLongLong());
00309                                                         break;
00310                                                 default: LegoFatal("IA64Write", 
00311                                                         "Cmp have a 3rd src oprd");
00312                                                         exit(1);
00313                                            }
00314                                            break;
00315                         default:        LegoFatal("IA64Write", 
00316                                         "Cmp have src oprd that is not a reg. or a literal ");
00317                                         exit(1); 
00318                 }
00319         }
00320 }
00321 
00322 void WriteCmpOp(legoOp *op)
00323 {
00324         icmpQuals icmp;
00325         
00326         icmp = Opcode->GetIcmpQuals();
00327         
00328         switch(op->GetOpcode())
00329         {
00330                 case CMP:       fprintf(fp, "cmp");
00331                                 break;
00332                 case CMP_W:     fprintf(fp, "cmp4");
00333                                 break;
00334         }
00335         
00336         switch(icmp.relation)
00337         {
00338                 case CR_EQ:     fprintf(fp, ".eq");
00339                                 break;
00340                 case CR_NE:     fprintf(fp, ".ne");
00341                                 break;
00342                 case CR_LT:     fprintf(fp, ".lt");
00343                                 break;
00344                 case CR_LE:     fprintf(fp, ".le");
00345                                 break;
00346                 case CR_GT:     fprintf(fp, ".gt");
00347                                 break;
00348                 case CR_GE:     fprintf(fp, ".ge");
00349                                 break;
00350                 case CR_LTU:    fprintf(fp, ".ltu");
00351                                 break;
00352                 case CR_LEU:    fprintf(fp, ".leu");
00353                                 break;
00354                 case CR_GTU:    fprintf(fp, ".gtu");
00355                                 break;
00356                 case CR_GEU:    fprintf(fp, ".geu");
00357                                 break;
00358         }
00359         
00360         switch(icmp.type)
00361         {
00362                 case CT_UNC:    fprintf(fp, ".unc");
00363                                 break;
00364                 case CT_OR:     fprintf(fp, ".or");
00365                                 break;
00366                 case CT_AND:    fprintf(fp, ".and");
00367                                 break;
00368                 case CT_ORANDCM: fprintf(fp, ".or.andcm");
00369                                 break;
00370                 case CT_ORCM:   fprintf(fp, ".orcm");
00371                                 break;
00372                 case CT_ANDCM:  fprintf(fp, ".andcm");
00373                                 break;
00374                 case CT_ANDORCM: fprintf(fp, ".and.orcm");
00375                                  break;
00376                 case CT_NONE:   break;
00377         }
00378         
00379         WriteCmpOprd(op);
00380         
00381         fprintf(fp, "\n");
00382 }
00383 
00384 void WriteIaluOprd(legoOp *op)
00385 {
00386         legoOprd *src, *dest;
00387         int counter;
00388         
00389         for(dest = op->GetDestOprdPtr(); dest != NULL;
00390         dest = dest->GetNextOprdPtr())
00391         {
00392                 switch(dest->GetOprdType())
00393                 {
00394                         case OT_REG:    fprintf(fp, " r%d", 
00395                                         dest->GetOprdRegNum());
00396                                         break;
00397                         
00398                         default:        LegoFatal("IA64Write", 
00399                                         "Ialu op have dest oprd that is not a reg.");
00400                                         exit(1);
00401                 }
00402         }
00403         for(src = op->GetSrcOprdPtr(), counter = 0; src != NULL;
00404         src = src->GetNextOprdPtr())
00405         {
00406                 switch(src->GetOprdType())
00407                 {
00408                     //HZ: made changes so that the comma does not appear
00409                     //when counter is zero
00410                         case OT_REG:    switch(counter)
00411                                         {
00412                                                 case 0: fprintf(fp, " = r%d", 
00413                                                         src->GetOprdRegNum());
00414                                                         counter++;
00415                                                         break;
00416                                                 case 1: fprintf(fp, ", r%d", 
00417                                                         src->GetOprdRegNum());
00418                                                         counter++;
00419                                                         break;
00420                                                 case 2: fprintf(fp, ", r%d", 
00421                                                         src->GetOprdRegNum());
00422                                                         counter++;
00423                                                         break; 
00424                                                 case 3: fprintf(fp, ", r%d", 
00425                                                         src->GetOprdRegNum());
00426                                                         break; 
00427                                                 default: LegoFatal("IA64Write", 
00428                                                         "Ialu op have a unknown src oprd");
00429                                                         exit(1);
00430                                         }
00431                                         break;
00432                         case OT_LITERAL_S: switch(counter)
00433                                            {
00434                                                 case 0: fprintf(fp, " = %s", 
00435                                                         src->GetLiteralString());
00436                                                         counter++;
00437                                                         break;
00438                                                 case 1: fprintf(fp, ", %s", 
00439                                                         src->GetLiteralString());
00440                                                         counter++;
00441                                                         break;
00442                                                 case 2: fprintf(fp, ", %s",
00443                                                         src->GetLiteralString());
00444                                                         counter++;
00445                                                         break;
00446                                                 case 3: fprintf(fp, ", %s",
00447                                                         src->GetLiteralString());
00448                                                         break;
00449                                                 default: LegoFatal("IA64Write", 
00450                                                         "Ialu op have a unknown src oprd");
00451                                                                             exit(1);
00452                                            }
00453                                            break;
00454                         case OT_LITERAL_LLNG: switch(counter)
00455                                            {
00456                                                 case 0: fprintf(fp, " = %lld", 
00457                                                         src->GetLiteralLongLong());
00458                                                         counter++;
00459                                                         break;
00460                                                 case 1: fprintf(fp, ", %lld", 
00461                                                         src->GetLiteralLongLong());
00462                                                         counter++;
00463                                                         break;
00464                                                 case 2: fprintf(fp, ", %lld",
00465                                                         src->GetLiteralLongLong());
00466                                                         counter++;
00467                                                         break;
00468                                                 case 3: fprintf(fp, ", %lld",
00469                                                         src->GetLiteralLongLong());
00470                                                         break;
00471                                                 default: LegoFatal("IA64Write", 
00472                                                         "Ialu op have a unknown src oprd");
00473                                                         exit(1);
00474                                            }
00475                                            break;
00476                         
00477                         default:        LegoFatal("IA64Write", 
00478                                         "Ialu op have src oprd that is not a reg. or a literal ");
00479                                         exit(1); 
00480                 }       
00481         }
00482 }
00483 
00484 void WriteMovOprd(legoOp *op)
00485 {
00486         legoOprd *dest, *src;
00487         int counter;
00488         
00489         for(dest = op->GetDestOprdPtr(); dest != NULL;
00490                 dest = dest->GetNextOprdPtr())
00491         {
00492                 switch(dest->GetOprdType())
00493                 {
00494                         case OT_REG:    switch(dest->GetOprdFileType())
00495                                         {
00496                                                 case FT_GPR:    fprintf(fp, " r%d",
00497                                                                 dest->GetOprdRegNum());
00498                                                                 break;
00499                                                 case FT_FPR:    fprintf(fp, " f%d",
00500                                                                 dest->GetOprdRegNum());
00501                                                                 break;
00502                                                 case FT_CR:     fprintf(fp, " ar%d",
00503                                                                 dest->GetOprdRegNum());
00504                                                                 break;
00505                                                 case FT_PR:     fprintf(fp, " p%d",
00506                                                                 dest->GetOprdRegNum());
00507                                                                 break;
00508                                                 case FT_BTR:    fprintf(fp, " b%d",
00509                                                                 dest->GetOprdRegNum());
00510                                                                 break;
00511                                                 default:        LegoFatal("IA64Write", 
00512                                                                 "Mov have dest oprd that has a unknown reg file type.");
00513                                                                 exit(1);
00514                                                                 
00515                                         }
00516                                         break;
00517                         case OT_LITERAL_S:      fprintf(fp, " %s", 
00518                                                 dest->GetLiteralString());
00519                                                 break;
00520                         default:        LegoFatal("IA64Write", 
00521                                         "Mov have dest oprd that is not a reg.");
00522                                         exit(1);
00523                 }
00524         }
00525         // Need to check for the second src operand.
00526         //HZ: add check so that second src oprd does not have = output
00527         for(src = op->GetSrcOprdPtr(), counter = 0; src != NULL; 
00528                 src = src->GetNextOprdPtr())
00529         {
00530                 if(counter == 0)
00531                     fprintf(fp, " = ");
00532                 else
00533                     fprintf(fp, ", ");
00534                 switch(src->GetOprdType())
00535                 {
00536                         case OT_REG:    switch(src->GetOprdFileType())
00537                                         {
00538                                                 case FT_GPR:    fprintf(fp, "r%d",
00539                                                                 src->GetOprdRegNum());
00540                                                                 break;
00541                                                 case FT_FPR:    fprintf(fp, "f%d",
00542                                                                 src->GetOprdRegNum());
00543                                                                 break;
00544                                                 case FT_CR:     fprintf(fp, "ar%d",
00545                                                                 src->GetOprdRegNum());
00546                                                                 break;
00547                                                 case FT_PR:     fprintf(fp, "p%d",
00548                                                                 src->GetOprdRegNum());
00549                                                                 break;
00550                                                 case FT_BTR:    fprintf(fp, "b%d",
00551                                                                 src->GetOprdRegNum());
00552                                                                 break;
00553                                                 default:        LegoFatal("IA64Write", 
00554                                                                 "Mov have dest oprd that has a unknown reg file type.");
00555                                                                 exit(1);
00556                                                                 
00557                                         }
00558                                         break;
00559                         case OT_LITERAL_S:      fprintf(fp, "%s", 
00560                                                 src->GetLiteralString());
00561                                                 break;
00562                         case OT_LITERAL_LLNG:   fprintf(fp, "%lld", 
00563                                                 src->GetLiteralLongLong());
00564                                                 break;
00565                         default:        LegoFatal("IA64Write", 
00566                                         "Mov have src oprd that is not a reg. or literal");
00567                                         exit(1);
00568                 }
00569                 counter++;
00570         }
00571 }
00572 
00573 void WriteXOprd(legoOp *op)
00574 {
00575         legoOprd *dest, *src;
00576         int counter;
00577         
00578         for(dest = op->GetDestOprdPtr(); dest != NULL;
00579                 dest = dest->GetNextOprdPtr())
00580         {
00581                 switch(dest->GetOprdType())
00582                 {
00583                         case OT_REG:    switch(dest->GetOprdFileType())
00584                                         {
00585                                                 case FT_FPR:    fprintf(fp, " f%d",
00586                                                                 dest->GetOprdRegNum());
00587                                                                 break;
00588                                                 default:        LegoFatal("IA64Write", 
00589                                                                 "Xma or Xmpy  have dest oprd that is not a Freg.");
00590                                                                 exit(1);
00591                                                                 
00592                                         }
00593                                         break;
00594                         default:        LegoFatal("IA64Write", 
00595                                         "Xma or XMPY have dest oprd that is not a reg.");
00596                                         exit(1);
00597                 }
00598         }
00599         
00600         for(src = op->GetSrcOprdPtr(), counter = 0; src != NULL;
00601         src = src->GetNextOprdPtr())
00602         {
00603                 switch(src->GetOprdType())
00604                 {
00605                         case OT_REG:    switch(src->GetOprdFileType())
00606                                         {
00607                                                 case FT_FPR:    switch(counter)
00608                                                                 {
00609                                                                         case 0: fprintf(fp, " = f%d,",
00610                                                                                 src->GetOprdRegNum());
00611                                                                                 counter++;
00612                                                                                 break;
00613                                                                         case 1: fprintf(fp, " f%d", 
00614                                                                                 src->GetOprdRegNum());
00615                                                                                 counter++;
00616                                                                                 break;
00617                                                                         case 2: fprintf(fp, ", f%d", 
00618                                                                                 src->GetOprdRegNum());
00619                                                                                 break;
00620                                                                         default: LegoFatal("IA64Write", 
00621                                                                                 "XMA or Xmpy op have a unknown src oprd");
00622                                                                                 exit(1);
00623                                                                 }
00624                                                                 break;
00625                                                 default:        LegoFatal("IA64Write", 
00626                                                                 "Xma or Xmpy  have src oprd that is not a Freg.");
00627                                                                 exit(1);
00628                                                                 
00629                                         }
00630                                         break;
00631                         default:        LegoFatal("IA64Write", 
00632                                         "LD or ST op have src oprd that is not a reg. or a literal ");
00633                                         exit(1); 
00634                 }       
00635         }
00636 }
00637 
00638 void WriteIntOp(legoOp *op)
00639 {
00640         ialuQuals ialu;
00641         
00642         ialu = Opcode->GetIaluQuals();
00643         
00644         switch(op->GetOpcode())
00645         {
00646                 case ADD:       fprintf(fp, "add");
00647                                 WriteIaluOprd(op);
00648                                 break;
00649                 case ADDS:      fprintf(fp, "adds");
00650                                 WriteIaluOprd(op);
00651                                 break;
00652                 case ADDL:      fprintf(fp, "addl");
00653                                 WriteIaluOprd(op);
00654                                 break;
00655                 case ADDP4:     fprintf(fp, "addp4");
00656                                 WriteIaluOprd(op);
00657                                 break;
00658                 case AND:       fprintf(fp, "and");
00659                                 WriteIaluOprd(op);      //And has the same type of operands as of ADD
00660                                 break;                  //But Beware of the error messages.
00661                 case ANDCM:     fprintf(fp, "andcm");
00662                                 WriteIaluOprd(op);      //AndCm has the same type of operands as of ADD
00663                                 break;                  //But Beware of the error messages.
00664                 case CZX:       fprintf(fp, "czx");
00665                                 switch(ialu.size)
00666                                 {
00667                                         case OS_B:      fprintf(fp, "1");
00668                                                         break;
00669                                         case OS_H:      fprintf(fp, "2");
00670                                                         break;
00671                                 }
00672                                 
00673                                 switch(ialu.leftRight)
00674                                 {
00675                                         case OFLR_L:    fprintf(fp, ".l");
00676                                                         break;
00677                                         case OFLR_R:    fprintf(fp, ".r");
00678                                                         break;
00679                                 }
00680                                 WriteIaluOprd(op);
00681                                 break;
00682                 case DEP:       fprintf(fp, "dep");
00683                                 WriteIaluOprd(op);
00684                                 break;
00685                 case DEPZ:      fprintf(fp, "dep.z");
00686                                 WriteIaluOprd(op);
00687                                 break;
00688                 case EXTR:      fprintf(fp, "extr");
00689                                 switch(ialu.sign)
00690                                 {
00691                                         case OFS_UNSIGNED:      fprintf(fp, ".u");
00692                                                                 break;
00693                                         case OFS_SIGNED:        break;
00694                                 }
00695                                 WriteIaluOprd(op);
00696                                 break;
00697                 case MIX:       fprintf(fp, "mix");
00698                                 switch(ialu.size)
00699                                 {
00700                                         case OS_B:      fprintf(fp, "1");
00701                                                         break;
00702                                         case OS_H:      fprintf(fp, "2");
00703                                                         break;
00704                                         case OS_W:      fprintf(fp, "4");
00705                                                         break;
00706                                 }
00707                                 switch(ialu.leftRight)
00708                                 {
00709                                         case OFLR_L:    fprintf(fp, ".l");
00710                                                         break;
00711                                         case OFLR_R:    fprintf(fp, ".r");
00712                                                         break;
00713                                 }
00714                                 WriteIaluOprd(op);
00715                                 break;
00716                 case MOV:       fprintf(fp, "mov");
00717                                 switch(ialu.unit)
00718                                 {
00719                                         case OFMU_I:    fprintf(fp, ".i");
00720                                                         break;
00721                                         case OFMU_M:    fprintf(fp, ".m");
00722                                                         break;
00723                                         case OFMU_RET:  fprintf(fp, ".ret");
00724                                                         break;
00725                                         default:        break;
00726                                 }
00727                                 WriteMovOprd(op);
00728                                 break;
00729                 case MOVL:      fprintf(fp, "movl");
00730                                 WriteMovOprd(op);
00731                                 break;
00732                 case OR:        fprintf(fp, "or");
00733                                 WriteIaluOprd(op);
00734                                 break;
00735                 case POPCNT:    fprintf(fp, "popcnt");
00736                                 WriteIaluOprd(op);
00737                                 break;
00738                 case SHL:       fprintf(fp, "shl");
00739                                 WriteIaluOprd(op);
00740                                 break;
00741                 case SHLADD:    fprintf(fp, "shladd");
00742                                 WriteIaluOprd(op);
00743                                 break;
00744                 case SHLADDP4:  fprintf(fp, "shladdp4");
00745                                 WriteIaluOprd(op);
00746                                 break;
00747                 case SHR:       fprintf(fp, "shr");
00748                                 if(ialu.sign == OFS_UNSIGNED)
00749                                 fprintf(fp, ".u");
00750                                 WriteIaluOprd(op);
00751                                 break;
00752                 case SHRP:      fprintf(fp, "shrp");
00753                                 WriteIaluOprd(op);
00754                                 break;
00755                 case SUB:       fprintf(fp, "sub");
00756                                 WriteIaluOprd(op);
00757                                 break;
00758                 case SXT:       fprintf(fp, "sxt");
00759                                 switch(ialu.size)
00760                                 {
00761                                         case OS_B:      fprintf(fp, "1");
00762                                                         break;
00763                                         case OS_H:      fprintf(fp, "2");
00764                                                         break;
00765                                         case OS_W:      fprintf(fp, "4");
00766                                                         break;
00767                                 }
00768                                 WriteIaluOprd(op);
00769                                 break;
00770                 case TBIT:      fprintf(fp, "tbit");
00771                                 switch(ialu.relation)
00772                                 {
00773                                         case TBR_NZ:    fprintf(fp, ".nz");
00774                                                         break;
00775                                         case TBR_Z:     fprintf(fp, ".z");
00776                                                         break;
00777                                 }
00778                                 switch(ialu.type)
00779                                 {
00780                                         case CT_UNC:    fprintf(fp, ".unc");
00781                                                         break;
00782                                         case CT_OR:     fprintf(fp, ".or");
00783                                                         break;
00784                                         case CT_AND:    fprintf(fp, ".and");
00785                                                         break;
00786                                         case CT_ORANDCM: fprintf(fp, ".or.andcm");
00787                                                         break;
00788                                         case CT_ORCM:   fprintf(fp, ".orcm");
00789                                                         break;
00790                                         case CT_ANDCM:  fprintf(fp, ".andcm");
00791                                                         break;
00792                                         case CT_ANDORCM: fprintf(fp, ".and.orcm");
00793                                                         break;
00794                                         case CT_NONE:   break;
00795                                 }
00796                                 WriteCmpOprd(op); // TBIT has the same oprd as
00797                                 break;            // of CMP.
00798                 case TNAT:      fprintf(fp, "tnat");
00799                                 switch(ialu.relation)
00800                                 {
00801                                         case TBR_NZ:    fprintf(fp, ".nz");
00802                                                         break;
00803                                         case TBR_Z:     fprintf(fp, ".z");
00804                                                         break;
00805                                 }
00806                                 switch(ialu.type)
00807                                 {
00808                                         case CT_UNC:    fprintf(fp, ".unc");
00809                                                         break;
00810                                         case CT_OR:     fprintf(fp, ".or");
00811                                                         break;
00812                                         case CT_AND:    fprintf(fp, ".and");
00813                                                         break;
00814                                         case CT_ORANDCM: fprintf(fp, ".or.andcm");
00815                                                         break;
00816                                         case CT_ORCM:   fprintf(fp, ".orcm");
00817                                                         break;
00818                                         case CT_ANDCM:  fprintf(fp, ".andcm");
00819                                                         break;
00820                                         case CT_ANDORCM: fprintf(fp, ".and.orcm");
00821                                                         break;
00822                                         case CT_NONE:   break;
00823                                 }
00824                                 WriteCmpOprd(op); // TNAT has the same oprd as
00825                                 break;            // of CMP
00826                 case XMA:       fprintf(fp, "xma");
00827                                 switch(ialu.highLow)
00828                                 {
00829                                         case OFHL_HIGH: fprintf(fp,".h");
00830                                                         break;
00831                                         case OFHL_LOW:  fprintf(fp, ".l");
00832                                 
00833                                 }
00834                                 if(ialu.sign == OFS_UNSIGNED)
00835                                 fprintf(fp, "u");
00836                                 WriteXOprd(op);
00837                                 break;
00838                 case XMPY:      fprintf(fp, "xmpy");
00839                                 switch(ialu.highLow)
00840                                 {
00841                                         case OFHL_HIGH: fprintf(fp,".h");
00842                                                         break;
00843                                         case OFHL_LOW:  fprintf(fp, ".l");
00844                                 
00845                                 }
00846                                 if(ialu.sign == OFS_UNSIGNED)
00847                                 fprintf(fp, "u");
00848                                 WriteXOprd(op);
00849                                 break;
00850                 case XOR:       fprintf(fp, "xor");
00851                                 WriteIaluOprd(op);
00852                                 break;
00853                 case ZXT:       fprintf(fp, "zxt");
00854                                 switch(ialu.size)
00855                                 {
00856                                         case OS_B:      fprintf(fp, "1");
00857                                                         break;
00858                                         case OS_H:      fprintf(fp, "2");
00859                                                         break;
00860                                         case OS_W:      fprintf(fp, "4");
00861                                                         break;
00862                                 }
00863                                 WriteIaluOprd(op);
00864                                 break;
00865                 
00866         }
00867         fprintf(fp, "\n");
00868 }
00869 void WriteldstOprd(legoOp *op)
00870 {
00871         legoOprd *dest, *src;
00872         int counter;
00873         
00874         //for(dest = op->GetDestOprdPtr(), counter = 0; dest != NULL;
00875         //      dest = dest->GetNextOprdPtr())
00876         
00877         //HZ: Process only 1 dest as the second dest is implict in IA64 asm.
00878         counter = 0;
00879         dest = op->GetDestOprdPtr();
00880         if(dest != NULL)
00881         {
00882                 switch(dest->GetOprdType())
00883                 {
00884                         case OT_REG:    switch(dest->GetOprdFileType())
00885                                         {
00886                                                 case FT_GPR:    switch(op->GetOpcode())
00887                                                                 {
00888                                                                  case FETCHADD:
00889                                                                  case LD: fprintf(fp, " r%d",
00890                                                                           dest->GetOprdRegNum());
00891                                                                           break;
00892                                                                 //HZ: ST is treated differently
00893                                                                 //         case ST: fprintf(fp, " [r%d]",
00894                                                                 //        dest->GetOprdRegNum());
00895                                                                 //        counter++;
00896                                                                 //        break;
00897                                                                 }
00898                                                                 break;
00899                                                 default:        LegoFatal("IA64Write", 
00900                                                                 "Ld have dest oprd that is not a reg.");
00901                                                                 exit(1);
00902                                                                 
00903                                         }
00904                                         break;
00905                         default:        LegoFatal("IA64Write", 
00906                                         "LDST have dest oprd that is not a reg.");
00907                                         exit(1);
00908                 }
00909         }
00910         
00911         for(src = op->GetSrcOprdPtr(), counter = 0; src != NULL;
00912         src = src->GetNextOprdPtr())
00913         {
00914                 switch(src->GetOprdType())
00915                 {
00916                         case OT_REG:    switch(counter)
00917                                         {
00918                                                 case 0: switch(op->GetOpcode())
00919                                                         {
00920                                                          case FETCHADD:
00921                                                          case LD: fprintf(fp, " = [r%d]", 
00922                                                                   src->GetOprdRegNum());
00923                                                                   counter++;
00924                                                                   break;
00925                                                          case ST: fprintf(fp, " [r%d] = ", 
00926                                                                   src->GetOprdRegNum());
00927                                                                   counter++;
00928                                                                   break;
00929                                                         }
00930                                                         break;
00931                                                         
00932                                                 case 1: switch(op->GetOpcode())
00933                                                         {
00934                                                           case FETCHADD:
00935                                                           case LD: fprintf(fp, ", r%d", src->GetOprdRegNum());
00936                                                                    break;
00937                                                           case ST: fprintf(fp, "r%d", src->GetOprdRegNum());
00938                                                                    break;
00939                                                         }
00940                                                         counter++;
00941                                                         break;
00942                                                 default: LegoFatal("IA64Write", 
00943                                                         "LdSt op have a unknown src oprd");
00944                                                         exit(1);
00945                                         }
00946                                         break;
00947                         case OT_LITERAL_S: fprintf(fp, ", %s",
00948                                            src->GetLiteralString());
00949                                            break;
00950                         case OT_LITERAL_LLNG: fprintf(fp, ", %lld",
00951                                            src->GetLiteralLongLong());
00952                                            break;
00953                         default:        LegoFatal("IA64Write", 
00954                                         "LDST op have src oprd that is not a reg. or a literal ");
00955                                         exit(1); 
00956                 }       
00957         }
00958 }
00959 
00960 void WriteLfetchOprd(legoOp *op)
00961 {
00962         legoOprd *src;
00963         int counter;
00964         
00965         for(src = op->GetSrcOprdPtr(), counter = 0; src != NULL;
00966                 src = src->GetNextOprdPtr())
00967         {
00968                 switch(src->GetOprdType())
00969                 {
00970                         case OT_REG:    switch(src->GetOprdFileType())
00971                                         {
00972                                                 case FT_GPR:    switch(counter)
00973                                                                 {
00974                                                                  case 1: fprintf(fp, ", r%d",
00975                                                                          src->GetOprdRegNum());
00976                                                                          break;
00977                                                                  case 0: fprintf(fp, " [r%d]",
00978                                                                          src->GetOprdRegNum());
00979                                                                          counter++;
00980                                                                          break;
00981                                                                 }
00982                                                                 break;
00983                                                 default:        LegoFatal("IA64Write", 
00984                                                                 "Lfetch have a src oprd that is not a Greg.");
00985                                                                 exit(1);
00986                                                                 
00987                                         }
00988                                         break;
00989                         case OT_LITERAL_S: fprintf(fp, ", %s",
00990                                            src->GetLiteralString());
00991                                            break;
00992                         case OT_LITERAL_LLNG: fprintf(fp, ", %lld",
00993                                            src->GetLiteralLongLong());
00994                                            break;
00995                         default:        LegoFatal("IA64Write", 
00996                                         "Lfetch have a src oprd that is not a reg.");
00997                                         exit(1);
00998                 }
00999         }
01000 }
01001 void WriteIldstOp(legoOp *op)
01002 {
01003         ildstQuals ildst;
01004         
01005         ildst = Opcode->GetImemQuals();
01006         
01007         switch(op->GetOpcode())
01008         {
01009                 case FETCHADD:  fprintf(fp, "fetchadd");
01010                                 switch(ildst.size)
01011                                 {
01012                                         case OS_W:      fprintf(fp, "4");
01013                                                         break;
01014                                         case OS_X:      fprintf(fp, "8");
01015                                                         break;
01016                                 }
01017                                 switch(ildst.sem)
01018                                 {
01019                                         case FAS_ACQ:   fprintf(fp, ".acq");
01020                                                         break;
01021                                         case FAS_REL:   fprintf(fp, ".rel");
01022                                 }
01023                                 switch(ildst.hint)
01024                                 {
01025                                         case LSH_NT1:   fprintf(fp, ".nt1");
01026                                                         break;
01027                                         case LSH_NTA:   fprintf(fp, ".nta");
01028                                                         break;
01029                                         case LSH_NONE:  break;
01030                                 
01031                                 }
01032                                 WriteldstOprd(op);
01033                                 break;
01034                 case LD:        fprintf(fp, "ld");
01035                                 switch(ildst.size)
01036                                 {
01037                                         case OS_B:      fprintf(fp, "1");
01038                                                         break;
01039                                         case OS_H:      fprintf(fp, "2");
01040                                                         break;
01041                                         case OS_W:      fprintf(fp, "4");
01042                                                         break;
01043                                         case OS_X:      fprintf(fp, "8");
01044                                                         break;
01045                                 }
01046                                 switch(ildst.type)
01047                                 {
01048                                         case LST_S:     fprintf(fp, ".s");
01049                                                         break;
01050                                         case LST_A:     fprintf(fp, ".a");
01051                                                         break;
01052                                         case LST_SA:    fprintf(fp, ".sa");
01053                                                         break;
01054                                         case LST_CNC:   fprintf(fp, ".c.nc");
01055                                                         break;
01056                                         case LST_CC:    fprintf(fp, ".c.clr");
01057                                                         break;
01058                                         case LST_CCACQ: fprintf(fp, ".c.clr.acq");
01059                                                         break;
01060                                         case LST_ACQ:   fprintf(fp, ".acq");
01061                                                         break;
01062                                         case LST_BIAS:  fprintf(fp, ".bias");
01063                                                         break;
01064                                         case LST_FILL:  fprintf(fp, ".fill");
01065                                                         break;
01066                                 }
01067                                 switch(ildst.hint)
01068                                 {
01069                                         case LSH_NT1:   fprintf(fp, ".nt1");
01070                                                         break;
01071                                         case LSH_NTA:   fprintf(fp, ".nta");
01072                                                         break;
01073                                         case LSH_NONE:  break;
01074                                 }
01075                                 WriteldstOprd(op);
01076                                 break;
01077                 case LFETCH:    fprintf(fp, "lfetch");
01078                                 switch(ildst.type)
01079                                 {
01080                                         case LST_NONEEXC: fprintf(fp, ".excl");
01081                                                           break;
01082                                         case LST_FAULT: fprintf(fp, ".fault");
01083                                                         break;
01084                                         case LST_FAULTEXC: fprintf(fp, ".fault.excl");
01085                                                            break;
01086                                         case LST_NONE:  break;
01087                                 }
01088                                 switch(ildst.hint)
01089                                 {
01090                                         case LSH_NT1:   fprintf(fp, ".nt1");
01091                                                         break;
01092                                         case LSH_NT2:   fprintf(fp, ".nt2");
01093                                                         break;
01094                                         case LSH_NTA:   fprintf(fp, ".nta");
01095                                                         break;
01096                                         case LSH_NONE:  break;
01097                                 }
01098                                 WriteLfetchOprd(op);
01099                                 break;
01100                 case ST:        fprintf(fp, "st");
01101                                 switch(ildst.size)
01102                                 {
01103                                         case OS_B:      fprintf(fp, "1");
01104                                                         break;
01105                                         case OS_H:      fprintf(fp, "2");
01106                                                         break;
01107                                         case OS_W:      fprintf(fp, "4");
01108                                                         break;
01109                                         case OS_X:      fprintf(fp, "8");
01110                                                         break;
01111                                 }
01112                                 switch(ildst.type)
01113                                 {
01114                                         case LST_REL:   fprintf(fp, ".rel");
01115                                                         break;
01116                                         case LST_SPILL: fprintf(fp, ".spill");
01117                                                         break;
01118                                         case LST_NONE:  break;
01119                                 }
01120                                 switch(ildst.hint)
01121                                 {
01122                                         case LSH_NTA:   fprintf(fp, ".nta");
01123                                                         break;
01124                                         case LSH_NONE:  break;
01125                                 }
01126                                 WriteldstOprd(op);
01127                                 break;
01128                 case XCHG:      fprintf(fp, "xchg");
01129                                 switch(ildst.size)
01130                                 {
01131                                         case OS_B:      fprintf(fp, "1");
01132                                                         break;
01133                                         case OS_H:      fprintf(fp, "2");
01134                                                         break;
01135                                         case OS_W:      fprintf(fp, "4");
01136                                                         break;
01137                                         case OS_X:      fprintf(fp, "8");
01138                                                         break;
01139                                 }
01140                                 switch(ildst.hint)
01141                                 {
01142                                         case LSH_NT1:   fprintf(fp, ".nt1");
01143                                                         break;
01144                                         case LSH_NTA:   fprintf(fp, ".nta");
01145                                                         break;
01146                                         case LSH_NONE:  break;
01147                                 }
01148                                 break;
01149                 case CMPXCHG:   fprintf(fp, "cmpxchg");
01150                                 switch(ildst.size)
01151                                 {
01152                                         case OS_B:      fprintf(fp, "1");
01153                                                         break;
01154                                         case OS_H:      fprintf(fp, "2");
01155                                                         break;
01156                                         case OS_W:      fprintf(fp, "4");
01157                                                         break;
01158                                         case OS_X:      fprintf(fp, "8");
01159                                                         break;
01160                                 }
01161                                 switch(ildst.sem)
01162                                 {
01163                                         case FAS_ACQ:   fprintf(fp, ".acq");
01164                                                         break;
01165                                         case FAS_REL:   fprintf(fp, ".rel");
01166                                 }
01167                                 switch(ildst.hint)
01168                                 {
01169                                         case LSH_NT1:   fprintf(fp, ".nt1");
01170                                                         break;
01171                                         case LSH_NTA:   fprintf(fp, ".nta");
01172                                                         break;
01173                                         case LSH_NONE:  break;
01174                                 
01175                                 }
01176                                 break;
01177         }
01178         fprintf(fp, "\n");
01179 }
01180 
01181 void WriteGSetfOprd(legoOp *op)
01182 {
01183         legoOprd *dest, *src;
01184         int counter;
01185         
01186         for(dest = op->GetDestOprdPtr(); dest != NULL;
01187                 dest = dest->GetNextOprdPtr())
01188         {
01189                 switch(dest->GetOprdType())
01190                 {
01191                         case OT_REG:    switch(dest->GetOprdFileType())
01192                                         {
01193                                                 case FT_GPR:    fprintf(fp, " r%d",
01194                                                                 dest->GetOprdRegNum());
01195                                                                 break;
01196                                                 case FT_FPR:    fprintf(fp, " f%d",
01197                                                                 dest->GetOprdRegNum());
01198                                                                 break;
01199                                                 default:        LegoFatal("IA64Write", 
01200                                                                 "Getf or SetF  have dest oprd that is not a greg or freg.");
01201                                                                 exit(1);
01202                                                                 
01203                                         }
01204                                         break;
01205                         default:        LegoFatal("IA64Write", 
01206                                         "Getf or Setf have dest oprd that is not a reg.");
01207                                         exit(1);
01208                 }
01209         }
01210         
01211         for(src = op->GetSrcOprdPtr(), counter = 0; src != NULL;
01212         src = src->GetNextOprdPtr())
01213         {
01214                 switch(src->GetOprdType())
01215                 {
01216                         case OT_REG:    switch(src->GetOprdFileType())
01217                                         {
01218                                                 case FT_FPR:    fprintf(fp, " = f%d",
01219                                                                 src->GetOprdRegNum());
01220                                                                 break;
01221                                                 case FT_GPR:    fprintf(fp, " = r%d",
01222                                                                 src->GetOprdRegNum());
01223                                                                 break;
01224                                                 default:        LegoFatal("IA64Write", 
01225                                                                 "Getf or Setf  have src oprd that is not a Freg or greg.");
01226                                                                 exit(1);
01227                                                                 
01228                                         }
01229                                         break;
01230                         default:        LegoFatal("IA64Write", 
01231                                         "Getf or Setf op have src oprd that is not a reg.");
01232                                         exit(1); 
01233                 }       
01234         }
01235 }
01236 
01237 void WriteFpOprd(legoOp *op)
01238 {
01239         legoOprd *dest, *src;
01240         int counter;
01241         
01242         for(dest = op->GetDestOprdPtr(); dest != NULL;
01243                 dest = dest->GetNextOprdPtr())
01244         {
01245                 switch(dest->GetOprdType())
01246                 {
01247                         case OT_REG:    switch(dest->GetOprdFileType())
01248                                         {
01249                                                 case FT_FPR:    fprintf(fp, " f%d",
01250                                                                 dest->GetOprdRegNum());
01251                                                                 break;
01252                                                 default:        LegoFatal("IA64Write", 
01253                                                                 "FP op have dest oprd that is not a Freg.");
01254                                                                 exit(1);
01255                                                                 
01256                                         }
01257                                         break;
01258                         default:        LegoFatal("IA64Write", 
01259                                         "FP op have dest oprd that is not a reg.");
01260                                         exit(1);
01261                 }
01262         }
01263         
01264         for(src = op->GetSrcOprdPtr(), counter = 0; src != NULL;
01265         src = src->GetNextOprdPtr())
01266         {
01267                 switch(src->GetOprdType())
01268                 {
01269                         case OT_REG:    switch(src->GetOprdFileType())
01270                                         {
01271                                                 case FT_FPR:    switch(counter)
01272                                                                 {
01273                                                                         case 0: fprintf(fp, " = f%d",
01274                                                                                 src->GetOprdRegNum());
01275                                                                                 counter++;
01276                                                                                 break;
01277                                                                         case 1: fprintf(fp, ", f%d", 
01278                                                                                 src->GetOprdRegNum());
01279                                                                                 counter++;
01280                                                                                 break;
01281                                                                         case 2: fprintf(fp, ", f%d", 
01282                                                                                 src->GetOprdRegNum());
01283                                                                                 break;
01284                                                                         default: LegoFatal("IA64Write", 
01285                                                                                 "XMA or Xmpy op have a unknown src oprd");
01286                                                                                 exit(1);
01287                                                                 }
01288                                                                 break;
01289                                                 default:        LegoFatal("IA64Write", 
01290                                                                 "FP op have src oprd that is not a Freg.");
01291                                                                 exit(1);
01292                                                                 
01293                                         }
01294                                         break;
01295                         default:        LegoFatal("IA64Write", 
01296                                         "FP op have src oprd that is not a reg.");
01297                                         exit(1); 
01298                 }       
01299         }       
01300 }
01301 
01302 void WriteFCmpOprd(legoOp *op)
01303 {
01304         legoOprd *dest, *src;
01305         int counter;
01306         
01307         for(dest = op->GetDestOprdPtr(), counter=0; dest != NULL;
01308                 dest = dest->GetNextOprdPtr())
01309         {
01310                 switch(dest->GetOprdType())
01311                 {
01312                         case OT_REG:    switch(dest->GetOprdFileType())
01313                                         {
01314                                                 case FT_PR: switch(counter)
01315                                                             {   
01316                                                              case 0: fprintf(fp, " p%d",
01317                                                                      dest->GetOprdRegNum());
01318                                                                      counter++;
01319                                                                      break;
01320                                                              default: fprintf(fp, ", p%d",
01321                                                                      dest->GetOprdRegNum());
01322                                                                      counter++;
01323                                                                      break;
01324                                                             }
01325                                                             break; 
01326                                                 case FT_FPR:    switch(counter)
01327                                                             {   
01328                                                              case 0: fprintf(fp, " f%d",
01329                                                                      dest->GetOprdRegNum());
01330                                                                      counter++;
01331                                                                      break;
01332                                                              default: fprintf(fp, ", f%d",
01333                                                                      dest->GetOprdRegNum());
01334                                                                      counter++;
01335                                                                      break;
01336                                                             }
01337                                                             break; 
01338                                                 default:        LegoFatal("IA64Write", 
01339                                                                 "Fcmp  have dest oprd that is not a preg or freg.");
01340                                                                 exit(1);
01341                                                                 
01342                                         }
01343                                         break;
01344                         default:        LegoFatal("IA64Write", 
01345                                         "FP op have dest oprd that is not a reg.");
01346                                         exit(1);
01347                 }
01348         }
01349         
01350         for(src = op->GetSrcOprdPtr(), counter = 0; src != NULL; 
01351                 src = src->GetNextOprdPtr())
01352         {
01353                 switch(src->GetOprdType())
01354                 {
01355                         case OT_REG:    switch(counter)
01356                                         {
01357                                                 case 0: fprintf(fp, " = f%d", 
01358                                                         src->GetOprdRegNum());
01359                                                         counter++;
01360                                                         break;
01361                                                 case 1: fprintf(fp, ", f%d", 
01362                                                         src->GetOprdRegNum());
01363                                                         break;
01364                                                 default: LegoFatal("IA64Write", 
01365                                                         "FCmp have a 3rd src oprd");
01366                                                         exit(1);
01367                                         }
01368                                         break;
01369                         case OT_LITERAL_S: switch(counter)
01370                                            {
01371                                                 case 0: fprintf(fp, " = %s", 
01372                                                         src->GetLiteralString());
01373                                                         counter++;
01374                                                         break;
01375                                                 case 1: fprintf(fp, ", %s", 
01376                                                         src->GetLiteralString());
01377                                                         break;
01378                                                 default: LegoFatal("IA64Write", 
01379                                                         "FCmp have a 3rd src oprd");
01380                                                         exit(1);
01381                                            }
01382                                            break;
01383                         case OT_LITERAL_LLNG: switch(counter)
01384                                            {
01385                                                 case 0: fprintf(fp, " = %lld", 
01386                                                         src->GetLiteralLongLong());
01387                                                         counter++;
01388                                                         break;
01389                                                 case 1: fprintf(fp, ", %lld", 
01390                                                         src->GetLiteralLongLong());
01391                                                         break;
01392                                                 default: LegoFatal("IA64Write", 
01393                                                         "FCmp have a 3rd src oprd");
01394                                                         exit(1);
01395                                            }
01396                                            break;
01397                         default:        LegoFatal("IA64Write", 
01398                                         "FCmp have src oprd that is not a reg. or a literal ");
01399                                         exit(1); 
01400                 }
01401         }
01402 }
01403 
01404 void WriteFpOp(legoOp *op)
01405 {
01406         faluQuals falu;
01407         
01408         falu = Opcode->GetFaluQuals();
01409         
01410         switch(op->GetOpcode())
01411         {
01412                 case FABS:      fprintf(fp, "fabs");
01413                                 WriteFpOprd(op);
01414                                 break;
01415                 case FADD:      fprintf(fp, "fadd");
01416                                 switch(falu.precision)
01417                                 {
01418                                         case FPP_S: fprintf(fp, ".s");
01419                                                     break;
01420                                         case FPP_D: fprintf(fp, ".d");
01421                                                     break;
01422                                         case FPP_NONE: break;
01423                                 }
01424                                 switch(falu.sfield)
01425                                 {
01426                                         case FPSF_F0: fprintf(fp, ".s0");
01427                                                       break;
01428                                         case FPSF_F1: fprintf(fp, ".s1");
01429                                                       break;
01430                                         case FPSF_F2: fprintf(fp, ".s2");
01431                                                       break;
01432                                         case FPSF_F3: fprintf(fp, ".s3");
01433                                                       break;
01434                                         case FPSF_NONE: break;
01435                                 }
01436                                 WriteFpOprd(op);
01437                                 break;
01438                 case FAMAX:     fprintf(fp, "famax");
01439                                 switch(falu.sfield)
01440                                 {
01441                                         case FPSF_F0: fprintf(fp, ".s0");
01442                                                       break;
01443                                         case FPSF_F1: fprintf(fp, ".s1");
01444                                                       break;
01445                                         case FPSF_F2: fprintf(fp, ".s2");
01446                                                       break;
01447                                         case FPSF_F3: fprintf(fp, ".s3");
01448                                                       break;
01449                                         case FPSF_NONE: break;
01450                                 }
01451                                 WriteFpOprd(op);
01452                                 break;
01453                 case FAMIN:     fprintf(fp, "famin");
01454                                 switch(falu.sfield)
01455                                 {
01456                                         case FPSF_F0: fprintf(fp, ".s0");
01457                                                       break;
01458                                         case FPSF_F1: fprintf(fp, ".s1");
01459                                                       break;
01460                                         case FPSF_F2: fprintf(fp, ".s2");
01461                                                       break;
01462                                         case FPSF_F3: fprintf(fp, ".s3");
01463                                                       break;
01464                                         case FPSF_NONE: break;
01465                                 }
01466                                 WriteFpOprd(op);
01467                                 break;
01468                 case FAND:      fprintf(fp, "fand");
01469                                 WriteFpOprd(op);
01470                                 break;
01471                 case FANDCM:    fprintf(fp, "fandcm");
01472                                 WriteFpOprd(op);
01473                                 break;
01474                 case FCVT:      fprintf(fp, "fcvt");
01475                                 switch(falu.ctype)
01476                                 {
01477                                         case OFCV_FX: fprintf(fp, ".fx");
01478                                                       break;
01479                                         case OFCV_FXU: fprintf(fp, ".fxu");
01480                                                       break;
01481                                         case OFCV_XUF: fprintf(fp, ".xuf");
01482                                                       break;
01483                                         case OFCV_XF: fprintf(fp, ".xf");
01484                                                       break;
01485                                 }
01486                                 switch(falu.trunc)
01487                                 {
01488                                         case OFT_TRUNC: fprintf(fp, ".trunc");
01489                                                         break;
01490                                         case OFT_NOTRUNC: break;
01491                                 }
01492                                 switch(falu.sfield)
01493                                 {
01494                                         case FPSF_F0: fprintf(fp, ".s0");
01495                                                       break;
01496                                         case FPSF_F1: fprintf(fp, ".s1");
01497                                                       break;
01498                                         case FPSF_F2: fprintf(fp, ".s2");
01499                                                       break;
01500                                         case FPSF_F3: fprintf(fp, ".s3");
01501                                                       break;
01502                                         case FPSF_NONE: break;
01503                                 }
01504                                 WriteFpOprd(op);
01505                                 break;
01506                 case FMA:       fprintf(fp, "fma");
01507                                 switch(falu.precision)
01508                                 {
01509                                         case FPP_S: fprintf(fp, ".s");
01510                                                     break;
01511                                         case FPP_D: fprintf(fp, ".d");
01512                                                     break;
01513                                         case FPP_NONE: break;
01514                                 }
01515                                 switch(falu.sfield)
01516                                 {
01517                                         case FPSF_F0: fprintf(fp, ".s0");
01518                                                       break;
01519                                         case FPSF_F1: fprintf(fp, ".s1");
01520                                                       break;
01521                                         case FPSF_F2: fprintf(fp, ".s2");
01522                                                       break;
01523                                         case FPSF_F3: fprintf(fp, ".s3");
01524                                                       break;
01525                                         case FPSF_NONE: break;
01526                                 }
01527                                 WriteFpOprd(op);
01528                                 break;
01529                 case FMAX:      fprintf(fp, "fmax");
01530                                 switch(falu.sfield)
01531                                 {
01532                                         case FPSF_F0: fprintf(fp, ".s0");
01533                                                       break;
01534                                         case FPSF_F1: fprintf(fp, ".s1");
01535                                                       break;
01536                                         case FPSF_F2: fprintf(fp, ".s2");
01537                                                       break;
01538                                         case FPSF_F3: fprintf(fp, ".s3");
01539                                                       break;
01540                                         case FPSF_NONE: break;
01541                                 }
01542                                 WriteFpOprd(op);
01543                                 break;
01544                 case FMERGE:    fprintf(fp, "fmerge");
01545                                 switch(falu.mergeForm)
01546                                 {
01547                                         case OFFM_NEGSIGN: fprintf(fp, ".ns");
01548                                                            break;
01549                                         case OFFM_SIGN: fprintf(fp, ".s");
01550                                                         break;
01551                                         case OFFM_EXP:  fprintf(fp, ".se");
01552                                                         break;
01553                                 }
01554                                 WriteFpOprd(op);
01555                                 break;
01556                 case FMIN:      fprintf(fp, "fmin");
01557                                 switch(falu.sfield)
01558                                 {
01559                                         case FPSF_F0: fprintf(fp, ".s0");
01560                                                       break;
01561                                         case FPSF_F1: fprintf(fp, ".s1");
01562                                                       break;
01563                                         case FPSF_F2: fprintf(fp, ".s2");
01564                                                       break;
01565                                         case FPSF_F3: fprintf(fp, ".s3");
01566                                                       break;
01567                                         case FPSF_NONE: break;
01568                                 }
01569                                 WriteFpOprd(op);
01570                                 break;
01571                 case FMIX:      fprintf(fp, "fmix");
01572                                 switch(falu.leftRight)
01573                                 {
01574                                         case OFLR_L: fprintf(fp, ".l");
01575                                                         break;
01576                                         case OFLR_R: fprintf(fp, ".r");
01577                                                         break;
01578                                         case OFLR_LR: fprintf(fp, ".lr");
01579                                                         break;
01580                                 }
01581                                 WriteFpOprd(op);
01582                                 break;
01583                 case FMPY:      fprintf(fp, "fmpy");
01584                                 switch(falu.precision)
01585                                 {
01586                                         case FPP_S: fprintf(fp, ".s");
01587                                                     break;
01588                                         case FPP_D: fprintf(fp, ".d");
01589                                                     break;
01590                                         case FPP_NONE: break;
01591                                 }
01592                                 switch(falu.sfield)
01593                                 {
01594                                         case FPSF_F0: fprintf(fp, ".s0");
01595                                                       break;
01596                                         case FPSF_F1: fprintf(fp, ".s1");
01597                                                       break;
01598                                         case FPSF_F2: fprintf(fp, ".s2");
01599                                                       break;
01600                                         case FPSF_F3: fprintf(fp, ".s3");
01601                                                       break;
01602                                         case FPSF_NONE: break;
01603                                 }
01604                                 WriteFpOprd(op);
01605                                 break;
01606                 case FMS:       fprintf(fp, "fms");
01607                                 switch(falu.precision)
01608                                 {
01609                                         case FPP_S: fprintf(fp, ".s");
01610                                                     break;
01611                                         case FPP_D: fprintf(fp, ".d");
01612                                                     break;
01613                                         case FPP_NONE: break;
01614                                 }
01615                                 switch(falu.sfield)
01616                                 {
01617                                         case FPSF_F0: fprintf(fp, ".s0");
01618                                                       break;
01619                                         case FPSF_F1: fprintf(fp, ".s1");
01620                                                       break;
01621                                         case FPSF_F2: fprintf(fp, ".s2");
01622                                                       break;
01623                                         case FPSF_F3: fprintf(fp, ".s3");
01624                                                       break;
01625                                         case FPSF_NONE: break;
01626                                 }
01627                                 WriteFpOprd(op);
01628                                 break;
01629                 case FNEG:      fprintf(fp, "fneg");
01630                                 WriteFpOprd(op);
01631                                 break;
01632                 case FNEGABS:   fprintf(fp, "fnegabs");
01633                                 WriteFpOprd(op);
01634                                 break;
01635                 case FNMA:      fprintf(fp, "fnma");
01636                                 switch(falu.precision)
01637                                 {
01638                                         case FPP_S: fprintf(fp, ".s");
01639                                                     break;
01640                                         case FPP_D: fprintf(fp, ".d");
01641                                                     break;
01642                                         case FPP_NONE: break;
01643                                 }
01644                                 switch(falu.sfield)
01645                                 {
01646                                         case FPSF_F0: fprintf(fp, ".s0");
01647                                                       break;
01648                                         case FPSF_F1: fprintf(fp, ".s1");
01649                                                       break;
01650                                         case FPSF_F2: fprintf(fp, ".s2");
01651                                                       break;
01652                                         case FPSF_F3: fprintf(fp, ".s3");
01653                                                       break;
01654                                         case FPSF_NONE: break;
01655                                 }
01656                                 WriteFpOprd(op);
01657                                 break;
01658                 case FNMPY:     fprintf(fp, "fnmpy");
01659                                 switch(falu.precision)
01660                                 {
01661                                         case FPP_S: fprintf(fp, ".s");
01662                                                     break;
01663                                         case FPP_D: fprintf(fp, ".d");
01664                                                     break;
01665                                         case FPP_NONE: break;
01666                                 }
01667                                 switch(falu.sfield)
01668                                 {
01669                                         case FPSF_F0: fprintf(fp, ".s0");
01670                                                       break;
01671                                         case FPSF_F1: fprintf(fp, ".s1");
01672                                                       break;
01673                                         case FPSF_F2: fprintf(fp, ".s2");
01674                                                       break;
01675                                         case FPSF_F3: fprintf(fp, ".s3");
01676                                                       break;
01677                                         case FPSF_NONE: break;
01678                                 }
01679                                 WriteFpOprd(op);
01680                                 break;
01681                 case FNORM:     fprintf(fp, "fnorm");
01682                                 switch(falu.precision)
01683                                 {
01684                                         case FPP_S: fprintf(fp, ".s");
01685                                                     break;
01686                                         case FPP_D: fprintf(fp, ".d");
01687                                                     break;
01688                                         case FPP_NONE: break;
01689                                 }
01690                                 switch(falu.sfield)
01691                                 {
01692                                         case FPSF_F0: fprintf(fp, ".s0");
01693                                                       break;
01694                                         case FPSF_F1: fprintf(fp, ".s1");
01695                                                       break;
01696                                         case FPSF_F2: fprintf(fp, ".s2");
01697                                                       break;
01698                                         case FPSF_F3: fprintf(fp, ".s3");
01699                                                       break;
01700                                         case FPSF_NONE: break;
01701                                 }
01702                                 WriteFpOprd(op);
01703                                 break;
01704                 case FOR:       fprintf(fp, "for");
01705                                 WriteFpOprd(op);
01706                                 break;
01707                 case FRCPA:     fprintf(fp, "frcpa");
01708                                 switch(falu.sfield)
01709                                 {
01710                                         case FPSF_F0: fprintf(fp, ".s0");
01711                                                       break;
01712                                         case FPSF_F1: fprintf(fp, ".s1");
01713                                                       break;
01714                                         case FPSF_F2: fprintf(fp, ".s2");
01715                                                       break;
01716                                         case FPSF_F3: fprintf(fp, ".s3");
01717                                                       break;
01718                                         case FPSF_NONE: break;
01719                                 }
01720                                 WriteFCmpOprd(op);
01721                                 break;
01722                 case FRSQRTA:   fprintf(fp, "frsqrta");
01723                                 switch(falu.sfield)
01724                                 {
01725                                         case FPSF_F0: fprintf(fp, ".s0");
01726                                                       break;
01727                                         case FPSF_F1: fprintf(fp, ".s1");
01728                                                       break;
01729                                         case FPSF_F2: fprintf(fp, ".s2");
01730                                                       break;
01731                                         case FPSF_F3: fprintf(fp, ".s3");
01732                                                       break;
01733                                         case FPSF_NONE: break;
01734                                 }
01735                                 WriteFCmpOprd(op);
01736                                 break;
01737                 case FSELECT:   fprintf(fp, "fselect");
01738                                 WriteFpOprd(op);
01739                                 break;
01740                 case FSUB:      fprintf(fp, "fsub");
01741                                 switch(falu.precision)
01742                                 {
01743                                         case FPP_S: fprintf(fp, ".s");
01744                                                     break;
01745                                         case FPP_D: fprintf(fp, ".d");
01746                                                     break;
01747                                         case FPP_NONE: break;
01748                                 }
01749                                 switch(falu.sfield)
01750                                 {
01751                                         case FPSF_F0: fprintf(fp, ".s0");
01752                                                       break;
01753                                         case FPSF_F1: fprintf(fp, ".s1");
01754                                                       break;
01755                                         case FPSF_F2: fprintf(fp, ".s2");
01756                                                       break;
01757                                         case FPSF_F3: fprintf(fp, ".s3");
01758                                                       break;
01759                                         case FPSF_NONE: break;
01760                                 }
01761                                 WriteFpOprd(op);
01762                                 break;
01763                 case FSWAP:     fprintf(fp, "fswap");
01764                                 switch(falu.leftRight)
01765                                 {
01766                                         case OFLR_L: fprintf(fp, ".l");
01767                                                         break;
01768                                         case OFLR_R: fprintf(fp, ".r");
01769                                                         break;
01770                                         case OFLR_NONE: break;
01771                                 }
01772                                 WriteFpOprd(op);
01773                                 break;
01774                 case FXOR:      fprintf(fp, "fxor");
01775                                 WriteFpOprd(op);
01776                                 break;
01777                 case GETF:      fprintf(fp, "getf");
01778                                 switch(falu.getSetForm)
01779                                 {
01780                                         case OFFC_S:    fprintf(fp,".s");
01781                                                         break;
01782                                         case OFFC_D:    fprintf(fp,".d");
01783                                                         break;
01784                                         case OFFC_EXP:  fprintf(fp,".exp");
01785                                                         break;
01786                                         case OFFC_SIG:  fprintf(fp,".sig");
01787                                                         break;
01788                                 }
01789                                 WriteGSetfOprd(op);
01790                                 break;
01791                 case SETF:      fprintf(fp, "setf");
01792                                 switch(falu.getSetForm)
01793                                 {
01794                                         case OFFC_S:    fprintf(fp,".s");
01795                                                         break;
01796                                         case OFFC_D:    fprintf(fp,".d");
01797                                                         break;
01798                                         case OFFC_EXP:  fprintf(fp,".exp");
01799                                                         break;
01800                                         case OFFC_SIG:  fprintf(fp,".sig");
01801                                                         break;
01802                                 }
01803                                 WriteGSetfOprd(op);
01804                                 break;
01805                 case FSXT:      fprintf(fp, "fsxt");
01806                                 switch(falu.leftRight)
01807                                 {
01808                                         case OFLR_L: fprintf(fp, ".l");
01809                                                         break;
01810                                         case OFLR_R: fprintf(fp, ".r");
01811                                                         break;
01812                                 }
01813                                 WriteFpOprd(op);
01814                                 break;
01815         }
01816         fprintf(fp, "\n");
01817 }
01818 
01819 void WriteLDFOprd(legoOp *op)
01820 {
01821         legoOprd *dest, *src;
01822         int counter;
01823         
01824         
01825         
01826         
01827         for(dest = op->GetDestOprdPtr(), counter = 0; dest != NULL;
01828                 dest = dest->GetNextOprdPtr())
01829         {
01830                 switch(dest->GetOprdType())
01831                 {
01832                         case OT_REG: switch(op->GetOpcode())
01833                                      {
01834                                         case LDFP:
01835                                         switch(counter)
01836                                         { 
01837                                                 case 0: fprintf(fp, " f%d",
01838                                                         dest->GetOprdRegNum());
01839                                                         counter++;
01840                                                         break;
01841                                                 default: fprintf(fp, ", f%d",
01842                                                         dest->GetOprdRegNum());
01843                                                         counter++;
01844                                                         assert(counter <= 2);
01845                                                         break;
01846                                         }
01847                                         break;
01848                                         case LDF: //HZ: only output first dest of LDF
01849                                         if(counter == 0)
01850                                         {
01851                                             fprintf(fp, " f%d",dest->GetOprdRegNum());
01852                                         
01853                                         }
01854                                         counter++;
01855                                         break;
01856                                     }
01857                                     break;
01858                         default:    LegoFatal("IA64Write", 
01859                                         "LDST of FP have dest oprd that is not a reg.");
01860                                         exit(1);
01861                 }
01862         }
01863         
01864         for(src = op->GetSrcOprdPtr(), counter = 0; src != NULL;
01865         src = src->GetNextOprdPtr())
01866         {
01867                 switch(src->GetOprdType())
01868                 {
01869                         case OT_REG:    switch(counter)
01870                                         {
01871                                                 case 0: switch(op->GetOpcode())
01872                                                         {
01873                                                          case LDFP:
01874                                                          case LDF: fprintf(fp, " = [r%d]", 
01875                                                                   src->GetOprdRegNum());
01876                                                                   counter++;
01877                                                                   break;
01878                                                          case STF: fprintf(fp, " [r%d] = ", 
01879                                                                   src->GetOprdRegNum());
01880                                                                   counter++;
01881                                                                   break;
01882                                                         }
01883                                                         break;
01884                                                 case 1: if(op->GetOpcode() == STF)
01885                                                         {
01886                                                             fprintf(fp, "f%d", src->GetOprdRegNum());
01887                                                         }
01888                                                         else
01889                                                         {
01890                                                             fprintf(fp, ", r%d", src->GetOprdRegNum());
01891                                                         }
01892                                                         counter++;
01893                                                         break;
01894                                                 default: LegoFatal("IA64Write", 
01895                                                         "LdSt op have a unknown src oprd");
01896                                                         exit(1);
01897                                         }
01898                                         break;
01899                         case OT_LITERAL_S: fprintf(fp, ", %s",
01900                                            src->GetLiteralString());
01901                                            break;
01902                         case OT_LITERAL_LLNG: fprintf(fp, ", %lld",
01903                                            src->GetLiteralLongLong());
01904                                            break;
01905                         default:        LegoFatal("IA64Write", 
01906                                         "LDST of FP op have src oprd that is not a reg. or a literal ");
01907                                         exit(1); 
01908                 }       
01909         }       
01910 }
01911 
01912 void WriteFpLdstOp(legoOp *op)
01913 {
01914         fldstQuals fldst;
01915         
01916         fldst = Opcode->GetFmemQuals();
01917         
01918         switch(op->GetOpcode())
01919         {
01920                 case LDF:       fprintf(fp, "ldf");
01921                                 switch(fldst.size)
01922                                 {
01923                                         case FLSS_S: fprintf(fp, "s");
01924                                                         break;
01925                                         case FLSS_D: fprintf(fp, "d");
01926                                                         break;
01927                                         case FLSS_E: fprintf(fp, "e");
01928                                                         break;
01929                                         case FLSS_I: fprintf(fp, "8");
01930                                                         break;
01931                                         case FLSS_NONE: break;
01932                                 }
01933                                 switch(fldst.type)
01934                                 {
01935                                         case LST_S: fprintf(fp, ".s");
01936                                                         break;
01937                                         case LST_A: fprintf(fp, ".a");
01938                                                         break;
01939                                         case LST_SA: fprintf(fp, ".sa");
01940                                                         break;
01941                                         case LST_CNC: fprintf(fp, ".c.nc");
01942                                                         break;
01943                                         case LST_CC: fprintf(fp, ".c.clr");
01944                                                         break;
01945                                         case LST_FILL: fprintf(fp, ".fill");
01946                                                         break;
01947                                         case LST_NONE: break;
01948                                 }
01949                                 switch(fldst.hint)
01950                                 {
01951                                         case LSH_NT1: fprintf(fp, ".nt1");
01952                                                         break;
01953                                         case LSH_NTA: fprintf(fp, ".nta");
01954                                                         break;
01955                                         case LSH_NONE: break;           
01956                                 }
01957                                 WriteLDFOprd(op);
01958                                 break;
01959                 case LDFP:      fprintf(fp, "ldfp");
01960                                 switch(fldst.size)
01961                                 {
01962                                         case FLSS_S: fprintf(fp, "s");
01963                                                         break;
01964                                         case FLSS_D: fprintf(fp, "d");
01965                                                         break;
01966                                         case FLSS_I: fprintf(fp, "8");
01967                                                         break;
01968                                 }
01969                                 switch(fldst.type)
01970                                 {
01971                                         case LST_S: fprintf(fp, ".s");
01972                                                         break;
01973                                         case LST_A: fprintf(fp, ".a");
01974                                                         break;
01975                                         case LST_SA: fprintf(fp, ".sa");
01976                                                         break;
01977                                         case LST_CNC: fprintf(fp, ".c.nc");
01978                                                         break;
01979                                         case LST_CC: fprintf(fp, ".c.clr");
01980                                                         break;
01981                                         case LST_FILL: fprintf(fp, ".fill");
01982                                                         break;
01983                                         case LST_NONE: break;
01984                                 }
01985                                 switch(fldst.hint)
01986                                 {
01987                                         case LSH_NT1: fprintf(fp, ".nt1");
01988                                                         break;
01989                                         case LSH_NTA: fprintf(fp, ".nta");
01990                                                         break;
01991                                         case LSH_NONE: break;           
01992                                 }
01993                                 WriteLDFOprd(op);
01994                                 break;
01995                 case STF:       fprintf(fp, "stf");
01996                                 switch(fldst.size)
01997                                 {
01998                                         case FLSS_S: fprintf(fp, "s");
01999                                                         break;
02000                                         case FLSS_D: fprintf(fp, "d");
02001                                                         break;
02002                                         case FLSS_E: fprintf(fp, "e");
02003                                                         break;
02004                                         case FLSS_I: fprintf(fp, "8");
02005                                                         break;
02006                                         case FLSS_NONE: break;
02007                                 }
02008                                 switch(fldst.type)
02009                                 {
02010                                         case LST_SPILL: fprintf(fp, ".spill");
02011                                                         break;
02012                                         case LST_NONE: break;
02013                                 }
02014                                 switch(fldst.hint)
02015                                 {
02016                                         case LSH_NTA: fprintf(fp, ".nta");
02017                                                         break;
02018                                         case LSH_NONE: break;           
02019                                 }
02020                                 WriteLDFOprd(op);
02021                                 break;
02022         }
02023         fprintf(fp, "\n");
02024 }
02025 
02026 void WriteFpCmpOp(legoOp *op)
02027 {
02028         fcmpQuals fcmp;
02029         
02030         fcmp = Opcode->GetFcmpQuals();
02031         
02032         switch(op->GetOpcode())
02033         {
02034                 case FCMP:      fprintf(fp, "fcmp");
02035                                 switch(fcmp.relation)
02036                                 {
02037                                         case FCR_EQ:    fprintf(fp, ".eq");
02038                                                         break;
02039                                         case FCR_NEQ:   fprintf(fp, ".neq");
02040                                                         break;
02041                                         case FCR_LT:    fprintf(fp, ".lt");
02042                                                         break;
02043                                         case FCR_NLT:   fprintf(fp, ".nlt");
02044                                                         break;
02045                                         case FCR_LE:    fprintf(fp, ".le");
02046                                                         break;
02047                                         case FCR_NLE:   fprintf(fp, ".nle");
02048                                                         break;
02049                                         case FCR_GT:    fprintf(fp, ".gt");
02050                                                         break;
02051                                         case FCR_NGT:   fprintf(fp, ".ngt");
02052                                                         break;
02053                                         case FCR_GE:    fprintf(fp, ".ge");
02054                                                         break;
02055                                         case FCR_NGE:   fprintf(fp, ".nge");
02056                                                         break;
02057                                         case FCR_UNORD: fprintf(fp, ".unord");
02058                                                         break;
02059                                         case FCR_ORD:   fprintf(fp, ".ord");
02060                                                         break;
02061                                 }
02062                                 switch(fcmp.type)
02063                                 {
02064                                         case FCT_UNC: fprintf(fp, ".unc");
02065                                                         break;
02066                                         case FCT_NONE: break;
02067                                 }
02068                                 switch(fcmp.sfield)
02069                                 {
02070                                         case FPSF_F0: fprintf(fp, ".s0");
02071                                                       break;
02072                                         case FPSF_F1: fprintf(fp, ".s1");
02073                                                       break;
02074                                         case FPSF_F2: fprintf(fp, ".s2");
02075                                                       break;
02076                                         case FPSF_F3: fprintf(fp, ".s3");
02077                                                       break;
02078                                         case FPSF_NONE: break;
02079                                 }
02080                                 WriteFCmpOprd(op);
02081                                 break;
02082                 case FCLASS:    fprintf(fp, "fclass");
02083                                 switch(fcmp.classrelation)
02084                                 {
02085                                         case FPCR_M: fprintf(fp, ".m");
02086                                                         break;
02087                                         case FPCR_NM: fprintf(fp, ".nm");
02088                                                         break;
02089                                 }
02090                                 switch(fcmp.type)
02091                                 {
02092                                         case FCT_UNC: fprintf(fp, ".unc");
02093                                                         break;
02094                                         case FCT_NONE: break;
02095                                 }
02096                                 WriteFCmpOprd(op);
02097                                 break;
02098         }
02099         fprintf(fp, "\n");
02100 }
02101 
02102 void WriteMiscOp(legoOp *op)
02103 {
02104         miscQuals misc; 
02105 
02106         misc = Opcode->GetMiscQuals();
02107 
02108         legoOprd *dest, *src;
02109         int counter;
02110         
02111         switch(op->GetOpcode())
02112         {
02113                 case ALLOC:     fprintf(fp, "alloc");
02114                                 for(dest = op->GetDestOprdPtr(); dest != NULL;
02115                                         dest = dest->GetNextOprdPtr())
02116                                 {
02117                                         if(dest->GetOprdType() == OT_REG)
02118                                         {
02119                                                 fprintf(fp, " r%d", dest->GetOprdRegNum());
02120                                         }
02121                                         
02122                                         // This has to be removed.
02123                                         //else if(dest->GetOprdType() == OT_LITERAL_S)
02124                                         //{
02125                                         //      fprintf(fp, " %s", dest->GetLiteralString());
02126                                         //}
02127                                         
02128                                         
02129                                 }
02130                                 
02131                                 fprintf(fp, " =");
02132                                 
02133                                 for(src = op->GetSrcOprdPtr(), counter = 0; src != NULL;
02134                                         src = src->GetNextOprdPtr())
02135                                 {
02136                                         
02137                                         switch(src->GetOprdType())
02138                                         {
02139                                                 case OT_LITERAL_S: switch(counter)
02140                                                                    {
02141                                                                     case 0: fprintf(fp, " %s", 
02142                                                                             src->GetLiteralString());
02143                                                                             counter++;
02144                                                                             break;
02145                                                                     case 4:
02146                                                                     case 3:
02147                                                                     case 1: 
02148                                                                     case 2: fprintf(fp, ", %s", 
02149                                                                             src->GetLiteralString());
02150                                                                             counter++;
02151                                                                             break;
02152                                                                     }
02153                                                                     break;
02154                                                 case OT_LITERAL_LLNG:  switch(counter)
02155                                                                    {
02156                                                                     case 0: fprintf(fp, " %lld", 
02157                                                                             src->GetLiteralLongLong());
02158                                                                             counter++;
02159                                                                             break;
02160                                                                     case 4:
02161                                                                     case 3:
02162                                                                     case 1: 
02163                                                                     case 2: fprintf(fp, ", %lld", 
02164                                                                             src->GetLiteralLongLong());
02165                                                                             counter++;
02166                                                                             break;
02167                                                                     }
02168                                                                     break;
02169                                                 default:        LegoFatal("IA64Write", 
02170                                                                 "Alloc have src oprd that is not a literal.");
02171                                                                 exit(1);
02172                                         }
02173                                 } 
02174                                 break;
02175                 case NOP:       fprintf(fp, "nop");
02176                                 for(dest = op->GetDestOprdPtr(); dest != NULL;
02177                                         dest = dest->GetNextOprdPtr())
02178                                 {
02179                                         switch(dest->GetOprdType())
02180                                         {
02181                                                 case OT_LITERAL_S: fprintf(fp, " %s", 
02182                                                                             dest->GetLiteralString());
02183                                                                             counter++;
02184                                                                             break;
02185                                                                     
02186                                                                     break;
02187                                                 case OT_LITERAL_LLNG: fprintf(fp, " %lld", 
02188                                                                             dest->GetLiteralLongLong());
02189                                                                             counter++;
02190                                                                             break;
02191                                                                     
02192                                                                    
02193                                                 default:        LegoFatal("IA64Write", 
02194                                                                 "NOP have dest oprd that is not a literal.");
02195                                                                 exit(1);
02196                                         }       
02197                                         
02198                                 }
02199                                 break;
02200                 case BREAK:     fprintf(fp, "break");
02201 
02202                                 switch(misc.breakUnit)
02203                                   {
02204                                   case OFMU_I: 
02205                                     fprintf(fp, ".i");
02206                                     break;
02207                                   case OFMU_B: 
02208                                     fprintf(fp, ".b");
02209                                     break;
02210                                   case OFMU_M: 
02211                                     fprintf(fp, ".m");
02212                                     break;
02213                                   case OFMU_F: 
02214                                     fprintf(fp, ".f");
02215                                     break;
02216                                   case OFMU_X: 
02217                                     fprintf(fp, ".x");
02218                                     break;
02219                                   case OFMU_NONE: 
02220                                     break;
02221                                   }
02222                   
02223                                 for(src = op->GetSrcOprdPtr(); src != NULL;
02224                                         src = src->GetNextOprdPtr())
02225                                 {
02226                                         switch(src->GetOprdType())
02227                                         {
02228                                                 case OT_LITERAL_LLNG: fprintf(fp, " %lld", 
02229                                                                             src->GetLiteralLongLong());
02230                                                                             break;
02231                                                                    
02232                                                 default:        LegoFatal("IA64Write", 
02233                                                                 "BREAK has src oprd that is not a literal long long.");
02234                                                                 exit(1);
02235                                         }       
02236                                         
02237                                 }
02238                                 break;
02239         }
02240         fprintf(fp, "\n");
02241 }
02242 
02243 void IA64WriteVariable(nameTable * var, FILE *out)
02244 {
02245     fprintf(out, "%s", var->GetInfo());
02246 }
02247 
02248 void IA64WriteData1Seg(symbolTable * sym, FILE *out)
02249 {
02250   for(int i=0; i < sym->GetVarCount();i++) {
02251     if (sym->GetVarTablePtr(i)->GetImportType() == LIR_GNU_WEAK) {
02252       fprintf(out, ".weak %s#\n", sym->GetVarTablePtr(i)->GetVarName());
02253       fprintf(out, ".section        .gnu.linkonce.r.%s,\"a\",@progbits\n", sym->GetVarTablePtr(i)->GetVarName());
02254       IA64WriteVariable(sym->GetVarTablePtr(i), out);
02255     }
02256     else {
02257       fprintf(out, ".section .rodata\n");
02258       IA64WriteVariable(sym->GetVarTablePtr(i), out);
02259     }
02260   }
02261 }
02262 
02263 void IA64WriteDataSeg(symbolTable * sym, FILE *out)
02264 {
02265   for(int i=0; i < sym->GetVarCount();i++) {
02266     if (sym->GetVarTablePtr(i)->GetImportType() == LIR_GNU_WEAK) {
02267       fprintf(out, ".weak %s#\n", sym->GetVarTablePtr(i)->GetVarName());
02268       fprintf(out, ".section        .gnu.linkonce.d.%s,\"aw\",@progbits\n", sym->GetVarTablePtr(i)->GetVarName());
02269       IA64WriteVariable(sym->GetVarTablePtr(i), out);
02270     }
02271     else {
02272       fprintf(out, ".data\n");
02273       IA64WriteVariable(sym->GetVarTablePtr(i), out);
02274     }
02275   }
02276 }
02277 
02278 void IA64WriteSDataSeg(symbolTable * sym, FILE *out)
02279 {
02280     fprintf(out, ".sdata\n");
02281     for(int i=0; i < sym->GetVarCount();i++)
02282       IA64WriteVariable(sym->GetVarTablePtr(i), out);
02283 }
02284         
02285 void IA64WriteBssSeg(symbolTable * sym, FILE *out)
02286 {
02287     fprintf(out, ".bss\n");
02288     for(int i=0; i < sym->GetVarCount();i++)
02289       IA64WriteVariable(sym->GetVarTablePtr(i), out);
02290 }
02291 
02292 void IA64WriteSBssSeg(symbolTable * sym, FILE *out)
02293 {
02294     fprintf(out, ".sbss\n");
02295     for(int i=0; i < sym->GetVarCount();i++)
02296       IA64WriteVariable(sym->GetVarTablePtr(i), out);
02297 }
02298 
02299 void IA64WriteCommentSeg(symbolTable * sym, FILE *out)
02300 {
02301     //for the .common directives
02302     for(int i=0; i < sym->GetVarCount();i++)
02303       IA64WriteVariable(sym->GetVarTablePtr(i), out);
02304 }
02305 
02306 void IA64WriteCtorsSeg(legoProc *proc)
02307 {
02308   attrList *alc;
02309   attrs *a;
02310   char *directive;
02311   
02312   alc = proc->GetRegionAttrListPtr();
02313   
02314   for(; alc != NULL; alc = alc->GetNextListPtr())
02315     {
02316       a = alc->GetAttrPtr();
02317       if(!a) continue;
02318       
02319       if(a->GetAttrType() == ATTR_LC)
02320         {
02321           for(a = alc->GetAttrPtr(); a != NULL; 
02322               a = a->GetNextLcEntryPtr())
02323             {
02324               if(strncmp(a->GetAttrString(), 
02325                          "ctor_declaration:", 17) == 0)
02326                 {
02327                   directive = a->GetAttrString() + 
02328                     strlen("ctor_declaration:");
02329                   fprintf(fp, ".section        .ctors,\"aw\",@progbits\n");
02330                   fprintf(fp, "%s", directive);
02331                 }
02332             }
02333         }
02334       
02335     }
02336 }
02337 
02338 void IA64WriteDtorsSeg(legoProc *proc)
02339 {
02340   attrList *alc;
02341   attrs *a;
02342   char *directive;
02343   
02344   alc = proc->GetRegionAttrListPtr();
02345   
02346   for(; alc != NULL; alc = alc->GetNextListPtr())
02347     {
02348       a = alc->GetAttrPtr();
02349       if(!a) continue;
02350       
02351       if(a->GetAttrType() == ATTR_LC)
02352         {
02353           for(a = alc->GetAttrPtr(); a != NULL; 
02354               a = a->GetNextLcEntryPtr())
02355             {
02356               if(strncmp(a->GetAttrString(), 
02357                          "dtor_declaration:", 17) == 0)
02358                 {
02359                   directive = a->GetAttrString() + 
02360                     strlen("dtor_declaration:");
02361                   fprintf(fp, ".section        .dtors,\"aw\",@progbits\n");
02362                   fprintf(fp, "%s", directive);
02363                 }
02364             }
02365         }
02366       
02367     }
02368 }
02369 
02370 void WriteGroupEnd(legoOp * op)
02371 {
02372         attrList *alc;
02373         attrs *a;
02374         char *directive;
02375         
02376         alc = op->GetOpAttrListPtr();
02377         
02378         for(; alc != NULL; alc = alc->GetNextListPtr())
02379         {
02380          a = alc->GetAttrPtr();
02381          if(!a) continue;
02382                 
02383          if(a->GetAttrType() == ATTR_LC)
02384          {
02385                 for(a = alc->GetAttrPtr(); a != NULL; 
02386                         a = a->GetNextLcEntryPtr())
02387                 {
02388                         if(strncmp(a->GetAttrString(), 
02389                         "group_end:", 10) == 0)
02390                         {
02391                                 fprintf(fp, "\t;;\n");
02392                         }
02393                 }
02394          }
02395                 
02396         }
02397 }
02398 
02399 //HZ: write to the file specified by global variable fp
02400 void IA64RegionWrite(legoRegion * Region, legoProc *Proc)
02401 {
02402     int i;
02403     switch(Region->GetRegionType())
02404     {
02405         case RT_TREE:
02406                 for(i = 0; i < Region->GetCount(); i++)
02407                 {
02408                     legoRegion *region = (legoRegion *)Region->GetItem(i);
02409                     IA64RegionWrite(region, Proc);
02410                 }
02411                 break;
02412         case RT_BB:
02413         {
02414                         legoOp * op = Region->GetEntryOpsPtr()->GetOpPtr();
02415                         for(; op != NULL; op = op->GetNextLink())
02416                         {
02417                                 //legoOp * op = (legoOp *) Region->GetItem(k);
02418                                 
02419                                 WriteDirective(op);
02420                                 
02421                                 //This write the predicate oprd of
02422                                 //an op (if any).
02423                                 WritePredicateOprd(op);
02424                                 
02425                                 Opcode = op->GetOpcodePtr(); //HZ: global variable 
02426                                 
02427                                 if(Opcode->GetOpcodeClass() == OC_BR)
02428                                 {
02429                                         fprintf(fp, "\t");
02430                                         WriteBrOp(op, Proc);
02431                                         WriteJTBL(op);
02432                                 }
02433                                 
02434                                 else if(Opcode->GetOpcodeClass() == OC_CMP)
02435                                 {
02436                                         fprintf(fp, "\t");
02437                                         WriteCmpOp(op);
02438                                 }
02439                                 
02440                                 else if(Opcode->GetOpcodeClass() == OC_INT)
02441                                 {
02442                                         fprintf(fp, "\t");
02443                                         WriteIntOp(op);
02444                                 }
02445                                 else if(Opcode->GetOpcodeClass() == OC_LDST)
02446                                 {
02447                                         fprintf(fp, "\t");
02448                                         WriteIldstOp(op);
02449                                 }
02450                                 else if(Opcode->GetOpcodeClass() == OC_FP)
02451                                 {
02452                                         fprintf(fp, "\t");
02453                                         WriteFpOp(op);
02454                                 }
02455                                 else if(Opcode->GetOpcodeClass() == OC_FCMP)
02456                                 {
02457                                         fprintf(fp, "\t");
02458                                         WriteFpCmpOp(op);
02459                                 }
02460                                 else if(Opcode->GetOpcodeClass() == OC_FPLDST)
02461                                 {
02462                                         fprintf(fp, "\t");
02463                                         WriteFpLdstOp(op);
02464                                 }
02465                                 else if(Opcode->GetOpcodeClass() == OC_UNDEF)
02466                                 {
02467                                         if(op->GetOpcode() == NO_OP)
02468                                         fprintf(fp, "\t;;\n");
02469                                         
02470                                         else if(op->IsCMERGEOp())
02471                                         {
02472                                            legoOprd *dest;
02473                                            dest = op->GetDestOprdPtr();
02474                                            if(dest != NULL)
02475                                            {
02476                                                 if(dest->GetOprdType() == 
02477                                                 OT_LITERAL_S)
02478                                                 {
02479                                                  fprintf(fp, ".%s:\n", 
02480                                                  dest->GetLiteralString());
02481                                                 }
02482                                                 //HZ: due to the legoIA64 lexer, all labels start with a capital
02483                                                 //letter
02484                                                 //Also, IA64 assembler requires unique label name in the file
02485                                                 //(legoModule) scope instead of function (legoProc) scope.
02486                                                 //So, add function name to disambiguate.
02487                                                 if(dest->GetOprdType() ==
02488                                                         OT_LITERAL_CB)
02489                                                     fprintf(fp, ".C_%s_B%d:\n", Proc->GetProcName(), dest->GetLiteralControlBlock());
02490                                             }
02491                                         }
02492                                 }
02493                                 else if(Opcode->GetOpcodeClass() == OC_MISC)
02494                                 {
02495                                         fprintf(fp, "\t");
02496                                         WriteMiscOp(op);
02497                                 } 
02498                                 
02499                                 WriteGroupEnd(op);                                      
02500                         }
02501                     }
02502                 break;
02503         default:
02504                 fprintf(stderr, "Error: IA64RegionWrite region type not supported.\n");
02505                 exit(-1);
02506     }
02507 }
02508 
02509 int IA64Write (legoModule *Module, char *infile)
02510 {
02511         //legoModule *Module;
02512         legoProc *Proc;
02513         legoRegion *Region;
02514         legoOp *op;
02515         vector <char *> * cmts;
02516         vector <char *>::iterator comi;
02517         bool anyWeak = false; 
02518         
02519         if(!Module)
02520         {
02521                 LegoFatal("IA64Wrt", "Module is a null pointer\n");
02522                 return 1;
02523         }
02524         
02525         fp = fopen(infile, "w");
02526         //Module = new legoModule;
02527         //printf ("Reading in file %s ...\n", argv[1]);
02528         //LegoRead_IA64(argv[1], Module);
02529         
02530         //fprintf(fp, ".auto\n");
02531         
02532         fprintf(fp, ".file ");
02533         
02534         //Print out the comments of the module
02535         cmts = Module->GetComments();
02536         if(cmts != NULL)
02537         {
02538                 for (comi = cmts->begin(); comi != cmts->end(); comi++)
02539                 {
02540                         if(strstr(*comi, "//IA: ") != NULL)
02541                         fprintf(fp, "%s", *comi + strlen("//IA: "));
02542                         
02543                         else if(strstr(*comi, "//Global: ") != NULL)
02544                         fprintf(fp, "%s", *comi + strlen("//Global: "));
02545                 }
02546         }
02547         
02548         //First write out the data segments
02549         if(Module->GetData1Ptr() != NULL)
02550         IA64WriteData1Seg(Module->GetData1Ptr(), fp);
02551         if(Module->GetDataPtr() != NULL)
02552         IA64WriteDataSeg(Module->GetDataPtr(), fp);
02553         if(Module->GetSDataPtr() != NULL)
02554         IA64WriteSDataSeg(Module->GetSDataPtr(), fp);
02555         if(Module->GetBssPtr() != NULL)
02556         IA64WriteBssSeg(Module->GetBssPtr(), fp);
02557         if(Module->GetSBssPtr() != NULL)
02558         IA64WriteSBssSeg(Module->GetSBssPtr(), fp);
02559     
02560         //output the necessary comments (.common & .lcomm directives currently)
02561         if(Module->GetCommentPtr() != NULL)
02562         IA64WriteCommentSeg(Module->GetCommentPtr(), fp);
02563         
02564         //printf("\n Done reading file!!\n");
02565         
02566         for(int i = 0; i < Module->GetCount(); i++)
02567         {
02568                 Proc = (legoProc *) Module->GetItem(i);
02569                 
02570                 if(Proc->GetInfo() != NULL)
02571                     fprintf(fp, "%s", Proc->GetInfo());
02572                 
02573                 if (Proc->GetScope() == LIR_GNU_WEAK) {
02574                   anyWeak = true; 
02575                   fprintf(fp, "\t.section        .gnu.linkonce.t.%s,\"ax\",@progbits\n",
02576                           Proc->GetProcName());
02577                   fprintf(fp, "\t.align 16\n\t.weak %s#\n\t.proc %s#\n",
02578                           Proc->GetProcName(), Proc->GetProcName());
02579                   fprintf(fp, "%s:\n", Proc->GetProcName());
02580                 }
02581                 else {
02582                   fprintf(fp, ".text\n");
02583                   if(Proc->GetScope() == LIR_GLOBAL)
02584                     {
02585                       fprintf(fp, "\t.align 16\n\t.global %s#\n\t.proc %s#\n",
02586                               Proc->GetProcName(), Proc->GetProcName());
02587                     }
02588                   else
02589                     {
02590                       fprintf(fp, "\t.align 16\n\t.proc %s#\n",
02591                               Proc->GetProcName(), Proc->GetProcName());
02592                     }
02593                   fprintf(fp, "%s:\n", Proc->GetProcName());
02594                 }
02595                 
02596                 for(int j = 0; j < Proc->GetCount(); j++)
02597                 {
02598                         Region = (legoRegion *) Proc->GetItem(j);
02599                         
02600                         IA64RegionWrite(Region, Proc);
02601                 }
02602                 WriteEndpDirective(Proc); 
02603                 fprintf(fp, "\t.endp %s#\n", Proc->GetProcName());
02604                 IA64WriteCtorsSeg(Proc);
02605                 IA64WriteDtorsSeg(Proc);
02606                 
02607         } 
02608         
02609         if (anyWeak) {
02610           fprintf(fp, "%s", "\t.weak   pthread_mutex_unlock#\n\t.weak   pthread_mutex_trylock#\n\t.weak   pthread_mutex_lock#\n\t.weak   pthread_create#\n\t.weak   pthread_setspecific#\n\t.weak   pthread_getspecific#\n\t.weak   pthread_key_delete#\n\t.weak   pthread_key_create#\n\t.weak   pthread_once#\n\t.ident  \"GCC: (GNU) 3.1\"\n");
02611         }
02612 
02613         //LegoWrite(Module);
02614         //printf ("LegoInOut done!\n"); 
02615         //delete Module;
02616         fclose(fp);
02617         return 0;
02618 }

Generated on Mon Jul 21 20:24:16 2003 for TINKER LEGO DOC by doxygen 1.3.2