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";
716948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  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_";
786948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  return MCSymbolRefExpr::create(Context.getOrCreateSymbol(Name),
79ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines                                 MCSymbolRefExpr::VK_None,
80ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines                                 Context);
81ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines}
82ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
836948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar// MI loads the high part of a vector from memory.  Return an instruction
846948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar// that uses replicating vector load Opcode to do the same thing.
856948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarstatic MCInst lowerSubvectorLoad(const MachineInstr *MI, unsigned Opcode) {
866948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  return MCInstBuilder(Opcode)
876948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    .addReg(SystemZMC::getRegAsVR128(MI->getOperand(0).getReg()))
886948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    .addReg(MI->getOperand(1).getReg())
896948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    .addImm(MI->getOperand(2).getImm())
906948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    .addReg(MI->getOperand(3).getReg());
916948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar}
926948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
936948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar// MI stores the high part of a vector to memory.  Return an instruction
946948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar// that uses elemental vector store Opcode to do the same thing.
956948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarstatic MCInst lowerSubvectorStore(const MachineInstr *MI, unsigned Opcode) {
966948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  return MCInstBuilder(Opcode)
976948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    .addReg(SystemZMC::getRegAsVR128(MI->getOperand(0).getReg()))
986948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    .addReg(MI->getOperand(1).getReg())
996948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    .addImm(MI->getOperand(2).getImm())
1006948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    .addReg(MI->getOperand(3).getReg())
1016948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    .addImm(0);
1026948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar}
1036948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
1041d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigandvoid SystemZAsmPrinter::EmitInstruction(const MachineInstr *MI) {
1058eff5d998e88ba8763d72f4e94d7a32f2dbb9005Rafael Espindola  SystemZMCInstLower Lower(MF->getContext(), *this);
1061d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  MCInst LoweredMI;
1079f3f4bf377ac93fd32c8b93ae23378a82ad0f353Richard Sandiford  switch (MI->getOpcode()) {
1089f3f4bf377ac93fd32c8b93ae23378a82ad0f353Richard Sandiford  case SystemZ::Return:
1099f3f4bf377ac93fd32c8b93ae23378a82ad0f353Richard Sandiford    LoweredMI = MCInstBuilder(SystemZ::BR).addReg(SystemZ::R14D);
1109f3f4bf377ac93fd32c8b93ae23378a82ad0f353Richard Sandiford    break;
1119f3f4bf377ac93fd32c8b93ae23378a82ad0f353Richard Sandiford
112de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  case SystemZ::CondReturn:
113de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    LoweredMI = MCInstBuilder(SystemZ::BCR)
114de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      .addImm(MI->getOperand(0).getImm())
115de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      .addImm(MI->getOperand(1).getImm())
116de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      .addReg(SystemZ::R14D);
117de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    break;
118de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
119de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  case SystemZ::CRBReturn:
120de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    LoweredMI = MCInstBuilder(SystemZ::CRB)
121de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      .addReg(MI->getOperand(0).getReg())
122de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      .addReg(MI->getOperand(1).getReg())
123de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      .addImm(MI->getOperand(2).getImm())
124de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      .addReg(SystemZ::R14D)
125de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      .addImm(0);
126de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    break;
127de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
128de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  case SystemZ::CGRBReturn:
129de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    LoweredMI = MCInstBuilder(SystemZ::CGRB)
130de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      .addReg(MI->getOperand(0).getReg())
131de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      .addReg(MI->getOperand(1).getReg())
132de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      .addImm(MI->getOperand(2).getImm())
133de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      .addReg(SystemZ::R14D)
134de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      .addImm(0);
135de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    break;
136de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
137de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  case SystemZ::CIBReturn:
138de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    LoweredMI = MCInstBuilder(SystemZ::CIB)
139de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      .addReg(MI->getOperand(0).getReg())
140de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      .addImm(MI->getOperand(1).getImm())
141de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      .addImm(MI->getOperand(2).getImm())
142de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      .addReg(SystemZ::R14D)
143de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      .addImm(0);
144de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    break;
145de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
146de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  case SystemZ::CGIBReturn:
147de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    LoweredMI = MCInstBuilder(SystemZ::CGIB)
148de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      .addReg(MI->getOperand(0).getReg())
149de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      .addImm(MI->getOperand(1).getImm())
150de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      .addImm(MI->getOperand(2).getImm())
151de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      .addReg(SystemZ::R14D)
152de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      .addImm(0);
153de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    break;
154de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
155de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  case SystemZ::CLRBReturn:
156de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    LoweredMI = MCInstBuilder(SystemZ::CLRB)
157de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      .addReg(MI->getOperand(0).getReg())
158de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      .addReg(MI->getOperand(1).getReg())
159de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      .addImm(MI->getOperand(2).getImm())
160de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      .addReg(SystemZ::R14D)
161de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      .addImm(0);
162de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    break;
163de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
164de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  case SystemZ::CLGRBReturn:
165de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    LoweredMI = MCInstBuilder(SystemZ::CLGRB)
166de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      .addReg(MI->getOperand(0).getReg())
167de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      .addReg(MI->getOperand(1).getReg())
168de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      .addImm(MI->getOperand(2).getImm())
169de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      .addReg(SystemZ::R14D)
170de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      .addImm(0);
171de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    break;
172de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
173de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  case SystemZ::CLIBReturn:
174de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    LoweredMI = MCInstBuilder(SystemZ::CLIB)
175de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      .addReg(MI->getOperand(0).getReg())
176de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      .addImm(MI->getOperand(1).getImm())
177de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      .addImm(MI->getOperand(2).getImm())
178de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      .addReg(SystemZ::R14D)
179de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      .addImm(0);
180de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    break;
181de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
182de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  case SystemZ::CLGIBReturn:
183de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    LoweredMI = MCInstBuilder(SystemZ::CLGIB)
184de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      .addReg(MI->getOperand(0).getReg())
185de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      .addImm(MI->getOperand(1).getImm())
186de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      .addImm(MI->getOperand(2).getImm())
187de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      .addReg(SystemZ::R14D)
188de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      .addImm(0);
189de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    break;
190de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
19176f8ae87b4705f5c08c3995948223531715a2d58Richard Sandiford  case SystemZ::CallBRASL:
19276f8ae87b4705f5c08c3995948223531715a2d58Richard Sandiford    LoweredMI = MCInstBuilder(SystemZ::BRASL)
19376f8ae87b4705f5c08c3995948223531715a2d58Richard Sandiford      .addReg(SystemZ::R14D)
19476f8ae87b4705f5c08c3995948223531715a2d58Richard Sandiford      .addExpr(Lower.getExpr(MI->getOperand(0), MCSymbolRefExpr::VK_PLT));
19576f8ae87b4705f5c08c3995948223531715a2d58Richard Sandiford    break;
19676f8ae87b4705f5c08c3995948223531715a2d58Richard Sandiford
19776f8ae87b4705f5c08c3995948223531715a2d58Richard Sandiford  case SystemZ::CallBASR:
19876f8ae87b4705f5c08c3995948223531715a2d58Richard Sandiford    LoweredMI = MCInstBuilder(SystemZ::BASR)
19976f8ae87b4705f5c08c3995948223531715a2d58Richard Sandiford      .addReg(SystemZ::R14D)
20076f8ae87b4705f5c08c3995948223531715a2d58Richard Sandiford      .addReg(MI->getOperand(0).getReg());
20176f8ae87b4705f5c08c3995948223531715a2d58Richard Sandiford    break;
20276f8ae87b4705f5c08c3995948223531715a2d58Richard Sandiford
20376f8ae87b4705f5c08c3995948223531715a2d58Richard Sandiford  case SystemZ::CallJG:
20476f8ae87b4705f5c08c3995948223531715a2d58Richard Sandiford    LoweredMI = MCInstBuilder(SystemZ::JG)
20576f8ae87b4705f5c08c3995948223531715a2d58Richard Sandiford      .addExpr(Lower.getExpr(MI->getOperand(0), MCSymbolRefExpr::VK_PLT));
20676f8ae87b4705f5c08c3995948223531715a2d58Richard Sandiford    break;
20776f8ae87b4705f5c08c3995948223531715a2d58Richard Sandiford
208de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  case SystemZ::CallBRCL:
209de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    LoweredMI = MCInstBuilder(SystemZ::BRCL)
210de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      .addImm(MI->getOperand(0).getImm())
211de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      .addImm(MI->getOperand(1).getImm())
212de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      .addExpr(Lower.getExpr(MI->getOperand(2), MCSymbolRefExpr::VK_PLT));
213de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    break;
214de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
21576f8ae87b4705f5c08c3995948223531715a2d58Richard Sandiford  case SystemZ::CallBR:
21676f8ae87b4705f5c08c3995948223531715a2d58Richard Sandiford    LoweredMI = MCInstBuilder(SystemZ::BR).addReg(SystemZ::R1D);
21776f8ae87b4705f5c08c3995948223531715a2d58Richard Sandiford    break;
21876f8ae87b4705f5c08c3995948223531715a2d58Richard Sandiford
219de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  case SystemZ::CallBCR:
220de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    LoweredMI = MCInstBuilder(SystemZ::BCR)
221de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      .addImm(MI->getOperand(0).getImm())
222de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      .addImm(MI->getOperand(1).getImm())
223de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      .addReg(SystemZ::R1D);
224de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    break;
225de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
226de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  case SystemZ::CRBCall:
227de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    LoweredMI = MCInstBuilder(SystemZ::CRB)
228de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      .addReg(MI->getOperand(0).getReg())
229de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      .addReg(MI->getOperand(1).getReg())
230de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      .addImm(MI->getOperand(2).getImm())
231de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      .addReg(SystemZ::R1D)
232de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      .addImm(0);
233de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    break;
234de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
235de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  case SystemZ::CGRBCall:
236de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    LoweredMI = MCInstBuilder(SystemZ::CGRB)
237de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      .addReg(MI->getOperand(0).getReg())
238de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      .addReg(MI->getOperand(1).getReg())
239de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      .addImm(MI->getOperand(2).getImm())
240de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      .addReg(SystemZ::R1D)
241de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      .addImm(0);
242de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    break;
243de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
244de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  case SystemZ::CIBCall:
245de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    LoweredMI = MCInstBuilder(SystemZ::CIB)
246de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      .addReg(MI->getOperand(0).getReg())
247de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      .addImm(MI->getOperand(1).getImm())
248de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      .addImm(MI->getOperand(2).getImm())
249de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      .addReg(SystemZ::R1D)
250de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      .addImm(0);
251de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    break;
252de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
253de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  case SystemZ::CGIBCall:
254de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    LoweredMI = MCInstBuilder(SystemZ::CGIB)
255de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      .addReg(MI->getOperand(0).getReg())
256de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      .addImm(MI->getOperand(1).getImm())
257de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      .addImm(MI->getOperand(2).getImm())
258de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      .addReg(SystemZ::R1D)
259de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      .addImm(0);
260de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    break;
261de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
262de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  case SystemZ::CLRBCall:
263de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    LoweredMI = MCInstBuilder(SystemZ::CLRB)
264de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      .addReg(MI->getOperand(0).getReg())
265de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      .addReg(MI->getOperand(1).getReg())
266de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      .addImm(MI->getOperand(2).getImm())
267de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      .addReg(SystemZ::R1D)
268de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      .addImm(0);
269de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    break;
270de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
271de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  case SystemZ::CLGRBCall:
272de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    LoweredMI = MCInstBuilder(SystemZ::CLGRB)
273de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      .addReg(MI->getOperand(0).getReg())
274de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      .addReg(MI->getOperand(1).getReg())
275de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      .addImm(MI->getOperand(2).getImm())
276de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      .addReg(SystemZ::R1D)
277de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      .addImm(0);
278de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    break;
279de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
280de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  case SystemZ::CLIBCall:
281de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    LoweredMI = MCInstBuilder(SystemZ::CLIB)
282de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      .addReg(MI->getOperand(0).getReg())
283de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      .addImm(MI->getOperand(1).getImm())
284de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      .addImm(MI->getOperand(2).getImm())
285de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      .addReg(SystemZ::R1D)
286de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      .addImm(0);
287de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    break;
288de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
289de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  case SystemZ::CLGIBCall:
290de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    LoweredMI = MCInstBuilder(SystemZ::CLGIB)
291de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      .addReg(MI->getOperand(0).getReg())
292de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      .addImm(MI->getOperand(1).getImm())
293de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      .addImm(MI->getOperand(2).getImm())
294de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      .addReg(SystemZ::R1D)
295de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      .addImm(0);
296de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    break;
297de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
298ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case SystemZ::TLS_GDCALL:
299ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    LoweredMI = MCInstBuilder(SystemZ::BRASL)
300ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines      .addReg(SystemZ::R14D)
301ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines      .addExpr(getTLSGetOffset(MF->getContext()))
302ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines      .addExpr(Lower.getExpr(MI->getOperand(0), MCSymbolRefExpr::VK_TLSGD));
303ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    break;
304ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
305ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case SystemZ::TLS_LDCALL:
306ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    LoweredMI = MCInstBuilder(SystemZ::BRASL)
307ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines      .addReg(SystemZ::R14D)
308ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines      .addExpr(getTLSGetOffset(MF->getContext()))
309ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines      .addExpr(Lower.getExpr(MI->getOperand(0), MCSymbolRefExpr::VK_TLSLDM));
310ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    break;
311ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
312ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case SystemZ::GOT:
313ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    LoweredMI = MCInstBuilder(SystemZ::LARL)
314ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines      .addReg(MI->getOperand(0).getReg())
315ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines      .addExpr(getGlobalOffsetTable(MF->getContext()));
316ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    break;
317ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
318259a6006e89576704e52e7392ef2bfd83f277ce3Richard Sandiford  case SystemZ::IILF64:
319259a6006e89576704e52e7392ef2bfd83f277ce3Richard Sandiford    LoweredMI = MCInstBuilder(SystemZ::IILF)
320259a6006e89576704e52e7392ef2bfd83f277ce3Richard Sandiford      .addReg(SystemZMC::getRegAsGR32(MI->getOperand(0).getReg()))
321259a6006e89576704e52e7392ef2bfd83f277ce3Richard Sandiford      .addImm(MI->getOperand(2).getImm());
322259a6006e89576704e52e7392ef2bfd83f277ce3Richard Sandiford    break;
323259a6006e89576704e52e7392ef2bfd83f277ce3Richard Sandiford
3244c8feae136bbb54ba09d8f8dc7e61714270f7cd5Richard Sandiford  case SystemZ::IIHF64:
3254c8feae136bbb54ba09d8f8dc7e61714270f7cd5Richard Sandiford    LoweredMI = MCInstBuilder(SystemZ::IIHF)
3264c8feae136bbb54ba09d8f8dc7e61714270f7cd5Richard Sandiford      .addReg(SystemZMC::getRegAsGRH32(MI->getOperand(0).getReg()))
3274c8feae136bbb54ba09d8f8dc7e61714270f7cd5Richard Sandiford      .addImm(MI->getOperand(2).getImm());
3284c8feae136bbb54ba09d8f8dc7e61714270f7cd5Richard Sandiford    break;
3294c8feae136bbb54ba09d8f8dc7e61714270f7cd5Richard Sandiford
33055d7d83b6c9e55fa73d667660c8e90f92999385bRichard Sandiford  case SystemZ::RISBHH:
33155d7d83b6c9e55fa73d667660c8e90f92999385bRichard Sandiford  case SystemZ::RISBHL:
33255d7d83b6c9e55fa73d667660c8e90f92999385bRichard Sandiford    LoweredMI = lowerRIEfLow(MI, SystemZ::RISBHG);
33355d7d83b6c9e55fa73d667660c8e90f92999385bRichard Sandiford    break;
33455d7d83b6c9e55fa73d667660c8e90f92999385bRichard Sandiford
33555d7d83b6c9e55fa73d667660c8e90f92999385bRichard Sandiford  case SystemZ::RISBLH:
33655d7d83b6c9e55fa73d667660c8e90f92999385bRichard Sandiford  case SystemZ::RISBLL:
33755d7d83b6c9e55fa73d667660c8e90f92999385bRichard Sandiford    LoweredMI = lowerRIEfLow(MI, SystemZ::RISBLG);
33855d7d83b6c9e55fa73d667660c8e90f92999385bRichard Sandiford    break;
33955d7d83b6c9e55fa73d667660c8e90f92999385bRichard Sandiford
3406948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  case SystemZ::VLVGP32:
3416948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    LoweredMI = MCInstBuilder(SystemZ::VLVGP)
3426948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      .addReg(MI->getOperand(0).getReg())
3436948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      .addReg(SystemZMC::getRegAsGR64(MI->getOperand(1).getReg()))
3446948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      .addReg(SystemZMC::getRegAsGR64(MI->getOperand(2).getReg()));
3456948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    break;
3466948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
3476948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  case SystemZ::VLR32:
3486948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  case SystemZ::VLR64:
3496948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    LoweredMI = MCInstBuilder(SystemZ::VLR)
3506948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      .addReg(SystemZMC::getRegAsVR128(MI->getOperand(0).getReg()))
3516948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      .addReg(SystemZMC::getRegAsVR128(MI->getOperand(1).getReg()));
3526948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    break;
3536948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
3546948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  case SystemZ::VL32:
3556948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    LoweredMI = lowerSubvectorLoad(MI, SystemZ::VLREPF);
3566948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    break;
3576948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
3586948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  case SystemZ::VL64:
3596948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    LoweredMI = lowerSubvectorLoad(MI, SystemZ::VLREPG);
3606948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    break;
3616948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
3626948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  case SystemZ::VST32:
3636948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    LoweredMI = lowerSubvectorStore(MI, SystemZ::VSTEF);
3646948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    break;
3656948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
3666948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  case SystemZ::VST64:
3676948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    LoweredMI = lowerSubvectorStore(MI, SystemZ::VSTEG);
3686948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    break;
3696948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
3706948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  case SystemZ::LFER:
3716948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    LoweredMI = MCInstBuilder(SystemZ::VLGVF)
3726948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      .addReg(SystemZMC::getRegAsGR64(MI->getOperand(0).getReg()))
3736948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      .addReg(SystemZMC::getRegAsVR128(MI->getOperand(1).getReg()))
3746948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      .addReg(0).addImm(0);
3756948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    break;
3766948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
3776948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  case SystemZ::LEFR:
3786948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    LoweredMI = MCInstBuilder(SystemZ::VLVGF)
3796948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      .addReg(SystemZMC::getRegAsVR128(MI->getOperand(0).getReg()))
3806948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      .addReg(SystemZMC::getRegAsVR128(MI->getOperand(0).getReg()))
3816948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      .addReg(MI->getOperand(1).getReg())
3826948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar      .addReg(0).addImm(0);
3836948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    break;
3846948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar
385259a6006e89576704e52e7392ef2bfd83f277ce3Richard Sandiford#define LOWER_LOW(NAME)                                                 \
386259a6006e89576704e52e7392ef2bfd83f277ce3Richard Sandiford  case SystemZ::NAME##64: LoweredMI = lowerRILow(MI, SystemZ::NAME); break
387259a6006e89576704e52e7392ef2bfd83f277ce3Richard Sandiford
388259a6006e89576704e52e7392ef2bfd83f277ce3Richard Sandiford  LOWER_LOW(IILL);
389259a6006e89576704e52e7392ef2bfd83f277ce3Richard Sandiford  LOWER_LOW(IILH);
390fff1ff91915a613c0c23a5bbf7acb4694654d694Richard Sandiford  LOWER_LOW(TMLL);
391fff1ff91915a613c0c23a5bbf7acb4694654d694Richard Sandiford  LOWER_LOW(TMLH);
392259a6006e89576704e52e7392ef2bfd83f277ce3Richard Sandiford  LOWER_LOW(NILL);
393259a6006e89576704e52e7392ef2bfd83f277ce3Richard Sandiford  LOWER_LOW(NILH);
394259a6006e89576704e52e7392ef2bfd83f277ce3Richard Sandiford  LOWER_LOW(NILF);
395259a6006e89576704e52e7392ef2bfd83f277ce3Richard Sandiford  LOWER_LOW(OILL);
396259a6006e89576704e52e7392ef2bfd83f277ce3Richard Sandiford  LOWER_LOW(OILH);
397259a6006e89576704e52e7392ef2bfd83f277ce3Richard Sandiford  LOWER_LOW(OILF);
398259a6006e89576704e52e7392ef2bfd83f277ce3Richard Sandiford  LOWER_LOW(XILF);
399259a6006e89576704e52e7392ef2bfd83f277ce3Richard Sandiford
400259a6006e89576704e52e7392ef2bfd83f277ce3Richard Sandiford#undef LOWER_LOW
401259a6006e89576704e52e7392ef2bfd83f277ce3Richard Sandiford
402645d250b84fe0d097e7813b980ae58daeca2c2e6Richard Sandiford#define LOWER_HIGH(NAME) \
403645d250b84fe0d097e7813b980ae58daeca2c2e6Richard Sandiford  case SystemZ::NAME##64: LoweredMI = lowerRIHigh(MI, SystemZ::NAME); break
404645d250b84fe0d097e7813b980ae58daeca2c2e6Richard Sandiford
405645d250b84fe0d097e7813b980ae58daeca2c2e6Richard Sandiford  LOWER_HIGH(IIHL);
406645d250b84fe0d097e7813b980ae58daeca2c2e6Richard Sandiford  LOWER_HIGH(IIHH);
407fff1ff91915a613c0c23a5bbf7acb4694654d694Richard Sandiford  LOWER_HIGH(TMHL);
408fff1ff91915a613c0c23a5bbf7acb4694654d694Richard Sandiford  LOWER_HIGH(TMHH);
409b9dcca8265e9da01119c47e65f114c3adc972ba6Richard Sandiford  LOWER_HIGH(NIHL);
410b9dcca8265e9da01119c47e65f114c3adc972ba6Richard Sandiford  LOWER_HIGH(NIHH);
411b9dcca8265e9da01119c47e65f114c3adc972ba6Richard Sandiford  LOWER_HIGH(NIHF);
4121c831f7f1f7e869516f5a70c1e6dd8896bef76f5Richard Sandiford  LOWER_HIGH(OIHL);
4131c831f7f1f7e869516f5a70c1e6dd8896bef76f5Richard Sandiford  LOWER_HIGH(OIHH);
4141c831f7f1f7e869516f5a70c1e6dd8896bef76f5Richard Sandiford  LOWER_HIGH(OIHF);
4151ff62e182e648c72e6fce4f9d7911f2edfd914d2Richard Sandiford  LOWER_HIGH(XIHF);
416645d250b84fe0d097e7813b980ae58daeca2c2e6Richard Sandiford
417645d250b84fe0d097e7813b980ae58daeca2c2e6Richard Sandiford#undef LOWER_HIGH
418645d250b84fe0d097e7813b980ae58daeca2c2e6Richard Sandiford
41936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  case SystemZ::Serialize:
420ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    if (MF->getSubtarget<SystemZSubtarget>().hasFastSerialization())
42136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      LoweredMI = MCInstBuilder(SystemZ::AsmBCR)
42236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines        .addImm(14).addReg(SystemZ::R0D);
42336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    else
42436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      LoweredMI = MCInstBuilder(SystemZ::AsmBCR)
42536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines        .addImm(15).addReg(SystemZ::R0D);
42636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    break;
42736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
428de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // Emit nothing here but a comment if we can.
429de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  case SystemZ::MemBarrier:
430de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    OutStreamer->emitRawComment("MEMBARRIER");
431de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return;
432de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
433de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // We want to emit "j .+2" for traps, jumping to the relative immediate field
434de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // of the jump instruction, which is an illegal instruction. We cannot emit a
435de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // "." symbol, so create and emit a temp label before the instruction and use
436de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // that instead.
437de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  case SystemZ::Trap: {
438de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    MCSymbol *DotSym = OutContext.createTempSymbol();
439de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    OutStreamer->EmitLabel(DotSym);
440de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
441de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    const MCSymbolRefExpr *Expr = MCSymbolRefExpr::create(DotSym, OutContext);
442de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    const MCConstantExpr *ConstExpr = MCConstantExpr::create(2, OutContext);
443de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    LoweredMI = MCInstBuilder(SystemZ::J)
444de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      .addExpr(MCBinaryExpr::createAdd(Expr, ConstExpr, OutContext));
445de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    }
446de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    break;
447de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
448de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // Conditional traps will create a branch on condition instruction that jumps
449de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // to the relative immediate field of the jump instruction. (eg. "jo .+2")
450de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  case SystemZ::CondTrap: {
451de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    MCSymbol *DotSym = OutContext.createTempSymbol();
452de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    OutStreamer->EmitLabel(DotSym);
453de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
454de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    const MCSymbolRefExpr *Expr = MCSymbolRefExpr::create(DotSym, OutContext);
455de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    const MCConstantExpr *ConstExpr = MCConstantExpr::create(2, OutContext);
456de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    LoweredMI = MCInstBuilder(SystemZ::BRC)
457de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      .addImm(MI->getOperand(0).getImm())
458de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      .addImm(MI->getOperand(1).getImm())
459de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      .addExpr(MCBinaryExpr::createAdd(Expr, ConstExpr, OutContext));
460de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    }
461de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    break;
462de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
4639f3f4bf377ac93fd32c8b93ae23378a82ad0f353Richard Sandiford  default:
46476f8ae87b4705f5c08c3995948223531715a2d58Richard Sandiford    Lower.lower(MI, LoweredMI);
4659f3f4bf377ac93fd32c8b93ae23378a82ad0f353Richard Sandiford    break;
4669f3f4bf377ac93fd32c8b93ae23378a82ad0f353Richard Sandiford  }
4676948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  EmitToStreamer(*OutStreamer, LoweredMI);
4681d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand}
4691d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand
4701d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand// Convert a SystemZ-specific constant pool modifier into the associated
4711d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand// MCSymbolRefExpr variant kind.
4721d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigandstatic MCSymbolRefExpr::VariantKind
4731d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich WeigandgetModifierVariantKind(SystemZCP::SystemZCPModifier Modifier) {
4741d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  switch (Modifier) {
475ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case SystemZCP::TLSGD: return MCSymbolRefExpr::VK_TLSGD;
476ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case SystemZCP::TLSLDM: return MCSymbolRefExpr::VK_TLSLDM;
477ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  case SystemZCP::DTPOFF: return MCSymbolRefExpr::VK_DTPOFF;
4781d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  case SystemZCP::NTPOFF: return MCSymbolRefExpr::VK_NTPOFF;
4791d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  }
4801d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  llvm_unreachable("Invalid SystemCPModifier!");
4811d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand}
4821d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand
4831d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigandvoid SystemZAsmPrinter::
4841d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich WeigandEmitMachineConstantPoolValue(MachineConstantPoolValue *MCPV) {
48536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  auto *ZCPV = static_cast<SystemZConstantPoolValue*>(MCPV);
4861d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand
4871d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  const MCExpr *Expr =
4886948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    MCSymbolRefExpr::create(getSymbol(ZCPV->getGlobalValue()),
4891d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand                            getModifierVariantKind(ZCPV->getModifier()),
4901d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand                            OutContext);
491f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  uint64_t Size = getDataLayout().getTypeAllocSize(ZCPV->getType());
4921d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand
4936948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar  OutStreamer->EmitValue(Expr, Size);
4941d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand}
4951d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand
4961d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigandbool SystemZAsmPrinter::PrintAsmOperand(const MachineInstr *MI,
4971d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand                                        unsigned OpNo,
4981d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand                                        unsigned AsmVariant,
4991d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand                                        const char *ExtraCode,
5001d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand                                        raw_ostream &OS) {
5011d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  if (ExtraCode && *ExtraCode == 'n') {
5021d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand    if (!MI->getOperand(OpNo).isImm())
5031d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand      return true;
5041d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand    OS << -int64_t(MI->getOperand(OpNo).getImm());
5051d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  } else {
5068eff5d998e88ba8763d72f4e94d7a32f2dbb9005Rafael Espindola    SystemZMCInstLower Lower(MF->getContext(), *this);
5071d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand    MCOperand MO(Lower.lowerOperand(MI->getOperand(OpNo)));
5086948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar    SystemZInstPrinter::printOperand(MO, MAI, OS);
5091d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  }
5101d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  return false;
5111d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand}
5121d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand
5131d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigandbool SystemZAsmPrinter::PrintAsmMemoryOperand(const MachineInstr *MI,
5141d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand                                              unsigned OpNo,
5151d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand                                              unsigned AsmVariant,
5161d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand                                              const char *ExtraCode,
5171d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand                                              raw_ostream &OS) {
5181d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  SystemZInstPrinter::printAddress(MI->getOperand(OpNo).getReg(),
5191d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand                                   MI->getOperand(OpNo + 1).getImm(),
5201d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand                                   MI->getOperand(OpNo + 2).getReg(), OS);
5211d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  return false;
5221d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand}
5231d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand
5241d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand// Force static initialization.
5251d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigandextern "C" void LLVMInitializeSystemZAsmPrinter() {
5261d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand  RegisterAsmPrinter<SystemZAsmPrinter> X(TheSystemZTarget);
5271d09d56fe1e3f3faadd4bf4ccf3e585ddb3c3b07Ulrich Weigand}
528