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

legoOprd.H

Go to the documentation of this file.
00001 /*
00002  *   Name:        legoOprd.H
00003  *
00004  *   Designer:    Willie Glover
00005  *
00006  *   Created:     4/10/96
00007  *
00008  *   Description: This file contains the hesder file for the LEGO operand
00009  *                base class used for the LEGO IR.
00010  *
00011  *   Location:    /ncsu/tinker/LEGO/src/base/legoOprd.H
00012  *
00013  *   Methods:     /ncsu/tinker/LEGO/src/base/legoOprd.C
00014  *
00015  *   05/09/96  WTG: Tested inlining (for usage)
00016  *   05/11/96  WTG: Completed inlining of LegoOprd
00017  *                  Renamed member functions using longer names.
00018  *                  Changed RegSpec to regSpec, Data to data
00019  *                  Combined CpyOprdLit() and CpyOprdReg() into single
00020  *                     function called CopyOperand(). See comments
00021  *   12/05/96  WAH: Added copy constructor.
00022  *    5/01/97  WAH: GetOprdRegNum returns booleanVal for BOOLEAN
00023  *                  operands; SetOprdRegNum sets booleanVal likewise.
00024  *    9/04/97  WAH: Removed private enumerations; switched to using
00025  *                  globals.H instead; removed SetOperand; added
00026  *                  Set[Prev|Next]OprdPtr.
00027  *    9/23/97  WAH: Added addrStyle field and associated methods;
00028  *                  added new literals and data types; reworked
00029  *                  OT_BOOLEAN to OT_LITERAL_P.
00030  *   10/10/97  WAH: Added parentPtr and associated methods.
00031  *   10/22/97  WAH: Added oprdList class (moved from analysis library).
00032  *   10/31/97  WAH: Added valid field and associated methods to legoOprd.
00033  *   1/9/98    WAH: Fixed SetLiteralString and SetLiteralLabel to handle NULL.
00034  *   4/22/98   WAH: Changed parentPtr to parentOpPtr; added parentAttrPtr.
00035  *   11/20/98  MDJ: Changed GegOprdRegNum to return intVal if RT_BR. intVal
00036  *                  is being used for bounded register numbers. 
00037  */
00038 
00039 #ifndef LEGOOPRD_H
00040 #define LEGOOPRD_H
00041 
00042 #include <stdio.h>
00043 #include <stdlib.h>
00044 
00045 /* added include for globals.h -8/22/96- */
00046 
00047 #include "globals.H"
00048 
00049 class HppaTxOp;
00050 // wah 4/22/98 Added forward declaration of legoOp and attrs.
00051 class legoOp;
00052 class attrs;
00053 
00054 class legoOprd {
00055   friend class legoOp;
00056   friend class HppaTxOp;
00057 
00058   enum oprdTypes oprdType;      // literal, reg, undefined, or vacant
00059 
00060   union operandData {
00061     union literalType {
00062       char               booleanLit;
00063       char               charLit;
00064       unsigned char      uCharLit;
00065       short              shortLit;
00066       unsigned short     uShortLit;
00067       int                integerLit;
00068       unsigned           uIntegerLit;
00069       long               longLit;
00070       unsigned long      uLongLit;
00071       long long          longLongLit;
00072       unsigned long long uLongLongLit;
00073       long long          longLongLongLit;
00074       unsigned long long uLongLongLongLit;
00075       long               pointerLit;
00076       char*              labelLit;
00077       char*              stringLit;
00078       float              floatLit;
00079       double             doubleLit;
00080       int                cbLit;
00081       char               predicateLit;
00082     } literal;                  // literal operand data
00083 
00084     struct {
00085       enum regTypes regType;    // r, vr, fr, br, mvr
00086       int regNum;               // register number or macro register
00087       int omega;
00088       enum dataTypes dataType;  // i, f, d, p, or b, or others
00089       enum fileTypes fileType;  // gpr, fpr, pr, btr, or cr
00090       enum regStyles regStyle;  // static or rotating (s or r)
00091       int intValue;             // ?? not sure what for
00092     } regSpec;                  // register operand data
00093     //    int booleanVal;               // boolean value for predicates
00094   } data;                       // operand data
00095 
00096   enum addrStyles addrStyle;    // addressing style for label/string lits.
00097 
00098   int valid;                    // valid bit
00099   legoOprd *nextOperandPtr;     // ptr to next operand
00100   legoOprd *prevOperandPtr;     // ptr to prev operand
00101   legoOp *parentOpPtr;          // ptr to parent op of operand chain
00102   attrs *parentAttrPtr;         // ptr to parent attr of operand chain
00103 
00104 public:
00105 
00106   legoOprd (void);              // constructor
00107   legoOprd (const legoOprd &);  // copy constructor
00108   ~legoOprd (void);             // destructor
00109 
00110  /* CopyOperand copies  one operand to another.  The argument is a
00111   * pointer to the operand you want to copy from.  The oprdType field
00112   * is checked to determine what type of operand is being copied.  A
00113   * pointer to the new operand is returned.
00114   */
00115 
00116   // wah 4/22/98 Commented out.
00117   //  legoOprd *CopyOperand (legoOprd*);
00118 
00119   /*
00120    *  SetOperand allows update of already existing lego operand.  Pass
00121    *   operand pointer & fields.  Separate function for regSpec and literal
00122    */
00123 
00124   //  void SetOperand(int, int, int, int, int, int);
00125   //  void SetOperand(legoOprd::operandData::literalType);
00126 
00127   /*
00128    *  AddOprd creates adds an operand of the specified type.  If no
00129    *   operand currently exists, one is created; -- otherwise another is
00130    *   linked in and the appropriate next & prev pointers are updated.
00131    *   Returns pointer to new operand.
00132    */
00133 
00134   legoOprd *AddOprd();
00135 
00136   /*
00137    *  The following methods allow update of individual fields of the
00138    *   lego operand.
00139    */
00140   void SetOprdType (enum oprdTypes oprdT) { oprdType = oprdT; }
00141   void SetOprdLiteral (legoOprd::operandData::literalType literalOprd)
00142        { data.literal = literalOprd; }
00143   void SetLiteralControlBlock (int litCB) { data.literal.cbLit = litCB; }
00144   void SetLiteralBoolean (int litBool) { data.literal.booleanLit = litBool; }
00145   void SetLiteralChar (int litChr) { data.literal.charLit = litChr; }
00146   void SetLiteralUChar (int litUChr) { data.literal.uCharLit = litUChr; }
00147   void SetLiteralShort (int litSh) { data.literal.shortLit = litSh; }
00148   void SetLiteralUShort (int litUSh) { data.literal.uShortLit = litUSh; }
00149   void SetLiteralInteger (int litInt) { data.literal.integerLit = litInt; }
00150   void SetLiteralUInteger (int litUInt) { data.literal.uIntegerLit = litUInt; }
00151   void SetLiteralLong (long litLong) { data.literal.longLit = litLong; }
00152   void SetLiteralULong (long litULong) { data.literal.uLongLit = litULong; }
00153   void SetLiteralLongLong (long long litLongLong)
00154   { data.literal.longLongLit = litLongLong; }
00155   void SetLiteralULongLong (long long litULongLong)
00156   { data.literal.uLongLongLit = litULongLong; }
00157   void SetLiteralLongLongLong (long long litLongLongLong)
00158   { data.literal.longLongLongLit = litLongLongLong; }
00159   void SetLiteralULongLongLong (long long litULongLongLong)
00160   { data.literal.uLongLongLongLit = litULongLongLong; }
00161   void SetLiteralPointer (long litPtr) { data.literal.pointerLit = litPtr; }
00162   void SetLiteralFloat (float litFlt) { data.literal.floatLit = litFlt; }
00163   void SetLiteralDouble (double litDbl) { data.literal.doubleLit = litDbl; }
00164   void SetLiteralPredicate (int litPr) { data.literal.predicateLit = litPr; }
00165   void SetLiteralString (char *litStr)
00166        {
00167          /* MEMORY LEAK!!!!! */
00168          //         delete[] data.literal.stringLit;
00169          if (litStr != NULL)
00170            {
00171              data.literal.stringLit = new char[strlen(litStr)+1];
00172              int idx2 = strlen(litStr);
00173              for (int idx=0; idx<idx2; idx++) {
00174                data.literal.stringLit[idx] = *(litStr++);
00175              }
00176              data.literal.stringLit[idx2] = '\0';
00177            } // end if
00178          else data.literal.stringLit = NULL;
00179        }
00180   void SetLiteralLabel (char *litLab)
00181        {
00182          //      delete[] data.literal.labelLit;
00183          if (litLab != NULL)
00184            {
00185              data.literal.labelLit = new char[strlen(litLab)+1];
00186              int idx2 = strlen(litLab);
00187              for (int idx=0; idx<idx2; idx++) {
00188                data.literal.labelLit[idx] = *(litLab++);
00189              }
00190              data.literal.labelLit[idx2] = '\0';
00191            } // end if
00192          else data.literal.labelLit = NULL;
00193        }
00194   void SetLiteralAddrStyle (enum addrStyles addrS) { addrStyle = addrS; }
00195   void SetOprdRegType (enum regTypes regT) { data.regSpec.regType = regT; }
00196   void SetOprdRegNum (int regN)
00197   {
00198     if (oprdType != OT_LITERAL_P)
00199       data.regSpec.regNum = regN;
00200     else
00201       data.literal.predicateLit = regN;
00202   }
00203   void SetOprdOmega  (int omeg){ data.regSpec.omega = omeg; }
00204   void SetOprdDataType (enum dataTypes datT) { data.regSpec.dataType = datT; }
00205   void SetOprdFileType (enum fileTypes filT) { data.regSpec.fileType = filT; }
00206   void SetOprdRegStyle (enum regStyles regS) { data.regSpec.regStyle = regS; }
00207   void SetIntValue  (int intV) { data.regSpec.intValue = intV; }
00208   void SetBooleanVal  (int bVal) { data.literal.predicateLit = bVal; }
00209   void SetValid (int v) { valid = v; }
00210   void SetNextOprdPtr (legoOprd *noprd) { nextOperandPtr = noprd; }
00211   void SetPrevOprdPtr (legoOprd *poprd) { prevOperandPtr = poprd; }
00212   void SetParentOpPtr (legoOp *pptr) { parentOpPtr = pptr; }
00213   void SetParentAttrPtr (attrs *pptr) { parentAttrPtr = pptr; }
00214 
00215   /*
00216    *  The following methods provide reading of individual fields of the
00217    *   lego operand.
00218    */
00219   enum oprdTypes GetOprdType (void) { return oprdType; }
00220   int  GetLiteralControlBlock (void) { return data.literal.cbLit; }
00221   char GetLiteralBoolean (void) { return data.literal.booleanLit; }
00222   int  GetLiteralChar (void) { return data.literal.charLit; }
00223   unsigned GetLiteralUChar (void) { return data.literal.uCharLit; }
00224   int  GetLiteralShort (void) { return data.literal.shortLit; }
00225   unsigned GetLiteralUShort (void) { return data.literal.uShortLit; }
00226   int  GetLiteralInteger (void) { return data.literal.integerLit; }
00227   unsigned GetLiteralUInteger (void) { return data.literal.uIntegerLit; }
00228   long GetLiteralLong (void) { return data.literal.longLit; }
00229   unsigned long GetLiteralULong (void) { return data.literal.uLongLit; }
00230   long long GetLiteralLongLong (void) { return data.literal.longLongLit; }
00231   unsigned long long GetLiteralULongLong (void)
00232   { return data.literal.uLongLongLit; }
00233   long long GetLiteralLongLongLong (void)
00234   { return data.literal.longLongLongLit; }
00235   unsigned long long GetLiteralULongLongLong (void)
00236   { return data.literal.uLongLongLongLit; }
00237   long GetLiteralPointer (void) { return data.literal.pointerLit; }
00238   float GetLiteralFloat (void) { return data.literal.floatLit; }
00239   double GetLiteralDouble (void) { return data.literal.doubleLit; }
00240   char GetLiteralPredicate (void) { return data.literal.predicateLit; }
00241   char *GetLiteralString (void) { return data.literal.stringLit; }
00242   char *GetLiteralLabel (void) { return data.literal.labelLit; }
00243   enum addrStyles GetLiteralAddrStyle (void)
00244   {
00245     if (oprdType != OT_LITERAL_L && oprdType != OT_LITERAL_S)
00246       return AS_UNDEF;
00247     else
00248       return addrStyle;
00249   }
00250   enum regTypes GetOprdRegType (void) { return data.regSpec.regType; }
00251   int  GetOprdRegNum (void)
00252   {
00253     if (oprdType == OT_LITERAL_P)
00254       return data.literal.predicateLit;
00255     else if (data.regSpec.regType == RT_BR)
00256       return data.regSpec.intValue;
00257     else 
00258       return data.regSpec.regNum;
00259   }
00260   int  GetOprdOmega (void) { return data.regSpec.omega; }
00261   enum dataTypes GetOprdDataType (void) { return data.regSpec.dataType; }
00262   enum fileTypes GetOprdFileType (void) { return data.regSpec.fileType; }
00263   enum regStyles GetOprdRegStyle (void) { return data.regSpec.regStyle; }
00264   int  GetBooleanVal  (void) { return data.literal.predicateLit; }
00265   int  GetOprdIntValue  (void) { return data.regSpec.intValue; }
00266   int  GetValid (void) { return valid; }
00267   legoOprd *GetNextOprdPtr (void) { return nextOperandPtr; }
00268   legoOprd *GetPrevOprdPtr (void) { return prevOperandPtr; }
00269   legoOp *GetParentOpPtr (void)
00270   {
00271     legoOprd *oprd;
00272 
00273     for (oprd = this; oprd->prevOperandPtr != NULL;
00274          oprd = oprd->prevOperandPtr) ;
00275     return oprd->parentOpPtr;
00276   }
00277   attrs *GetParentAttrPtr (void)
00278   {
00279     legoOprd *oprd;
00280 
00281     for (oprd = this; oprd->prevOperandPtr != NULL;
00282          oprd = oprd->prevOperandPtr) ;
00283     return oprd->parentAttrPtr;
00284   }
00285 };
00286 
00287 class oprdList
00288 {
00289   legoOprd *oprdPtr;
00290   oprdList *nextListPtr;
00291 
00292 public:
00293   oprdList (void) { oprdPtr = NULL; nextListPtr = NULL; }
00294   ~oprdList (void)
00295   {
00296     oprdList *tmpOprdListPtr;
00297     while (nextListPtr != NULL) {
00298       tmpOprdListPtr = nextListPtr;
00299       nextListPtr = tmpOprdListPtr->nextListPtr;
00300       tmpOprdListPtr->nextListPtr = NULL;
00301       delete tmpOprdListPtr;
00302     }
00303   }
00304 
00305   legoOprd *GetOprdPtr (void) { return oprdPtr; }
00306   void SetOprdPtr (legoOprd *o) { oprdPtr = o; }
00307 
00308   oprdList *GetNextListPtr (void) { return nextListPtr; }
00309   void SetNextListPtr (oprdList *n) { nextListPtr = n; }
00310 }; // end class oprdList
00311 
00312 #endif
00313 

Generated on Mon Jul 21 20:27:41 2003 for TINKER LEGO DOC by doxygen 1.3.2