[llvm-commits] [llvm] r55919 - in /llvm/trunk: lib/CodeGen/AsmPrinter/AsmPrinter.cpp test/CodeGen/Generic/i128-and-beyond.ll
Dan Gohman
gohman at apple.com
Mon Sep 8 09:40:13 PDT 2008
Author: djg
Date: Mon Sep 8 11:40:13 2008
New Revision: 55919
URL: http://llvm.org/viewvc/llvm-project?rev=55919&view=rev
Log:
Add AsmPrinter support for i128 and larger static initializer data.
Added:
llvm/trunk/test/CodeGen/Generic/i128-and-beyond.ll
Modified:
llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
Modified: llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp?rev=55919&r1=55918&r2=55919&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp (original)
+++ llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp Mon Sep 8 11:40:13 2008
@@ -1062,26 +1062,41 @@
}
return;
} else assert(0 && "Floating point constant type not handled");
- } else if (CV->getType() == Type::Int64Ty) {
+ } else if (CV->getType()->isInteger() &&
+ cast<IntegerType>(CV->getType())->getBitWidth() >= 64) {
if (const ConstantInt *CI = dyn_cast<ConstantInt>(CV)) {
- uint64_t Val = CI->getZExtValue();
-
- if (TAI->getData64bitsDirective())
- O << TAI->getData64bitsDirective() << Val << '\n';
- else if (TD->isBigEndian()) {
- O << TAI->getData32bitsDirective() << unsigned(Val >> 32)
- << '\t' << TAI->getCommentString()
- << " Double-word most significant word " << Val << '\n';
- O << TAI->getData32bitsDirective() << unsigned(Val)
- << '\t' << TAI->getCommentString()
- << " Double-word least significant word " << Val << '\n';
- } else {
- O << TAI->getData32bitsDirective() << unsigned(Val)
- << '\t' << TAI->getCommentString()
- << " Double-word least significant word " << Val << '\n';
- O << TAI->getData32bitsDirective() << unsigned(Val >> 32)
- << '\t' << TAI->getCommentString()
- << " Double-word most significant word " << Val << '\n';
+ unsigned BitWidth = CI->getBitWidth();
+ assert(isPowerOf2_32(BitWidth) &&
+ "Non-power-of-2-sized integers not handled!");
+
+ // We don't expect assemblers to support integer data directives
+ // for more than 64 bits, so we emit the data in at most 64-bit
+ // quantities at a time.
+ const uint64_t *RawData = CI->getValue().getRawData();
+ for (unsigned i = 0, e = BitWidth / 64; i != e; ++i) {
+ uint64_t Val;
+ if (TD->isBigEndian())
+ Val = RawData[e - i - 1];
+ else
+ Val = RawData[i];
+
+ if (TAI->getData64bitsDirective())
+ O << TAI->getData64bitsDirective() << Val << '\n';
+ else if (TD->isBigEndian()) {
+ O << TAI->getData32bitsDirective() << unsigned(Val >> 32)
+ << '\t' << TAI->getCommentString()
+ << " Double-word most significant word " << Val << '\n';
+ O << TAI->getData32bitsDirective() << unsigned(Val)
+ << '\t' << TAI->getCommentString()
+ << " Double-word least significant word " << Val << '\n';
+ } else {
+ O << TAI->getData32bitsDirective() << unsigned(Val)
+ << '\t' << TAI->getCommentString()
+ << " Double-word least significant word " << Val << '\n';
+ O << TAI->getData32bitsDirective() << unsigned(Val >> 32)
+ << '\t' << TAI->getCommentString()
+ << " Double-word most significant word " << Val << '\n';
+ }
}
return;
}
@@ -1440,6 +1455,8 @@
assert(TAI->getData64bitsDirective() &&
"Target cannot handle 64-bit constant exprs!");
O << TAI->getData64bitsDirective();
+ } else {
+ assert(0 && "Target cannot handle given data directive width!");
}
break;
}
Added: llvm/trunk/test/CodeGen/Generic/i128-and-beyond.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/Generic/i128-and-beyond.ll?rev=55919&view=auto
==============================================================================
--- llvm/trunk/test/CodeGen/Generic/i128-and-beyond.ll (added)
+++ llvm/trunk/test/CodeGen/Generic/i128-and-beyond.ll Mon Sep 8 11:40:13 2008
@@ -0,0 +1,9 @@
+; RUN: llvm-as < %s | llc -march=x86 | grep 18446744073709551615 | count 14
+; RUN: llvm-as < %s | llc -march=ppc32 | grep 4294967295 | count 28
+
+; These static initializers are too big to hand off to assemblers
+; as monolithic blobs.
+
+ at x = global i128 -1
+ at y = global i256 -1
+ at z = global i512 -1
More information about the llvm-commits
mailing list