mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-19 04:32:19 +00:00
Factor several methods, including getInversePredicate and
getSwappedPredicate, from ICmpInst and FCmpInst into common methods in CmpInst. This allows CmpInsts to be manipulated generically. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@51810 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
e4c67cdab4
commit
7e2dd6628e
@ -656,17 +656,41 @@ public:
|
|||||||
return static_cast<OtherOps>(Instruction::getOpcode());
|
return static_cast<OtherOps>(Instruction::getOpcode());
|
||||||
}
|
}
|
||||||
|
|
||||||
/// The predicate for CmpInst is defined by the subclasses but stored in
|
|
||||||
/// the SubclassData field (see Value.h). We allow it to be fetched here
|
|
||||||
/// as the predicate but there is no enum type for it, just the raw unsigned
|
|
||||||
/// short. This facilitates comparison of CmpInst instances without delving
|
|
||||||
/// into the subclasses since predicate values are distinct between the
|
|
||||||
/// CmpInst subclasses.
|
|
||||||
/// @brief Return the predicate for this instruction.
|
/// @brief Return the predicate for this instruction.
|
||||||
unsigned short getPredicate() const {
|
Predicate getPredicate() const { return Predicate(SubclassData); }
|
||||||
return SubclassData;
|
|
||||||
|
/// @brief Set the predicate for this instruction to the specified value.
|
||||||
|
void setPredicate(Predicate P) { SubclassData = P; }
|
||||||
|
|
||||||
|
/// For example, EQ -> NE, UGT -> ULE, SLT -> SGE,
|
||||||
|
/// OEQ -> UNE, UGT -> OLE, OLT -> UGE, etc.
|
||||||
|
/// @returns the inverse predicate for the instruction's current predicate.
|
||||||
|
/// @brief Return the inverse of the instruction's predicate.
|
||||||
|
Predicate getInversePredicate() const {
|
||||||
|
return getInversePredicate(getPredicate());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// For example, EQ -> NE, UGT -> ULE, SLT -> SGE,
|
||||||
|
/// OEQ -> UNE, UGT -> OLE, OLT -> UGE, etc.
|
||||||
|
/// @returns the inverse predicate for predicate provided in \p pred.
|
||||||
|
/// @brief Return the inverse of a given predicate
|
||||||
|
static Predicate getInversePredicate(Predicate pred);
|
||||||
|
|
||||||
|
/// For example, EQ->EQ, SLE->SGE, ULT->UGT,
|
||||||
|
/// OEQ->OEQ, ULE->UGE, OLT->OGT, etc.
|
||||||
|
/// @returns the predicate that would be the result of exchanging the two
|
||||||
|
/// operands of the CmpInst instruction without changing the result
|
||||||
|
/// produced.
|
||||||
|
/// @brief Return the predicate as if the operands were swapped
|
||||||
|
Predicate getSwappedPredicate() const {
|
||||||
|
return getSwappedPredicate(getPredicate());
|
||||||
|
}
|
||||||
|
|
||||||
|
/// This is a static version that you can use without an instruction
|
||||||
|
/// available.
|
||||||
|
/// @brief Return the predicate as if the operands were swapped.
|
||||||
|
static Predicate getSwappedPredicate(Predicate pred);
|
||||||
|
|
||||||
/// @brief Provide more efficient getOperand methods.
|
/// @brief Provide more efficient getOperand methods.
|
||||||
DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value);
|
DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value);
|
||||||
|
|
||||||
|
@ -650,38 +650,6 @@ public:
|
|||||||
"Invalid operand types for ICmp instruction");
|
"Invalid operand types for ICmp instruction");
|
||||||
}
|
}
|
||||||
|
|
||||||
/// @brief Return the predicate for this instruction.
|
|
||||||
Predicate getPredicate() const { return Predicate(SubclassData); }
|
|
||||||
|
|
||||||
/// @brief Set the predicate for this instruction to the specified value.
|
|
||||||
void setPredicate(Predicate P) { SubclassData = P; }
|
|
||||||
|
|
||||||
/// For example, EQ -> NE, UGT -> ULE, SLT -> SGE, etc.
|
|
||||||
/// @returns the inverse predicate for the instruction's current predicate.
|
|
||||||
/// @brief Return the inverse of the instruction's predicate.
|
|
||||||
Predicate getInversePredicate() const {
|
|
||||||
return getInversePredicate(getPredicate());
|
|
||||||
}
|
|
||||||
|
|
||||||
/// For example, EQ -> NE, UGT -> ULE, SLT -> SGE, etc.
|
|
||||||
/// @returns the inverse predicate for predicate provided in \p pred.
|
|
||||||
/// @brief Return the inverse of a given predicate
|
|
||||||
static Predicate getInversePredicate(Predicate pred);
|
|
||||||
|
|
||||||
/// For example, EQ->EQ, SLE->SGE, ULT->UGT, etc.
|
|
||||||
/// @returns the predicate that would be the result of exchanging the two
|
|
||||||
/// operands of the ICmpInst instruction without changing the result
|
|
||||||
/// produced.
|
|
||||||
/// @brief Return the predicate as if the operands were swapped
|
|
||||||
Predicate getSwappedPredicate() const {
|
|
||||||
return getSwappedPredicate(getPredicate());
|
|
||||||
}
|
|
||||||
|
|
||||||
/// This is a static version that you can use without an instruction
|
|
||||||
/// available.
|
|
||||||
/// @brief Return the predicate as if the operands were swapped.
|
|
||||||
static Predicate getSwappedPredicate(Predicate pred);
|
|
||||||
|
|
||||||
/// For example, EQ->EQ, SLE->SLE, UGT->SGT, etc.
|
/// For example, EQ->EQ, SLE->SLE, UGT->SGT, etc.
|
||||||
/// @returns the predicate that would be the result if the operand were
|
/// @returns the predicate that would be the result if the operand were
|
||||||
/// regarded as signed.
|
/// regarded as signed.
|
||||||
@ -830,38 +798,6 @@ public:
|
|||||||
"Invalid operand types for FCmp instruction");
|
"Invalid operand types for FCmp instruction");
|
||||||
}
|
}
|
||||||
|
|
||||||
/// @brief Return the predicate for this instruction.
|
|
||||||
Predicate getPredicate() const { return Predicate(SubclassData); }
|
|
||||||
|
|
||||||
/// @brief Set the predicate for this instruction to the specified value.
|
|
||||||
void setPredicate(Predicate P) { SubclassData = P; }
|
|
||||||
|
|
||||||
/// For example, OEQ -> UNE, UGT -> OLE, OLT -> UGE, etc.
|
|
||||||
/// @returns the inverse predicate for the instructions current predicate.
|
|
||||||
/// @brief Return the inverse of the predicate
|
|
||||||
Predicate getInversePredicate() const {
|
|
||||||
return getInversePredicate(getPredicate());
|
|
||||||
}
|
|
||||||
|
|
||||||
/// For example, OEQ -> UNE, UGT -> OLE, OLT -> UGE, etc.
|
|
||||||
/// @returns the inverse predicate for \p pred.
|
|
||||||
/// @brief Return the inverse of a given predicate
|
|
||||||
static Predicate getInversePredicate(Predicate pred);
|
|
||||||
|
|
||||||
/// For example, OEQ->OEQ, ULE->UGE, OLT->OGT, etc.
|
|
||||||
/// @returns the predicate that would be the result of exchanging the two
|
|
||||||
/// operands of the ICmpInst instruction without changing the result
|
|
||||||
/// produced.
|
|
||||||
/// @brief Return the predicate as if the operands were swapped
|
|
||||||
Predicate getSwappedPredicate() const {
|
|
||||||
return getSwappedPredicate(getPredicate());
|
|
||||||
}
|
|
||||||
|
|
||||||
/// This is a static version that you can use without an instruction
|
|
||||||
/// available.
|
|
||||||
/// @brief Return the predicate as if the operands were swapped.
|
|
||||||
static Predicate getSwappedPredicate(Predicate Opcode);
|
|
||||||
|
|
||||||
/// This also tests for commutativity. If isEquality() returns true then
|
/// This also tests for commutativity. If isEquality() returns true then
|
||||||
/// the predicate is also commutative. Only the equality predicates are
|
/// the predicate is also commutative. Only the equality predicates are
|
||||||
/// commutative.
|
/// commutative.
|
||||||
|
@ -2497,10 +2497,9 @@ bool CmpInst::isEquality() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
ICmpInst::Predicate ICmpInst::getInversePredicate(Predicate pred) {
|
CmpInst::Predicate CmpInst::getInversePredicate(Predicate pred) {
|
||||||
switch (pred) {
|
switch (pred) {
|
||||||
default:
|
default: assert(!"Unknown cmp predicate!");
|
||||||
assert(!"Unknown icmp predicate!");
|
|
||||||
case ICMP_EQ: return ICMP_NE;
|
case ICMP_EQ: return ICMP_NE;
|
||||||
case ICMP_NE: return ICMP_EQ;
|
case ICMP_NE: return ICMP_EQ;
|
||||||
case ICMP_UGT: return ICMP_ULE;
|
case ICMP_UGT: return ICMP_ULE;
|
||||||
@ -2511,22 +2510,23 @@ ICmpInst::Predicate ICmpInst::getInversePredicate(Predicate pred) {
|
|||||||
case ICMP_SLT: return ICMP_SGE;
|
case ICMP_SLT: return ICMP_SGE;
|
||||||
case ICMP_SGE: return ICMP_SLT;
|
case ICMP_SGE: return ICMP_SLT;
|
||||||
case ICMP_SLE: return ICMP_SGT;
|
case ICMP_SLE: return ICMP_SGT;
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ICmpInst::Predicate ICmpInst::getSwappedPredicate(Predicate pred) {
|
case FCMP_OEQ: return FCMP_UNE;
|
||||||
switch (pred) {
|
case FCMP_ONE: return FCMP_UEQ;
|
||||||
default: assert(! "Unknown icmp predicate!");
|
case FCMP_OGT: return FCMP_ULE;
|
||||||
case ICMP_EQ: case ICMP_NE:
|
case FCMP_OLT: return FCMP_UGE;
|
||||||
return pred;
|
case FCMP_OGE: return FCMP_ULT;
|
||||||
case ICMP_SGT: return ICMP_SLT;
|
case FCMP_OLE: return FCMP_UGT;
|
||||||
case ICMP_SLT: return ICMP_SGT;
|
case FCMP_UEQ: return FCMP_ONE;
|
||||||
case ICMP_SGE: return ICMP_SLE;
|
case FCMP_UNE: return FCMP_OEQ;
|
||||||
case ICMP_SLE: return ICMP_SGE;
|
case FCMP_UGT: return FCMP_OLE;
|
||||||
case ICMP_UGT: return ICMP_ULT;
|
case FCMP_ULT: return FCMP_OGE;
|
||||||
case ICMP_ULT: return ICMP_UGT;
|
case FCMP_UGE: return FCMP_OLT;
|
||||||
case ICMP_UGE: return ICMP_ULE;
|
case FCMP_ULE: return FCMP_OGT;
|
||||||
case ICMP_ULE: return ICMP_UGE;
|
case FCMP_ORD: return FCMP_UNO;
|
||||||
|
case FCMP_UNO: return FCMP_ORD;
|
||||||
|
case FCMP_TRUE: return FCMP_FALSE;
|
||||||
|
case FCMP_FALSE: return FCMP_TRUE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2602,32 +2602,20 @@ ICmpInst::makeConstantRange(Predicate pred, const APInt &C) {
|
|||||||
return ConstantRange(Lower, Upper);
|
return ConstantRange(Lower, Upper);
|
||||||
}
|
}
|
||||||
|
|
||||||
FCmpInst::Predicate FCmpInst::getInversePredicate(Predicate pred) {
|
CmpInst::Predicate CmpInst::getSwappedPredicate(Predicate pred) {
|
||||||
switch (pred) {
|
switch (pred) {
|
||||||
default:
|
default: assert(!"Unknown cmp predicate!");
|
||||||
assert(!"Unknown icmp predicate!");
|
case ICMP_EQ: case ICMP_NE:
|
||||||
case FCMP_OEQ: return FCMP_UNE;
|
return pred;
|
||||||
case FCMP_ONE: return FCMP_UEQ;
|
case ICMP_SGT: return ICMP_SLT;
|
||||||
case FCMP_OGT: return FCMP_ULE;
|
case ICMP_SLT: return ICMP_SGT;
|
||||||
case FCMP_OLT: return FCMP_UGE;
|
case ICMP_SGE: return ICMP_SLE;
|
||||||
case FCMP_OGE: return FCMP_ULT;
|
case ICMP_SLE: return ICMP_SGE;
|
||||||
case FCMP_OLE: return FCMP_UGT;
|
case ICMP_UGT: return ICMP_ULT;
|
||||||
case FCMP_UEQ: return FCMP_ONE;
|
case ICMP_ULT: return ICMP_UGT;
|
||||||
case FCMP_UNE: return FCMP_OEQ;
|
case ICMP_UGE: return ICMP_ULE;
|
||||||
case FCMP_UGT: return FCMP_OLE;
|
case ICMP_ULE: return ICMP_UGE;
|
||||||
case FCMP_ULT: return FCMP_OGE;
|
|
||||||
case FCMP_UGE: return FCMP_OLT;
|
|
||||||
case FCMP_ULE: return FCMP_OGT;
|
|
||||||
case FCMP_ORD: return FCMP_UNO;
|
|
||||||
case FCMP_UNO: return FCMP_ORD;
|
|
||||||
case FCMP_TRUE: return FCMP_FALSE;
|
|
||||||
case FCMP_FALSE: return FCMP_TRUE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
FCmpInst::Predicate FCmpInst::getSwappedPredicate(Predicate pred) {
|
|
||||||
switch (pred) {
|
|
||||||
default: assert(!"Unknown fcmp predicate!");
|
|
||||||
case FCMP_FALSE: case FCMP_TRUE:
|
case FCMP_FALSE: case FCMP_TRUE:
|
||||||
case FCMP_OEQ: case FCMP_ONE:
|
case FCMP_OEQ: case FCMP_ONE:
|
||||||
case FCMP_UEQ: case FCMP_UNE:
|
case FCMP_UEQ: case FCMP_UNE:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user