mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-24 19:52:54 +01:00
* Spell "necessary" correctly
* Print floating point values using C99 hexadecimal style FP if possible. This increases the number of floating point constants that may be emitted inline, and improves precision for global variable initializers which can not be emitted in integer form. This fixes the Olden/Power benchmark with the CBE!!!! llvm-svn: 9052
This commit is contained in:
parent
fb1eb84a7d
commit
5567441de9
@ -23,6 +23,10 @@
|
|||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
|
|
||||||
|
|
||||||
|
/* FIXME: This should be autoconf'd! */
|
||||||
|
#define HAS_C99_HEXADECIMAL_CONSTANTS 1
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
class CWriter : public Pass, public InstVisitor<CWriter> {
|
class CWriter : public Pass, public InstVisitor<CWriter> {
|
||||||
std::ostream &Out;
|
std::ostream &Out;
|
||||||
@ -337,6 +341,16 @@ void CWriter::printConstantArray(ConstantArray *CPA) {
|
|||||||
// only deal in IEEE FP).
|
// only deal in IEEE FP).
|
||||||
//
|
//
|
||||||
static bool isFPCSafeToPrint(const ConstantFP *CFP) {
|
static bool isFPCSafeToPrint(const ConstantFP *CFP) {
|
||||||
|
#if HAS_C99_HEXADECIMAL_CONSTANTS
|
||||||
|
char Buffer[100];
|
||||||
|
sprintf(Buffer, "%a", CFP->getValue());
|
||||||
|
|
||||||
|
if (!strncmp(Buffer, "0x", 2) ||
|
||||||
|
!strncmp(Buffer, "-0x", 3) ||
|
||||||
|
!strncmp(Buffer, "+0x", 3))
|
||||||
|
return atof(Buffer) == CFP->getValue();
|
||||||
|
return false;
|
||||||
|
#else
|
||||||
std::string StrVal = ftostr(CFP->getValue());
|
std::string StrVal = ftostr(CFP->getValue());
|
||||||
|
|
||||||
while (StrVal[0] == ' ')
|
while (StrVal[0] == ' ')
|
||||||
@ -350,6 +364,7 @@ static bool isFPCSafeToPrint(const ConstantFP *CFP) {
|
|||||||
// Reparse stringized version!
|
// Reparse stringized version!
|
||||||
return atof(StrVal.c_str()) == CFP->getValue();
|
return atof(StrVal.c_str()) == CFP->getValue();
|
||||||
return false;
|
return false;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
// printConstant - The LLVM Constant to C Constant converter.
|
// printConstant - The LLVM Constant to C Constant converter.
|
||||||
@ -442,8 +457,14 @@ void CWriter::printConstant(Constant *CPV) {
|
|||||||
Out << "(*(" << (FPC->getType() == Type::FloatTy ? "float" : "double")
|
Out << "(*(" << (FPC->getType() == Type::FloatTy ? "float" : "double")
|
||||||
<< "*)&FPConstant" << I->second << ")";
|
<< "*)&FPConstant" << I->second << ")";
|
||||||
} else {
|
} else {
|
||||||
|
#if HAS_C99_HEXADECIMAL_CONSTANTS
|
||||||
// Print out the constant as a floating point number.
|
// Print out the constant as a floating point number.
|
||||||
|
char Buffer[100];
|
||||||
|
sprintf(Buffer, "%a", FPC->getValue());
|
||||||
|
Out << Buffer << " /*" << FPC->getValue() << "*/ ";
|
||||||
|
#else
|
||||||
Out << ftostr(FPC->getValue());
|
Out << ftostr(FPC->getValue());
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -1018,7 +1039,7 @@ void CWriter::visitUnwindInst(UnwindInst &I) {
|
|||||||
emittedInvoke = true;
|
emittedInvoke = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool isGotoCodeNeccessary(BasicBlock *From, BasicBlock *To) {
|
static bool isGotoCodeNecessary(BasicBlock *From, BasicBlock *To) {
|
||||||
// If PHI nodes need copies, we need the copy code...
|
// If PHI nodes need copies, we need the copy code...
|
||||||
if (isa<PHINode>(To->front()) ||
|
if (isa<PHINode>(To->front()) ||
|
||||||
From->getNext() != To) // Not directly successor, need goto
|
From->getNext() != To) // Not directly successor, need goto
|
||||||
@ -1051,14 +1072,14 @@ void CWriter::printBranchToBlock(BasicBlock *CurBB, BasicBlock *Succ,
|
|||||||
//
|
//
|
||||||
void CWriter::visitBranchInst(BranchInst &I) {
|
void CWriter::visitBranchInst(BranchInst &I) {
|
||||||
if (I.isConditional()) {
|
if (I.isConditional()) {
|
||||||
if (isGotoCodeNeccessary(I.getParent(), I.getSuccessor(0))) {
|
if (isGotoCodeNecessary(I.getParent(), I.getSuccessor(0))) {
|
||||||
Out << " if (";
|
Out << " if (";
|
||||||
writeOperand(I.getCondition());
|
writeOperand(I.getCondition());
|
||||||
Out << ") {\n";
|
Out << ") {\n";
|
||||||
|
|
||||||
printBranchToBlock(I.getParent(), I.getSuccessor(0), 2);
|
printBranchToBlock(I.getParent(), I.getSuccessor(0), 2);
|
||||||
|
|
||||||
if (isGotoCodeNeccessary(I.getParent(), I.getSuccessor(1))) {
|
if (isGotoCodeNecessary(I.getParent(), I.getSuccessor(1))) {
|
||||||
Out << " } else {\n";
|
Out << " } else {\n";
|
||||||
printBranchToBlock(I.getParent(), I.getSuccessor(1), 2);
|
printBranchToBlock(I.getParent(), I.getSuccessor(1), 2);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user