Path: blob/main/contrib/llvm-project/llvm/lib/Target/CSKY/CSKYInstrInfo.cpp
35269 views
//===-- CSKYInstrInfo.h - CSKY Instruction Information --------*- C++ -*---===//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 contains the CSKY implementation of the TargetInstrInfo class.9//10//===----------------------------------------------------------------------===//1112#include "CSKYInstrInfo.h"13#include "CSKYConstantPoolValue.h"14#include "CSKYMachineFunctionInfo.h"15#include "CSKYTargetMachine.h"16#include "llvm/CodeGen/MachineFrameInfo.h"17#include "llvm/MC/MCContext.h"1819#define DEBUG_TYPE "csky-instr-info"2021using namespace llvm;2223#define GET_INSTRINFO_CTOR_DTOR24#include "CSKYGenInstrInfo.inc"2526CSKYInstrInfo::CSKYInstrInfo(CSKYSubtarget &STI)27: CSKYGenInstrInfo(CSKY::ADJCALLSTACKDOWN, CSKY::ADJCALLSTACKUP), STI(STI) {28v2sf = STI.hasFPUv2SingleFloat();29v2df = STI.hasFPUv2DoubleFloat();30v3sf = STI.hasFPUv3SingleFloat();31v3df = STI.hasFPUv3DoubleFloat();32}3334static void parseCondBranch(MachineInstr &LastInst, MachineBasicBlock *&Target,35SmallVectorImpl<MachineOperand> &Cond) {36// Block ends with fall-through condbranch.37assert(LastInst.getDesc().isConditionalBranch() &&38"Unknown conditional branch");39Target = LastInst.getOperand(1).getMBB();40Cond.push_back(MachineOperand::CreateImm(LastInst.getOpcode()));41Cond.push_back(LastInst.getOperand(0));42}4344bool CSKYInstrInfo::analyzeBranch(MachineBasicBlock &MBB,45MachineBasicBlock *&TBB,46MachineBasicBlock *&FBB,47SmallVectorImpl<MachineOperand> &Cond,48bool AllowModify) const {49TBB = FBB = nullptr;50Cond.clear();5152// If the block has no terminators, it just falls into the block after it.53MachineBasicBlock::iterator I = MBB.getLastNonDebugInstr();54if (I == MBB.end() || !isUnpredicatedTerminator(*I))55return false;5657// Count the number of terminators and find the first unconditional or58// indirect branch.59MachineBasicBlock::iterator FirstUncondOrIndirectBr = MBB.end();60int NumTerminators = 0;61for (auto J = I.getReverse(); J != MBB.rend() && isUnpredicatedTerminator(*J);62J++) {63NumTerminators++;64if (J->getDesc().isUnconditionalBranch() ||65J->getDesc().isIndirectBranch()) {66FirstUncondOrIndirectBr = J.getReverse();67}68}6970// If AllowModify is true, we can erase any terminators after71// FirstUncondOrIndirectBR.72if (AllowModify && FirstUncondOrIndirectBr != MBB.end()) {73while (std::next(FirstUncondOrIndirectBr) != MBB.end()) {74std::next(FirstUncondOrIndirectBr)->eraseFromParent();75NumTerminators--;76}77I = FirstUncondOrIndirectBr;78}7980// We can't handle blocks that end in an indirect branch.81if (I->getDesc().isIndirectBranch())82return true;8384// We can't handle blocks with more than 2 terminators.85if (NumTerminators > 2)86return true;8788// Handle a single unconditional branch.89if (NumTerminators == 1 && I->getDesc().isUnconditionalBranch()) {90TBB = getBranchDestBlock(*I);91return false;92}9394// Handle a single conditional branch.95if (NumTerminators == 1 && I->getDesc().isConditionalBranch()) {96parseCondBranch(*I, TBB, Cond);97return false;98}99100// Handle a conditional branch followed by an unconditional branch.101if (NumTerminators == 2 && std::prev(I)->getDesc().isConditionalBranch() &&102I->getDesc().isUnconditionalBranch()) {103parseCondBranch(*std::prev(I), TBB, Cond);104FBB = getBranchDestBlock(*I);105return false;106}107108// Otherwise, we can't handle this.109return true;110}111112unsigned CSKYInstrInfo::removeBranch(MachineBasicBlock &MBB,113int *BytesRemoved) const {114if (BytesRemoved)115*BytesRemoved = 0;116MachineBasicBlock::iterator I = MBB.getLastNonDebugInstr();117if (I == MBB.end())118return 0;119120if (!I->getDesc().isUnconditionalBranch() &&121!I->getDesc().isConditionalBranch())122return 0;123124// Remove the branch.125if (BytesRemoved)126*BytesRemoved += getInstSizeInBytes(*I);127I->eraseFromParent();128129I = MBB.end();130131if (I == MBB.begin())132return 1;133--I;134if (!I->getDesc().isConditionalBranch())135return 1;136137// Remove the branch.138if (BytesRemoved)139*BytesRemoved += getInstSizeInBytes(*I);140I->eraseFromParent();141return 2;142}143144MachineBasicBlock *145CSKYInstrInfo::getBranchDestBlock(const MachineInstr &MI) const {146assert(MI.getDesc().isBranch() && "Unexpected opcode!");147// The branch target is always the last operand.148int NumOp = MI.getNumExplicitOperands();149assert(MI.getOperand(NumOp - 1).isMBB() && "Expected MBB!");150return MI.getOperand(NumOp - 1).getMBB();151}152153unsigned CSKYInstrInfo::insertBranch(154MachineBasicBlock &MBB, MachineBasicBlock *TBB, MachineBasicBlock *FBB,155ArrayRef<MachineOperand> Cond, const DebugLoc &DL, int *BytesAdded) const {156if (BytesAdded)157*BytesAdded = 0;158159// Shouldn't be a fall through.160assert(TBB && "insertBranch must not be told to insert a fallthrough");161assert((Cond.size() == 2 || Cond.size() == 0) &&162"CSKY branch conditions have two components!");163164// Unconditional branch.165if (Cond.empty()) {166MachineInstr &MI = *BuildMI(&MBB, DL, get(CSKY::BR32)).addMBB(TBB);167if (BytesAdded)168*BytesAdded += getInstSizeInBytes(MI);169return 1;170}171172// Either a one or two-way conditional branch.173unsigned Opc = Cond[0].getImm();174MachineInstr &CondMI = *BuildMI(&MBB, DL, get(Opc)).add(Cond[1]).addMBB(TBB);175if (BytesAdded)176*BytesAdded += getInstSizeInBytes(CondMI);177178// One-way conditional branch.179if (!FBB)180return 1;181182// Two-way conditional branch.183MachineInstr &MI = *BuildMI(&MBB, DL, get(CSKY::BR32)).addMBB(FBB);184if (BytesAdded)185*BytesAdded += getInstSizeInBytes(MI);186return 2;187}188189static unsigned getOppositeBranchOpc(unsigned Opcode) {190switch (Opcode) {191default:192llvm_unreachable("Unknown conditional branch!");193case CSKY::BT32:194return CSKY::BF32;195case CSKY::BT16:196return CSKY::BF16;197case CSKY::BF32:198return CSKY::BT32;199case CSKY::BF16:200return CSKY::BT16;201case CSKY::BHZ32:202return CSKY::BLSZ32;203case CSKY::BHSZ32:204return CSKY::BLZ32;205case CSKY::BLZ32:206return CSKY::BHSZ32;207case CSKY::BLSZ32:208return CSKY::BHZ32;209case CSKY::BNEZ32:210return CSKY::BEZ32;211case CSKY::BEZ32:212return CSKY::BNEZ32;213}214}215216bool CSKYInstrInfo::reverseBranchCondition(217SmallVectorImpl<MachineOperand> &Cond) const {218assert((Cond.size() == 2) && "Invalid branch condition!");219Cond[0].setImm(getOppositeBranchOpc(Cond[0].getImm()));220return false;221}222223Register CSKYInstrInfo::movImm(MachineBasicBlock &MBB,224MachineBasicBlock::iterator MBBI,225const DebugLoc &DL, uint64_t Val,226MachineInstr::MIFlag Flag) const {227if (!isInt<32>(Val))228report_fatal_error("Should only materialize 32-bit constants.");229230MachineRegisterInfo &MRI = MBB.getParent()->getRegInfo();231232Register DstReg;233if (STI.hasE2()) {234DstReg = MRI.createVirtualRegister(&CSKY::GPRRegClass);235236if (isUInt<16>(Val)) {237BuildMI(MBB, MBBI, DL, get(CSKY::MOVI32), DstReg)238.addImm(Val & 0xFFFF)239.setMIFlags(Flag);240} else if (isShiftedUInt<16, 16>(Val)) {241BuildMI(MBB, MBBI, DL, get(CSKY::MOVIH32), DstReg)242.addImm((Val >> 16) & 0xFFFF)243.setMIFlags(Flag);244} else {245BuildMI(MBB, MBBI, DL, get(CSKY::MOVIH32), DstReg)246.addImm((Val >> 16) & 0xFFFF)247.setMIFlags(Flag);248BuildMI(MBB, MBBI, DL, get(CSKY::ORI32), DstReg)249.addReg(DstReg)250.addImm(Val & 0xFFFF)251.setMIFlags(Flag);252}253254} else {255DstReg = MRI.createVirtualRegister(&CSKY::mGPRRegClass);256if (isUInt<8>(Val)) {257BuildMI(MBB, MBBI, DL, get(CSKY::MOVI16), DstReg)258.addImm(Val & 0xFF)259.setMIFlags(Flag);260} else if (isUInt<16>(Val)) {261BuildMI(MBB, MBBI, DL, get(CSKY::MOVI16), DstReg)262.addImm((Val >> 8) & 0xFF)263.setMIFlags(Flag);264BuildMI(MBB, MBBI, DL, get(CSKY::LSLI16), DstReg)265.addReg(DstReg)266.addImm(8)267.setMIFlags(Flag);268if ((Val & 0xFF) != 0)269BuildMI(MBB, MBBI, DL, get(CSKY::ADDI16), DstReg)270.addReg(DstReg)271.addImm(Val & 0xFF)272.setMIFlags(Flag);273} else if (isUInt<24>(Val)) {274BuildMI(MBB, MBBI, DL, get(CSKY::MOVI16), DstReg)275.addImm((Val >> 16) & 0xFF)276.setMIFlags(Flag);277BuildMI(MBB, MBBI, DL, get(CSKY::LSLI16), DstReg)278.addReg(DstReg)279.addImm(8)280.setMIFlags(Flag);281if (((Val >> 8) & 0xFF) != 0)282BuildMI(MBB, MBBI, DL, get(CSKY::ADDI16), DstReg)283.addReg(DstReg)284.addImm((Val >> 8) & 0xFF)285.setMIFlags(Flag);286BuildMI(MBB, MBBI, DL, get(CSKY::LSLI16), DstReg)287.addReg(DstReg)288.addImm(8)289.setMIFlags(Flag);290if ((Val & 0xFF) != 0)291BuildMI(MBB, MBBI, DL, get(CSKY::ADDI16), DstReg)292.addReg(DstReg)293.addImm(Val & 0xFF)294.setMIFlags(Flag);295} else {296BuildMI(MBB, MBBI, DL, get(CSKY::MOVI16), DstReg)297.addImm((Val >> 24) & 0xFF)298.setMIFlags(Flag);299BuildMI(MBB, MBBI, DL, get(CSKY::LSLI16), DstReg)300.addReg(DstReg)301.addImm(8)302.setMIFlags(Flag);303if (((Val >> 16) & 0xFF) != 0)304BuildMI(MBB, MBBI, DL, get(CSKY::ADDI16), DstReg)305.addReg(DstReg)306.addImm((Val >> 16) & 0xFF)307.setMIFlags(Flag);308BuildMI(MBB, MBBI, DL, get(CSKY::LSLI16), DstReg)309.addReg(DstReg)310.addImm(8)311.setMIFlags(Flag);312if (((Val >> 8) & 0xFF) != 0)313BuildMI(MBB, MBBI, DL, get(CSKY::ADDI16), DstReg)314.addReg(DstReg)315.addImm((Val >> 8) & 0xFF)316.setMIFlags(Flag);317BuildMI(MBB, MBBI, DL, get(CSKY::LSLI16), DstReg)318.addReg(DstReg)319.addImm(8)320.setMIFlags(Flag);321if ((Val & 0xFF) != 0)322BuildMI(MBB, MBBI, DL, get(CSKY::ADDI16), DstReg)323.addReg(DstReg)324.addImm(Val & 0xFF)325.setMIFlags(Flag);326}327}328329return DstReg;330}331332Register CSKYInstrInfo::isLoadFromStackSlot(const MachineInstr &MI,333int &FrameIndex) const {334switch (MI.getOpcode()) {335default:336return 0;337case CSKY::LD16B:338case CSKY::LD16H:339case CSKY::LD16W:340case CSKY::LD32B:341case CSKY::LD32BS:342case CSKY::LD32H:343case CSKY::LD32HS:344case CSKY::LD32W:345case CSKY::FLD_S:346case CSKY::FLD_D:347case CSKY::f2FLD_S:348case CSKY::f2FLD_D:349case CSKY::RESTORE_CARRY:350break;351}352353if (MI.getOperand(1).isFI() && MI.getOperand(2).isImm() &&354MI.getOperand(2).getImm() == 0) {355FrameIndex = MI.getOperand(1).getIndex();356return MI.getOperand(0).getReg();357}358359return 0;360}361362Register CSKYInstrInfo::isStoreToStackSlot(const MachineInstr &MI,363int &FrameIndex) const {364switch (MI.getOpcode()) {365default:366return 0;367case CSKY::ST16B:368case CSKY::ST16H:369case CSKY::ST16W:370case CSKY::ST32B:371case CSKY::ST32H:372case CSKY::ST32W:373case CSKY::FST_S:374case CSKY::FST_D:375case CSKY::f2FST_S:376case CSKY::f2FST_D:377case CSKY::SPILL_CARRY:378break;379}380381if (MI.getOperand(1).isFI() && MI.getOperand(2).isImm() &&382MI.getOperand(2).getImm() == 0) {383FrameIndex = MI.getOperand(1).getIndex();384return MI.getOperand(0).getReg();385}386387return 0;388}389390void CSKYInstrInfo::storeRegToStackSlot(MachineBasicBlock &MBB,391MachineBasicBlock::iterator I,392Register SrcReg, bool IsKill, int FI,393const TargetRegisterClass *RC,394const TargetRegisterInfo *TRI,395Register VReg) const {396DebugLoc DL;397if (I != MBB.end())398DL = I->getDebugLoc();399400MachineFunction &MF = *MBB.getParent();401CSKYMachineFunctionInfo *CFI = MF.getInfo<CSKYMachineFunctionInfo>();402MachineFrameInfo &MFI = MF.getFrameInfo();403404unsigned Opcode = 0;405406if (CSKY::GPRRegClass.hasSubClassEq(RC)) {407Opcode = CSKY::ST32W; // Optimize for 16bit408} else if (CSKY::CARRYRegClass.hasSubClassEq(RC)) {409Opcode = CSKY::SPILL_CARRY;410CFI->setSpillsCR();411} else if (v2sf && CSKY::sFPR32RegClass.hasSubClassEq(RC))412Opcode = CSKY::FST_S;413else if (v2df && CSKY::sFPR64RegClass.hasSubClassEq(RC))414Opcode = CSKY::FST_D;415else if (v3sf && CSKY::FPR32RegClass.hasSubClassEq(RC))416Opcode = CSKY::f2FST_S;417else if (v3df && CSKY::FPR64RegClass.hasSubClassEq(RC))418Opcode = CSKY::f2FST_D;419else {420llvm_unreachable("Unknown RegisterClass");421}422423MachineMemOperand *MMO = MF.getMachineMemOperand(424MachinePointerInfo::getFixedStack(MF, FI), MachineMemOperand::MOStore,425MFI.getObjectSize(FI), MFI.getObjectAlign(FI));426427BuildMI(MBB, I, DL, get(Opcode))428.addReg(SrcReg, getKillRegState(IsKill))429.addFrameIndex(FI)430.addImm(0)431.addMemOperand(MMO);432}433434void CSKYInstrInfo::loadRegFromStackSlot(MachineBasicBlock &MBB,435MachineBasicBlock::iterator I,436Register DestReg, int FI,437const TargetRegisterClass *RC,438const TargetRegisterInfo *TRI,439Register VReg) const {440DebugLoc DL;441if (I != MBB.end())442DL = I->getDebugLoc();443444MachineFunction &MF = *MBB.getParent();445CSKYMachineFunctionInfo *CFI = MF.getInfo<CSKYMachineFunctionInfo>();446MachineFrameInfo &MFI = MF.getFrameInfo();447448unsigned Opcode = 0;449450if (CSKY::GPRRegClass.hasSubClassEq(RC)) {451Opcode = CSKY::LD32W;452} else if (CSKY::CARRYRegClass.hasSubClassEq(RC)) {453Opcode = CSKY::RESTORE_CARRY;454CFI->setSpillsCR();455} else if (v2sf && CSKY::sFPR32RegClass.hasSubClassEq(RC))456Opcode = CSKY::FLD_S;457else if (v2df && CSKY::sFPR64RegClass.hasSubClassEq(RC))458Opcode = CSKY::FLD_D;459else if (v3sf && CSKY::FPR32RegClass.hasSubClassEq(RC))460Opcode = CSKY::f2FLD_S;461else if (v3df && CSKY::FPR64RegClass.hasSubClassEq(RC))462Opcode = CSKY::f2FLD_D;463else {464llvm_unreachable("Unknown RegisterClass");465}466467MachineMemOperand *MMO = MF.getMachineMemOperand(468MachinePointerInfo::getFixedStack(MF, FI), MachineMemOperand::MOLoad,469MFI.getObjectSize(FI), MFI.getObjectAlign(FI));470471BuildMI(MBB, I, DL, get(Opcode), DestReg)472.addFrameIndex(FI)473.addImm(0)474.addMemOperand(MMO);475}476477void CSKYInstrInfo::copyPhysReg(MachineBasicBlock &MBB,478MachineBasicBlock::iterator I,479const DebugLoc &DL, MCRegister DestReg,480MCRegister SrcReg, bool KillSrc) const {481if (CSKY::GPRRegClass.contains(SrcReg) &&482CSKY::CARRYRegClass.contains(DestReg)) {483if (STI.hasE2()) {484BuildMI(MBB, I, DL, get(CSKY::BTSTI32), DestReg)485.addReg(SrcReg, getKillRegState(KillSrc))486.addImm(0);487} else {488assert(SrcReg < CSKY::R8);489BuildMI(MBB, I, DL, get(CSKY::BTSTI16), DestReg)490.addReg(SrcReg, getKillRegState(KillSrc))491.addImm(0);492}493return;494}495496if (CSKY::CARRYRegClass.contains(SrcReg) &&497CSKY::GPRRegClass.contains(DestReg)) {498499if (STI.hasE2()) {500BuildMI(MBB, I, DL, get(CSKY::MVC32), DestReg)501.addReg(SrcReg, getKillRegState(KillSrc));502} else {503assert(DestReg < CSKY::R16);504assert(DestReg < CSKY::R8);505BuildMI(MBB, I, DL, get(CSKY::MOVI16), DestReg).addImm(0);506BuildMI(MBB, I, DL, get(CSKY::ADDC16))507.addReg(DestReg, RegState::Define)508.addReg(SrcReg, RegState::Define)509.addReg(DestReg, getKillRegState(true))510.addReg(DestReg, getKillRegState(true))511.addReg(SrcReg, getKillRegState(true));512BuildMI(MBB, I, DL, get(CSKY::BTSTI16))513.addReg(SrcReg, RegState::Define | getDeadRegState(KillSrc))514.addReg(DestReg)515.addImm(0);516}517return;518}519520unsigned Opcode = 0;521if (CSKY::GPRRegClass.contains(DestReg, SrcReg))522Opcode = STI.hasE2() ? CSKY::MOV32 : CSKY::MOV16;523else if (v2sf && CSKY::sFPR32RegClass.contains(DestReg, SrcReg))524Opcode = CSKY::FMOV_S;525else if (v3sf && CSKY::FPR32RegClass.contains(DestReg, SrcReg))526Opcode = CSKY::f2FMOV_S;527else if (v2df && CSKY::sFPR64RegClass.contains(DestReg, SrcReg))528Opcode = CSKY::FMOV_D;529else if (v3df && CSKY::FPR64RegClass.contains(DestReg, SrcReg))530Opcode = CSKY::f2FMOV_D;531else if (v2sf && CSKY::sFPR32RegClass.contains(SrcReg) &&532CSKY::GPRRegClass.contains(DestReg))533Opcode = CSKY::FMFVRL;534else if (v3sf && CSKY::FPR32RegClass.contains(SrcReg) &&535CSKY::GPRRegClass.contains(DestReg))536Opcode = CSKY::f2FMFVRL;537else if (v2df && CSKY::sFPR64RegClass.contains(SrcReg) &&538CSKY::GPRRegClass.contains(DestReg))539Opcode = CSKY::FMFVRL_D;540else if (v3df && CSKY::FPR64RegClass.contains(SrcReg) &&541CSKY::GPRRegClass.contains(DestReg))542Opcode = CSKY::f2FMFVRL_D;543else if (v2sf && CSKY::GPRRegClass.contains(SrcReg) &&544CSKY::sFPR32RegClass.contains(DestReg))545Opcode = CSKY::FMTVRL;546else if (v3sf && CSKY::GPRRegClass.contains(SrcReg) &&547CSKY::FPR32RegClass.contains(DestReg))548Opcode = CSKY::f2FMTVRL;549else if (v2df && CSKY::GPRRegClass.contains(SrcReg) &&550CSKY::sFPR64RegClass.contains(DestReg))551Opcode = CSKY::FMTVRL_D;552else if (v3df && CSKY::GPRRegClass.contains(SrcReg) &&553CSKY::FPR64RegClass.contains(DestReg))554Opcode = CSKY::f2FMTVRL_D;555else {556LLVM_DEBUG(dbgs() << "src = " << SrcReg << ", dst = " << DestReg);557LLVM_DEBUG(I->dump());558llvm_unreachable("Unknown RegisterClass");559}560561BuildMI(MBB, I, DL, get(Opcode), DestReg)562.addReg(SrcReg, getKillRegState(KillSrc));563}564565Register CSKYInstrInfo::getGlobalBaseReg(MachineFunction &MF) const {566CSKYMachineFunctionInfo *CFI = MF.getInfo<CSKYMachineFunctionInfo>();567MachineConstantPool *MCP = MF.getConstantPool();568MachineRegisterInfo &MRI = MF.getRegInfo();569570Register GlobalBaseReg = CFI->getGlobalBaseReg();571if (GlobalBaseReg != 0)572return GlobalBaseReg;573574// Insert a pseudo instruction to set the GlobalBaseReg into the first575// MBB of the function576MachineBasicBlock &FirstMBB = MF.front();577MachineBasicBlock::iterator MBBI = FirstMBB.begin();578DebugLoc DL;579580CSKYConstantPoolValue *CPV = CSKYConstantPoolSymbol::Create(581Type::getInt32Ty(MF.getFunction().getContext()), "_GLOBAL_OFFSET_TABLE_",5820, CSKYCP::ADDR);583584unsigned CPI = MCP->getConstantPoolIndex(CPV, Align(4));585586MachineMemOperand *MO =587MF.getMachineMemOperand(MachinePointerInfo::getConstantPool(MF),588MachineMemOperand::MOLoad, 4, Align(4));589BuildMI(FirstMBB, MBBI, DL, get(CSKY::LRW32), CSKY::R28)590.addConstantPoolIndex(CPI)591.addMemOperand(MO);592593GlobalBaseReg = MRI.createVirtualRegister(&CSKY::GPRRegClass);594BuildMI(FirstMBB, MBBI, DL, get(TargetOpcode::COPY), GlobalBaseReg)595.addReg(CSKY::R28);596597CFI->setGlobalBaseReg(GlobalBaseReg);598return GlobalBaseReg;599}600601unsigned CSKYInstrInfo::getInstSizeInBytes(const MachineInstr &MI) const {602switch (MI.getOpcode()) {603default:604return MI.getDesc().getSize();605case CSKY::CONSTPOOL_ENTRY:606return MI.getOperand(2).getImm();607case CSKY::SPILL_CARRY:608case CSKY::RESTORE_CARRY:609case CSKY::PseudoTLSLA32:610return 8;611case TargetOpcode::INLINEASM_BR:612case TargetOpcode::INLINEASM: {613const MachineFunction *MF = MI.getParent()->getParent();614const char *AsmStr = MI.getOperand(0).getSymbolName();615return getInlineAsmLength(AsmStr, *MF->getTarget().getMCAsmInfo());616}617}618}619620621