SystemZAsmPrinter.cpp revision ffc7dca885151ed42642c2d6733e8db75d276621
11d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand//===-- SystemZAsmPrinter.cpp - SystemZ LLVM assembly printer -------------===//
21d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand//
31d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand//                     The LLVM Compiler Infrastructure
41d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand//
51d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand// This file is distributed under the University of Illinois Open Source
61d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand// License. See LICENSE.TXT for details.
71d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand//
81d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand//===----------------------------------------------------------------------===//
91d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand//
101d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand// Streams SystemZ assembly language and associated data, in the form of
111d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand// MCInsts and MCExprs respectively.
121d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand//
131d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand//===----------------------------------------------------------------------===//
141d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand
151d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand#include "SystemZAsmPrinter.h"
161d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand#include "InstPrinter/SystemZInstPrinter.h"
171d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand#include "SystemZConstantPoolValue.h"
181d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand#include "SystemZMCInstLower.h"
191d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand#include "llvm/CodeGen/MachineModuleInfoImpls.h"
201d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand#include "llvm/CodeGen/TargetLoweringObjectFileImpl.h"
211d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand#include "llvm/MC/MCExpr.h"
229f3f4bf377ac93fd32c8b93ae23378a82ad0f353Richard Sandiford#include "llvm/MC/MCInstBuilder.h"
231d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand#include "llvm/MC/MCStreamer.h"
241d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand#include "llvm/Support/TargetRegistry.h"
251d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand#include "llvm/Target/Mangler.h"
261d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand
271d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigandusing namespace llvm;
281d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand
29259a6006e89576704e52e7392ef2bfd83f277ce3Richard Sandiford// Return an RI instruction like MI with opcode Opcode, but with the
30259a6006e89576704e52e7392ef2bfd83f277ce3Richard Sandiford// GR64 register operands turned into GR32s.
31259a6006e89576704e52e7392ef2bfd83f277ce3Richard Sandifordstatic MCInst lowerRILow(const MachineInstr *MI, unsigned Opcode) {
32259a6006e89576704e52e7392ef2bfd83f277ce3Richard Sandiford  return MCInstBuilder(Opcode)
33259a6006e89576704e52e7392ef2bfd83f277ce3Richard Sandiford    .addReg(SystemZMC::getRegAsGR32(MI->getOperand(0).getReg()))
34259a6006e89576704e52e7392ef2bfd83f277ce3Richard Sandiford    .addReg(SystemZMC::getRegAsGR32(MI->getOperand(1).getReg()))
35259a6006e89576704e52e7392ef2bfd83f277ce3Richard Sandiford    .addImm(MI->getOperand(2).getImm());
36259a6006e89576704e52e7392ef2bfd83f277ce3Richard Sandiford}
37259a6006e89576704e52e7392ef2bfd83f277ce3Richard Sandiford
3855d7d83b6c9e55fa73d667660c8e90f92999385bRichard Sandiford// Return an RI instruction like MI with opcode Opcode, but with the
39645d250b84fe0d097e7813b980ae58daeca2c2e6Richard Sandiford// GR64 register operands turned into GRH32s.
40645d250b84fe0d097e7813b980ae58daeca2c2e6Richard Sandifordstatic MCInst lowerRIHigh(const MachineInstr *MI, unsigned Opcode) {
41645d250b84fe0d097e7813b980ae58daeca2c2e6Richard Sandiford  return MCInstBuilder(Opcode)
42645d250b84fe0d097e7813b980ae58daeca2c2e6Richard Sandiford    .addReg(SystemZMC::getRegAsGRH32(MI->getOperand(0).getReg()))
43645d250b84fe0d097e7813b980ae58daeca2c2e6Richard Sandiford    .addReg(SystemZMC::getRegAsGRH32(MI->getOperand(1).getReg()))
44645d250b84fe0d097e7813b980ae58daeca2c2e6Richard Sandiford    .addImm(MI->getOperand(2).getImm());
45645d250b84fe0d097e7813b980ae58daeca2c2e6Richard Sandiford}
46645d250b84fe0d097e7813b980ae58daeca2c2e6Richard Sandiford
47645d250b84fe0d097e7813b980ae58daeca2c2e6Richard Sandiford// Return an RI instruction like MI with opcode Opcode, but with the
4855d7d83b6c9e55fa73d667660c8e90f92999385bRichard Sandiford// R2 register turned into a GR64.
4955d7d83b6c9e55fa73d667660c8e90f92999385bRichard Sandifordstatic MCInst lowerRIEfLow(const MachineInstr *MI, unsigned Opcode) {
5055d7d83b6c9e55fa73d667660c8e90f92999385bRichard Sandiford  return MCInstBuilder(Opcode)
5155d7d83b6c9e55fa73d667660c8e90f92999385bRichard Sandiford    .addReg(MI->getOperand(0).getReg())
5255d7d83b6c9e55fa73d667660c8e90f92999385bRichard Sandiford    .addReg(MI->getOperand(1).getReg())
5355d7d83b6c9e55fa73d667660c8e90f92999385bRichard Sandiford    .addReg(SystemZMC::getRegAsGR64(MI->getOperand(2).getReg()))
5455d7d83b6c9e55fa73d667660c8e90f92999385bRichard Sandiford    .addImm(MI->getOperand(3).getImm())
5555d7d83b6c9e55fa73d667660c8e90f92999385bRichard Sandiford    .addImm(MI->getOperand(4).getImm())
5655d7d83b6c9e55fa73d667660c8e90f92999385bRichard Sandiford    .addImm(MI->getOperand(5).getImm());
5755d7d83b6c9e55fa73d667660c8e90f92999385bRichard Sandiford}
5855d7d83b6c9e55fa73d667660c8e90f92999385bRichard Sandiford
591d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigandvoid SystemZAsmPrinter::EmitInstruction(const MachineInstr *MI) {
608eff5d998e88ba8763d72f4e94d7a32f2dbb9005Rafael Espindola  SystemZMCInstLower Lower(MF->getContext(), *this);
611d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  MCInst LoweredMI;
629f3f4bf377ac93fd32c8b93ae23378a82ad0f353Richard Sandiford  switch (MI->getOpcode()) {
639f3f4bf377ac93fd32c8b93ae23378a82ad0f353Richard Sandiford  case SystemZ::Return:
649f3f4bf377ac93fd32c8b93ae23378a82ad0f353Richard Sandiford    LoweredMI = MCInstBuilder(SystemZ::BR).addReg(SystemZ::R14D);
659f3f4bf377ac93fd32c8b93ae23378a82ad0f353Richard Sandiford    break;
669f3f4bf377ac93fd32c8b93ae23378a82ad0f353Richard Sandiford
6776f8ae87b4705f5c08c3995948223531715a2d58Richard Sandiford  case SystemZ::CallBRASL:
6876f8ae87b4705f5c08c3995948223531715a2d58Richard Sandiford    LoweredMI = MCInstBuilder(SystemZ::BRASL)
6976f8ae87b4705f5c08c3995948223531715a2d58Richard Sandiford      .addReg(SystemZ::R14D)
7076f8ae87b4705f5c08c3995948223531715a2d58Richard Sandiford      .addExpr(Lower.getExpr(MI->getOperand(0), MCSymbolRefExpr::VK_PLT));
7176f8ae87b4705f5c08c3995948223531715a2d58Richard Sandiford    break;
7276f8ae87b4705f5c08c3995948223531715a2d58Richard Sandiford
7376f8ae87b4705f5c08c3995948223531715a2d58Richard Sandiford  case SystemZ::CallBASR:
7476f8ae87b4705f5c08c3995948223531715a2d58Richard Sandiford    LoweredMI = MCInstBuilder(SystemZ::BASR)
7576f8ae87b4705f5c08c3995948223531715a2d58Richard Sandiford      .addReg(SystemZ::R14D)
7676f8ae87b4705f5c08c3995948223531715a2d58Richard Sandiford      .addReg(MI->getOperand(0).getReg());
7776f8ae87b4705f5c08c3995948223531715a2d58Richard Sandiford    break;
7876f8ae87b4705f5c08c3995948223531715a2d58Richard Sandiford
7976f8ae87b4705f5c08c3995948223531715a2d58Richard Sandiford  case SystemZ::CallJG:
8076f8ae87b4705f5c08c3995948223531715a2d58Richard Sandiford    LoweredMI = MCInstBuilder(SystemZ::JG)
8176f8ae87b4705f5c08c3995948223531715a2d58Richard Sandiford      .addExpr(Lower.getExpr(MI->getOperand(0), MCSymbolRefExpr::VK_PLT));
8276f8ae87b4705f5c08c3995948223531715a2d58Richard Sandiford    break;
8376f8ae87b4705f5c08c3995948223531715a2d58Richard Sandiford
8476f8ae87b4705f5c08c3995948223531715a2d58Richard Sandiford  case SystemZ::CallBR:
8576f8ae87b4705f5c08c3995948223531715a2d58Richard Sandiford    LoweredMI = MCInstBuilder(SystemZ::BR).addReg(SystemZ::R1D);
8676f8ae87b4705f5c08c3995948223531715a2d58Richard Sandiford    break;
8776f8ae87b4705f5c08c3995948223531715a2d58Richard Sandiford
88259a6006e89576704e52e7392ef2bfd83f277ce3Richard Sandiford  case SystemZ::IILF64:
89259a6006e89576704e52e7392ef2bfd83f277ce3Richard Sandiford    LoweredMI = MCInstBuilder(SystemZ::IILF)
90259a6006e89576704e52e7392ef2bfd83f277ce3Richard Sandiford      .addReg(SystemZMC::getRegAsGR32(MI->getOperand(0).getReg()))
91259a6006e89576704e52e7392ef2bfd83f277ce3Richard Sandiford      .addImm(MI->getOperand(2).getImm());
92259a6006e89576704e52e7392ef2bfd83f277ce3Richard Sandiford    break;
93259a6006e89576704e52e7392ef2bfd83f277ce3Richard Sandiford
944c8feae136bbb54ba09d8f8dc7e61714270f7cd5Richard Sandiford  case SystemZ::IIHF64:
954c8feae136bbb54ba09d8f8dc7e61714270f7cd5Richard Sandiford    LoweredMI = MCInstBuilder(SystemZ::IIHF)
964c8feae136bbb54ba09d8f8dc7e61714270f7cd5Richard Sandiford      .addReg(SystemZMC::getRegAsGRH32(MI->getOperand(0).getReg()))
974c8feae136bbb54ba09d8f8dc7e61714270f7cd5Richard Sandiford      .addImm(MI->getOperand(2).getImm());
984c8feae136bbb54ba09d8f8dc7e61714270f7cd5Richard Sandiford    break;
994c8feae136bbb54ba09d8f8dc7e61714270f7cd5Richard Sandiford
10055d7d83b6c9e55fa73d667660c8e90f92999385bRichard Sandiford  case SystemZ::RISBHH:
10155d7d83b6c9e55fa73d667660c8e90f92999385bRichard Sandiford  case SystemZ::RISBHL:
10255d7d83b6c9e55fa73d667660c8e90f92999385bRichard Sandiford    LoweredMI = lowerRIEfLow(MI, SystemZ::RISBHG);
10355d7d83b6c9e55fa73d667660c8e90f92999385bRichard Sandiford    break;
10455d7d83b6c9e55fa73d667660c8e90f92999385bRichard Sandiford
10555d7d83b6c9e55fa73d667660c8e90f92999385bRichard Sandiford  case SystemZ::RISBLH:
10655d7d83b6c9e55fa73d667660c8e90f92999385bRichard Sandiford  case SystemZ::RISBLL:
10755d7d83b6c9e55fa73d667660c8e90f92999385bRichard Sandiford    LoweredMI = lowerRIEfLow(MI, SystemZ::RISBLG);
10855d7d83b6c9e55fa73d667660c8e90f92999385bRichard Sandiford    break;
10955d7d83b6c9e55fa73d667660c8e90f92999385bRichard Sandiford
110259a6006e89576704e52e7392ef2bfd83f277ce3Richard Sandiford#define LOWER_LOW(NAME)                                                 \
111259a6006e89576704e52e7392ef2bfd83f277ce3Richard Sandiford  case SystemZ::NAME##64: LoweredMI = lowerRILow(MI, SystemZ::NAME); break
112259a6006e89576704e52e7392ef2bfd83f277ce3Richard Sandiford
113259a6006e89576704e52e7392ef2bfd83f277ce3Richard Sandiford  LOWER_LOW(IILL);
114259a6006e89576704e52e7392ef2bfd83f277ce3Richard Sandiford  LOWER_LOW(IILH);
115259a6006e89576704e52e7392ef2bfd83f277ce3Richard Sandiford  LOWER_LOW(NILL);
116259a6006e89576704e52e7392ef2bfd83f277ce3Richard Sandiford  LOWER_LOW(NILH);
117259a6006e89576704e52e7392ef2bfd83f277ce3Richard Sandiford  LOWER_LOW(NILF);
118259a6006e89576704e52e7392ef2bfd83f277ce3Richard Sandiford  LOWER_LOW(OILL);
119259a6006e89576704e52e7392ef2bfd83f277ce3Richard Sandiford  LOWER_LOW(OILH);
120259a6006e89576704e52e7392ef2bfd83f277ce3Richard Sandiford  LOWER_LOW(OILF);
121259a6006e89576704e52e7392ef2bfd83f277ce3Richard Sandiford  LOWER_LOW(XILF);
122259a6006e89576704e52e7392ef2bfd83f277ce3Richard Sandiford
123259a6006e89576704e52e7392ef2bfd83f277ce3Richard Sandiford#undef LOWER_LOW
124259a6006e89576704e52e7392ef2bfd83f277ce3Richard Sandiford
125645d250b84fe0d097e7813b980ae58daeca2c2e6Richard Sandiford#define LOWER_HIGH(NAME) \
126645d250b84fe0d097e7813b980ae58daeca2c2e6Richard Sandiford  case SystemZ::NAME##64: LoweredMI = lowerRIHigh(MI, SystemZ::NAME); break
127645d250b84fe0d097e7813b980ae58daeca2c2e6Richard Sandiford
128645d250b84fe0d097e7813b980ae58daeca2c2e6Richard Sandiford  LOWER_HIGH(IIHL);
129645d250b84fe0d097e7813b980ae58daeca2c2e6Richard Sandiford  LOWER_HIGH(IIHH);
130b9dcca8265e9da01119c47e65f114c3adc972ba6Richard Sandiford  LOWER_HIGH(NIHL);
131b9dcca8265e9da01119c47e65f114c3adc972ba6Richard Sandiford  LOWER_HIGH(NIHH);
132b9dcca8265e9da01119c47e65f114c3adc972ba6Richard Sandiford  LOWER_HIGH(NIHF);
1331c831f7f1f7e869516f5a70c1e6dd8896bef76f5Richard Sandiford  LOWER_HIGH(OIHL);
1341c831f7f1f7e869516f5a70c1e6dd8896bef76f5Richard Sandiford  LOWER_HIGH(OIHH);
1351c831f7f1f7e869516f5a70c1e6dd8896bef76f5Richard Sandiford  LOWER_HIGH(OIHF);
1361ff62e182e648c72e6fce4f9d7911f2edfd914d2Richard Sandiford  LOWER_HIGH(XIHF);
137645d250b84fe0d097e7813b980ae58daeca2c2e6Richard Sandiford
138645d250b84fe0d097e7813b980ae58daeca2c2e6Richard Sandiford#undef LOWER_HIGH
139645d250b84fe0d097e7813b980ae58daeca2c2e6Richard Sandiford
1409f3f4bf377ac93fd32c8b93ae23378a82ad0f353Richard Sandiford  default:
14176f8ae87b4705f5c08c3995948223531715a2d58Richard Sandiford    Lower.lower(MI, LoweredMI);
1429f3f4bf377ac93fd32c8b93ae23378a82ad0f353Richard Sandiford    break;
1439f3f4bf377ac93fd32c8b93ae23378a82ad0f353Richard Sandiford  }
1441d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  OutStreamer.EmitInstruction(LoweredMI);
1451d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand}
1461d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand
1471d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand// Convert a SystemZ-specific constant pool modifier into the associated
1481d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand// MCSymbolRefExpr variant kind.
1491d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigandstatic MCSymbolRefExpr::VariantKind
1501d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich WeigandgetModifierVariantKind(SystemZCP::SystemZCPModifier Modifier) {
1511d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  switch (Modifier) {
1521d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  case SystemZCP::NTPOFF: return MCSymbolRefExpr::VK_NTPOFF;
1531d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  }
1541d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  llvm_unreachable("Invalid SystemCPModifier!");
1551d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand}
1561d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand
1571d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigandvoid SystemZAsmPrinter::
1581d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich WeigandEmitMachineConstantPoolValue(MachineConstantPoolValue *MCPV) {
1591d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  SystemZConstantPoolValue *ZCPV =
1601d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand    static_cast<SystemZConstantPoolValue*>(MCPV);
1611d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand
1621d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  const MCExpr *Expr =
163ffc7dca885151ed42642c2d6733e8db75d276621Rafael Espindola    MCSymbolRefExpr::Create(getSymbol(ZCPV->getGlobalValue()),
1641d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand                            getModifierVariantKind(ZCPV->getModifier()),
1651d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand                            OutContext);
1661d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  uint64_t Size = TM.getDataLayout()->getTypeAllocSize(ZCPV->getType());
1671d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand
1681d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  OutStreamer.EmitValue(Expr, Size);
1691d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand}
1701d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand
1711d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigandbool SystemZAsmPrinter::PrintAsmOperand(const MachineInstr *MI,
1721d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand                                        unsigned OpNo,
1731d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand                                        unsigned AsmVariant,
1741d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand                                        const char *ExtraCode,
1751d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand                                        raw_ostream &OS) {
1761d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  if (ExtraCode && *ExtraCode == 'n') {
1771d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand    if (!MI->getOperand(OpNo).isImm())
1781d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand      return true;
1791d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand    OS << -int64_t(MI->getOperand(OpNo).getImm());
1801d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  } else {
1818eff5d998e88ba8763d72f4e94d7a32f2dbb9005Rafael Espindola    SystemZMCInstLower Lower(MF->getContext(), *this);
1821d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand    MCOperand MO(Lower.lowerOperand(MI->getOperand(OpNo)));
1831d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand    SystemZInstPrinter::printOperand(MO, OS);
1841d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  }
1851d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  return false;
1861d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand}
1871d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand
1881d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigandbool SystemZAsmPrinter::PrintAsmMemoryOperand(const MachineInstr *MI,
1891d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand                                              unsigned OpNo,
1901d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand                                              unsigned AsmVariant,
1911d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand                                              const char *ExtraCode,
1921d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand                                              raw_ostream &OS) {
1931d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  SystemZInstPrinter::printAddress(MI->getOperand(OpNo).getReg(),
1941d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand                                   MI->getOperand(OpNo + 1).getImm(),
1951d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand                                   MI->getOperand(OpNo + 2).getReg(), OS);
1961d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  return false;
1971d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand}
1981d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand
1991d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigandvoid SystemZAsmPrinter::EmitEndOfAsmFile(Module &M) {
2001d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  if (Subtarget->isTargetELF()) {
2011d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand    const TargetLoweringObjectFileELF &TLOFELF =
2021d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand      static_cast<const TargetLoweringObjectFileELF &>(getObjFileLowering());
2031d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand
2041d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand    MachineModuleInfoELF &MMIELF = MMI->getObjFileInfo<MachineModuleInfoELF>();
2051d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand
2061d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand    // Output stubs for external and common global variables.
2071d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand    MachineModuleInfoELF::SymbolListTy Stubs = MMIELF.GetGVStubList();
2081d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand    if (!Stubs.empty()) {
2091d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand      OutStreamer.SwitchSection(TLOFELF.getDataRelSection());
2101d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand      const DataLayout *TD = TM.getDataLayout();
2111d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand
2121d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand      for (unsigned i = 0, e = Stubs.size(); i != e; ++i) {
2131d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand        OutStreamer.EmitLabel(Stubs[i].first);
2141d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand        OutStreamer.EmitSymbolValue(Stubs[i].second.getPointer(),
215a3863ea2dacafc925a8272ebf9884fc64bef686cRafael Espindola                                    TD->getPointerSize(0));
2161d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand      }
2171d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand      Stubs.clear();
2181d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand    }
2191d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  }
2201d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand}
2211d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand
2221d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand// Force static initialization.
2231d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigandextern "C" void LLVMInitializeSystemZAsmPrinter() {
2241d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  RegisterAsmPrinter<SystemZAsmPrinter> X(TheSystemZTarget);
2251d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand}
226