summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp
diff options
context:
space:
mode:
authorSander de Smalen <sander.desmalen@arm.com>2018-01-29 13:05:38 +0000
committerSander de Smalen <sander.desmalen@arm.com>2018-01-29 13:05:38 +0000
commita1c259c22cb4bf0077461398fcd029769b3d86f0 (patch)
treec0c21344f1012ea65d076041214eb60f826bf950 /llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp
parentde6fad6935546c44293341a272a974423ee60582 (diff)
downloadbcm5719-llvm-a1c259c22cb4bf0077461398fcd029769b3d86f0.tar.gz
bcm5719-llvm-a1c259c22cb4bf0077461398fcd029769b3d86f0.zip
[AArch64][AsmParser] NFC: Generalize LogicalImm[Not](32|64) code
Summary: All variants of isLogicalImm[Not](32|64) can be combined into a single templated function, same for printLogicalImm(32|64). By making it use a template instead, further SVE patches can use it for other data types as well (e.g. 8, 16 bits). Reviewers: fhahn, rengolin, aadg, echristo, kristof.beyls, samparker Reviewed By: samparker Subscribers: aemerson, javed.absar, llvm-commits Differential Revision: https://reviews.llvm.org/D42294 llvm-svn: 323646
Diffstat (limited to 'llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp')
-rw-r--r--llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp69
1 files changed, 17 insertions, 52 deletions
diff --git a/llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp b/llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp
index 34e1fce7243..a04754bdda3 100644
--- a/llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp
+++ b/llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp
@@ -555,45 +555,23 @@ public:
return (Val >= N && Val <= M);
}
- bool isLogicalImm32() const {
+ // NOTE: Also used for isLogicalImmNot as anything that can be represented as
+ // a logical immediate can always be represented when inverted.
+ template <typename T>
+ bool isLogicalImm() const {
if (!isImm())
return false;
const MCConstantExpr *MCE = dyn_cast<MCConstantExpr>(getImm());
if (!MCE)
return false;
- int64_t Val = MCE->getValue();
- if (Val >> 32 != 0 && Val >> 32 != ~0LL)
- return false;
- Val &= 0xFFFFFFFF;
- return AArch64_AM::isLogicalImmediate(Val, 32);
- }
- bool isLogicalImm64() const {
- if (!isImm())
- return false;
- const MCConstantExpr *MCE = dyn_cast<MCConstantExpr>(getImm());
- if (!MCE)
+ int64_t Val = MCE->getValue();
+ int64_t SVal = typename std::make_signed<T>::type(Val);
+ int64_t UVal = typename std::make_unsigned<T>::type(Val);
+ if (Val != SVal && Val != UVal)
return false;
- return AArch64_AM::isLogicalImmediate(MCE->getValue(), 64);
- }
- bool isLogicalImm32Not() const {
- if (!isImm())
- return false;
- const MCConstantExpr *MCE = dyn_cast<MCConstantExpr>(getImm());
- if (!MCE)
- return false;
- int64_t Val = ~MCE->getValue() & 0xFFFFFFFF;
- return AArch64_AM::isLogicalImmediate(Val, 32);
- }
-
- bool isLogicalImm64Not() const {
- if (!isImm())
- return false;
- const MCConstantExpr *MCE = dyn_cast<MCConstantExpr>(getImm());
- if (!MCE)
- return false;
- return AArch64_AM::isLogicalImmediate(~MCE->getValue(), 64);
+ return AArch64_AM::isLogicalImmediate(UVal, sizeof(T) * 8);
}
bool isShiftedImm() const { return Kind == k_ShiftedImm; }
@@ -1378,34 +1356,21 @@ public:
Inst.addOperand(MCOperand::createImm(MCE->getValue()));
}
- void addLogicalImm32Operands(MCInst &Inst, unsigned N) const {
- assert(N == 1 && "Invalid number of operands!");
- const MCConstantExpr *MCE = cast<MCConstantExpr>(getImm());
- uint64_t encoding =
- AArch64_AM::encodeLogicalImmediate(MCE->getValue() & 0xFFFFFFFF, 32);
- Inst.addOperand(MCOperand::createImm(encoding));
- }
-
- void addLogicalImm64Operands(MCInst &Inst, unsigned N) const {
- assert(N == 1 && "Invalid number of operands!");
- const MCConstantExpr *MCE = cast<MCConstantExpr>(getImm());
- uint64_t encoding = AArch64_AM::encodeLogicalImmediate(MCE->getValue(), 64);
- Inst.addOperand(MCOperand::createImm(encoding));
- }
-
- void addLogicalImm32NotOperands(MCInst &Inst, unsigned N) const {
+ template <typename T>
+ void addLogicalImmOperands(MCInst &Inst, unsigned N) const {
assert(N == 1 && "Invalid number of operands!");
const MCConstantExpr *MCE = cast<MCConstantExpr>(getImm());
- int64_t Val = ~MCE->getValue() & 0xFFFFFFFF;
- uint64_t encoding = AArch64_AM::encodeLogicalImmediate(Val, 32);
+ typename std::make_unsigned<T>::type Val = MCE->getValue();
+ uint64_t encoding = AArch64_AM::encodeLogicalImmediate(Val, sizeof(T) * 8);
Inst.addOperand(MCOperand::createImm(encoding));
}
- void addLogicalImm64NotOperands(MCInst &Inst, unsigned N) const {
+ template <typename T>
+ void addLogicalImmNotOperands(MCInst &Inst, unsigned N) const {
assert(N == 1 && "Invalid number of operands!");
const MCConstantExpr *MCE = cast<MCConstantExpr>(getImm());
- uint64_t encoding =
- AArch64_AM::encodeLogicalImmediate(~MCE->getValue(), 64);
+ typename std::make_unsigned<T>::type Val = ~MCE->getValue();
+ uint64_t encoding = AArch64_AM::encodeLogicalImmediate(Val, sizeof(T) * 8);
Inst.addOperand(MCOperand::createImm(encoding));
}
OpenPOWER on IntegriCloud