blob: a577f47388374123df0829b6efbf1cd654291629 [file] [log] [blame]
Chris Lattner959a5fb2002-08-09 20:08:06 +00001//===-- SparcInternals.h ----------------------------------------*- C++ -*-===//
Vikram S. Adve6fcb2892001-11-08 04:55:13 +00002//
Chris Lattner959a5fb2002-08-09 20:08:06 +00003// This file defines stuff that is to be private to the Sparc backend, but is
4// shared among different portions of the backend.
5//
6//===----------------------------------------------------------------------===//
Chris Lattner5fae0de2001-09-14 03:56:45 +00007
8#ifndef SPARC_INTERNALS_H
9#define SPARC_INTERNALS_H
10
Ruchira Sasankadfc6c882001-09-18 22:52:44 +000011#include "llvm/Target/TargetMachine.h"
Chris Lattnerf9781b52002-12-29 03:13:05 +000012#include "llvm/Target/TargetSchedInfo.h"
Chris Lattner871e5912002-12-28 21:00:25 +000013#include "llvm/Target/TargetFrameInfo.h"
Chris Lattner83d835d2002-12-29 02:50:33 +000014#include "llvm/Target/TargetCacheInfo.h"
Chris Lattnerf9781b52002-12-29 03:13:05 +000015#include "llvm/Target/TargetRegInfo.h"
Chris Lattner83d835d2002-12-29 02:50:33 +000016#include "llvm/Target/TargetOptInfo.h"
Chris Lattner5fae0de2001-09-14 03:56:45 +000017#include "llvm/Type.h"
Chris Lattner8d44b992001-09-14 16:56:32 +000018#include <sys/types.h>
Chris Lattner5fae0de2001-09-14 03:56:45 +000019
Chris Lattner38aa77b2002-02-03 23:42:19 +000020class LiveRange;
Chris Lattnerf8464e42001-09-14 04:32:55 +000021class UltraSparc;
Chris Lattner38aa77b2002-02-03 23:42:19 +000022class PhyRegAlloc;
Chris Lattner35b90c22002-04-09 05:16:36 +000023class Pass;
Chris Lattner38aa77b2002-02-03 23:42:19 +000024
Chris Lattner5fae0de2001-09-14 03:56:45 +000025enum SparcInstrSchedClass {
26 SPARC_NONE, /* Instructions with no scheduling restrictions */
27 SPARC_IEUN, /* Integer class that can use IEU0 or IEU1 */
28 SPARC_IEU0, /* Integer class IEU0 */
29 SPARC_IEU1, /* Integer class IEU1 */
30 SPARC_FPM, /* FP Multiply or Divide instructions */
31 SPARC_FPA, /* All other FP instructions */
32 SPARC_CTI, /* Control-transfer instructions */
33 SPARC_LD, /* Load instructions */
34 SPARC_ST, /* Store instructions */
35 SPARC_SINGLE, /* Instructions that must issue by themselves */
36
37 SPARC_INV, /* This should stay at the end for the next value */
38 SPARC_NUM_SCHED_CLASSES = SPARC_INV
39};
40
Chris Lattner5fae0de2001-09-14 03:56:45 +000041
42//---------------------------------------------------------------------------
43// enum SparcMachineOpCode.
Chris Lattnerb4d58d72003-01-14 22:00:31 +000044// const TargetInstrDescriptor SparcMachineInstrDesc[]
Chris Lattner5fae0de2001-09-14 03:56:45 +000045//
46// Purpose:
47// Description of UltraSparc machine instructions.
48//
49//---------------------------------------------------------------------------
50
Chris Lattner5fae0de2001-09-14 03:56:45 +000051enum SparcMachineOpCode {
Chris Lattnere86a0232001-09-19 15:56:23 +000052#define I(ENUM, OPCODESTRING, NUMOPERANDS, RESULTPOS, MAXIMM, IMMSE, \
53 NUMDELAYSLOTS, LATENCY, SCHEDCLASS, INSTFLAGS) \
54 ENUM,
55#include "SparcInstr.def"
Chris Lattner5fae0de2001-09-14 03:56:45 +000056
Chris Lattner5fae0de2001-09-14 03:56:45 +000057 // End-of-array marker
58 INVALID_OPCODE,
Vikram S. Adve7c1a8d62001-10-22 13:31:53 +000059 NUM_REAL_OPCODES = PHI, // number of valid opcodes
Chris Lattner5fae0de2001-09-14 03:56:45 +000060 NUM_TOTAL_OPCODES = INVALID_OPCODE
61};
62
Chris Lattner5fae0de2001-09-14 03:56:45 +000063
Chris Lattnere86a0232001-09-19 15:56:23 +000064// Array of machine instruction descriptions...
Chris Lattnerb4d58d72003-01-14 22:00:31 +000065extern const TargetInstrDescriptor SparcMachineInstrDesc[];
Chris Lattner5fae0de2001-09-14 03:56:45 +000066
67
68//---------------------------------------------------------------------------
69// class UltraSparcInstrInfo
70//
71// Purpose:
72// Information about individual instructions.
73// Most information is stored in the SparcMachineInstrDesc array above.
74// Other information is computed on demand, and most such functions
Chris Lattnerb4d58d72003-01-14 22:00:31 +000075// default to member functions in base class TargetInstrInfo.
Chris Lattner5fae0de2001-09-14 03:56:45 +000076//---------------------------------------------------------------------------
77
Chris Lattnerb4d58d72003-01-14 22:00:31 +000078struct UltraSparcInstrInfo : public TargetInstrInfo {
Chris Lattner01efae02002-10-29 15:45:20 +000079 UltraSparcInstrInfo();
Vikram S. Adve7e833072001-11-14 18:48:36 +000080
81 //
Vikram S. Adve0513e012002-03-18 03:02:42 +000082 // All immediate constants are in position 1 except the
Vikram S. Adve36d3e032002-09-16 15:39:26 +000083 // store instructions and SETxx.
Vikram S. Adve7e833072001-11-14 18:48:36 +000084 //
Vikram S. Adve0513e012002-03-18 03:02:42 +000085 virtual int getImmedConstantPos(MachineOpCode opCode) const {
Vikram S. Adve7e833072001-11-14 18:48:36 +000086 bool ignore;
87 if (this->maxImmedConstant(opCode, ignore) != 0)
88 {
Vikram S. Adve5eb69422002-07-08 23:34:10 +000089 assert(! this->isStore((MachineOpCode) STB - 1)); // 1st store opcode
90 assert(! this->isStore((MachineOpCode) STXFSR+1));// last store opcode
Vikram S. Adve36d3e032002-09-16 15:39:26 +000091 if (opCode==SETSW || opCode==SETUW || opCode==SETX || opCode==SETHI)
92 return 0;
93 if (opCode >= STB && opCode <= STXFSR)
94 return 2;
95 return 1;
Vikram S. Adve7e833072001-11-14 18:48:36 +000096 }
97 else
98 return -1;
99 }
Chris Lattner5fae0de2001-09-14 03:56:45 +0000100
Vikram S. Adve505130c2001-10-18 00:02:06 +0000101 virtual bool hasResultInterlock (MachineOpCode opCode) const
Chris Lattner5fae0de2001-09-14 03:56:45 +0000102 {
103 // All UltraSPARC instructions have interlocks (note that delay slots
104 // are not considered here).
105 // However, instructions that use the result of an FCMP produce a
106 // 9-cycle stall if they are issued less than 3 cycles after the FCMP.
107 // Force the compiler to insert a software interlock (i.e., gap of
108 // 2 other groups, including NOPs if necessary).
109 return (opCode == FCMPS || opCode == FCMPD || opCode == FCMPQ);
110 }
111
Vikram S. Adve505130c2001-10-18 00:02:06 +0000112 //-------------------------------------------------------------------------
Vikram S. Adve36d3e032002-09-16 15:39:26 +0000113 // Queries about representation of LLVM quantities (e.g., constants)
114 //-------------------------------------------------------------------------
115
116 virtual bool ConstantMayNotFitInImmedField(const Constant* CV,
117 const Instruction* I) const;
118
119 //-------------------------------------------------------------------------
Vikram S. Adve505130c2001-10-18 00:02:06 +0000120 // Code generation support for creating individual machine instructions
121 //-------------------------------------------------------------------------
Vikram S. Advebbf45f62002-09-20 00:52:09 +0000122
123 // Get certain common op codes for the current target. This and all the
124 // Create* methods below should be moved to a machine code generation class
125 //
126 virtual MachineOpCode getNOPOpCode() const { return NOP; }
127
Vikram S. Adve505130c2001-10-18 00:02:06 +0000128 // Create an instruction sequence to put the constant `val' into
Vikram S. Advee9327f02002-05-19 15:25:51 +0000129 // the virtual register `dest'. `val' may be a Constant or a
130 // GlobalValue, viz., the constant address of a global variable or function.
131 // The generated instructions are returned in `mvec'.
132 // Any temp. registers (TmpInstruction) created are recorded in mcfi.
133 // Any stack space required is allocated via mcff.
Vikram S. Adve505130c2001-10-18 00:02:06 +0000134 //
Vikram S. Advee9327f02002-05-19 15:25:51 +0000135 virtual void CreateCodeToLoadConst(const TargetMachine& target,
136 Function* F,
Vikram S. Adve0513e012002-03-18 03:02:42 +0000137 Value* val,
Vikram S. Adve505130c2001-10-18 00:02:06 +0000138 Instruction* dest,
Vikram S. Advee9327f02002-05-19 15:25:51 +0000139 std::vector<MachineInstr*>& mvec,
140 MachineCodeForInstruction& mcfi) const;
Vikram S. Adve6fcb2892001-11-08 04:55:13 +0000141
Vikram S. Adve367f34f2001-11-09 02:15:52 +0000142 // Create an instruction sequence to copy an integer value `val'
143 // to a floating point value `dest' by copying to memory and back.
144 // val must be an integral type. dest must be a Float or Double.
Vikram S. Advee9327f02002-05-19 15:25:51 +0000145 // The generated instructions are returned in `mvec'.
146 // Any temp. registers (TmpInstruction) created are recorded in mcfi.
147 // Any stack space required is allocated via mcff.
Vikram S. Adve6fcb2892001-11-08 04:55:13 +0000148 //
Vikram S. Advee9327f02002-05-19 15:25:51 +0000149 virtual void CreateCodeToCopyIntToFloat(const TargetMachine& target,
150 Function* F,
151 Value* val,
152 Instruction* dest,
153 std::vector<MachineInstr*>& mvec,
154 MachineCodeForInstruction& mcfi) const;
Vikram S. Adve367f34f2001-11-09 02:15:52 +0000155
156 // Similarly, create an instruction sequence to copy an FP value
157 // `val' to an integer value `dest' by copying to memory and back.
Vikram S. Advee9327f02002-05-19 15:25:51 +0000158 // The generated instructions are returned in `mvec'.
159 // Any temp. registers (TmpInstruction) created are recorded in mcfi.
160 // Any stack space required is allocated via mcff.
Vikram S. Adve367f34f2001-11-09 02:15:52 +0000161 //
Vikram S. Advee9327f02002-05-19 15:25:51 +0000162 virtual void CreateCodeToCopyFloatToInt(const TargetMachine& target,
163 Function* F,
164 Value* val,
165 Instruction* dest,
166 std::vector<MachineInstr*>& mvec,
167 MachineCodeForInstruction& mcfi) const;
168
169 // Create instruction(s) to copy src to dest, for arbitrary types
170 // The generated instructions are returned in `mvec'.
171 // Any temp. registers (TmpInstruction) created are recorded in mcfi.
172 // Any stack space required is allocated via mcff.
173 //
Vikram S. Adve0513e012002-03-18 03:02:42 +0000174 virtual void CreateCopyInstructionsByType(const TargetMachine& target,
Vikram S. Advee9327f02002-05-19 15:25:51 +0000175 Function* F,
176 Value* src,
177 Instruction* dest,
178 std::vector<MachineInstr*>& mvec,
179 MachineCodeForInstruction& mcfi) const;
180
181 // Create instruction sequence to produce a sign-extended register value
182 // from an arbitrary sized value (sized in bits, not bytes).
Vikram S. Advef5d585d2002-09-05 18:34:31 +0000183 // The generated instructions are appended to `mvec'.
184 // Any temp. registers (TmpInstruction) created are recorded in mcfi.
Vikram S. Advee9327f02002-05-19 15:25:51 +0000185 // Any stack space required is allocated via mcff.
186 //
187 virtual void CreateSignExtensionInstructions(const TargetMachine& target,
188 Function* F,
Vikram S. Advef5d585d2002-09-05 18:34:31 +0000189 Value* srcVal,
Vikram S. Adve40e23472002-09-27 14:29:45 +0000190 Value* destVal,
191 unsigned int numLowBits,
Vikram S. Advef5d585d2002-09-05 18:34:31 +0000192 std::vector<MachineInstr*>& mvec,
193 MachineCodeForInstruction& mcfi) const;
194
195 // Create instruction sequence to produce a zero-extended register value
196 // from an arbitrary sized value (sized in bits, not bytes).
197 // The generated instructions are appended to `mvec'.
198 // Any temp. registers (TmpInstruction) created are recorded in mcfi.
199 // Any stack space required is allocated via mcff.
200 //
201 virtual void CreateZeroExtensionInstructions(const TargetMachine& target,
202 Function* F,
203 Value* srcVal,
Vikram S. Adve40e23472002-09-27 14:29:45 +0000204 Value* destVal,
205 unsigned int numLowBits,
Vikram S. Advee9327f02002-05-19 15:25:51 +0000206 std::vector<MachineInstr*>& mvec,
207 MachineCodeForInstruction& mcfi) const;
Chris Lattner5fae0de2001-09-14 03:56:45 +0000208};
209
Ruchira Sasanka7d144a82001-09-15 00:30:44 +0000210
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000211//----------------------------------------------------------------------------
212// class UltraSparcRegInfo
213//
Chris Lattnerf9781b52002-12-29 03:13:05 +0000214// This class implements the virtual class TargetRegInfo for Sparc.
Ruchira Sasanka57386b52002-01-07 20:28:49 +0000215//
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000216//----------------------------------------------------------------------------
217
Chris Lattnerf9781b52002-12-29 03:13:05 +0000218class UltraSparcRegInfo : public TargetRegInfo {
Ruchira Sasanka560b0ad2001-09-30 23:19:57 +0000219 // The actual register classes in the Sparc
Ruchira Sasanka57386b52002-01-07 20:28:49 +0000220 //
Ruchira Sasanka7d144a82001-09-15 00:30:44 +0000221 enum RegClassIDs {
Ruchira Sasanka57386b52002-01-07 20:28:49 +0000222 IntRegClassID, // Integer
223 FloatRegClassID, // Float (both single/double)
224 IntCCRegClassID, // Int Condition Code
225 FloatCCRegClassID // Float Condition code
Ruchira Sasanka7d144a82001-09-15 00:30:44 +0000226 };
227
Ruchira Sasanka560b0ad2001-09-30 23:19:57 +0000228
229 // Type of registers available in Sparc. There can be several reg types
230 // in the same class. For instace, the float reg class has Single/Double
231 // types
Ruchira Sasanka57386b52002-01-07 20:28:49 +0000232 //
Ruchira Sasanka560b0ad2001-09-30 23:19:57 +0000233 enum RegTypes {
234 IntRegType,
235 FPSingleRegType,
236 FPDoubleRegType,
237 IntCCRegType,
238 FloatCCRegType
239 };
240
Ruchira Sasanka57386b52002-01-07 20:28:49 +0000241 // **** WARNING: If the above enum order is changed, also modify
Ruchira Sasanka7d144a82001-09-15 00:30:44 +0000242 // getRegisterClassOfValue method below since it assumes this particular
243 // order for efficiency.
244
Chris Lattner5fae0de2001-09-14 03:56:45 +0000245
Ruchira Sasanka57386b52002-01-07 20:28:49 +0000246 // Number of registers used for passing int args (usually 6: %o0 - %o5)
247 //
Chris Lattner5fae0de2001-09-14 03:56:45 +0000248 unsigned const NumOfIntArgRegs;
Ruchira Sasanka57386b52002-01-07 20:28:49 +0000249
250 // Number of registers used for passing float args (usually 32: %f0 - %f31)
251 //
Chris Lattner5fae0de2001-09-14 03:56:45 +0000252 unsigned const NumOfFloatArgRegs;
Ruchira Sasanka57386b52002-01-07 20:28:49 +0000253
254 // An out of bound register number that can be used to initialize register
255 // numbers. Useful for error detection.
256 //
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +0000257 int const InvalidRegNum;
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000258
259
Ruchira Sasanka57386b52002-01-07 20:28:49 +0000260 // ======================== Private Methods =============================
Chris Lattner5fae0de2001-09-14 03:56:45 +0000261
Ruchira Sasanka57386b52002-01-07 20:28:49 +0000262 // The following methods are used to color special live ranges (e.g.
Chris Lattnerc8e66542002-04-27 06:56:12 +0000263 // function args and return values etc.) with specific hardware registers
Ruchira Sasanka57386b52002-01-07 20:28:49 +0000264 // as required. See SparcRegInfo.cpp for the implementation.
265 //
Vikram S. Adve5eb69422002-07-08 23:34:10 +0000266 void suggestReg4RetAddr(MachineInstr *RetMI,
Chris Lattner5216cc52002-02-04 05:59:25 +0000267 LiveRangeInfo &LRI) const;
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000268
Vikram S. Advecce628a2002-09-28 16:56:59 +0000269 void suggestReg4CallAddr(MachineInstr *CallMI, LiveRangeInfo &LRI) const;
Vikram S. Adve5eb69422002-07-08 23:34:10 +0000270
271 void InitializeOutgoingArg(MachineInstr* CallMI, AddedInstrns *CallAI,
Vikram S. Advee9327f02002-05-19 15:25:51 +0000272 PhyRegAlloc &PRA, LiveRange* LR,
273 unsigned regType, unsigned RegClassID,
274 int UniArgReg, unsigned int argNo,
275 std::vector<MachineInstr *>& AddedInstrnsBefore)
276 const;
277
Chris Lattnerf9fd5912003-01-15 21:14:32 +0000278 int getRegType(const Type* type) const;
Chris Lattner5216cc52002-02-04 05:59:25 +0000279 int getRegType(const LiveRange *LR) const;
Vikram S. Adve5eb69422002-07-08 23:34:10 +0000280 int getRegType(int unifiedRegNum) const;
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +0000281
Ruchira Sasanka57386b52002-01-07 20:28:49 +0000282 // Used to generate a copy instruction based on the register class of
283 // value.
284 //
Chris Lattner5216cc52002-02-04 05:59:25 +0000285 MachineInstr *cpValue2RegMI(Value *Val, unsigned DestReg,
286 int RegType) const;
Ruchira Sasanka0c085982001-11-10 21:20:43 +0000287
288
Ruchira Sasanka57386b52002-01-07 20:28:49 +0000289 // The following 2 methods are used to order the instructions addeed by
Chris Lattnerc8e66542002-04-27 06:56:12 +0000290 // the register allocator in association with function calling. See
Ruchira Sasanka57386b52002-01-07 20:28:49 +0000291 // SparcRegInfo.cpp for more details
292 //
Chris Lattner7f74a562002-01-20 22:54:45 +0000293 void moveInst2OrdVec(std::vector<MachineInstr *> &OrdVec,
294 MachineInstr *UnordInst,
295 PhyRegAlloc &PRA) const;
Ruchira Sasanka0c085982001-11-10 21:20:43 +0000296
Chris Lattner7f74a562002-01-20 22:54:45 +0000297 void OrderAddedInstrns(std::vector<MachineInstr *> &UnordVec,
298 std::vector<MachineInstr *> &OrdVec,
299 PhyRegAlloc &PRA) const;
Ruchira Sasanka0c085982001-11-10 21:20:43 +0000300
301
Vikram S. Advea77a8ee2002-04-25 04:40:24 +0000302 // Compute which register can be used for an argument, if any
303 //
304 int regNumForIntArg(bool inCallee, bool isVarArgsCall,
305 unsigned argNo, unsigned intArgNo, unsigned fpArgNo,
306 unsigned& regClassId) const;
Ruchira Sasanka0c085982001-11-10 21:20:43 +0000307
Vikram S. Advea77a8ee2002-04-25 04:40:24 +0000308 int regNumForFPArg(unsigned RegType, bool inCallee, bool isVarArgsCall,
309 unsigned argNo, unsigned intArgNo, unsigned fpArgNo,
310 unsigned& regClassId) const;
311
Chris Lattner5216cc52002-02-04 05:59:25 +0000312public:
313 UltraSparcRegInfo(const UltraSparc &tgt);
Ruchira Sasanka7d144a82001-09-15 00:30:44 +0000314
Vikram S. Adve0513e012002-03-18 03:02:42 +0000315 // To find the register class used for a specified Type
Ruchira Sasanka57386b52002-01-07 20:28:49 +0000316 //
Vikram S. Adve5eb69422002-07-08 23:34:10 +0000317 unsigned getRegClassIDOfType(const Type *type,
318 bool isCCReg = false) const;
Ruchira Sasanka7d144a82001-09-15 00:30:44 +0000319
Vikram S. Adve5eb69422002-07-08 23:34:10 +0000320 // To find the register class to which a specified register belongs
321 //
322 unsigned getRegClassIDOfReg(int unifiedRegNum) const;
323 unsigned getRegClassIDOfRegType(int regType) const;
Vikram S. Adve0513e012002-03-18 03:02:42 +0000324
Chris Lattner5216cc52002-02-04 05:59:25 +0000325 // getZeroRegNum - returns the register that contains always zero this is the
326 // unified register number
Ruchira Sasanka57386b52002-01-07 20:28:49 +0000327 //
Chris Lattner5216cc52002-02-04 05:59:25 +0000328 virtual int getZeroRegNum() const;
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000329
Chris Lattner5216cc52002-02-04 05:59:25 +0000330 // getCallAddressReg - returns the reg used for pushing the address when a
Chris Lattnerc8e66542002-04-27 06:56:12 +0000331 // function is called. This can be used for other purposes between calls
Ruchira Sasanka57386b52002-01-07 20:28:49 +0000332 //
Chris Lattner5216cc52002-02-04 05:59:25 +0000333 unsigned getCallAddressReg() const;
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000334
Ruchira Sasanka57386b52002-01-07 20:28:49 +0000335 // Returns the register containing the return address.
336 // It should be made sure that this register contains the return
337 // value when a return instruction is reached.
338 //
Chris Lattner5216cc52002-02-04 05:59:25 +0000339 unsigned getReturnAddressReg() const;
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000340
Vikram S. Advee9327f02002-05-19 15:25:51 +0000341 // Number of registers used for passing int args (usually 6: %o0 - %o5)
342 // and float args (usually 32: %f0 - %f31)
343 //
344 unsigned const GetNumOfIntArgRegs() const { return NumOfIntArgRegs; }
345 unsigned const GetNumOfFloatArgRegs() const { return NumOfFloatArgRegs; }
346
Ruchira Sasanka57386b52002-01-07 20:28:49 +0000347 // The following methods are used to color special live ranges (e.g.
Chris Lattnerc8e66542002-04-27 06:56:12 +0000348 // function args and return values etc.) with specific hardware registers
Ruchira Sasanka57386b52002-01-07 20:28:49 +0000349 // as required. See SparcRegInfo.cpp for the implementation for Sparc.
350 //
Chris Lattnerf739fa82002-04-08 22:03:57 +0000351 void suggestRegs4MethodArgs(const Function *Meth,
Ruchira Sasanka560b0ad2001-09-30 23:19:57 +0000352 LiveRangeInfo& LRI) const;
Chris Lattner5fae0de2001-09-14 03:56:45 +0000353
Vikram S. Adve5eb69422002-07-08 23:34:10 +0000354 void suggestRegs4CallArgs(MachineInstr *CallMI,
Vikram S. Advecce628a2002-09-28 16:56:59 +0000355 LiveRangeInfo& LRI) const;
Chris Lattner5fae0de2001-09-14 03:56:45 +0000356
Vikram S. Adve5eb69422002-07-08 23:34:10 +0000357 void suggestReg4RetValue(MachineInstr *RetMI,
Chris Lattner7f74a562002-01-20 22:54:45 +0000358 LiveRangeInfo& LRI) const;
Vikram S. Adve5eb69422002-07-08 23:34:10 +0000359
Chris Lattnerf739fa82002-04-08 22:03:57 +0000360 void colorMethodArgs(const Function *Meth, LiveRangeInfo &LRI,
Chris Lattner5216cc52002-02-04 05:59:25 +0000361 AddedInstrns *FirstAI) const;
Ruchira Sasanka560b0ad2001-09-30 23:19:57 +0000362
Vikram S. Adve5eb69422002-07-08 23:34:10 +0000363 void colorCallArgs(MachineInstr *CallMI, LiveRangeInfo &LRI,
Chris Lattner5216cc52002-02-04 05:59:25 +0000364 AddedInstrns *CallAI, PhyRegAlloc &PRA,
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000365 const BasicBlock *BB) const;
Ruchira Sasanka560b0ad2001-09-30 23:19:57 +0000366
Vikram S. Adve5eb69422002-07-08 23:34:10 +0000367 void colorRetValue(MachineInstr *RetI, LiveRangeInfo& LRI,
Chris Lattner5216cc52002-02-04 05:59:25 +0000368 AddedInstrns *RetAI) const;
Ruchira Sasanka560b0ad2001-09-30 23:19:57 +0000369
370
Ruchira Sasanka57386b52002-01-07 20:28:49 +0000371 // method used for printing a register for debugging purposes
372 //
Chris Lattner5216cc52002-02-04 05:59:25 +0000373 static void printReg(const LiveRange *LR);
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000374
Vikram S. Adve5eb69422002-07-08 23:34:10 +0000375 // Each register class has a seperate space for register IDs. To convert
376 // a regId in a register class to a common Id, or vice versa,
377 // we use the folloing methods.
Ruchira Sasanka57386b52002-01-07 20:28:49 +0000378 //
Vikram S. Adve5eb69422002-07-08 23:34:10 +0000379 // This method provides a unique number for each register
380 inline int getUnifiedRegNum(unsigned regClassID, int reg) const {
381
382 if (regClassID == IntRegClassID) {
383 assert(reg < 32 && "Invalid reg. number");
Chris Lattner5fae0de2001-09-14 03:56:45 +0000384 return reg;
Vikram S. Adve5eb69422002-07-08 23:34:10 +0000385 }
386 else if (regClassID == FloatRegClassID) {
387 assert(reg < 64 && "Invalid reg. number");
Chris Lattner5fae0de2001-09-14 03:56:45 +0000388 return reg + 32; // we have 32 int regs
Vikram S. Adve5eb69422002-07-08 23:34:10 +0000389 }
390 else if (regClassID == FloatCCRegClassID) {
391 assert(reg < 4 && "Invalid reg. number");
Chris Lattner5fae0de2001-09-14 03:56:45 +0000392 return reg + 32 + 64; // 32 int, 64 float
Vikram S. Adve5eb69422002-07-08 23:34:10 +0000393 }
394 else if (regClassID == IntCCRegClassID ) {
395 assert(reg == 0 && "Invalid reg. number");
396 return reg + 4+ 32 + 64; // only one int CC reg
397 }
398 else if (reg==InvalidRegNum) {
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +0000399 return InvalidRegNum;
Vikram S. Adve5eb69422002-07-08 23:34:10 +0000400 }
Ruchira Sasanka7d144a82001-09-15 00:30:44 +0000401 else
Vikram S. Adve5eb69422002-07-08 23:34:10 +0000402 assert(0 && "Invalid register class");
Chris Lattner5e030832001-11-07 13:49:12 +0000403 return 0;
Chris Lattner5fae0de2001-09-14 03:56:45 +0000404 }
Vikram S. Adve5eb69422002-07-08 23:34:10 +0000405
406 // This method converts the unified number to the number in its class,
407 // and returns the class ID in regClassID.
408 inline int getClassRegNum(int ureg, unsigned& regClassID) const {
409 if (ureg < 32) { regClassID = IntRegClassID; return ureg; }
410 else if (ureg < 32+64) { regClassID = FloatRegClassID; return ureg-32; }
411 else if (ureg < 4 +96) { regClassID = FloatCCRegClassID; return ureg-96; }
412 else if (ureg < 1 +100) { regClassID = IntCCRegClassID; return ureg-100;}
413 else if (ureg == InvalidRegNum) { return InvalidRegNum; }
414 else { assert(0 && "Invalid unified register number"); }
Chris Lattner3091e112002-07-25 06:08:32 +0000415 return 0;
Vikram S. Adve5eb69422002-07-08 23:34:10 +0000416 }
417
418 // Returns the assembly-language name of the specified machine register.
Ruchira Sasanka57386b52002-01-07 20:28:49 +0000419 //
Chris Lattner56e91662002-08-12 21:25:05 +0000420 virtual const char * const getUnifiedRegName(int reg) const;
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000421
422
Ruchira Sasanka57386b52002-01-07 20:28:49 +0000423 // returns the # of bytes of stack space allocated for each register
424 // type. For Sparc, currently we allocate 8 bytes on stack for all
425 // register types. We can optimize this later if necessary to save stack
426 // space (However, should make sure that stack alignment is correct)
427 //
Chris Lattner5216cc52002-02-04 05:59:25 +0000428 inline int getSpilledRegSize(int RegType) const {
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000429 return 8;
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000430 }
431
Ruchira Sasanka57386b52002-01-07 20:28:49 +0000432
Vikram S. Adve02662bd2002-03-31 19:04:50 +0000433 // To obtain the return value and the indirect call address (if any)
434 // contained in a CALL machine instruction
Ruchira Sasanka57386b52002-01-07 20:28:49 +0000435 //
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000436 const Value * getCallInstRetVal(const MachineInstr *CallMI) const;
Vikram S. Adve02662bd2002-03-31 19:04:50 +0000437 const Value * getCallInstIndirectAddrVal(const MachineInstr *CallMI) const;
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000438
Ruchira Sasanka57386b52002-01-07 20:28:49 +0000439 // The following methods are used to generate "copy" machine instructions
440 // for an architecture.
441 //
Vikram S. Adve5eb69422002-07-08 23:34:10 +0000442 // The function regTypeNeedsScratchReg() can be used to check whether a
443 // scratch register is needed to copy a register of type `regType' to
444 // or from memory. If so, such a scratch register can be provided by
445 // the caller (e.g., if it knows which regsiters are free); otherwise
446 // an arbitrary one will be chosen and spilled by the copy instructions.
447 //
448 bool regTypeNeedsScratchReg(int RegType,
449 int& scratchRegClassId) const;
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +0000450
Vikram S. Adve5eb69422002-07-08 23:34:10 +0000451 void cpReg2RegMI(std::vector<MachineInstr*>& mvec,
452 unsigned SrcReg, unsigned DestReg,
453 int RegType) const;
454
455 void cpReg2MemMI(std::vector<MachineInstr*>& mvec,
456 unsigned SrcReg, unsigned DestPtrReg,
457 int Offset, int RegType, int scratchReg = -1) const;
458
459 void cpMem2RegMI(std::vector<MachineInstr*>& mvec,
460 unsigned SrcPtrReg, int Offset, unsigned DestReg,
461 int RegType, int scratchReg = -1) const;
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +0000462
Vikram S. Advee9327f02002-05-19 15:25:51 +0000463 void cpValue2Value(Value *Src, Value *Dest,
Anand Shukla458496c2002-06-25 20:55:50 +0000464 std::vector<MachineInstr*>& mvec) const;
Ruchira Sasankab7a39722001-11-03 17:13:27 +0000465
Ruchira Sasanka57386b52002-01-07 20:28:49 +0000466 // To see whether a register is a volatile (i.e., whehter it must be
467 // preserved acorss calls)
468 //
Chris Lattner5216cc52002-02-04 05:59:25 +0000469 inline bool isRegVolatile(int RegClassID, int Reg) const {
470 return MachineRegClassArr[RegClassID]->isRegVolatile(Reg);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +0000471 }
472
473
Chris Lattner5216cc52002-02-04 05:59:25 +0000474 virtual unsigned getFramePointer() const;
475 virtual unsigned getStackPointer() const;
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +0000476
Chris Lattner5216cc52002-02-04 05:59:25 +0000477 virtual int getInvalidRegNum() const {
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +0000478 return InvalidRegNum;
479 }
480
Ruchira Sasanka57386b52002-01-07 20:28:49 +0000481 // This method inserts the caller saving code for call instructions
482 //
Anand Shuklacf764682002-07-11 00:16:28 +0000483 void insertCallerSavingCode(std::vector<MachineInstr*>& instrnsBefore,
484 std::vector<MachineInstr*>& instrnsAfter,
Vikram S. Advec5f8b522002-07-10 21:42:42 +0000485 MachineInstr *MInst,
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000486 const BasicBlock *BB, PhyRegAlloc &PRA ) const;
Chris Lattner5fae0de2001-09-14 03:56:45 +0000487};
488
489
490
Chris Lattner5fae0de2001-09-14 03:56:45 +0000491
492//---------------------------------------------------------------------------
493// class UltraSparcSchedInfo
494//
495// Purpose:
496// Interface to instruction scheduling information for UltraSPARC.
497// The parameter values above are based on UltraSPARC IIi.
498//---------------------------------------------------------------------------
499
500
Chris Lattnerf9781b52002-12-29 03:13:05 +0000501class UltraSparcSchedInfo: public TargetSchedInfo {
Chris Lattner5fae0de2001-09-14 03:56:45 +0000502public:
Chris Lattner5216cc52002-02-04 05:59:25 +0000503 UltraSparcSchedInfo(const TargetMachine &tgt);
Chris Lattner5fae0de2001-09-14 03:56:45 +0000504protected:
Chris Lattner5216cc52002-02-04 05:59:25 +0000505 virtual void initializeResources();
Chris Lattner5fae0de2001-09-14 03:56:45 +0000506};
507
Chris Lattnerf8464e42001-09-14 04:32:55 +0000508
509//---------------------------------------------------------------------------
Vikram S. Adve7c1a8d62001-10-22 13:31:53 +0000510// class UltraSparcFrameInfo
511//
512// Purpose:
513// Interface to stack frame layout info for the UltraSPARC.
Vikram S. Adve6e9422e2001-11-12 23:26:35 +0000514// Starting offsets for each area of the stack frame are aligned at
515// a multiple of getStackFrameSizeAlignment().
Vikram S. Adve7c1a8d62001-10-22 13:31:53 +0000516//---------------------------------------------------------------------------
517
Chris Lattnerfe9b7052002-12-28 20:20:24 +0000518class UltraSparcFrameInfo: public TargetFrameInfo {
519 const TargetMachine &target;
Vikram S. Adve7c1a8d62001-10-22 13:31:53 +0000520public:
Chris Lattnerfe9b7052002-12-28 20:20:24 +0000521 UltraSparcFrameInfo(const TargetMachine &TM)
522 : TargetFrameInfo(StackGrowsDown, StackFrameSizeAlignment, 0), target(TM) {}
Vikram S. Adve6fcb2892001-11-08 04:55:13 +0000523
524public:
Vikram S. Adve36d3e032002-09-16 15:39:26 +0000525 // These methods provide constant parameters of the frame layout.
526 //
Chris Lattnerc8e66542002-04-27 06:56:12 +0000527 int getStackFrameSizeAlignment() const { return StackFrameSizeAlignment;}
528 int getMinStackFrameSize() const { return MinStackFrameSize; }
529 int getNumFixedOutgoingArgs() const { return NumFixedOutgoingArgs; }
530 int getSizeOfEachArgOnStack() const { return SizeOfEachArgOnStack; }
531 bool argsOnStackHaveFixedSize() const { return true; }
Vikram S. Adve6fcb2892001-11-08 04:55:13 +0000532
Vikram S. Adve36d3e032002-09-16 15:39:26 +0000533 // This method adjusts a stack offset to meet alignment rules of target.
534 // The fixed OFFSET (0x7ff) must be subtracted and the result aligned.
535 virtual int adjustAlignment (int unalignedOffset,
536 bool growUp,
537 unsigned int align) const {
538 return unalignedOffset + (growUp? +1:-1)*((unalignedOffset-OFFSET) % align);
539 }
540
Vikram S. Adve6fcb2892001-11-08 04:55:13 +0000541 // These methods compute offsets using the frame contents for a
Chris Lattnerc8e66542002-04-27 06:56:12 +0000542 // particular function. The frame contents are obtained from the
543 // MachineCodeInfoForMethod object for the given function.
Vikram S. Adve6fcb2892001-11-08 04:55:13 +0000544 //
Misha Brukman7ae7f842002-10-28 00:28:31 +0000545 int getFirstIncomingArgOffset (MachineFunction& mcInfo,
Vikram S. Advea77a8ee2002-04-25 04:40:24 +0000546 bool& growUp) const
Vikram S. Adve6fcb2892001-11-08 04:55:13 +0000547 {
Vikram S. Advea77a8ee2002-04-25 04:40:24 +0000548 growUp = true; // arguments area grows upwards
Vikram S. Adve6fcb2892001-11-08 04:55:13 +0000549 return FirstIncomingArgOffsetFromFP;
550 }
Misha Brukman7ae7f842002-10-28 00:28:31 +0000551 int getFirstOutgoingArgOffset (MachineFunction& mcInfo,
Vikram S. Advea77a8ee2002-04-25 04:40:24 +0000552 bool& growUp) const
Vikram S. Adve6fcb2892001-11-08 04:55:13 +0000553 {
Vikram S. Advea77a8ee2002-04-25 04:40:24 +0000554 growUp = true; // arguments area grows upwards
Vikram S. Adve6fcb2892001-11-08 04:55:13 +0000555 return FirstOutgoingArgOffsetFromSP;
556 }
Misha Brukman7ae7f842002-10-28 00:28:31 +0000557 int getFirstOptionalOutgoingArgOffset(MachineFunction& mcInfo,
Vikram S. Advea77a8ee2002-04-25 04:40:24 +0000558 bool& growUp)const
Vikram S. Adve6fcb2892001-11-08 04:55:13 +0000559 {
Vikram S. Advea77a8ee2002-04-25 04:40:24 +0000560 growUp = true; // arguments area grows upwards
Vikram S. Adve6fcb2892001-11-08 04:55:13 +0000561 return FirstOptionalOutgoingArgOffsetFromSP;
562 }
563
Misha Brukman7ae7f842002-10-28 00:28:31 +0000564 int getFirstAutomaticVarOffset (MachineFunction& mcInfo,
Vikram S. Advea77a8ee2002-04-25 04:40:24 +0000565 bool& growUp) const;
Misha Brukman7ae7f842002-10-28 00:28:31 +0000566 int getRegSpillAreaOffset (MachineFunction& mcInfo,
Vikram S. Advea77a8ee2002-04-25 04:40:24 +0000567 bool& growUp) const;
Misha Brukman7ae7f842002-10-28 00:28:31 +0000568 int getTmpAreaOffset (MachineFunction& mcInfo,
Vikram S. Advea77a8ee2002-04-25 04:40:24 +0000569 bool& growUp) const;
Misha Brukman7ae7f842002-10-28 00:28:31 +0000570 int getDynamicAreaOffset (MachineFunction& mcInfo,
Vikram S. Advea77a8ee2002-04-25 04:40:24 +0000571 bool& growUp) const;
Vikram S. Adve6fcb2892001-11-08 04:55:13 +0000572
573 //
574 // These methods specify the base register used for each stack area
575 // (generally FP or SP)
576 //
577 virtual int getIncomingArgBaseRegNum() const {
578 return (int) target.getRegInfo().getFramePointer();
579 }
580 virtual int getOutgoingArgBaseRegNum() const {
581 return (int) target.getRegInfo().getStackPointer();
582 }
583 virtual int getOptionalOutgoingArgBaseRegNum() const {
584 return (int) target.getRegInfo().getStackPointer();
585 }
586 virtual int getAutomaticVarBaseRegNum() const {
587 return (int) target.getRegInfo().getFramePointer();
588 }
589 virtual int getRegSpillAreaBaseRegNum() const {
590 return (int) target.getRegInfo().getFramePointer();
591 }
592 virtual int getDynamicAreaBaseRegNum() const {
593 return (int) target.getRegInfo().getStackPointer();
594 }
Chris Lattnerfe9b7052002-12-28 20:20:24 +0000595
596 virtual int getIncomingArgOffset(MachineFunction& mcInfo,
597 unsigned argNum) const {
598 assert(argsOnStackHaveFixedSize());
599
600 unsigned relativeOffset = argNum * getSizeOfEachArgOnStack();
601 bool growUp; // do args grow up or down
602 int firstArg = getFirstIncomingArgOffset(mcInfo, growUp);
603 return growUp ? firstArg + relativeOffset : firstArg - relativeOffset;
604 }
605
606 virtual int getOutgoingArgOffset(MachineFunction& mcInfo,
607 unsigned argNum) const {
608 assert(argsOnStackHaveFixedSize());
609 //assert(((int) argNum - this->getNumFixedOutgoingArgs())
610 // <= (int) mcInfo.getInfo()->getMaxOptionalNumArgs());
611
612 unsigned relativeOffset = argNum * getSizeOfEachArgOnStack();
613 bool growUp; // do args grow up or down
614 int firstArg = getFirstOutgoingArgOffset(mcInfo, growUp);
615 return growUp ? firstArg + relativeOffset : firstArg - relativeOffset;
616 }
Vikram S. Adve6fcb2892001-11-08 04:55:13 +0000617
618private:
Vikram S. Adve36d3e032002-09-16 15:39:26 +0000619 /*----------------------------------------------------------------------
620 This diagram shows the stack frame layout used by llc on Sparc V9.
621 Note that only the location of automatic variables, spill area,
622 temporary storage, and dynamically allocated stack area are chosen
623 by us. The rest conform to the Sparc V9 ABI.
624 All stack addresses are offset by OFFSET = 0x7ff (2047).
625
Chris Lattnerfe9b7052002-12-28 20:20:24 +0000626 Alignment assumptions and other invariants:
Vikram S. Adve36d3e032002-09-16 15:39:26 +0000627 (1) %sp+OFFSET and %fp+OFFSET are always aligned on 16-byte boundary
628 (2) Variables in automatic, spill, temporary, or dynamic regions
629 are aligned according to their size as in all memory accesses.
630 (3) Everything below the dynamically allocated stack area is only used
631 during a call to another function, so it is never needed when
632 the current function is active. This is why space can be allocated
633 dynamically by incrementing %sp any time within the function.
634
635 STACK FRAME LAYOUT:
636
637 ...
638 %fp+OFFSET+176 Optional extra incoming arguments# 1..N
639 %fp+OFFSET+168 Incoming argument #6
640 ... ...
641 %fp+OFFSET+128 Incoming argument #1
642 ... ...
643 ---%fp+OFFSET-0--------Bottom of caller's stack frame--------------------
644 %fp+OFFSET-8 Automatic variables <-- ****TOP OF STACK FRAME****
645 Spill area
646 Temporary storage
647 ...
648
649 %sp+OFFSET+176+8N Bottom of dynamically allocated stack area
650 %sp+OFFSET+168+8N Optional extra outgoing argument# N
651 ... ...
652 %sp+OFFSET+176 Optional extra outgoing argument# 1
653 %sp+OFFSET+168 Outgoing argument #6
654 ... ...
655 %sp+OFFSET+128 Outgoing argument #1
656 %sp+OFFSET+120 Save area for %i7
657 ... ...
658 %sp+OFFSET+0 Save area for %l0 <-- ****BOTTOM OF STACK FRAME****
659
660 *----------------------------------------------------------------------*/
661
Vikram S. Adve367f34f2001-11-09 02:15:52 +0000662 // All stack addresses must be offset by 0x7ff (2047) on Sparc V9.
663 static const int OFFSET = (int) 0x7ff;
Vikram S. Adve6fcb2892001-11-08 04:55:13 +0000664 static const int StackFrameSizeAlignment = 16;
Vikram S. Adve7c1a8d62001-10-22 13:31:53 +0000665 static const int MinStackFrameSize = 176;
Vikram S. Adve6fcb2892001-11-08 04:55:13 +0000666 static const int NumFixedOutgoingArgs = 6;
667 static const int SizeOfEachArgOnStack = 8;
Vikram S. Adve367f34f2001-11-09 02:15:52 +0000668 static const int FirstIncomingArgOffsetFromFP = 128 + OFFSET;
669 static const int FirstOptionalIncomingArgOffsetFromFP = 176 + OFFSET;
Vikram S. Adve36d3e032002-09-16 15:39:26 +0000670 static const int StaticAreaOffsetFromFP = 0 + OFFSET;
Vikram S. Adve367f34f2001-11-09 02:15:52 +0000671 static const int FirstOutgoingArgOffsetFromSP = 128 + OFFSET;
672 static const int FirstOptionalOutgoingArgOffsetFromSP = 176 + OFFSET;
Vikram S. Adve7c1a8d62001-10-22 13:31:53 +0000673};
674
675
Vikram S. Adve367f34f2001-11-09 02:15:52 +0000676//---------------------------------------------------------------------------
677// class UltraSparcCacheInfo
678//
679// Purpose:
680// Interface to cache parameters for the UltraSPARC.
681// Just use defaults for now.
682//---------------------------------------------------------------------------
683
Chris Lattner83d835d2002-12-29 02:50:33 +0000684struct UltraSparcCacheInfo: public TargetCacheInfo {
685 UltraSparcCacheInfo(const TargetMachine &T) : TargetCacheInfo(T) {}
Vikram S. Adve367f34f2001-11-09 02:15:52 +0000686};
687
Vikram S. Adve7c1a8d62001-10-22 13:31:53 +0000688
689//---------------------------------------------------------------------------
Vikram S. Advebbf45f62002-09-20 00:52:09 +0000690// class UltraSparcOptInfo
691//
692// Purpose:
693// Interface to machine-level optimization routines for the UltraSPARC.
694//---------------------------------------------------------------------------
695
Chris Lattner83d835d2002-12-29 02:50:33 +0000696struct UltraSparcOptInfo: public TargetOptInfo {
697 UltraSparcOptInfo(const TargetMachine &T) : TargetOptInfo(T) {}
Vikram S. Advebbf45f62002-09-20 00:52:09 +0000698
699 virtual bool IsUselessCopy (const MachineInstr* MI) const;
700};
701
702
703//---------------------------------------------------------------------------
Chris Lattnerf8464e42001-09-14 04:32:55 +0000704// class UltraSparcMachine
705//
706// Purpose:
707// Primary interface to machine description for the UltraSPARC.
708// Primarily just initializes machine-dependent parameters in
709// class TargetMachine, and creates machine-dependent subclasses
Vikram S. Adve514180e2001-09-18 13:04:24 +0000710// for classes such as InstrInfo, SchedInfo and RegInfo.
Chris Lattnerf8464e42001-09-14 04:32:55 +0000711//---------------------------------------------------------------------------
712
713class UltraSparc : public TargetMachine {
Vikram S. Adve514180e2001-09-18 13:04:24 +0000714 UltraSparcInstrInfo instrInfo;
715 UltraSparcSchedInfo schedInfo;
716 UltraSparcRegInfo regInfo;
Vikram S. Adve7c1a8d62001-10-22 13:31:53 +0000717 UltraSparcFrameInfo frameInfo;
Vikram S. Adve367f34f2001-11-09 02:15:52 +0000718 UltraSparcCacheInfo cacheInfo;
Vikram S. Advebbf45f62002-09-20 00:52:09 +0000719 UltraSparcOptInfo optInfo;
Chris Lattnerf8464e42001-09-14 04:32:55 +0000720public:
721 UltraSparc();
Vikram S. Advebbf45f62002-09-20 00:52:09 +0000722
Chris Lattnerb4d58d72003-01-14 22:00:31 +0000723 virtual const TargetInstrInfo &getInstrInfo() const { return instrInfo; }
Chris Lattnerf9781b52002-12-29 03:13:05 +0000724 virtual const TargetSchedInfo &getSchedInfo() const { return schedInfo; }
725 virtual const TargetRegInfo &getRegInfo() const { return regInfo; }
Chris Lattnerfe9b7052002-12-28 20:20:24 +0000726 virtual const TargetFrameInfo &getFrameInfo() const { return frameInfo; }
Chris Lattner83d835d2002-12-29 02:50:33 +0000727 virtual const TargetCacheInfo &getCacheInfo() const { return cacheInfo; }
728 virtual const TargetOptInfo &getOptInfo() const { return optInfo; }
Chris Lattner518da4f2001-09-19 13:47:12 +0000729
Chris Lattner5667f0e2002-10-29 21:12:46 +0000730 virtual bool addPassesToEmitAssembly(PassManager &PM, std::ostream &Out);
Chris Lattnere94db672002-10-28 01:03:43 +0000731
Chris Lattnere2ac2712002-10-29 22:01:44 +0000732 // getPrologEpilogInsertionPass - Inserts prolog/epilog code.
733 Pass* getPrologEpilogInsertionPass();
Chris Lattnerf8464e42001-09-14 04:32:55 +0000734
Vikram S. Adve36d3e032002-09-16 15:39:26 +0000735 // getFunctionAsmPrinterPass - Writes out machine code for a single function
Chris Lattnere2ac2712002-10-29 22:01:44 +0000736 Pass* getFunctionAsmPrinterPass(std::ostream &Out);
Vikram S. Adve36d3e032002-09-16 15:39:26 +0000737
738 // getModuleAsmPrinterPass - Writes generated machine code to assembly file.
Chris Lattnere2ac2712002-10-29 22:01:44 +0000739 Pass* getModuleAsmPrinterPass(std::ostream &Out);
Vikram S. Adve36d3e032002-09-16 15:39:26 +0000740
741 // getEmitBytecodeToAsmPass - Emits final LLVM bytecode to assembly file.
Chris Lattnere2ac2712002-10-29 22:01:44 +0000742 Pass* getEmitBytecodeToAsmPass(std::ostream &Out);
Chris Lattner92a49c52002-02-03 07:51:17 +0000743};
Chris Lattnerf8464e42001-09-14 04:32:55 +0000744
Chris Lattner5fae0de2001-09-14 03:56:45 +0000745#endif