Path: blob/main/contrib/llvm-project/llvm/lib/MC/MCInstrDesc.cpp
35233 views
//===------ llvm/MC/MCInstrDesc.cpp- Instruction Descriptors --------------===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//7//8// This file defines methods on the MCOperandInfo and MCInstrDesc classes, which9// are used to describe target instructions and their operands.10//11//===----------------------------------------------------------------------===//1213#include "llvm/MC/MCInstrDesc.h"14#include "llvm/MC/MCInst.h"15#include "llvm/MC/MCRegisterInfo.h"1617using namespace llvm;1819bool MCInstrDesc::mayAffectControlFlow(const MCInst &MI,20const MCRegisterInfo &RI) const {21if (isBranch() || isCall() || isReturn() || isIndirectBranch())22return true;23unsigned PC = RI.getProgramCounter();24if (PC == 0)25return false;26if (hasDefOfPhysReg(MI, PC, RI))27return true;28return false;29}3031bool MCInstrDesc::hasImplicitDefOfPhysReg(unsigned Reg,32const MCRegisterInfo *MRI) const {33for (MCPhysReg ImpDef : implicit_defs())34if (ImpDef == Reg || (MRI && MRI->isSubRegister(Reg, ImpDef)))35return true;36return false;37}3839bool MCInstrDesc::hasDefOfPhysReg(const MCInst &MI, unsigned Reg,40const MCRegisterInfo &RI) const {41for (int i = 0, e = NumDefs; i != e; ++i)42if (MI.getOperand(i).isReg() && MI.getOperand(i).getReg() &&43RI.isSubRegisterEq(Reg, MI.getOperand(i).getReg()))44return true;45if (variadicOpsAreDefs())46for (int i = NumOperands - 1, e = MI.getNumOperands(); i != e; ++i)47if (MI.getOperand(i).isReg() &&48RI.isSubRegisterEq(Reg, MI.getOperand(i).getReg()))49return true;50return hasImplicitDefOfPhysReg(Reg, &RI);51}525354