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
1.3.2