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