1dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines//==-- AArch64MCInstLower.cpp - Convert AArch64 MachineInstr to an MCInst --==// 272062f5744557e270a38192554c3126ea5f97434Tim Northover// 372062f5744557e270a38192554c3126ea5f97434Tim Northover// The LLVM Compiler Infrastructure 472062f5744557e270a38192554c3126ea5f97434Tim Northover// 572062f5744557e270a38192554c3126ea5f97434Tim Northover// This file is distributed under the University of Illinois Open Source 672062f5744557e270a38192554c3126ea5f97434Tim Northover// License. See LICENSE.TXT for details. 772062f5744557e270a38192554c3126ea5f97434Tim Northover// 872062f5744557e270a38192554c3126ea5f97434Tim Northover//===----------------------------------------------------------------------===// 972062f5744557e270a38192554c3126ea5f97434Tim Northover// 1072062f5744557e270a38192554c3126ea5f97434Tim Northover// This file contains code to lower AArch64 MachineInstrs to their corresponding 1172062f5744557e270a38192554c3126ea5f97434Tim Northover// MCInst records. 1272062f5744557e270a38192554c3126ea5f97434Tim Northover// 1372062f5744557e270a38192554c3126ea5f97434Tim Northover//===----------------------------------------------------------------------===// 1472062f5744557e270a38192554c3126ea5f97434Tim Northover 15dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#include "AArch64MCInstLower.h" 1672062f5744557e270a38192554c3126ea5f97434Tim Northover#include "MCTargetDesc/AArch64MCExpr.h" 1719254c49a8752fe8c6fa648a6eb29f20a1f62c8bTim Northover#include "Utils/AArch64BaseInfo.h" 1872062f5744557e270a38192554c3126ea5f97434Tim Northover#include "llvm/CodeGen/AsmPrinter.h" 19dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#include "llvm/CodeGen/MachineBasicBlock.h" 20dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#include "llvm/CodeGen/MachineInstr.h" 2136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/IR/Mangler.h" 2272062f5744557e270a38192554c3126ea5f97434Tim Northover#include "llvm/MC/MCExpr.h" 2372062f5744557e270a38192554c3126ea5f97434Tim Northover#include "llvm/MC/MCInst.h" 24dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#include "llvm/Support/CodeGen.h" 254c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar#include "llvm/Support/CommandLine.h" 26dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#include "llvm/Target/TargetMachine.h" 2772062f5744557e270a38192554c3126ea5f97434Tim Northoverusing namespace llvm; 2872062f5744557e270a38192554c3126ea5f97434Tim Northover 294c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainarextern cl::opt<bool> EnableAArch64ELFLocalDynamicTLSGeneration; 304c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar 3137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen HinesAArch64MCInstLower::AArch64MCInstLower(MCContext &ctx, AsmPrinter &printer) 32dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines : Ctx(ctx), Printer(printer), TargetTriple(printer.getTargetTriple()) {} 3372062f5744557e270a38192554c3126ea5f97434Tim Northover 34dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen HinesMCSymbol * 35dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen HinesAArch64MCInstLower::GetGlobalAddressSymbol(const MachineOperand &MO) const { 36dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return Printer.getSymbol(MO.getGlobal()); 37dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines} 3872062f5744557e270a38192554c3126ea5f97434Tim Northover 39dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen HinesMCSymbol * 40dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen HinesAArch64MCInstLower::GetExternalSymbolSymbol(const MachineOperand &MO) const { 41dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return Printer.GetExternalSymbolSymbol(MO.getSymbolName()); 42dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines} 43dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 44dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen HinesMCOperand AArch64MCInstLower::lowerSymbolOperandDarwin(const MachineOperand &MO, 45dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines MCSymbol *Sym) const { 46dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines // FIXME: We would like an efficient form for this, so we don't have to do a 47dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines // lot of extra uniquing. 48dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines MCSymbolRefExpr::VariantKind RefKind = MCSymbolRefExpr::VK_None; 49dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines if ((MO.getTargetFlags() & AArch64II::MO_GOT) != 0) { 50dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines if ((MO.getTargetFlags() & AArch64II::MO_FRAGMENT) == AArch64II::MO_PAGE) 51dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines RefKind = MCSymbolRefExpr::VK_GOTPAGE; 52dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines else if ((MO.getTargetFlags() & AArch64II::MO_FRAGMENT) == 53dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines AArch64II::MO_PAGEOFF) 54dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines RefKind = MCSymbolRefExpr::VK_GOTPAGEOFF; 55dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines else 56c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines llvm_unreachable("Unexpected target flags with MO_GOT on GV operand"); 57dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines } else if ((MO.getTargetFlags() & AArch64II::MO_TLS) != 0) { 58dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines if ((MO.getTargetFlags() & AArch64II::MO_FRAGMENT) == AArch64II::MO_PAGE) 59dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines RefKind = MCSymbolRefExpr::VK_TLVPPAGE; 60dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines else if ((MO.getTargetFlags() & AArch64II::MO_FRAGMENT) == 61dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines AArch64II::MO_PAGEOFF) 62dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines RefKind = MCSymbolRefExpr::VK_TLVPPAGEOFF; 63dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines else 64dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines llvm_unreachable("Unexpected target flags with MO_TLS on GV operand"); 65dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines } else { 66dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines if ((MO.getTargetFlags() & AArch64II::MO_FRAGMENT) == AArch64II::MO_PAGE) 67dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines RefKind = MCSymbolRefExpr::VK_PAGE; 68dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines else if ((MO.getTargetFlags() & AArch64II::MO_FRAGMENT) == 69dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines AArch64II::MO_PAGEOFF) 70dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines RefKind = MCSymbolRefExpr::VK_PAGEOFF; 7172062f5744557e270a38192554c3126ea5f97434Tim Northover } 726948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar const MCExpr *Expr = MCSymbolRefExpr::create(Sym, RefKind, Ctx); 73dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines if (!MO.isJTI() && MO.getOffset()) 746948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Expr = MCBinaryExpr::createAdd( 756948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Expr, MCConstantExpr::create(MO.getOffset(), Ctx), Ctx); 766948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return MCOperand::createExpr(Expr); 77dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines} 78dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 79dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen HinesMCOperand AArch64MCInstLower::lowerSymbolOperandELF(const MachineOperand &MO, 80dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines MCSymbol *Sym) const { 81dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines uint32_t RefFlags = 0; 8272062f5744557e270a38192554c3126ea5f97434Tim Northover 83dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines if (MO.getTargetFlags() & AArch64II::MO_GOT) 84dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines RefFlags |= AArch64MCExpr::VK_GOT; 85dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines else if (MO.getTargetFlags() & AArch64II::MO_TLS) { 86dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines TLSModel::Model Model; 87dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines if (MO.isGlobal()) { 88dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines const GlobalValue *GV = MO.getGlobal(); 89dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Model = Printer.TM.getTLSModel(GV); 904c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar if (!EnableAArch64ELFLocalDynamicTLSGeneration && 914c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar Model == TLSModel::LocalDynamic) 924c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar Model = TLSModel::GeneralDynamic; 934c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar 94dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines } else { 95dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines assert(MO.isSymbol() && 96dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines StringRef(MO.getSymbolName()) == "_TLS_MODULE_BASE_" && 97dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines "unexpected external TLS symbol"); 984c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar // The general dynamic access sequence is used to get the 994c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar // address of _TLS_MODULE_BASE_. 100dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Model = TLSModel::GeneralDynamic; 101dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines } 102dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines switch (Model) { 103dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines case TLSModel::InitialExec: 104dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines RefFlags |= AArch64MCExpr::VK_GOTTPREL; 105dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines break; 106dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines case TLSModel::LocalExec: 107dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines RefFlags |= AArch64MCExpr::VK_TPREL; 108dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines break; 109dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines case TLSModel::LocalDynamic: 110dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines RefFlags |= AArch64MCExpr::VK_DTPREL; 111dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines break; 112dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines case TLSModel::GeneralDynamic: 113dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines RefFlags |= AArch64MCExpr::VK_TLSDESC; 114dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines break; 115dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines } 116dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines } else { 117dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines // No modifier means this is a generic reference, classified as absolute for 118dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines // the cases where it matters (:abs_g0: etc). 119dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines RefFlags |= AArch64MCExpr::VK_ABS; 120dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines } 121dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 122dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines if ((MO.getTargetFlags() & AArch64II::MO_FRAGMENT) == AArch64II::MO_PAGE) 123dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines RefFlags |= AArch64MCExpr::VK_PAGE; 124dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines else if ((MO.getTargetFlags() & AArch64II::MO_FRAGMENT) == 125dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines AArch64II::MO_PAGEOFF) 126dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines RefFlags |= AArch64MCExpr::VK_PAGEOFF; 127dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines else if ((MO.getTargetFlags() & AArch64II::MO_FRAGMENT) == AArch64II::MO_G3) 128dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines RefFlags |= AArch64MCExpr::VK_G3; 129dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines else if ((MO.getTargetFlags() & AArch64II::MO_FRAGMENT) == AArch64II::MO_G2) 130dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines RefFlags |= AArch64MCExpr::VK_G2; 131dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines else if ((MO.getTargetFlags() & AArch64II::MO_FRAGMENT) == AArch64II::MO_G1) 132dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines RefFlags |= AArch64MCExpr::VK_G1; 133dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines else if ((MO.getTargetFlags() & AArch64II::MO_FRAGMENT) == AArch64II::MO_G0) 134dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines RefFlags |= AArch64MCExpr::VK_G0; 1354c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar else if ((MO.getTargetFlags() & AArch64II::MO_FRAGMENT) == AArch64II::MO_HI12) 1364c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar RefFlags |= AArch64MCExpr::VK_HI12; 137dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 138dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines if (MO.getTargetFlags() & AArch64II::MO_NC) 139dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines RefFlags |= AArch64MCExpr::VK_NC; 140dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 141dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines const MCExpr *Expr = 1426948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar MCSymbolRefExpr::create(Sym, MCSymbolRefExpr::VK_None, Ctx); 14372062f5744557e270a38192554c3126ea5f97434Tim Northover if (!MO.isJTI() && MO.getOffset()) 1446948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Expr = MCBinaryExpr::createAdd( 1456948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Expr, MCConstantExpr::create(MO.getOffset(), Ctx), Ctx); 146dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 147dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines AArch64MCExpr::VariantKind RefKind; 148dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines RefKind = static_cast<AArch64MCExpr::VariantKind>(RefFlags); 1496948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Expr = AArch64MCExpr::create(Expr, RefKind, Ctx); 15072062f5744557e270a38192554c3126ea5f97434Tim Northover 1516948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return MCOperand::createExpr(Expr); 15272062f5744557e270a38192554c3126ea5f97434Tim Northover} 15372062f5744557e270a38192554c3126ea5f97434Tim Northover 154dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen HinesMCOperand AArch64MCInstLower::LowerSymbolOperand(const MachineOperand &MO, 155dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines MCSymbol *Sym) const { 156dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines if (TargetTriple.isOSDarwin()) 157dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return lowerSymbolOperandDarwin(MO, Sym); 158dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 159dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines assert(TargetTriple.isOSBinFormatELF() && "Expect Darwin or ELF target"); 160dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return lowerSymbolOperandELF(MO, Sym); 161dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines} 162dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 163dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesbool AArch64MCInstLower::lowerOperand(const MachineOperand &MO, 164dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines MCOperand &MCOp) const { 16572062f5744557e270a38192554c3126ea5f97434Tim Northover switch (MO.getType()) { 166dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines default: 167c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines llvm_unreachable("unknown operand type"); 16872062f5744557e270a38192554c3126ea5f97434Tim Northover case MachineOperand::MO_Register: 169dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines // Ignore all implicit register operands. 17072062f5744557e270a38192554c3126ea5f97434Tim Northover if (MO.isImplicit()) 17172062f5744557e270a38192554c3126ea5f97434Tim Northover return false; 1726948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar MCOp = MCOperand::createReg(MO.getReg()); 17372062f5744557e270a38192554c3126ea5f97434Tim Northover break; 174dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines case MachineOperand::MO_RegisterMask: 175dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines // Regmasks are like implicit defs. 176dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return false; 17772062f5744557e270a38192554c3126ea5f97434Tim Northover case MachineOperand::MO_Immediate: 1786948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar MCOp = MCOperand::createImm(MO.getImm()); 17972062f5744557e270a38192554c3126ea5f97434Tim Northover break; 180dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines case MachineOperand::MO_MachineBasicBlock: 1816948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar MCOp = MCOperand::createExpr( 1826948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar MCSymbolRefExpr::create(MO.getMBB()->getSymbol(), Ctx)); 18372062f5744557e270a38192554c3126ea5f97434Tim Northover break; 18472062f5744557e270a38192554c3126ea5f97434Tim Northover case MachineOperand::MO_GlobalAddress: 185dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines MCOp = LowerSymbolOperand(MO, GetGlobalAddressSymbol(MO)); 18672062f5744557e270a38192554c3126ea5f97434Tim Northover break; 187dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines case MachineOperand::MO_ExternalSymbol: 188dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines MCOp = LowerSymbolOperand(MO, GetExternalSymbolSymbol(MO)); 18972062f5744557e270a38192554c3126ea5f97434Tim Northover break; 190f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar case MachineOperand::MO_MCSymbol: 191f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar MCOp = LowerSymbolOperand(MO, MO.getMCSymbol()); 192f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar break; 19372062f5744557e270a38192554c3126ea5f97434Tim Northover case MachineOperand::MO_JumpTableIndex: 194dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines MCOp = LowerSymbolOperand(MO, Printer.GetJTISymbol(MO.getIndex())); 19572062f5744557e270a38192554c3126ea5f97434Tim Northover break; 19672062f5744557e270a38192554c3126ea5f97434Tim Northover case MachineOperand::MO_ConstantPoolIndex: 197dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines MCOp = LowerSymbolOperand(MO, Printer.GetCPISymbol(MO.getIndex())); 198dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines break; 199dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines case MachineOperand::MO_BlockAddress: 200dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines MCOp = LowerSymbolOperand( 201dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines MO, Printer.GetBlockAddressSymbol(MO.getBlockAddress())); 20272062f5744557e270a38192554c3126ea5f97434Tim Northover break; 20372062f5744557e270a38192554c3126ea5f97434Tim Northover } 20472062f5744557e270a38192554c3126ea5f97434Tim Northover return true; 20572062f5744557e270a38192554c3126ea5f97434Tim Northover} 20672062f5744557e270a38192554c3126ea5f97434Tim Northover 207dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesvoid AArch64MCInstLower::Lower(const MachineInstr *MI, MCInst &OutMI) const { 20872062f5744557e270a38192554c3126ea5f97434Tim Northover OutMI.setOpcode(MI->getOpcode()); 20972062f5744557e270a38192554c3126ea5f97434Tim Northover 210f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar for (const MachineOperand &MO : MI->operands()) { 21172062f5744557e270a38192554c3126ea5f97434Tim Northover MCOperand MCOp; 212f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar if (lowerOperand(MO, MCOp)) 21372062f5744557e270a38192554c3126ea5f97434Tim Northover OutMI.addOperand(MCOp); 21472062f5744557e270a38192554c3126ea5f97434Tim Northover } 21572062f5744557e270a38192554c3126ea5f97434Tim Northover} 216