From: Chris Lattner Date: Thu, 11 Apr 2002 21:44:02 +0000 (+0000) Subject: Handle the FP format problem, where outputed FP constants were not precise X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=f678dc6469d52e48eb352b3ff1d9683628b6959c;p=oota-llvm.git 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 --- diff --git a/lib/Target/SparcV9/SparcV9AsmPrinter.cpp b/lib/Target/SparcV9/SparcV9AsmPrinter.cpp index 02eeca49e53..79b7b003c71 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( CV) && ! isa(CV)) - && "Collective types should be handled outside this function"); + assert((!isa(CV) && ! isa(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(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(CV)) {