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