summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target/ARM/Utils
diff options
context:
space:
mode:
authorDavid Green <david.green@arm.com>2019-12-02 14:47:22 +0000
committerDavid Green <david.green@arm.com>2019-12-02 19:57:12 +0000
commit57d96ab593dfff39dc6eb8fa5f25eaf64af26ee1 (patch)
tree588a831b17cbc17e468054e0fbcbf785971383dd /llvm/lib/Target/ARM/Utils
parent63aff5cd3c83cc1000cf9c85388e62071086dda2 (diff)
downloadbcm5719-llvm-57d96ab593dfff39dc6eb8fa5f25eaf64af26ee1.tar.gz
bcm5719-llvm-57d96ab593dfff39dc6eb8fa5f25eaf64af26ee1.zip
[ARM] Add some VCMP folding and canonicalisation
The VCMP instructions in MVE can accept a register or ZR, but only as the right hand operator. Most of the time this will already be correct because the icmp will have been canonicalised that way already. There are some cases in the lowering of float conditions that this will not apply to though. This code should fix up those cases. Differential Revision: https://reviews.llvm.org/D70822
Diffstat (limited to 'llvm/lib/Target/ARM/Utils')
-rw-r--r--llvm/lib/Target/ARM/Utils/ARMBaseInfo.h19
1 files changed, 19 insertions, 0 deletions
diff --git a/llvm/lib/Target/ARM/Utils/ARMBaseInfo.h b/llvm/lib/Target/ARM/Utils/ARMBaseInfo.h
index aa3aca359cb..11cb1a162e2 100644
--- a/llvm/lib/Target/ARM/Utils/ARMBaseInfo.h
+++ b/llvm/lib/Target/ARM/Utils/ARMBaseInfo.h
@@ -64,6 +64,25 @@ inline static CondCodes getOppositeCondition(CondCodes CC) {
case LE: return GT;
}
}
+
+/// getSwappedCondition - assume the flags are set by MI(a,b), return
+/// the condition code if we modify the instructions such that flags are
+/// set by MI(b,a).
+inline static ARMCC::CondCodes getSwappedCondition(ARMCC::CondCodes CC) {
+ switch (CC) {
+ default: return ARMCC::AL;
+ case ARMCC::EQ: return ARMCC::EQ;
+ case ARMCC::NE: return ARMCC::NE;
+ case ARMCC::HS: return ARMCC::LS;
+ case ARMCC::LO: return ARMCC::HI;
+ case ARMCC::HI: return ARMCC::LO;
+ case ARMCC::LS: return ARMCC::HS;
+ case ARMCC::GE: return ARMCC::LE;
+ case ARMCC::LT: return ARMCC::GT;
+ case ARMCC::GT: return ARMCC::LT;
+ case ARMCC::LE: return ARMCC::GE;
+ }
+}
} // end namespace ARMCC
namespace ARMVCC {
OpenPOWER on IntegriCloud