aboutsummaryrefslogtreecommitdiffstats
path: root/lib/Target
diff options
context:
space:
mode:
authorVikram S. Adve <vadve@cs.uiuc.edu>2001-11-09 02:19:29 +0000
committerVikram S. Adve <vadve@cs.uiuc.edu>2001-11-09 02:19:29 +0000
commit915b58d2edd46ef03aef4eb8a7163a63589443e4 (patch)
treea82bdbf5f73a8865c5d095a49010b29b19f40e5b /lib/Target
parent6ad7c553fdbeb3e1156fb7571e5a1b38463fa88d (diff)
downloadexternal_llvm-915b58d2edd46ef03aef4eb8a7163a63589443e4.zip
external_llvm-915b58d2edd46ef03aef4eb8a7163a63589443e4.tar.gz
external_llvm-915b58d2edd46ef03aef4eb8a7163a63589443e4.tar.bz2
Add support to print constant arrays and structures.
Align data larger than an L1 cache line on L1 cache line boundary. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@1228 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target')
-rw-r--r--lib/Target/SparcV9/SparcV9AsmPrinter.cpp94
1 files changed, 68 insertions, 26 deletions
diff --git a/lib/Target/SparcV9/SparcV9AsmPrinter.cpp b/lib/Target/SparcV9/SparcV9AsmPrinter.cpp
index 3d35ecc..dd65305 100644
--- a/lib/Target/SparcV9/SparcV9AsmPrinter.cpp
+++ b/lib/Target/SparcV9/SparcV9AsmPrinter.cpp
@@ -59,7 +59,8 @@ private :
void emitMachineInst(const MachineInstr *MI);
void printGlobalVariable(const GlobalVariable* GV);
- void printConstant(const ConstPoolVal* CV, string valID = string(""));
+ void printSingleConstant(const ConstPoolVal* CV, string valID = string(""));
+ void printConstant( const ConstPoolVal* CV, string valID = string(""));
unsigned int printOperands(const MachineInstr *MI, unsigned int opNum);
void printOneOperand(const MachineOperand &Op);
@@ -187,8 +188,9 @@ SparcAsmPrinter::OpIsMemoryAddressBase(const MachineInstr *MI,
#define PrintOp1PlusOp2(Op1, Op2) \
- printOneOperand(Op1); toAsm << "+"; printOneOperand(Op2);
-
+ printOneOperand(Op1); \
+ toAsm << "+"; \
+ printOneOperand(Op2);
unsigned int
SparcAsmPrinter::printOperands(const MachineInstr *MI,
@@ -347,7 +349,8 @@ ArrayTypeIsString(ArrayType* arrayType)
arrayType->getElementType() == Type::SByteTy);
}
-inline const string TypeToDataDirective(const Type* type)
+inline const string
+TypeToDataDirective(const Type* type)
{
switch(type->getPrimitiveID())
{
@@ -373,8 +376,9 @@ inline const string TypeToDataDirective(const Type* type)
}
}
-inline unsigned int ConstantToSize(const ConstPoolVal* CV,
- const TargetMachine& target) {
+inline unsigned int
+ConstantToSize(const ConstPoolVal* CV, const TargetMachine& target)
+{
if (ConstPoolArray* AV = dyn_cast<ConstPoolArray>(CV))
if (ArrayTypeIsString((ArrayType*) CV->getType()))
return 1 + AV->getNumOperands();
@@ -390,19 +394,25 @@ unsigned int TypeToSize(const Type* type, const TargetMachine& target)
}
+// Align data larger than one L1 cache line on L1 cache line boundaries.
+// Align all smaller types on the next higher 2^x boundary (4, 8, ...).
+//
inline unsigned int
TypeToAlignment(const Type* type, const TargetMachine& target)
{
- if (type->getPrimitiveID() == Type::ArrayTyID &&
- ArrayTypeIsString((ArrayType*) type))
- return target.findOptimalStorageSize(Type::LongTy);
-
- return target.findOptimalStorageSize(type);
+ unsigned int typeSize = target.findOptimalStorageSize(type);
+ unsigned short cacheLineSize = target.getCacheInfo().getCacheLineSize(1);
+ if (typeSize > (int) cacheLineSize / 2)
+ return cacheLineSize;
+ else
+ for (unsigned sz=1; /*no condition*/; sz *= 2)
+ if (sz >= typeSize)
+ return sz;
}
void
-SparcAsmPrinter::printConstant(const ConstPoolVal* CV, string valID)
+SparcAsmPrinter::printSingleConstant(const ConstPoolVal* CV,string valID)
{
if (valID.length() == 0)
valID = getID(CV);
@@ -412,21 +422,12 @@ SparcAsmPrinter::printConstant(const ConstPoolVal* CV, string valID)
CV->getType() != Type::LabelTy &&
"Unexpected type for ConstPoolVal");
- toAsm << "\t.align\t" << TypeToAlignment(CV->getType(), Target)
- << endl;
-
- toAsm << valID << ":" << endl;
+ assert((! isa<ConstPoolArray>( CV) && ! isa<ConstPoolStruct>(CV))
+ && "Collective types should be handled outside this function");
toAsm << "\t"
<< TypeToDataDirective(CV->getType()) << "\t";
- if (ConstPoolArray *CPA = dyn_cast<ConstPoolArray>(CV))
- if (isStringCompatible(CPA))
- {
- toAsm << getAsCString(CPA) << endl;
- return;
- }
-
if (CV->getType()->isPrimitiveType())
{
if (CV->getType() == Type::FloatTy || CV->getType() == Type::DoubleTy)
@@ -446,13 +447,54 @@ SparcAsmPrinter::printConstant(const ConstPoolVal* CV, string valID)
}
else
{
- assert(0 && "Cannot yet print non-primitive constants to assembly");
- // toAsm << CV->getStrValue() << endl;
+ assert(0 && "Unknown elementary type for constant");
}
-
+}
+
+void
+SparcAsmPrinter::printConstant(const ConstPoolVal* CV, string valID)
+{
+ if (valID.length() == 0)
+ valID = getID(CV);
+
+ assert(CV->getType() != Type::VoidTy &&
+ CV->getType() != Type::TypeTy &&
+ CV->getType() != Type::LabelTy &&
+ "Unexpected type for ConstPoolVal");
+
+ toAsm << "\t.align\t" << TypeToAlignment(CV->getType(), Target)
+ << endl;
+
+ // Print .size and .type only if it is not a string.
+ ConstPoolArray *CPA = dyn_cast<ConstPoolArray>(CV);
+
+ if (CPA && isStringCompatible(CPA))
+ { // print it as a string and return
+ toAsm << valID << ":" << endl;
+ toAsm << "\t" << TypeToDataDirective(CV->getType()) << "\t"
+ << getAsCString(CPA) << endl;
+ return;
+ }
+
toAsm << "\t.type" << "\t" << valID << ",#object" << endl;
toAsm << "\t.size" << "\t" << valID << ","
<< ConstantToSize(CV, Target) << endl;
+ toAsm << valID << ":" << endl;
+
+ if (CPA)
+ { // Not a string. Print the values in successive locations
+ const vector<Use>& constValues = CPA->getValues();
+ for (unsigned i=1; i < constValues.size(); i++)
+ this->printSingleConstant(cast<ConstPoolVal>(constValues[i].get()));
+ }
+ else if (ConstPoolStruct *CPS = dyn_cast<ConstPoolStruct>(CV))
+ { // Print the fields in successive locations
+ const vector<Use>& constValues = CPA->getValues();
+ for (unsigned i=1; i < constValues.size(); i++)
+ this->printSingleConstant(cast<ConstPoolVal>(constValues[i].get()));
+ }
+ else
+ this->printSingleConstant(CV, valID);
}