This method was never implemented
[oota-llvm.git] / lib / Target / SparcV9 / SparcV9Internals.h
1 //===-- SparcV9Internals.h --------------------------------------*- C++ -*-===//
2 // 
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file was developed by the LLVM research group and is distributed under
6 // the University of Illinois Open Source License. See LICENSE.TXT for details.
7 // 
8 //===----------------------------------------------------------------------===//
9 // 
10 // This file defines stuff that is to be private to the SparcV9 backend, but is
11 // shared among different portions of the backend.
12 //
13 //===----------------------------------------------------------------------===//
14
15 #ifndef SPARCV9INTERNALS_H
16 #define SPARCV9INTERNALS_H
17
18 #include "llvm/CodeGen/MachineInstrBuilder.h"
19 #include "llvm/Target/TargetMachine.h"
20 #include "llvm/Target/TargetSchedInfo.h"
21 #include "llvm/Target/TargetFrameInfo.h"
22 #include "SparcV9RegInfo.h"
23 #include "llvm/Type.h"
24 #include "SparcV9RegClassInfo.h"
25 #include "llvm/Config/sys/types.h"
26
27 namespace llvm {
28
29 class LiveRange;
30 class SparcV9TargetMachine;
31 class ModulePass;
32 class GetElementPtrInst;
33
34 enum SparcV9InstrSchedClass {
35   SPARC_NONE,           /* Instructions with no scheduling restrictions */
36   SPARC_IEUN,           /* Integer class that can use IEU0 or IEU1 */
37   SPARC_IEU0,           /* Integer class IEU0 */
38   SPARC_IEU1,           /* Integer class IEU1 */
39   SPARC_FPM,            /* FP Multiply or Divide instructions */
40   SPARC_FPA,            /* All other FP instructions */ 
41   SPARC_CTI,            /* Control-transfer instructions */
42   SPARC_LD,             /* Load instructions */
43   SPARC_ST,             /* Store instructions */
44   SPARC_SINGLE,         /* Instructions that must issue by themselves */
45   
46   SPARC_INV,            /* This should stay at the end for the next value */
47   SPARC_NUM_SCHED_CLASSES = SPARC_INV
48 };
49
50
51 //---------------------------------------------------------------------------
52 // enum SparcV9MachineOpCode. 
53 // const TargetInstrDescriptor SparcV9MachineInstrDesc[]
54 // 
55 // Purpose:
56 //   Description of UltraSparcV9 machine instructions.
57 // 
58 //---------------------------------------------------------------------------
59
60 namespace V9 {
61   enum SparcV9MachineOpCode {
62 #define I(ENUM, OPCODESTRING, NUMOPERANDS, RESULTPOS, MAXIMM, IMMSE, \
63           NUMDELAYSLOTS, LATENCY, SCHEDCLASS, INSTFLAGS)             \
64    ENUM,
65 #include "SparcV9Instr.def"
66
67     // End-of-array marker
68     INVALID_OPCODE,
69     NUM_REAL_OPCODES = PHI,             // number of valid opcodes
70     NUM_TOTAL_OPCODES = INVALID_OPCODE
71   };
72 }
73
74 // Array of machine instruction descriptions...
75 extern const TargetInstrDescriptor SparcV9MachineInstrDesc[];
76
77 //---------------------------------------------------------------------------
78 // class SparcV9SchedInfo
79 // 
80 // Purpose:
81 //   Interface to instruction scheduling information for UltraSPARC.
82 //   The parameter values above are based on UltraSPARC IIi.
83 //---------------------------------------------------------------------------
84
85 class SparcV9SchedInfo: public TargetSchedInfo {
86 public:
87   SparcV9SchedInfo(const TargetMachine &tgt);
88 protected:
89   virtual void initializeResources();
90 };
91
92 /// createStackSlotsPass - External interface to stack-slots pass that enters 2
93 /// empty slots at the top of each function stack
94 ///
95 FunctionPass *createStackSlotsPass(const TargetMachine &TM);
96
97 /// Specializes LLVM code for a target machine.
98 ///
99 FunctionPass *createPreSelectionPass(const TargetMachine &TM);
100
101 // DecomposeMultiDimRefs - Convert multi-dimensional references consisting of
102 // any combination of 2 or more array and structure indices into a sequence of
103 // instructions (using getelementpr and cast) so that each instruction has at
104 // most one index (except structure references, which need an extra leading
105 // index of [0]).
106 // This pass decomposes all multi-dimensional references in a function.
107 FunctionPass *createDecomposeMultiDimRefsPass();
108
109 // This function decomposes a single instance of such a reference.
110 // Return value: true if the instruction was replaced; false otherwise.
111 // 
112 bool DecomposeArrayRef(GetElementPtrInst* GEP);
113
114 /// Peephole optimization pass operating on machine code
115 ///
116 FunctionPass *createPeepholeOptsPass(const TargetMachine &TM);
117
118 /// Writes out assembly code for the module, one function at a time
119 ///
120 FunctionPass *createAsmPrinterPass(std::ostream &Out, TargetMachine &TM);
121
122 /// getPrologEpilogInsertionPass - Inserts prolog/epilog code.
123 ///
124 FunctionPass* createPrologEpilogInsertionPass();
125
126 /// getBytecodeAsmPrinterPass - Emits final LLVM bytecode to assembly file.
127 ///
128 ModulePass* createBytecodeAsmPrinterPass(std::ostream &Out);
129
130 FunctionPass *createSparcV9MachineCodeDestructionPass();
131
132 } // End llvm namespace
133
134 #endif