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