293 lines · cpp
1//===-- SystemZMCTargetDesc.cpp - SystemZ target descriptions -------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#include "SystemZMCTargetDesc.h"10#include "SystemZGNUInstPrinter.h"11#include "SystemZHLASMAsmStreamer.h"12#include "SystemZHLASMInstPrinter.h"13#include "SystemZMCAsmInfo.h"14#include "SystemZTargetStreamer.h"15#include "TargetInfo/SystemZTargetInfo.h"16#include "llvm/MC/MCContext.h"17#include "llvm/MC/MCDwarf.h"18#include "llvm/MC/MCInst.h"19#include "llvm/MC/MCInstrAnalysis.h"20#include "llvm/MC/MCInstrInfo.h"21#include "llvm/MC/MCRegisterInfo.h"22#include "llvm/MC/MCStreamer.h"23#include "llvm/MC/MCSubtargetInfo.h"24#include "llvm/MC/TargetRegistry.h"25#include "llvm/Support/CommandLine.h"26#include "llvm/Support/Compiler.h"27 28using namespace llvm;29 30#define GET_INSTRINFO_MC_DESC31#define ENABLE_INSTR_PREDICATE_VERIFIER32#include "SystemZGenInstrInfo.inc"33 34#define GET_SUBTARGETINFO_MC_DESC35#include "SystemZGenSubtargetInfo.inc"36 37#define GET_REGINFO_MC_DESC38#include "SystemZGenRegisterInfo.inc"39 40// Temporary option to assist with the migration to a new HLASMAsmStreamer on41// z/OS42static cl::opt<bool> GNUAsOnzOSCL("emit-gnuas-syntax-on-zos",43 cl::desc("Emit GNU Assembly Syntax on z/OS."),44 cl::init(true));45 46const unsigned SystemZMC::GR32Regs[16] = {47 SystemZ::R0L, SystemZ::R1L, SystemZ::R2L, SystemZ::R3L,48 SystemZ::R4L, SystemZ::R5L, SystemZ::R6L, SystemZ::R7L,49 SystemZ::R8L, SystemZ::R9L, SystemZ::R10L, SystemZ::R11L,50 SystemZ::R12L, SystemZ::R13L, SystemZ::R14L, SystemZ::R15L};51 52const unsigned SystemZMC::GRH32Regs[16] = {53 SystemZ::R0H, SystemZ::R1H, SystemZ::R2H, SystemZ::R3H,54 SystemZ::R4H, SystemZ::R5H, SystemZ::R6H, SystemZ::R7H,55 SystemZ::R8H, SystemZ::R9H, SystemZ::R10H, SystemZ::R11H,56 SystemZ::R12H, SystemZ::R13H, SystemZ::R14H, SystemZ::R15H};57 58const unsigned SystemZMC::GR64Regs[16] = {59 SystemZ::R0D, SystemZ::R1D, SystemZ::R2D, SystemZ::R3D,60 SystemZ::R4D, SystemZ::R5D, SystemZ::R6D, SystemZ::R7D,61 SystemZ::R8D, SystemZ::R9D, SystemZ::R10D, SystemZ::R11D,62 SystemZ::R12D, SystemZ::R13D, SystemZ::R14D, SystemZ::R15D};63 64const unsigned SystemZMC::GR128Regs[16] = {65 SystemZ::R0Q, 0, SystemZ::R2Q, 0, SystemZ::R4Q, 0, SystemZ::R6Q, 0,66 SystemZ::R8Q, 0, SystemZ::R10Q, 0, SystemZ::R12Q, 0, SystemZ::R14Q, 0};67 68const unsigned SystemZMC::FP16Regs[16] = {69 SystemZ::F0H, SystemZ::F1H, SystemZ::F2H, SystemZ::F3H,70 SystemZ::F4H, SystemZ::F5H, SystemZ::F6H, SystemZ::F7H,71 SystemZ::F8H, SystemZ::F9H, SystemZ::F10H, SystemZ::F11H,72 SystemZ::F12H, SystemZ::F13H, SystemZ::F14H, SystemZ::F15H};73 74const unsigned SystemZMC::FP32Regs[16] = {75 SystemZ::F0S, SystemZ::F1S, SystemZ::F2S, SystemZ::F3S,76 SystemZ::F4S, SystemZ::F5S, SystemZ::F6S, SystemZ::F7S,77 SystemZ::F8S, SystemZ::F9S, SystemZ::F10S, SystemZ::F11S,78 SystemZ::F12S, SystemZ::F13S, SystemZ::F14S, SystemZ::F15S};79 80const unsigned SystemZMC::FP64Regs[16] = {81 SystemZ::F0D, SystemZ::F1D, SystemZ::F2D, SystemZ::F3D,82 SystemZ::F4D, SystemZ::F5D, SystemZ::F6D, SystemZ::F7D,83 SystemZ::F8D, SystemZ::F9D, SystemZ::F10D, SystemZ::F11D,84 SystemZ::F12D, SystemZ::F13D, SystemZ::F14D, SystemZ::F15D};85 86const unsigned SystemZMC::FP128Regs[16] = {87 SystemZ::F0Q, SystemZ::F1Q, 0, 0, SystemZ::F4Q, SystemZ::F5Q, 0, 0,88 SystemZ::F8Q, SystemZ::F9Q, 0, 0, SystemZ::F12Q, SystemZ::F13Q, 0, 0};89 90const unsigned SystemZMC::VR16Regs[32] = {91 SystemZ::F0H, SystemZ::F1H, SystemZ::F2H, SystemZ::F3H, SystemZ::F4H,92 SystemZ::F5H, SystemZ::F6H, SystemZ::F7H, SystemZ::F8H, SystemZ::F9H,93 SystemZ::F10H, SystemZ::F11H, SystemZ::F12H, SystemZ::F13H, SystemZ::F14H,94 SystemZ::F15H, SystemZ::F16H, SystemZ::F17H, SystemZ::F18H, SystemZ::F19H,95 SystemZ::F20H, SystemZ::F21H, SystemZ::F22H, SystemZ::F23H, SystemZ::F24H,96 SystemZ::F25H, SystemZ::F26H, SystemZ::F27H, SystemZ::F28H, SystemZ::F29H,97 SystemZ::F30H, SystemZ::F31H};98 99const unsigned SystemZMC::VR32Regs[32] = {100 SystemZ::F0S, SystemZ::F1S, SystemZ::F2S, SystemZ::F3S, SystemZ::F4S,101 SystemZ::F5S, SystemZ::F6S, SystemZ::F7S, SystemZ::F8S, SystemZ::F9S,102 SystemZ::F10S, SystemZ::F11S, SystemZ::F12S, SystemZ::F13S, SystemZ::F14S,103 SystemZ::F15S, SystemZ::F16S, SystemZ::F17S, SystemZ::F18S, SystemZ::F19S,104 SystemZ::F20S, SystemZ::F21S, SystemZ::F22S, SystemZ::F23S, SystemZ::F24S,105 SystemZ::F25S, SystemZ::F26S, SystemZ::F27S, SystemZ::F28S, SystemZ::F29S,106 SystemZ::F30S, SystemZ::F31S};107 108const unsigned SystemZMC::VR64Regs[32] = {109 SystemZ::F0D, SystemZ::F1D, SystemZ::F2D, SystemZ::F3D, SystemZ::F4D,110 SystemZ::F5D, SystemZ::F6D, SystemZ::F7D, SystemZ::F8D, SystemZ::F9D,111 SystemZ::F10D, SystemZ::F11D, SystemZ::F12D, SystemZ::F13D, SystemZ::F14D,112 SystemZ::F15D, SystemZ::F16D, SystemZ::F17D, SystemZ::F18D, SystemZ::F19D,113 SystemZ::F20D, SystemZ::F21D, SystemZ::F22D, SystemZ::F23D, SystemZ::F24D,114 SystemZ::F25D, SystemZ::F26D, SystemZ::F27D, SystemZ::F28D, SystemZ::F29D,115 SystemZ::F30D, SystemZ::F31D};116 117const unsigned SystemZMC::VR128Regs[32] = {118 SystemZ::V0, SystemZ::V1, SystemZ::V2, SystemZ::V3, SystemZ::V4,119 SystemZ::V5, SystemZ::V6, SystemZ::V7, SystemZ::V8, SystemZ::V9,120 SystemZ::V10, SystemZ::V11, SystemZ::V12, SystemZ::V13, SystemZ::V14,121 SystemZ::V15, SystemZ::V16, SystemZ::V17, SystemZ::V18, SystemZ::V19,122 SystemZ::V20, SystemZ::V21, SystemZ::V22, SystemZ::V23, SystemZ::V24,123 SystemZ::V25, SystemZ::V26, SystemZ::V27, SystemZ::V28, SystemZ::V29,124 SystemZ::V30, SystemZ::V31};125 126const unsigned SystemZMC::AR32Regs[16] = {127 SystemZ::A0, SystemZ::A1, SystemZ::A2, SystemZ::A3,128 SystemZ::A4, SystemZ::A5, SystemZ::A6, SystemZ::A7,129 SystemZ::A8, SystemZ::A9, SystemZ::A10, SystemZ::A11,130 SystemZ::A12, SystemZ::A13, SystemZ::A14, SystemZ::A15};131 132const unsigned SystemZMC::CR64Regs[16] = {133 SystemZ::C0, SystemZ::C1, SystemZ::C2, SystemZ::C3,134 SystemZ::C4, SystemZ::C5, SystemZ::C6, SystemZ::C7,135 SystemZ::C8, SystemZ::C9, SystemZ::C10, SystemZ::C11,136 SystemZ::C12, SystemZ::C13, SystemZ::C14, SystemZ::C15};137 138unsigned SystemZMC::getFirstReg(unsigned Reg) {139 static unsigned Map[SystemZ::NUM_TARGET_REGS];140 static bool Initialized = false;141 if (!Initialized) {142 for (unsigned I = 0; I < 16; ++I) {143 Map[GR32Regs[I]] = I;144 Map[GRH32Regs[I]] = I;145 Map[GR64Regs[I]] = I;146 Map[GR128Regs[I]] = I;147 Map[FP128Regs[I]] = I;148 Map[AR32Regs[I]] = I;149 }150 for (unsigned I = 0; I < 32; ++I) {151 Map[VR16Regs[I]] = I;152 Map[VR32Regs[I]] = I;153 Map[VR64Regs[I]] = I;154 Map[VR128Regs[I]] = I;155 }156 }157 assert(Reg < SystemZ::NUM_TARGET_REGS);158 return Map[Reg];159}160 161static MCAsmInfo *createSystemZMCAsmInfo(const MCRegisterInfo &MRI,162 const Triple &TT,163 const MCTargetOptions &Options) {164 if (TT.isOSzOS())165 return new SystemZMCAsmInfoGOFF(TT);166 167 MCAsmInfo *MAI = new SystemZMCAsmInfoELF(TT);168 MCCFIInstruction Inst = MCCFIInstruction::cfiDefCfa(169 nullptr, MRI.getDwarfRegNum(SystemZ::R15D, true),170 SystemZMC::ELFCFAOffsetFromInitialSP);171 MAI->addInitialFrameState(Inst);172 return MAI;173}174 175static MCInstrInfo *createSystemZMCInstrInfo() {176 MCInstrInfo *X = new MCInstrInfo();177 InitSystemZMCInstrInfo(X);178 return X;179}180 181static MCRegisterInfo *createSystemZMCRegisterInfo(const Triple &TT) {182 MCRegisterInfo *X = new MCRegisterInfo();183 InitSystemZMCRegisterInfo(X, SystemZ::R14D);184 return X;185}186 187static MCSubtargetInfo *188createSystemZMCSubtargetInfo(const Triple &TT, StringRef CPU, StringRef FS) {189 return createSystemZMCSubtargetInfoImpl(TT, CPU, /*TuneCPU*/ CPU, FS);190}191 192static MCInstPrinter *createSystemZMCInstPrinter(const Triple &T,193 unsigned SyntaxVariant,194 const MCAsmInfo &MAI,195 const MCInstrInfo &MII,196 const MCRegisterInfo &MRI) {197 if (SyntaxVariant == AD_HLASM)198 return new SystemZHLASMInstPrinter(MAI, MII, MRI);199 200 return new SystemZGNUInstPrinter(MAI, MII, MRI);201}202 203static MCTargetStreamer *createAsmTargetStreamer(MCStreamer &S,204 formatted_raw_ostream &OS,205 MCInstPrinter *InstPrint) {206 if (S.getContext().getTargetTriple().isOSzOS() && !GNUAsOnzOSCL)207 return new SystemZTargetHLASMStreamer(S, OS);208 else209 return new SystemZTargetGNUStreamer(S, OS);210}211 212static MCStreamer *createSystemZAsmStreamer(213 MCContext &Ctx, std::unique_ptr<formatted_raw_ostream> OS,214 std::unique_ptr<MCInstPrinter> IP, std::unique_ptr<MCCodeEmitter> CE,215 std::unique_ptr<MCAsmBackend> TAB) {216 217 auto TT = Ctx.getTargetTriple();218 if (TT.isOSzOS() && !GNUAsOnzOSCL)219 return new SystemZHLASMAsmStreamer(Ctx, std::move(OS), std::move(IP),220 std::move(CE), std::move(TAB));221 222 return llvm::createAsmStreamer(Ctx, std::move(OS), std::move(IP),223 std::move(CE), std::move(TAB));224}225 226static MCTargetStreamer *227createObjectTargetStreamer(MCStreamer &S, const MCSubtargetInfo &STI) {228 if (S.getContext().getTargetTriple().isOSzOS())229 return new SystemZTargetGOFFStreamer(S);230 else231 return new SystemZTargetELFStreamer(S);232}233 234static MCTargetStreamer *235createNullTargetStreamer(MCStreamer &S) {236 return new SystemZTargetStreamer(S);237}238 239static MCInstrAnalysis *createSystemZMCInstrAnalysis(const MCInstrInfo *Info) {240 return new MCInstrAnalysis(Info);241}242 243extern "C" LLVM_ABI LLVM_EXTERNAL_VISIBILITY void244LLVMInitializeSystemZTargetMC() {245 // Register the MCAsmInfo.246 TargetRegistry::RegisterMCAsmInfo(getTheSystemZTarget(),247 createSystemZMCAsmInfo);248 249 // Register the MCCodeEmitter.250 TargetRegistry::RegisterMCCodeEmitter(getTheSystemZTarget(),251 createSystemZMCCodeEmitter);252 253 // Register the MCInstrInfo.254 TargetRegistry::RegisterMCInstrInfo(getTheSystemZTarget(),255 createSystemZMCInstrInfo);256 257 // Register the MCRegisterInfo.258 TargetRegistry::RegisterMCRegInfo(getTheSystemZTarget(),259 createSystemZMCRegisterInfo);260 261 // Register the MCSubtargetInfo.262 TargetRegistry::RegisterMCSubtargetInfo(getTheSystemZTarget(),263 createSystemZMCSubtargetInfo);264 265 // Register the MCAsmBackend.266 TargetRegistry::RegisterMCAsmBackend(getTheSystemZTarget(),267 createSystemZMCAsmBackend);268 269 // Register the MCInstPrinter.270 TargetRegistry::RegisterMCInstPrinter(getTheSystemZTarget(),271 createSystemZMCInstPrinter);272 273 // Register the asm streamer.274 TargetRegistry::RegisterAsmStreamer(getTheSystemZTarget(),275 createSystemZAsmStreamer);276 277 // Register the asm target streamer.278 TargetRegistry::RegisterAsmTargetStreamer(getTheSystemZTarget(),279 createAsmTargetStreamer);280 281 // Register the obj streamer282 TargetRegistry::RegisterObjectTargetStreamer(getTheSystemZTarget(),283 createObjectTargetStreamer);284 285 // Register the null streamer286 TargetRegistry::RegisterNullTargetStreamer(getTheSystemZTarget(),287 createNullTargetStreamer);288 289 // Register the MCInstrAnalysis.290 TargetRegistry::RegisterMCInstrAnalysis(getTheSystemZTarget(),291 createSystemZMCInstrAnalysis);292}293