Map comparison predicates to strings for C++ output in a stand-alone function.
This commit is contained in:
68
cbackend.cpp
68
cbackend.cpp
@@ -3165,23 +3165,46 @@ void CWriter::visitBinaryOperator(llvm::Instruction &I) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static const char *
|
||||||
|
lPredicateToString(llvm::CmpInst::Predicate p) {
|
||||||
|
switch (p) {
|
||||||
|
case llvm::ICmpInst::ICMP_EQ: return "__equal";
|
||||||
|
case llvm::ICmpInst::ICMP_NE: return "__not_equal";
|
||||||
|
case llvm::ICmpInst::ICMP_ULE: return "__unsigned_less_equal";
|
||||||
|
case llvm::ICmpInst::ICMP_SLE: return "__signed_less_equal";
|
||||||
|
case llvm::ICmpInst::ICMP_UGE: return "__unsigned_greater_equal";
|
||||||
|
case llvm::ICmpInst::ICMP_SGE: return "__signed_greater_equal";
|
||||||
|
case llvm::ICmpInst::ICMP_ULT: return "__unsigned_less_than";
|
||||||
|
case llvm::ICmpInst::ICMP_SLT: return "__signed_less_than";
|
||||||
|
case llvm::ICmpInst::ICMP_UGT: return "__unsigned_greater_than";
|
||||||
|
case llvm::ICmpInst::ICMP_SGT: return "__signed_greater_than";
|
||||||
|
|
||||||
|
case llvm::FCmpInst::FCMP_ORD: return "__ordered";
|
||||||
|
case llvm::FCmpInst::FCMP_UNO: return "__cmpunord";
|
||||||
|
case llvm::FCmpInst::FCMP_UEQ: return "__equal";
|
||||||
|
case llvm::FCmpInst::FCMP_UNE: return "__not_equal";
|
||||||
|
case llvm::FCmpInst::FCMP_ULT: return "__less_than";
|
||||||
|
case llvm::FCmpInst::FCMP_ULE: return "__less_equal";
|
||||||
|
case llvm::FCmpInst::FCMP_UGT: return "__greater_than";
|
||||||
|
case llvm::FCmpInst::FCMP_UGE: return "__greater_equal";
|
||||||
|
case llvm::FCmpInst::FCMP_OEQ: return "__equal";
|
||||||
|
case llvm::FCmpInst::FCMP_ONE: return "__not_equal";
|
||||||
|
case llvm::FCmpInst::FCMP_OLT: return "__less_than";
|
||||||
|
case llvm::FCmpInst::FCMP_OLE: return "__less_equal";
|
||||||
|
case llvm::FCmpInst::FCMP_OGT: return "__greater_than";
|
||||||
|
case llvm::FCmpInst::FCMP_OGE: return "__greater_equal";
|
||||||
|
|
||||||
|
default: llvm_unreachable(0); return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void CWriter::visitICmpInst(llvm::ICmpInst &I) {
|
void CWriter::visitICmpInst(llvm::ICmpInst &I) {
|
||||||
bool isVector = llvm::isa<llvm::VectorType>(I.getOperand(0)->getType());
|
bool isVector = llvm::isa<llvm::VectorType>(I.getOperand(0)->getType());
|
||||||
|
|
||||||
if (isVector) {
|
if (isVector) {
|
||||||
switch (I.getPredicate()) {
|
Out << lPredicateToString(I.getPredicate());
|
||||||
case llvm::ICmpInst::ICMP_EQ: Out << "__equal"; break;
|
|
||||||
case llvm::ICmpInst::ICMP_NE: Out << "__not_equal"; break;
|
|
||||||
case llvm::ICmpInst::ICMP_ULE: Out << "__unsigned_less_equal"; break;
|
|
||||||
case llvm::ICmpInst::ICMP_SLE: Out << "__signed_less_equal"; break;
|
|
||||||
case llvm::ICmpInst::ICMP_UGE: Out << "__unsigned_greater_equal"; break;
|
|
||||||
case llvm::ICmpInst::ICMP_SGE: Out << "__signed_greater_equal"; break;
|
|
||||||
case llvm::ICmpInst::ICMP_ULT: Out << "__unsigned_less_than"; break;
|
|
||||||
case llvm::ICmpInst::ICMP_SLT: Out << "__signed_less_than"; break;
|
|
||||||
case llvm::ICmpInst::ICMP_UGT: Out << "__unsigned_greater_than"; break;
|
|
||||||
case llvm::ICmpInst::ICMP_SGT: Out << "__signed_greater_than"; break;
|
|
||||||
default: llvm_unreachable(0);
|
|
||||||
}
|
|
||||||
Out << "(";
|
Out << "(";
|
||||||
writeOperand(I.getOperand(0));
|
writeOperand(I.getOperand(0));
|
||||||
Out << ", ";
|
Out << ", ";
|
||||||
@@ -3246,23 +3269,8 @@ void CWriter::visitFCmpInst(llvm::FCmpInst &I) {
|
|||||||
// ispc source.
|
// ispc source.
|
||||||
|
|
||||||
if (isVector) {
|
if (isVector) {
|
||||||
switch (I.getPredicate()) {
|
Out << lPredicateToString(I.getPredicate());
|
||||||
default: llvm_unreachable("Illegal FCmp predicate");
|
Out << "(";
|
||||||
case llvm::FCmpInst::FCMP_ORD: Out << "__ordered("; break;
|
|
||||||
case llvm::FCmpInst::FCMP_UNO: Out << "__cmpunord("; break;
|
|
||||||
case llvm::FCmpInst::FCMP_UEQ: Out << "__equal("; break;
|
|
||||||
case llvm::FCmpInst::FCMP_UNE: Out << "__not_equal("; break;
|
|
||||||
case llvm::FCmpInst::FCMP_ULT: Out << "__less_than("; break;
|
|
||||||
case llvm::FCmpInst::FCMP_ULE: Out << "__less_equal("; break;
|
|
||||||
case llvm::FCmpInst::FCMP_UGT: Out << "__greater_than("; break;
|
|
||||||
case llvm::FCmpInst::FCMP_UGE: Out << "__greater_equal("; break;
|
|
||||||
case llvm::FCmpInst::FCMP_OEQ: Out << "__equal("; break;
|
|
||||||
case llvm::FCmpInst::FCMP_ONE: Out << "__not_equal("; break;
|
|
||||||
case llvm::FCmpInst::FCMP_OLT: Out << "__less_than("; break;
|
|
||||||
case llvm::FCmpInst::FCMP_OLE: Out << "__less_equal("; break;
|
|
||||||
case llvm::FCmpInst::FCMP_OGT: Out << "__greater_than("; break;
|
|
||||||
case llvm::FCmpInst::FCMP_OGE: Out << "__greater_equal("; break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
const char* op = 0;
|
const char* op = 0;
|
||||||
|
|||||||
Reference in New Issue
Block a user