SystemZAsmPrinter.cpp revision ebe69fe11e48d322045d5949c83283927a0d790b
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"
2136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/IR/Mangler.h"
221d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand#include "llvm/MC/MCExpr.h"
239f3f4bf377ac93fd32c8b93ae23378a82ad0f353Richard Sandiford#include "llvm/MC/MCInstBuilder.h"
241d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand#include "llvm/MC/MCStreamer.h"
251d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand#include "llvm/Support/TargetRegistry.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) {
32fff1ff91915a613c0c23a5bbf7acb4694654d694Richard Sandiford  if (MI->isCompare())
33fff1ff91915a613c0c23a5bbf7acb4694654d694Richard Sandiford    return MCInstBuilder(Opcode)
34fff1ff91915a613c0c23a5bbf7acb4694654d694Richard Sandiford      .addReg(SystemZMC::getRegAsGR32(MI->getOperand(0).getReg()))
35fff1ff91915a613c0c23a5bbf7acb4694654d694Richard Sandiford      .addImm(MI->getOperand(1).getImm());
36fff1ff91915a613c0c23a5bbf7acb4694654d694Richard Sandiford  else
37fff1ff91915a613c0c23a5bbf7acb4694654d694Richard Sandiford    return MCInstBuilder(Opcode)
38fff1ff91915a613c0c23a5bbf7acb4694654d694Richard Sandiford      .addReg(SystemZMC::getRegAsGR32(MI->getOperand(0).getReg()))
39fff1ff91915a613c0c23a5bbf7acb4694654d694Richard Sandiford      .addReg(SystemZMC::getRegAsGR32(MI->getOperand(1).getReg()))
40fff1ff91915a613c0c23a5bbf7acb4694654d694Richard Sandiford      .addImm(MI->getOperand(2).getImm());
41259a6006e89576704e52e7392ef2bfd83f277ce3Richard Sandiford}
42259a6006e89576704e52e7392ef2bfd83f277ce3Richard Sandiford
4355d7d83b6c9e55fa73d667660c8e90f92999385bRichard Sandiford// Return an RI instruction like MI with opcode Opcode, but with the
44645d250b84fe0d097e7813b980ae58daeca2c2e6Richard Sandiford// GR64 register operands turned into GRH32s.
45645d250b84fe0d097e7813b980ae58daeca2c2e6Richard Sandifordstatic MCInst lowerRIHigh(const MachineInstr *MI, unsigned Opcode) {
46fff1ff91915a613c0c23a5bbf7acb4694654d694Richard Sandiford  if (MI->isCompare())
47fff1ff91915a613c0c23a5bbf7acb4694654d694Richard Sandiford    return MCInstBuilder(Opcode)
48fff1ff91915a613c0c23a5bbf7acb4694654d694Richard Sandiford      .addReg(SystemZMC::getRegAsGRH32(MI->getOperand(0).getReg()))
49fff1ff91915a613c0c23a5bbf7acb4694654d694Richard Sandiford      .addImm(MI->getOperand(1).getImm());
50fff1ff91915a613c0c23a5bbf7acb4694654d694Richard Sandiford  else
51fff1ff91915a613c0c23a5bbf7acb4694654d694Richard Sandiford    return MCInstBuilder(Opcode)
52fff1ff91915a613c0c23a5bbf7acb4694654d694Richard Sandiford      .addReg(SystemZMC::getRegAsGRH32(MI->getOperand(0).getReg()))
53fff1ff91915a613c0c23a5bbf7acb4694654d694Richard Sandiford      .addReg(SystemZMC::getRegAsGRH32(MI->getOperand(1).getReg()))
54fff1ff91915a613c0c23a5bbf7acb4694654d694Richard Sandiford      .addImm(MI->getOperand(2).getImm());
55645d250b84fe0d097e7813b980ae58daeca2c2e6Richard Sandiford}
56645d250b84fe0d097e7813b980ae58daeca2c2e6Richard Sandiford
57645d250b84fe0d097e7813b980ae58daeca2c2e6Richard Sandiford// Return an RI instruction like MI with opcode Opcode, but with the
5855d7d83b6c9e55fa73d667660c8e90f92999385bRichard Sandiford// R2 register turned into a GR64.
5955d7d83b6c9e55fa73d667660c8e90f92999385bRichard Sandifordstatic MCInst lowerRIEfLow(const MachineInstr *MI, unsigned Opcode) {
6055d7d83b6c9e55fa73d667660c8e90f92999385bRichard Sandiford  return MCInstBuilder(Opcode)
6155d7d83b6c9e55fa73d667660c8e90f92999385bRichard Sandiford    .addReg(MI->getOperand(0).getReg())
6255d7d83b6c9e55fa73d667660c8e90f92999385bRichard Sandiford    .addReg(MI->getOperand(1).getReg())
6355d7d83b6c9e55fa73d667660c8e90f92999385bRichard Sandiford    .addReg(SystemZMC::getRegAsGR64(MI->getOperand(2).getReg()))
6455d7d83b6c9e55fa73d667660c8e90f92999385bRichard Sandiford    .addImm(MI->getOperand(3).getImm())
6555d7d83b6c9e55fa73d667660c8e90f92999385bRichard Sandiford    .addImm(MI->getOperand(4).getImm())
6655d7d83b6c9e55fa73d667660c8e90f92999385bRichard Sandiford    .addImm(MI->getOperand(5).getImm());
6755d7d83b6c9e55fa73d667660c8e90f92999385bRichard Sandiford}
6855d7d83b6c9e55fa73d667660c8e90f92999385bRichard Sandiford
69ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinesstatic const MCSymbolRefExpr *getTLSGetOffset(MCContext &Context) {
70ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  StringRef Name = "__tls_get_offset";
71ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  return MCSymbolRefExpr::Create(Context.GetOrCreateSymbol(Name),
72ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines                                 MCSymbolRefExpr::VK_PLT,
73ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines                                 Context);
74ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines}
75ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
76ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinesstatic const MCSymbolRefExpr *getGlobalOffsetTable(MCContext &Context) {
77ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  StringRef Name = "_GLOBAL_OFFSET_TABLE_";
78ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  return MCSymbolRefExpr::Create(Context.GetOrCreateSymbol(Name),
79ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines                                 MCSymbolRefExpr::VK_None,
80ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines                                 Context);
81ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines}
82ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
831d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigandvoid SystemZAsmPrinter::EmitInstruction(const MachineInstr *MI) {
848eff5d998e88ba8763d72f4e94d7a32f2dbb9005Rafael Espindola  SystemZMCInstLower Lower(MF->getContext(), *this);
851d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  MCInst LoweredMI;
869f3f4bf377ac93fd32c8b93ae23378a82ad0f353Richard Sandiford  switch (MI->getOpcode()) {
879f3f4bf377ac93fd32c8b93ae23378a82ad0f353Richard Sandiford  case SystemZ::Return:
889f3f4bf377ac93fd32c8b93ae23378a82ad0f353Richard Sandiford    LoweredMI = MCInstBuilder(SystemZ::BR).addReg(SystemZ::R14D);
899f3f4bf377ac93fd32c8b93ae23378a82ad0f353Richard Sandiford    break;
909f3f4bf377ac93fd32c8b93ae23378a82ad0f353Richard Sandiford
9176f8ae87b4705f5c08c3995948223531715a2d58Richard Sandiford  case SystemZ::CallBRASL:
9276f8ae87b4705f5c08c3995948223531715a2d58Richard Sandiford    LoweredMI = MCInstBuilder(SystemZ::BRASL)
9376f8ae87b4705f5c08c3995948223531715a2d58Richard Sandiford      .addReg(SystemZ::R14D)
9476f8ae87b4705f5c08c3995948223531715a2d58Richard Sandiford      .addExpr(Lower.getExpr(MI->getOperand(0), MCSymbolRefExpr::VK_PLT));
9576f8ae87b4705f5c08c3995948223531715a2d58Richard Sandiford    break;
9676f8ae87b4705f5c08c3995948223531715a2d58Richard Sandiford
9776f8ae87b4705f5c08c3995948223531715a2d58Richard Sandiford  case SystemZ::CallBASR:
9876f8ae87b4705f5c08c3995948223531715a2d58Richard Sandiford    LoweredMI = MCInstBuilder(SystemZ::BASR)
9976f8ae87b4705f5c08c3995948223531715a2d58Richard Sandiford      .addReg(SystemZ::R14D)
10076f8ae87b4705f5c08c3995948223531715a2d58Richard Sandiford      .addReg(MI->getOperand(0).getReg());
10176f8ae87b4705f5c08c3995948223531715a2d58Richard Sandiford    break;
10276f8ae87b4705f5c08c3995948223531715a2d58Richard Sandiford
10376f8ae87b4705f5c08c3995948223531715a2d58Richard Sandiford  case SystemZ::CallJG:
10476f8ae87b4705f5c08c3995948223531715a2d58Richard Sandiford    LoweredMI = MCInstBuilder(SystemZ::JG)
10576f8ae87b4705f5c08c3995948223531715a2d58Richard Sandiford      .addExpr(Lower.getExpr(MI->getOperand(0), MCSymbolRefExpr::VK_PLT));
10676f8ae87b4705f5c08c3995948223531715a2d58Richard Sandiford    break;
10776f8ae87b4705f5c08c3995948223531715a2d58Richard Sandiford
10876f8ae87b4705f5c08c3995948223531715a2d58Richard Sandiford  case SystemZ::CallBR:
10976f8ae87b4705f5c08c3995948223531715a2d58Richard Sandiford    LoweredMI = MCInstBuilder(SystemZ::BR).addReg(SystemZ::R1D);
11076f8ae87b4705f5c08c3995948223531715a2d58Richard Sandiford    break;
11176f8ae87b4705f5c08c3995948223531715a2d58Richard Sandiford
112ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case SystemZ::TLS_GDCALL:
113ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    LoweredMI = MCInstBuilder(SystemZ::BRASL)
114ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines      .addReg(SystemZ::R14D)
115ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines      .addExpr(getTLSGetOffset(MF->getContext()))
116ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines      .addExpr(Lower.getExpr(MI->getOperand(0), MCSymbolRefExpr::VK_TLSGD));
117ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    break;
118ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
119ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case SystemZ::TLS_LDCALL:
120ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    LoweredMI = MCInstBuilder(SystemZ::BRASL)
121ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines      .addReg(SystemZ::R14D)
122ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines      .addExpr(getTLSGetOffset(MF->getContext()))
123ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines      .addExpr(Lower.getExpr(MI->getOperand(0), MCSymbolRefExpr::VK_TLSLDM));
124ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    break;
125ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
126ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case SystemZ::GOT:
127ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    LoweredMI = MCInstBuilder(SystemZ::LARL)
128ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines      .addReg(MI->getOperand(0).getReg())
129ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines      .addExpr(getGlobalOffsetTable(MF->getContext()));
130ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    break;
131ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
132259a6006e89576704e52e7392ef2bfd83f277ce3Richard Sandiford  case SystemZ::IILF64:
133259a6006e89576704e52e7392ef2bfd83f277ce3Richard Sandiford    LoweredMI = MCInstBuilder(SystemZ::IILF)
134259a6006e89576704e52e7392ef2bfd83f277ce3Richard Sandiford      .addReg(SystemZMC::getRegAsGR32(MI->getOperand(0).getReg()))
135259a6006e89576704e52e7392ef2bfd83f277ce3Richard Sandiford      .addImm(MI->getOperand(2).getImm());
136259a6006e89576704e52e7392ef2bfd83f277ce3Richard Sandiford    break;
137259a6006e89576704e52e7392ef2bfd83f277ce3Richard Sandiford
1384c8feae136bbb54ba09d8f8dc7e61714270f7cd5Richard Sandiford  case SystemZ::IIHF64:
1394c8feae136bbb54ba09d8f8dc7e61714270f7cd5Richard Sandiford    LoweredMI = MCInstBuilder(SystemZ::IIHF)
1404c8feae136bbb54ba09d8f8dc7e61714270f7cd5Richard Sandiford      .addReg(SystemZMC::getRegAsGRH32(MI->getOperand(0).getReg()))
1414c8feae136bbb54ba09d8f8dc7e61714270f7cd5Richard Sandiford      .addImm(MI->getOperand(2).getImm());
1424c8feae136bbb54ba09d8f8dc7e61714270f7cd5Richard Sandiford    break;
1434c8feae136bbb54ba09d8f8dc7e61714270f7cd5Richard Sandiford
14455d7d83b6c9e55fa73d667660c8e90f92999385bRichard Sandiford  case SystemZ::RISBHH:
14555d7d83b6c9e55fa73d667660c8e90f92999385bRichard Sandiford  case SystemZ::RISBHL:
14655d7d83b6c9e55fa73d667660c8e90f92999385bRichard Sandiford    LoweredMI = lowerRIEfLow(MI, SystemZ::RISBHG);
14755d7d83b6c9e55fa73d667660c8e90f92999385bRichard Sandiford    break;
14855d7d83b6c9e55fa73d667660c8e90f92999385bRichard Sandiford
14955d7d83b6c9e55fa73d667660c8e90f92999385bRichard Sandiford  case SystemZ::RISBLH:
15055d7d83b6c9e55fa73d667660c8e90f92999385bRichard Sandiford  case SystemZ::RISBLL:
15155d7d83b6c9e55fa73d667660c8e90f92999385bRichard Sandiford    LoweredMI = lowerRIEfLow(MI, SystemZ::RISBLG);
15255d7d83b6c9e55fa73d667660c8e90f92999385bRichard Sandiford    break;
15355d7d83b6c9e55fa73d667660c8e90f92999385bRichard Sandiford
154259a6006e89576704e52e7392ef2bfd83f277ce3Richard Sandiford#define LOWER_LOW(NAME)                                                 \
155259a6006e89576704e52e7392ef2bfd83f277ce3Richard Sandiford  case SystemZ::NAME##64: LoweredMI = lowerRILow(MI, SystemZ::NAME); break
156259a6006e89576704e52e7392ef2bfd83f277ce3Richard Sandiford
157259a6006e89576704e52e7392ef2bfd83f277ce3Richard Sandiford  LOWER_LOW(IILL);
158259a6006e89576704e52e7392ef2bfd83f277ce3Richard Sandiford  LOWER_LOW(IILH);
159fff1ff91915a613c0c23a5bbf7acb4694654d694Richard Sandiford  LOWER_LOW(TMLL);
160fff1ff91915a613c0c23a5bbf7acb4694654d694Richard Sandiford  LOWER_LOW(TMLH);
161259a6006e89576704e52e7392ef2bfd83f277ce3Richard Sandiford  LOWER_LOW(NILL);
162259a6006e89576704e52e7392ef2bfd83f277ce3Richard Sandiford  LOWER_LOW(NILH);
163259a6006e89576704e52e7392ef2bfd83f277ce3Richard Sandiford  LOWER_LOW(NILF);
164259a6006e89576704e52e7392ef2bfd83f277ce3Richard Sandiford  LOWER_LOW(OILL);
165259a6006e89576704e52e7392ef2bfd83f277ce3Richard Sandiford  LOWER_LOW(OILH);
166259a6006e89576704e52e7392ef2bfd83f277ce3Richard Sandiford  LOWER_LOW(OILF);
167259a6006e89576704e52e7392ef2bfd83f277ce3Richard Sandiford  LOWER_LOW(XILF);
168259a6006e89576704e52e7392ef2bfd83f277ce3Richard Sandiford
169259a6006e89576704e52e7392ef2bfd83f277ce3Richard Sandiford#undef LOWER_LOW
170259a6006e89576704e52e7392ef2bfd83f277ce3Richard Sandiford
171645d250b84fe0d097e7813b980ae58daeca2c2e6Richard Sandiford#define LOWER_HIGH(NAME) \
172645d250b84fe0d097e7813b980ae58daeca2c2e6Richard Sandiford  case SystemZ::NAME##64: LoweredMI = lowerRIHigh(MI, SystemZ::NAME); break
173645d250b84fe0d097e7813b980ae58daeca2c2e6Richard Sandiford
174645d250b84fe0d097e7813b980ae58daeca2c2e6Richard Sandiford  LOWER_HIGH(IIHL);
175645d250b84fe0d097e7813b980ae58daeca2c2e6Richard Sandiford  LOWER_HIGH(IIHH);
176fff1ff91915a613c0c23a5bbf7acb4694654d694Richard Sandiford  LOWER_HIGH(TMHL);
177fff1ff91915a613c0c23a5bbf7acb4694654d694Richard Sandiford  LOWER_HIGH(TMHH);
178b9dcca8265e9da01119c47e65f114c3adc972ba6Richard Sandiford  LOWER_HIGH(NIHL);
179b9dcca8265e9da01119c47e65f114c3adc972ba6Richard Sandiford  LOWER_HIGH(NIHH);
180b9dcca8265e9da01119c47e65f114c3adc972ba6Richard Sandiford  LOWER_HIGH(NIHF);
1811c831f7f1f7e869516f5a70c1e6dd8896bef76f5Richard Sandiford  LOWER_HIGH(OIHL);
1821c831f7f1f7e869516f5a70c1e6dd8896bef76f5Richard Sandiford  LOWER_HIGH(OIHH);
1831c831f7f1f7e869516f5a70c1e6dd8896bef76f5Richard Sandiford  LOWER_HIGH(OIHF);
1841ff62e182e648c72e6fce4f9d7911f2edfd914d2Richard Sandiford  LOWER_HIGH(XIHF);
185645d250b84fe0d097e7813b980ae58daeca2c2e6Richard Sandiford
186645d250b84fe0d097e7813b980ae58daeca2c2e6Richard Sandiford#undef LOWER_HIGH
187645d250b84fe0d097e7813b980ae58daeca2c2e6Richard Sandiford
18836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  case SystemZ::Serialize:
189ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    if (MF->getSubtarget<SystemZSubtarget>().hasFastSerialization())
19036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      LoweredMI = MCInstBuilder(SystemZ::AsmBCR)
19136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines        .addImm(14).addReg(SystemZ::R0D);
19236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    else
19336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      LoweredMI = MCInstBuilder(SystemZ::AsmBCR)
19436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines        .addImm(15).addReg(SystemZ::R0D);
19536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    break;
19636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
1979f3f4bf377ac93fd32c8b93ae23378a82ad0f353Richard Sandiford  default:
19876f8ae87b4705f5c08c3995948223531715a2d58Richard Sandiford    Lower.lower(MI, LoweredMI);
1999f3f4bf377ac93fd32c8b93ae23378a82ad0f353Richard Sandiford    break;
2009f3f4bf377ac93fd32c8b93ae23378a82ad0f353Richard Sandiford  }
20136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  EmitToStreamer(OutStreamer, LoweredMI);
2021d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand}
2031d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand
2041d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand// Convert a SystemZ-specific constant pool modifier into the associated
2051d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand// MCSymbolRefExpr variant kind.
2061d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigandstatic MCSymbolRefExpr::VariantKind
2071d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich WeigandgetModifierVariantKind(SystemZCP::SystemZCPModifier Modifier) {
2081d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  switch (Modifier) {
209ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case SystemZCP::TLSGD: return MCSymbolRefExpr::VK_TLSGD;
210ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case SystemZCP::TLSLDM: return MCSymbolRefExpr::VK_TLSLDM;
211ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case SystemZCP::DTPOFF: return MCSymbolRefExpr::VK_DTPOFF;
2121d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  case SystemZCP::NTPOFF: return MCSymbolRefExpr::VK_NTPOFF;
2131d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  }
2141d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  llvm_unreachable("Invalid SystemCPModifier!");
2151d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand}
2161d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand
2171d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigandvoid SystemZAsmPrinter::
2181d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich WeigandEmitMachineConstantPoolValue(MachineConstantPoolValue *MCPV) {
21936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  auto *ZCPV = static_cast<SystemZConstantPoolValue*>(MCPV);
2201d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand
2211d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  const MCExpr *Expr =
222ffc7dca885151ed42642c2d6733e8db75d276621Rafael Espindola    MCSymbolRefExpr::Create(getSymbol(ZCPV->getGlobalValue()),
2231d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand                            getModifierVariantKind(ZCPV->getModifier()),
2241d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand                            OutContext);
225ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  uint64_t Size = TM.getDataLayout()->getTypeAllocSize(ZCPV->getType());
2261d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand
2271d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  OutStreamer.EmitValue(Expr, Size);
2281d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand}
2291d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand
2301d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigandbool SystemZAsmPrinter::PrintAsmOperand(const MachineInstr *MI,
2311d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand                                        unsigned OpNo,
2321d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand                                        unsigned AsmVariant,
2331d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand                                        const char *ExtraCode,
2341d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand                                        raw_ostream &OS) {
2351d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  if (ExtraCode && *ExtraCode == 'n') {
2361d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand    if (!MI->getOperand(OpNo).isImm())
2371d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand      return true;
2381d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand    OS << -int64_t(MI->getOperand(OpNo).getImm());
2391d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  } else {
2408eff5d998e88ba8763d72f4e94d7a32f2dbb9005Rafael Espindola    SystemZMCInstLower Lower(MF->getContext(), *this);
2411d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand    MCOperand MO(Lower.lowerOperand(MI->getOperand(OpNo)));
2421d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand    SystemZInstPrinter::printOperand(MO, OS);
2431d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  }
2441d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  return false;
2451d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand}
2461d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand
2471d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigandbool SystemZAsmPrinter::PrintAsmMemoryOperand(const MachineInstr *MI,
2481d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand                                              unsigned OpNo,
2491d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand                                              unsigned AsmVariant,
2501d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand                                              const char *ExtraCode,
2511d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand                                              raw_ostream &OS) {
2521d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  SystemZInstPrinter::printAddress(MI->getOperand(OpNo).getReg(),
2531d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand                                   MI->getOperand(OpNo + 1).getImm(),
2541d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand                                   MI->getOperand(OpNo + 2).getReg(), OS);
2551d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  return false;
2561d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand}
2571d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand
2581d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigandvoid SystemZAsmPrinter::EmitEndOfAsmFile(Module &M) {
259ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  if (Triple(TM.getTargetTriple()).isOSBinFormatELF()) {
26036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    auto &TLOFELF =
2611d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand      static_cast<const TargetLoweringObjectFileELF &>(getObjFileLowering());
2621d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand
2631d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand    MachineModuleInfoELF &MMIELF = MMI->getObjFileInfo<MachineModuleInfoELF>();
2641d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand
2651d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand    // Output stubs for external and common global variables.
2661d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand    MachineModuleInfoELF::SymbolListTy Stubs = MMIELF.GetGVStubList();
2671d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand    if (!Stubs.empty()) {
2681d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand      OutStreamer.SwitchSection(TLOFELF.getDataRelSection());
269ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines      const DataLayout *TD = TM.getDataLayout();
2701d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand
2711d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand      for (unsigned i = 0, e = Stubs.size(); i != e; ++i) {
2721d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand        OutStreamer.EmitLabel(Stubs[i].first);
2731d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand        OutStreamer.EmitSymbolValue(Stubs[i].second.getPointer(),
274a3863ea2dacafc925a8272ebf9884fc64bef686cRafael Espindola                                    TD->getPointerSize(0));
2751d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand      }
2761d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand      Stubs.clear();
2771d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand    }
2781d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  }
2791d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand}
2801d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand
2811d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand// Force static initialization.
2821d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigandextern "C" void LLVMInitializeSystemZAsmPrinter() {
2831d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  RegisterAsmPrinter<SystemZAsmPrinter> X(TheSystemZTarget);
2841d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand}
285