From 469ab79584cd31d9f632988abccefc16c7a215e0 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Tue, 17 Aug 2004 02:48:44 +0000 Subject: [PATCH] Print float constants as 4 byte values. Also, fix endianness problems when cross compiling from little-endian host. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@15847 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/PowerPC/PPC32AsmPrinter.cpp | 47 ++++++++++++++------------ lib/Target/PowerPC/PPCAsmPrinter.cpp | 47 ++++++++++++++------------ 2 files changed, 50 insertions(+), 44 deletions(-) diff --git a/lib/Target/PowerPC/PPC32AsmPrinter.cpp b/lib/Target/PowerPC/PPC32AsmPrinter.cpp index 42030ff1410..798a908c65a 100644 --- a/lib/Target/PowerPC/PPC32AsmPrinter.cpp +++ b/lib/Target/PowerPC/PPC32AsmPrinter.cpp @@ -195,21 +195,24 @@ void PowerPCAsmPrinter::emitGlobalConstant(const Constant *CV) { // FP Constants are printed as integer constants to avoid losing // precision... double Val = CFP->getValue(); - if (1 || CFP->getType() == Type::DoubleTy) { + if (CFP->getType() == Type::DoubleTy) { union DU { // Abide by C TBAA rules double FVal; uint64_t UVal; - struct { - uint32_t MSWord; - uint32_t LSWord; - } T; } U; U.FVal = Val; - - O << ".long\t" << U.T.MSWord << "\t; double most significant word " - << Val << "\n"; - O << ".long\t" << U.T.LSWord << "\t; double least significant word " - << Val << "\n"; + + if (TD.isBigEndian()) { + O << ".long\t" << unsigned(U.UVal >> 32) + << "\t; double most significant word " << Val << "\n"; + O << ".long\t" << unsigned(U.UVal) + << "\t; double least significant word " << Val << "\n"; + } else { + O << ".long\t" << unsigned(U.UVal) + << "\t; double least significant word " << Val << "\n"; + O << ".long\t" << unsigned(U.UVal >> 32) + << "\t; double most significant word " << Val << "\n"; + } return; } else { union FU { // Abide by C TBAA rules @@ -223,19 +226,19 @@ void PowerPCAsmPrinter::emitGlobalConstant(const Constant *CV) { } } else if (CV->getType() == Type::ULongTy || CV->getType() == Type::LongTy) { if (const ConstantInt *CI = dyn_cast(CV)) { - union DU { // Abide by C TBAA rules - int64_t UVal; - struct { - uint32_t MSWord; - uint32_t LSWord; - } T; - } U; - U.UVal = CI->getRawValue(); + uint64_t Val = CI->getRawValue(); - O << ".long\t" << U.T.MSWord << "\t; Double-word most significant word " - << U.UVal << "\n"; - O << ".long\t" << U.T.LSWord << "\t; Double-word least significant word " - << U.UVal << "\n"; + if (TD.isBigEndian()) { + O << ".long\t" << unsigned(Val >> 32) + << "\t; Double-word most significant word " << Val << "\n"; + O << ".long\t" << unsigned(Val) + << "\t; Double-word least significant word " << Val << "\n"; + } else { + O << ".long\t" << unsigned(Val) + << "\t; Double-word least significant word " << Val << "\n"; + O << ".long\t" << unsigned(Val >> 32) + << "\t; Double-word most significant word " << Val << "\n"; + } return; } } diff --git a/lib/Target/PowerPC/PPCAsmPrinter.cpp b/lib/Target/PowerPC/PPCAsmPrinter.cpp index 42030ff1410..798a908c65a 100644 --- a/lib/Target/PowerPC/PPCAsmPrinter.cpp +++ b/lib/Target/PowerPC/PPCAsmPrinter.cpp @@ -195,21 +195,24 @@ void PowerPCAsmPrinter::emitGlobalConstant(const Constant *CV) { // FP Constants are printed as integer constants to avoid losing // precision... double Val = CFP->getValue(); - if (1 || CFP->getType() == Type::DoubleTy) { + if (CFP->getType() == Type::DoubleTy) { union DU { // Abide by C TBAA rules double FVal; uint64_t UVal; - struct { - uint32_t MSWord; - uint32_t LSWord; - } T; } U; U.FVal = Val; - - O << ".long\t" << U.T.MSWord << "\t; double most significant word " - << Val << "\n"; - O << ".long\t" << U.T.LSWord << "\t; double least significant word " - << Val << "\n"; + + if (TD.isBigEndian()) { + O << ".long\t" << unsigned(U.UVal >> 32) + << "\t; double most significant word " << Val << "\n"; + O << ".long\t" << unsigned(U.UVal) + << "\t; double least significant word " << Val << "\n"; + } else { + O << ".long\t" << unsigned(U.UVal) + << "\t; double least significant word " << Val << "\n"; + O << ".long\t" << unsigned(U.UVal >> 32) + << "\t; double most significant word " << Val << "\n"; + } return; } else { union FU { // Abide by C TBAA rules @@ -223,19 +226,19 @@ void PowerPCAsmPrinter::emitGlobalConstant(const Constant *CV) { } } else if (CV->getType() == Type::ULongTy || CV->getType() == Type::LongTy) { if (const ConstantInt *CI = dyn_cast(CV)) { - union DU { // Abide by C TBAA rules - int64_t UVal; - struct { - uint32_t MSWord; - uint32_t LSWord; - } T; - } U; - U.UVal = CI->getRawValue(); + uint64_t Val = CI->getRawValue(); - O << ".long\t" << U.T.MSWord << "\t; Double-word most significant word " - << U.UVal << "\n"; - O << ".long\t" << U.T.LSWord << "\t; Double-word least significant word " - << U.UVal << "\n"; + if (TD.isBigEndian()) { + O << ".long\t" << unsigned(Val >> 32) + << "\t; Double-word most significant word " << Val << "\n"; + O << ".long\t" << unsigned(Val) + << "\t; Double-word least significant word " << Val << "\n"; + } else { + O << ".long\t" << unsigned(Val) + << "\t; Double-word least significant word " << Val << "\n"; + O << ".long\t" << unsigned(Val >> 32) + << "\t; Double-word most significant word " << Val << "\n"; + } return; } }