diff options
Diffstat (limited to 'contrib/llvm/lib/Target/ARC/ARCInstrInfo.cpp')
-rw-r--r-- | contrib/llvm/lib/Target/ARC/ARCInstrInfo.cpp | 54 |
1 files changed, 49 insertions, 5 deletions
diff --git a/contrib/llvm/lib/Target/ARC/ARCInstrInfo.cpp b/contrib/llvm/lib/Target/ARC/ARCInstrInfo.cpp index a8084f16893b..2a660e3c4dd1 100644 --- a/contrib/llvm/lib/Target/ARC/ARCInstrInfo.cpp +++ b/contrib/llvm/lib/Target/ARC/ARCInstrInfo.cpp @@ -1,9 +1,8 @@ //===- ARCInstrInfo.cpp - ARC Instruction Information -----------*- C++ -*-===// // -// 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 // //===----------------------------------------------------------------------===// // @@ -28,6 +27,19 @@ using namespace llvm; #include "ARCGenInstrInfo.inc" #define DEBUG_TYPE "arc-inst-info" + +enum AddrIncType { + NoAddInc = 0, + PreInc = 1, + PostInc = 2, + Scaled = 3 +}; + +enum TSFlagsConstants { + TSF_AddrModeOff = 0, + TSF_AddModeMask = 3 +}; + // Pin the vtable to this file. void ARCInstrInfo::anchor() {} @@ -389,10 +401,42 @@ unsigned ARCInstrInfo::insertBranch(MachineBasicBlock &MBB, } unsigned ARCInstrInfo::getInstSizeInBytes(const MachineInstr &MI) const { - if (MI.getOpcode() == TargetOpcode::INLINEASM) { + if (MI.isInlineAsm()) { const MachineFunction *MF = MI.getParent()->getParent(); const char *AsmStr = MI.getOperand(0).getSymbolName(); return getInlineAsmLength(AsmStr, *MF->getTarget().getMCAsmInfo()); } return MI.getDesc().getSize(); } + +bool ARCInstrInfo::isPostIncrement(const MachineInstr &MI) const { + const MCInstrDesc &MID = MI.getDesc(); + const uint64_t F = MID.TSFlags; + return ((F >> TSF_AddrModeOff) & TSF_AddModeMask) == PostInc; +} + +bool ARCInstrInfo::isPreIncrement(const MachineInstr &MI) const { + const MCInstrDesc &MID = MI.getDesc(); + const uint64_t F = MID.TSFlags; + return ((F >> TSF_AddrModeOff) & TSF_AddModeMask) == PreInc; +} + +bool ARCInstrInfo::getBaseAndOffsetPosition(const MachineInstr &MI, + unsigned &BasePos, + unsigned &OffsetPos) const { + if (!MI.mayLoad() && !MI.mayStore()) + return false; + + BasePos = 1; + OffsetPos = 2; + + if (isPostIncrement(MI) || isPreIncrement(MI)) { + BasePos++; + OffsetPos++; + } + + if (!MI.getOperand(BasePos).isReg() || !MI.getOperand(OffsetPos).isImm()) + return false; + + return true; +} |