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