diff options
| author | Sander de Smalen <sander.desmalen@arm.com> | 2018-01-29 13:05:38 +0000 |
|---|---|---|
| committer | Sander de Smalen <sander.desmalen@arm.com> | 2018-01-29 13:05:38 +0000 |
| commit | a1c259c22cb4bf0077461398fcd029769b3d86f0 (patch) | |
| tree | c0c21344f1012ea65d076041214eb60f826bf950 /llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp | |
| parent | de6fad6935546c44293341a272a974423ee60582 (diff) | |
| download | bcm5719-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.cpp | 69 |
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)); } |

