diff options
author | Chris Lattner <sabre@nondot.org> | 2002-04-11 21:44:02 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2002-04-11 21:44:02 +0000 |
commit | f678dc6469d52e48eb352b3ff1d9683628b6959c (patch) | |
tree | b52ed7502815ad95c814867bc7f547dd81c8cd5d /lib | |
parent | f8b90ee366cb3030b4d60a7dc4a911ffbdbe7fd7 (diff) |
Handle the FP format problem, where outputed FP constants were not precise
enough. This fixes compilation of the health benchmark.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@2228 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Target/SparcV9/SparcV9AsmPrinter.cpp | 31 |
1 files changed, 24 insertions, 7 deletions
diff --git a/lib/Target/SparcV9/SparcV9AsmPrinter.cpp b/lib/Target/SparcV9/SparcV9AsmPrinter.cpp index 02eeca49e5..79b7b003c7 100644 --- a/lib/Target/SparcV9/SparcV9AsmPrinter.cpp +++ b/lib/Target/SparcV9/SparcV9AsmPrinter.cpp @@ -530,9 +530,9 @@ TypeToDataDirective(const Type* type) case Type::ULongTyID: case Type::LongTyID: case Type::PointerTyID: return ".xword"; case Type::FloatTyID: - return ".single"; + return ".word"; case Type::DoubleTyID: - return ".double"; + return ".xword"; case Type::ArrayTyID: if (ArrayTypeIsString((ArrayType*) type)) return ".ascii"; @@ -606,16 +606,33 @@ SparcModuleAsmPrinter::printSingleConstant(const Constant* CV) CV->getType() != Type::LabelTy && "Unexpected type for Constant"); - assert((! isa<ConstantArray>( CV) && ! isa<ConstantStruct>(CV)) - && "Collective types should be handled outside this function"); + assert((!isa<ConstantArray>(CV) && ! isa<ConstantStruct>(CV)) + && "Aggregate types should be handled outside this function"); toAsm << "\t" << TypeToDataDirective(CV->getType()) << "\t"; if (CV->getType()->isPrimitiveType()) { - if (CV->getType()->isFloatingPoint()) - toAsm << "0r"; // FP constants must have this prefix - toAsm << CV->getStrValue() << "\n"; + if (CV->getType()->isFloatingPoint()) { + // FP Constants are printed as integer constants to avoid losing + // precision... + double Val = cast<ConstantFP>(CV)->getValue(); + if (CV->getType() == Type::FloatTy) { + float FVal = (float)Val; + char *ProxyPtr = (char*)&FVal; // Abide by C TBAA rules + toAsm << *(unsigned int*)ProxyPtr; + } else if (CV->getType() == Type::DoubleTy) { + char *ProxyPtr = (char*)&Val; // Abide by C TBAA rules + toAsm << *(uint64_t*)ProxyPtr; + } else { + assert(0 && "Unknown floating point type!"); + } + + toAsm << "\t! " << CV->getType()->getDescription() + << " value: " << Val << "\n"; + } else { + toAsm << CV->getStrValue() << "\n"; + } } else if (ConstantPointer* CPP = dyn_cast<ConstantPointer>(CV)) { |