diff options
author | Fraser Cormack <fraser@codeplay.com> | 2022-03-30 13:14:33 +0100 |
---|---|---|
committer | Fraser Cormack <fraser@codeplay.com> | 2022-03-30 17:05:11 +0100 |
commit | 73244e8f8568fb0ebf0be5943c5d290f5b91d0c1 (patch) | |
tree | 7df669ed368807c5b9636d795db1b9b692f2498b /llvm/lib/IR/IntrinsicInst.cpp | |
parent | a0e5d9e1f41bb9dca94815f714646640d656d085 (diff) | |
download | llvm-73244e8f8568fb0ebf0be5943c5d290f5b91d0c1.zip llvm-73244e8f8568fb0ebf0be5943c5d290f5b91d0c1.tar.gz llvm-73244e8f8568fb0ebf0be5943c5d290f5b91d0c1.tar.bz2 |
[VP] Add vp.icmp comparison intrinsic and docs
This patch mostly follows up on D121292 which introduced the vp.fcmp
intrinsic.
Reviewed By: craig.topper
Differential Revision: https://reviews.llvm.org/D122729
Diffstat (limited to 'llvm/lib/IR/IntrinsicInst.cpp')
-rw-r--r-- | llvm/lib/IR/IntrinsicInst.cpp | 24 |
1 files changed, 21 insertions, 3 deletions
diff --git a/llvm/lib/IR/IntrinsicInst.cpp b/llvm/lib/IR/IntrinsicInst.cpp index eeffbaf..67bcb11 100644 --- a/llvm/lib/IR/IntrinsicInst.cpp +++ b/llvm/lib/IR/IntrinsicInst.cpp @@ -576,6 +576,24 @@ bool VPCmpIntrinsic::isVPCmp(Intrinsic::ID ID) { return false; } +static ICmpInst::Predicate getIntPredicateFromMD(const Value *Op) { + Metadata *MD = cast<MetadataAsValue>(Op)->getMetadata(); + if (!MD || !isa<MDString>(MD)) + return ICmpInst::BAD_ICMP_PREDICATE; + return StringSwitch<ICmpInst::Predicate>(cast<MDString>(MD)->getString()) + .Case("eq", ICmpInst::ICMP_EQ) + .Case("ne", ICmpInst::ICMP_NE) + .Case("ugt", ICmpInst::ICMP_UGT) + .Case("uge", ICmpInst::ICMP_UGE) + .Case("ult", ICmpInst::ICMP_ULT) + .Case("ule", ICmpInst::ICMP_ULE) + .Case("sgt", ICmpInst::ICMP_SGT) + .Case("sge", ICmpInst::ICMP_SGE) + .Case("slt", ICmpInst::ICMP_SLT) + .Case("sle", ICmpInst::ICMP_SLE) + .Default(ICmpInst::BAD_ICMP_PREDICATE); +} + CmpInst::Predicate VPCmpIntrinsic::getPredicate() const { bool IsFP = true; Optional<unsigned> CCArgIdx; @@ -590,9 +608,9 @@ CmpInst::Predicate VPCmpIntrinsic::getPredicate() const { #define END_REGISTER_VP_INTRINSIC(VPID) break; #include "llvm/IR/VPIntrinsics.def" } - assert(CCArgIdx.hasValue() && IsFP && - "Unexpected vector-predicated comparison"); - return getFPPredicateFromMD(getArgOperand(*CCArgIdx)); + assert(CCArgIdx.hasValue() && "Unexpected vector-predicated comparison"); + return IsFP ? getFPPredicateFromMD(getArgOperand(*CCArgIdx)) + : getIntPredicateFromMD(getArgOperand(*CCArgIdx)); } unsigned VPReductionIntrinsic::getVectorParamPos() const { |