1*9880d681SAndroid Build Coastguard Worker //===-- SystemZMCTargetDesc.h - SystemZ target descriptions -----*- C++ -*-===// 2*9880d681SAndroid Build Coastguard Worker // 3*9880d681SAndroid Build Coastguard Worker // The LLVM Compiler Infrastructure 4*9880d681SAndroid Build Coastguard Worker // 5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source 6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details. 7*9880d681SAndroid Build Coastguard Worker // 8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===// 9*9880d681SAndroid Build Coastguard Worker 10*9880d681SAndroid Build Coastguard Worker #ifndef LLVM_LIB_TARGET_SYSTEMZ_MCTARGETDESC_SYSTEMZMCTARGETDESC_H 11*9880d681SAndroid Build Coastguard Worker #define LLVM_LIB_TARGET_SYSTEMZ_MCTARGETDESC_SYSTEMZMCTARGETDESC_H 12*9880d681SAndroid Build Coastguard Worker 13*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/DataTypes.h" 14*9880d681SAndroid Build Coastguard Worker 15*9880d681SAndroid Build Coastguard Worker namespace llvm { 16*9880d681SAndroid Build Coastguard Worker 17*9880d681SAndroid Build Coastguard Worker class MCAsmBackend; 18*9880d681SAndroid Build Coastguard Worker class MCCodeEmitter; 19*9880d681SAndroid Build Coastguard Worker class MCContext; 20*9880d681SAndroid Build Coastguard Worker class MCInstrInfo; 21*9880d681SAndroid Build Coastguard Worker class MCObjectWriter; 22*9880d681SAndroid Build Coastguard Worker class MCRegisterInfo; 23*9880d681SAndroid Build Coastguard Worker class MCSubtargetInfo; 24*9880d681SAndroid Build Coastguard Worker class StringRef; 25*9880d681SAndroid Build Coastguard Worker class Target; 26*9880d681SAndroid Build Coastguard Worker class Triple; 27*9880d681SAndroid Build Coastguard Worker class raw_pwrite_stream; 28*9880d681SAndroid Build Coastguard Worker class raw_ostream; 29*9880d681SAndroid Build Coastguard Worker 30*9880d681SAndroid Build Coastguard Worker extern Target TheSystemZTarget; 31*9880d681SAndroid Build Coastguard Worker 32*9880d681SAndroid Build Coastguard Worker namespace SystemZMC { 33*9880d681SAndroid Build Coastguard Worker // How many bytes are in the ABI-defined, caller-allocated part of 34*9880d681SAndroid Build Coastguard Worker // a stack frame. 35*9880d681SAndroid Build Coastguard Worker const int64_t CallFrameSize = 160; 36*9880d681SAndroid Build Coastguard Worker 37*9880d681SAndroid Build Coastguard Worker // The offset of the DWARF CFA from the incoming stack pointer. 38*9880d681SAndroid Build Coastguard Worker const int64_t CFAOffsetFromInitialSP = CallFrameSize; 39*9880d681SAndroid Build Coastguard Worker 40*9880d681SAndroid Build Coastguard Worker // Maps of asm register numbers to LLVM register numbers, with 0 indicating 41*9880d681SAndroid Build Coastguard Worker // an invalid register. In principle we could use 32-bit and 64-bit register 42*9880d681SAndroid Build Coastguard Worker // classes directly, provided that we relegated the GPR allocation order 43*9880d681SAndroid Build Coastguard Worker // in SystemZRegisterInfo.td to an AltOrder and left the default order 44*9880d681SAndroid Build Coastguard Worker // as %r0-%r15. It seems better to provide the same interface for 45*9880d681SAndroid Build Coastguard Worker // all classes though. 46*9880d681SAndroid Build Coastguard Worker extern const unsigned GR32Regs[16]; 47*9880d681SAndroid Build Coastguard Worker extern const unsigned GRH32Regs[16]; 48*9880d681SAndroid Build Coastguard Worker extern const unsigned GR64Regs[16]; 49*9880d681SAndroid Build Coastguard Worker extern const unsigned GR128Regs[16]; 50*9880d681SAndroid Build Coastguard Worker extern const unsigned FP32Regs[16]; 51*9880d681SAndroid Build Coastguard Worker extern const unsigned FP64Regs[16]; 52*9880d681SAndroid Build Coastguard Worker extern const unsigned FP128Regs[16]; 53*9880d681SAndroid Build Coastguard Worker extern const unsigned VR32Regs[32]; 54*9880d681SAndroid Build Coastguard Worker extern const unsigned VR64Regs[32]; 55*9880d681SAndroid Build Coastguard Worker extern const unsigned VR128Regs[32]; 56*9880d681SAndroid Build Coastguard Worker 57*9880d681SAndroid Build Coastguard Worker // Return the 0-based number of the first architectural register that 58*9880d681SAndroid Build Coastguard Worker // contains the given LLVM register. E.g. R1D -> 1. 59*9880d681SAndroid Build Coastguard Worker unsigned getFirstReg(unsigned Reg); 60*9880d681SAndroid Build Coastguard Worker 61*9880d681SAndroid Build Coastguard Worker // Return the given register as a GR64. getRegAsGR64(unsigned Reg)62*9880d681SAndroid Build Coastguard Workerinline unsigned getRegAsGR64(unsigned Reg) { 63*9880d681SAndroid Build Coastguard Worker return GR64Regs[getFirstReg(Reg)]; 64*9880d681SAndroid Build Coastguard Worker } 65*9880d681SAndroid Build Coastguard Worker 66*9880d681SAndroid Build Coastguard Worker // Return the given register as a low GR32. getRegAsGR32(unsigned Reg)67*9880d681SAndroid Build Coastguard Workerinline unsigned getRegAsGR32(unsigned Reg) { 68*9880d681SAndroid Build Coastguard Worker return GR32Regs[getFirstReg(Reg)]; 69*9880d681SAndroid Build Coastguard Worker } 70*9880d681SAndroid Build Coastguard Worker 71*9880d681SAndroid Build Coastguard Worker // Return the given register as a high GR32. getRegAsGRH32(unsigned Reg)72*9880d681SAndroid Build Coastguard Workerinline unsigned getRegAsGRH32(unsigned Reg) { 73*9880d681SAndroid Build Coastguard Worker return GRH32Regs[getFirstReg(Reg)]; 74*9880d681SAndroid Build Coastguard Worker } 75*9880d681SAndroid Build Coastguard Worker 76*9880d681SAndroid Build Coastguard Worker // Return the given register as a VR128. getRegAsVR128(unsigned Reg)77*9880d681SAndroid Build Coastguard Workerinline unsigned getRegAsVR128(unsigned Reg) { 78*9880d681SAndroid Build Coastguard Worker return VR128Regs[getFirstReg(Reg)]; 79*9880d681SAndroid Build Coastguard Worker } 80*9880d681SAndroid Build Coastguard Worker } // end namespace SystemZMC 81*9880d681SAndroid Build Coastguard Worker 82*9880d681SAndroid Build Coastguard Worker MCCodeEmitter *createSystemZMCCodeEmitter(const MCInstrInfo &MCII, 83*9880d681SAndroid Build Coastguard Worker const MCRegisterInfo &MRI, 84*9880d681SAndroid Build Coastguard Worker MCContext &Ctx); 85*9880d681SAndroid Build Coastguard Worker 86*9880d681SAndroid Build Coastguard Worker MCAsmBackend *createSystemZMCAsmBackend(const Target &T, 87*9880d681SAndroid Build Coastguard Worker const MCRegisterInfo &MRI, 88*9880d681SAndroid Build Coastguard Worker const Triple &TT, StringRef CPU); 89*9880d681SAndroid Build Coastguard Worker 90*9880d681SAndroid Build Coastguard Worker MCObjectWriter *createSystemZObjectWriter(raw_pwrite_stream &OS, uint8_t OSABI); 91*9880d681SAndroid Build Coastguard Worker } // end namespace llvm 92*9880d681SAndroid Build Coastguard Worker 93*9880d681SAndroid Build Coastguard Worker // Defines symbolic names for SystemZ registers. 94*9880d681SAndroid Build Coastguard Worker // This defines a mapping from register name to register number. 95*9880d681SAndroid Build Coastguard Worker #define GET_REGINFO_ENUM 96*9880d681SAndroid Build Coastguard Worker #include "SystemZGenRegisterInfo.inc" 97*9880d681SAndroid Build Coastguard Worker 98*9880d681SAndroid Build Coastguard Worker // Defines symbolic names for the SystemZ instructions. 99*9880d681SAndroid Build Coastguard Worker #define GET_INSTRINFO_ENUM 100*9880d681SAndroid Build Coastguard Worker #include "SystemZGenInstrInfo.inc" 101*9880d681SAndroid Build Coastguard Worker 102*9880d681SAndroid Build Coastguard Worker #define GET_SUBTARGETINFO_ENUM 103*9880d681SAndroid Build Coastguard Worker #include "SystemZGenSubtargetInfo.inc" 104*9880d681SAndroid Build Coastguard Worker 105*9880d681SAndroid Build Coastguard Worker #endif 106