summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/Target')
-rw-r--r--llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp41
1 files changed, 27 insertions, 14 deletions
diff --git a/llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp b/llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp
index 6af1207b580..2f042cd3df6 100644
--- a/llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp
+++ b/llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp
@@ -506,19 +506,24 @@ public:
template <int Width> bool isSImm() const { return isSImmScaled<Width, 1>(); }
- template <int Bits, int Scale> bool isSImmScaled() const {
+ template <int Bits, int Scale>
+ DiagnosticPredicate isSImmScaled() const {
if (!isImm())
- return false;
+ return DiagnosticPredicateTy::NoMatch;
+
const MCConstantExpr *MCE = dyn_cast<MCConstantExpr>(getImm());
if (!MCE)
- return false;
+ return DiagnosticPredicateTy::NoMatch;
int64_t Shift = Bits - 1;
int64_t MinVal = (int64_t(1) << Shift) * -Scale;
int64_t MaxVal = ((int64_t(1) << Shift) - 1) * Scale;
int64_t Val = MCE->getValue();
- return Val >= MinVal && Val <= MaxVal && (Val % Scale) == 0;
+ if (Val >= MinVal && Val <= MaxVal && (Val % Scale) == 0)
+ return DiagnosticPredicateTy::Match;
+
+ return DiagnosticPredicateTy::NearMatch;
}
bool isSVEPattern() const {
@@ -859,10 +864,16 @@ public:
template <int ElementWidth, unsigned Class,
AArch64_AM::ShiftExtendType ShiftExtendTy, int ShiftWidth>
- bool isSVEVectorRegWithShiftExtend() const {
- return Kind == k_Register && isSVEVectorRegOfWidth<ElementWidth, Class>() &&
- ShiftExtendTy == getShiftExtendType() &&
- getShiftExtendAmount() == Log2_32(ShiftWidth / 8);
+ DiagnosticPredicate isSVEVectorRegWithShiftExtend() const {
+ if (Kind != k_Register || Reg.Kind != RegKind::SVEDataVector)
+ return DiagnosticPredicateTy::NoMatch;
+
+ if (isSVEVectorRegOfWidth<ElementWidth, Class>() &&
+ ShiftExtendTy == getShiftExtendType() &&
+ getShiftExtendAmount() == Log2_32(ShiftWidth / 8))
+ return DiagnosticPredicateTy::Match;
+
+ return DiagnosticPredicateTy::NearMatch;
}
bool isGPR32as64() const {
@@ -899,12 +910,14 @@ public:
}
template <unsigned RegClassID, int ExtWidth>
- bool isGPR64WithShiftExtend() const {
- if (!isGPR64<RegClassID>())
- return false;
-
- return getShiftExtendType() == AArch64_AM::LSL &&
- getShiftExtendAmount() == Log2_32(ExtWidth / 8);
+ DiagnosticPredicate isGPR64WithShiftExtend() const {
+ if (Kind != k_Register || Reg.Kind != RegKind::Scalar)
+ return DiagnosticPredicateTy::NoMatch;
+
+ if (isGPR64<RegClassID>() && getShiftExtendType() == AArch64_AM::LSL &&
+ getShiftExtendAmount() == Log2_32(ExtWidth / 8))
+ return DiagnosticPredicateTy::Match;
+ return DiagnosticPredicateTy::NearMatch;
}
/// Is this a vector list with the type implicit (presumably attached to the
OpenPOWER on IntegriCloud