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) {
|
||||
bool isVector = llvm::isa<llvm::VectorType>(I.getOperand(0)->getType());
|
||||
|
||||
if (isVector) {
|
||||
switch (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 << lPredicateToString(I.getPredicate());
|
||||
Out << "(";
|
||||
writeOperand(I.getOperand(0));
|
||||
Out << ", ";
|
||||
@@ -3246,23 +3269,8 @@ void CWriter::visitFCmpInst(llvm::FCmpInst &I) {
|
||||
// ispc source.
|
||||
|
||||
if (isVector) {
|
||||
switch (I.getPredicate()) {
|
||||
default: llvm_unreachable("Illegal FCmp predicate");
|
||||
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;
|
||||
}
|
||||
Out << lPredicateToString(I.getPredicate());
|
||||
Out << "(";
|
||||
}
|
||||
else {
|
||||
const char* op = 0;
|
||||
|
||||
Reference in New Issue
Block a user