1c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng//===-- PPCMCTargetDesc.h - PowerPC Target Descriptions ---------*- C++ -*-===// 2c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng// 3c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng// The LLVM Compiler Infrastructure 4c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng// 5c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng// This file is distributed under the University of Illinois Open Source 6c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng// License. See LICENSE.TXT for details. 7c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng// 8c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng//===----------------------------------------------------------------------===// 9c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng// 10c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng// This file provides PowerPC specific target descriptions. 11c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng// 12c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng//===----------------------------------------------------------------------===// 13c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng 1437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#ifndef LLVM_LIB_TARGET_POWERPC_MCTARGETDESC_PPCMCTARGETDESC_H 1537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#define LLVM_LIB_TARGET_POWERPC_MCTARGETDESC_PPCMCTARGETDESC_H 16c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng 17399532b25a939d8c653fd453137bb8e01dc4b8fcRafael Espindola// GCC #defines PPC on Linux but we use it as our namespace name 18399532b25a939d8c653fd453137bb8e01dc4b8fcRafael Espindola#undef PPC 19399532b25a939d8c653fd453137bb8e01dc4b8fcRafael Espindola 20f3a86fb03d196994dc7923351f15d8ed9343013eRafael Espindola#include "llvm/Support/DataTypes.h" 210c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar#include "llvm/Support/MathExtras.h" 22f3a86fb03d196994dc7923351f15d8ed9343013eRafael Espindola 23c60f9b752381baa6c4b80c0739034660f1748c84Evan Chengnamespace llvm { 2478c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Chengclass MCAsmBackend; 25966aeb5788c242cfaca35c56c0ddc0ff778d4376Evan Chengclass MCCodeEmitter; 26966aeb5788c242cfaca35c56c0ddc0ff778d4376Evan Chengclass MCContext; 27966aeb5788c242cfaca35c56c0ddc0ff778d4376Evan Chengclass MCInstrInfo; 28f3a86fb03d196994dc7923351f15d8ed9343013eRafael Espindolaclass MCObjectWriter; 29918f55fe239f00651e396be841f2b3b6e242f98dJim Grosbachclass MCRegisterInfo; 30c60f9b752381baa6c4b80c0739034660f1748c84Evan Chengclass MCSubtargetInfo; 31c60f9b752381baa6c4b80c0739034660f1748c84Evan Chengclass Target; 326948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainarclass Triple; 33c60f9b752381baa6c4b80c0739034660f1748c84Evan Chengclass StringRef; 340c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainarclass raw_pwrite_stream; 35f3a86fb03d196994dc7923351f15d8ed9343013eRafael Espindolaclass raw_ostream; 36c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng 37c60f9b752381baa6c4b80c0739034660f1748c84Evan Chengextern Target ThePPC32Target; 38c60f9b752381baa6c4b80c0739034660f1748c84Evan Chengextern Target ThePPC64Target; 39f38cc38fa647d4e72c053c39bbe0cdec1342535fBill Schmidtextern Target ThePPC64LETarget; 404c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar 41966aeb5788c242cfaca35c56c0ddc0ff778d4376Evan ChengMCCodeEmitter *createPPCMCCodeEmitter(const MCInstrInfo &MCII, 42918f55fe239f00651e396be841f2b3b6e242f98dJim Grosbach const MCRegisterInfo &MRI, 43966aeb5788c242cfaca35c56c0ddc0ff778d4376Evan Cheng MCContext &Ctx); 44966aeb5788c242cfaca35c56c0ddc0ff778d4376Evan Cheng 45c3cee57f7d20f69a84fd88464ed8cf050e63c7adBill WendlingMCAsmBackend *createPPCAsmBackend(const Target &T, const MCRegisterInfo &MRI, 466948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar const Triple &TT, StringRef CPU); 47f3a86fb03d196994dc7923351f15d8ed9343013eRafael Espindola 480c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar/// Construct an PPC ELF object writer. 490c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga NainarMCObjectWriter *createPPCELFObjectWriter(raw_pwrite_stream &OS, bool Is64Bit, 500c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar bool IsLittleEndian, uint8_t OSABI); 510c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar/// Construct a PPC Mach-O object writer. 520c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga NainarMCObjectWriter *createPPCMachObjectWriter(raw_pwrite_stream &OS, bool Is64Bit, 53d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fang uint32_t CPUType, 54d4f9d05fde4b2cfd202a5852ec1ec3e960ef53edDavid Fang uint32_t CPUSubtype); 550c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar 560c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar/// Returns true iff Val consists of one contiguous run of 1s with any number of 570c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar/// 0s on either side. The 1s are allowed to wrap from LSB to MSB, so 580c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar/// 0x000FFF0, 0x0000FFFF, and 0xFF0000FF are all runs. 0x0F0F0000 is not, 590c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar/// since all 1s are not contiguous. 600c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainarstatic inline bool isRunOfOnes(unsigned Val, unsigned &MB, unsigned &ME) { 610c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar if (!Val) 620c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar return false; 630c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar 640c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar if (isShiftedMask_32(Val)) { 650c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar // look for the first non-zero bit 660c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar MB = countLeadingZeros(Val); 670c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar // look for the first zero bit after the run of ones 680c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar ME = countLeadingZeros((Val - 1) ^ Val); 690c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar return true; 700c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar } else { 710c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar Val = ~Val; // invert mask 720c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar if (isShiftedMask_32(Val)) { 730c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar // effectively look for the first zero bit 740c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar ME = countLeadingZeros(Val) - 1; 750c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar // effectively look for the first one bit after the run of zeros 760c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar MB = countLeadingZeros((Val - 1) ^ Val) + 1; 770c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar return true; 780c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar } 790c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar } 800c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar // no run present 810c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar return false; 820c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar} 830c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar 84c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng} // End llvm namespace 85c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng 8653856be683113838cc112331adca3717d4a520ccSylvestre Ledru// Generated files will use "namespace PPC". To avoid symbol clash, 8753856be683113838cc112331adca3717d4a520ccSylvestre Ledru// undefine PPC here. PPC may be predefined on some hosts. 8853856be683113838cc112331adca3717d4a520ccSylvestre Ledru#undef PPC 8953856be683113838cc112331adca3717d4a520ccSylvestre Ledru 90c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng// Defines symbolic names for PowerPC registers. This defines a mapping from 91c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng// register name to register number. 92c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng// 93c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng#define GET_REGINFO_ENUM 94c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng#include "PPCGenRegisterInfo.inc" 95c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng 96c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng// Defines symbolic names for the PowerPC instructions. 97c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng// 98c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng#define GET_INSTRINFO_ENUM 99c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng#include "PPCGenInstrInfo.inc" 100c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng 101c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng#define GET_SUBTARGETINFO_ENUM 102c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng#include "PPCGenSubtargetInfo.inc" 103c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng 104c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng#endif 105