diff options
Diffstat (limited to 'lib/Target/AVR/AsmParser/AVRAsmParser.cpp')
-rw-r--r-- | lib/Target/AVR/AsmParser/AVRAsmParser.cpp | 24 |
1 files changed, 20 insertions, 4 deletions
diff --git a/lib/Target/AVR/AsmParser/AVRAsmParser.cpp b/lib/Target/AVR/AsmParser/AVRAsmParser.cpp index f2bb59265271..aac5644711e2 100644 --- a/lib/Target/AVR/AsmParser/AVRAsmParser.cpp +++ b/lib/Target/AVR/AsmParser/AVRAsmParser.cpp @@ -1,9 +1,8 @@ //===---- AVRAsmParser.cpp - Parse AVR assembly to MCInst instructions ----===// // -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// @@ -12,6 +11,7 @@ #include "MCTargetDesc/AVRMCELFStreamer.h" #include "MCTargetDesc/AVRMCExpr.h" #include "MCTargetDesc/AVRMCTargetDesc.h" +#include "TargetInfo/AVRTargetInfo.h" #include "llvm/ADT/APInt.h" #include "llvm/ADT/StringSwitch.h" @@ -160,6 +160,22 @@ public: addExpr(Inst, getImm()); } + void addImmCom8Operands(MCInst &Inst, unsigned N) const { + assert(N == 1 && "Invalid number of operands!"); + // The operand is actually a imm8, but we have its bitwise + // negation in the assembly source, so twiddle it here. + const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm()); + Inst.addOperand(MCOperand::createImm(~(uint8_t)CE->getValue())); + } + + bool isImmCom8() const { + if (!isImm()) return false; + const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm()); + if (!CE) return false; + int64_t Value = CE->getValue(); + return isUInt<8>(Value); + } + bool isReg() const { return Kind == k_Register; } bool isImm() const { return Kind == k_Immediate; } bool isToken() const { return Kind == k_Token; } |