blob: a577f47388374123df0829b6efbf1cd654291629 [file] [log] [blame]
Chris Lattner035dfbe2002-08-09 20:08:06 +00001//===-- SparcInternals.h ----------------------------------------*- C++ -*-===//
Vikram S. Adve7f37fe52001-11-08 04:55:13 +00002//
Chris Lattner035dfbe2002-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 Lattnerc6495ee2001-09-14 03:56:45 +00007
8#ifndef SPARC_INTERNALS_H
9#define SPARC_INTERNALS_H
10
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +000011#include "llvm/Target/TargetMachine.h"
Chris Lattnerd0f166a2002-12-29 03:13:05 +000012#include "llvm/Target/TargetSchedInfo.h"
Chris Lattner8bd66e62002-12-28 21:00:25 +000013#include "llvm/Target/TargetFrameInfo.h"
Chris Lattnerdde12622002-12-29 02:50:33 +000014#include "llvm/Target/TargetCacheInfo.h"
Chris Lattnerd0f166a2002-12-29 03:13:05 +000015#include "llvm/Target/TargetRegInfo.h"
Chris Lattnerdde12622002-12-29 02:50:33 +000016#include "llvm/Target/TargetOptInfo.h"
Chris Lattnerc6495ee2001-09-14 03:56:45 +000017#include "llvm/Type.h"
Chris Lattner46cbff62001-09-14 16:56:32 +000018#include <sys/types.h>
Chris Lattnerc6495ee2001-09-14 03:56:45 +000019
Chris Lattner4387e312002-02-03 23:42:19 +000020class LiveRange;
Chris Lattnerf6e0e282001-09-14 04:32:55 +000021class UltraSparc;
Chris Lattner4387e312002-02-03 23:42:19 +000022class PhyRegAlloc;
Chris Lattner9aa697b2002-04-09 05:16:36 +000023class Pass;
Chris Lattner4387e312002-02-03 23:42:19 +000024
Chris Lattnerc6495ee2001-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 Lattnerc6495ee2001-09-14 03:56:45 +000041
42//---------------------------------------------------------------------------
43// enum SparcMachineOpCode.
Chris Lattner3501fea2003-01-14 22:00:31 +000044// const TargetInstrDescriptor SparcMachineInstrDesc[]
Chris Lattnerc6495ee2001-09-14 03:56:45 +000045//
46// Purpose:
47// Description of UltraSparc machine instructions.
48//
49//---------------------------------------------------------------------------
50
Chris Lattnerc6495ee2001-09-14 03:56:45 +000051enum SparcMachineOpCode {
Chris Lattner9a3d63b2001-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 Lattnerc6495ee2001-09-14 03:56:45 +000056
Chris Lattnerc6495ee2001-09-14 03:56:45 +000057 // End-of-array marker
58 INVALID_OPCODE,
Vikram S. Advec1521632001-10-22 13:31:53 +000059 NUM_REAL_OPCODES = PHI, // number of valid opcodes
Chris Lattnerc6495ee2001-09-14 03:56:45 +000060 NUM_TOTAL_OPCODES = INVALID_OPCODE
61};
62
Chris Lattnerc6495ee2001-09-14 03:56:45 +000063
Chris Lattner9a3d63b2001-09-19 15:56:23 +000064// Array of machine instruction descriptions...
Chris Lattner3501fea2003-01-14 22:00:31 +000065extern const TargetInstrDescriptor SparcMachineInstrDesc[];
Chris Lattnerc6495ee2001-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 Lattner3501fea2003-01-14 22:00:31 +000075// default to member functions in base class TargetInstrInfo.
Chris Lattnerc6495ee2001-09-14 03:56:45 +000076//---------------------------------------------------------------------------
77
Chris Lattner3501fea2003-01-14 22:00:31 +000078struct UltraSparcInstrInfo : public TargetInstrInfo {
Chris Lattner047bbaf2002-10-29 15:45:20 +000079 UltraSparcInstrInfo();
Vikram S. Adve4c5fe2d2001-11-14 18:48:36 +000080
81 //
Vikram S. Advedd558992002-03-18 03:02:42 +000082 // All immediate constants are in position 1 except the
Vikram S. Advee1f72802002-09-16 15:39:26 +000083 // store instructions and SETxx.
Vikram S. Adve4c5fe2d2001-11-14 18:48:36 +000084 //
Vikram S. Advedd558992002-03-18 03:02:42 +000085 virtual int getImmedConstantPos(MachineOpCode opCode) const {
Vikram S. Adve4c5fe2d2001-11-14 18:48:36 +000086 bool ignore;
87 if (this->maxImmedConstant(opCode, ignore) != 0)
88 {
Vikram S. Advefe09fb22002-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. Advee1f72802002-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. Adve4c5fe2d2001-11-14 18:48:36 +000096 }
97 else
98 return -1;
99 }
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000100
Vikram S. Adve5684c4e2001-10-18 00:02:06 +0000101 virtual bool hasResultInterlock (MachineOpCode opCode) const
Chris Lattnerc6495ee2001-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. Adve5684c4e2001-10-18 00:02:06 +0000112 //-------------------------------------------------------------------------
Vikram S. Advee1f72802002-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. Adve5684c4e2001-10-18 00:02:06 +0000120 // Code generation support for creating individual machine instructions
121 //-------------------------------------------------------------------------
Vikram S. Adved55697c2002-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. Adve5684c4e2001-10-18 00:02:06 +0000128 // Create an instruction sequence to put the constant `val' into
Vikram S. Adve242a8082002-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. Adve5684c4e2001-10-18 00:02:06 +0000134 //
Vikram S. Adve242a8082002-05-19 15:25:51 +0000135 virtual void CreateCodeToLoadConst(const TargetMachine& target,
136 Function* F,
Vikram S. Advedd558992002-03-18 03:02:42 +0000137 Value* val,
Vikram S. Adve5684c4e2001-10-18 00:02:06 +0000138 Instruction* dest,
Vikram S. Adve242a8082002-05-19 15:25:51 +0000139 std::vector<MachineInstr*>& mvec,
140 MachineCodeForInstruction& mcfi) const;
Vikram S. Adve7f37fe52001-11-08 04:55:13 +0000141
Vikram S. Adve5afff3b2001-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. Adve242a8082002-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. Adve7f37fe52001-11-08 04:55:13 +0000148 //
Vikram S. Adve242a8082002-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. Adve5afff3b2001-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. Adve242a8082002-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. Adve5afff3b2001-11-09 02:15:52 +0000161 //
Vikram S. Adve242a8082002-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. Advedd558992002-03-18 03:02:42 +0000174 virtual void CreateCopyInstructionsByType(const TargetMachine& target,
Vikram S. Adve242a8082002-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. Advef36f06b2002-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. Adve242a8082002-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. Advef36f06b2002-09-05 18:34:31 +0000189 Value* srcVal,
Vikram S. Adve5cedede2002-09-27 14:29:45 +0000190 Value* destVal,
191 unsigned int numLowBits,
Vikram S. Advef36f06b2002-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. Adve5cedede2002-09-27 14:29:45 +0000204 Value* destVal,
205 unsigned int numLowBits,
Vikram S. Adve242a8082002-05-19 15:25:51 +0000206 std::vector<MachineInstr*>& mvec,
207 MachineCodeForInstruction& mcfi) const;
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000208};
209
Ruchira Sasankae38bd5332001-09-15 00:30:44 +0000210
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000211//----------------------------------------------------------------------------
212// class UltraSparcRegInfo
213//
Chris Lattnerd0f166a2002-12-29 03:13:05 +0000214// This class implements the virtual class TargetRegInfo for Sparc.
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000215//
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000216//----------------------------------------------------------------------------
217
Chris Lattnerd0f166a2002-12-29 03:13:05 +0000218class UltraSparcRegInfo : public TargetRegInfo {
Ruchira Sasankaab304c42001-09-30 23:19:57 +0000219 // The actual register classes in the Sparc
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000220 //
Ruchira Sasankae38bd5332001-09-15 00:30:44 +0000221 enum RegClassIDs {
Ruchira Sasanka2563a982002-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 Sasankae38bd5332001-09-15 00:30:44 +0000226 };
227
Ruchira Sasankaab304c42001-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 Sasanka2563a982002-01-07 20:28:49 +0000232 //
Ruchira Sasankaab304c42001-09-30 23:19:57 +0000233 enum RegTypes {
234 IntRegType,
235 FPSingleRegType,
236 FPDoubleRegType,
237 IntCCRegType,
238 FloatCCRegType
239 };
240
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000241 // **** WARNING: If the above enum order is changed, also modify
Ruchira Sasankae38bd5332001-09-15 00:30:44 +0000242 // getRegisterClassOfValue method below since it assumes this particular
243 // order for efficiency.
244
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000245
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000246 // Number of registers used for passing int args (usually 6: %o0 - %o5)
247 //
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000248 unsigned const NumOfIntArgRegs;
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000249
250 // Number of registers used for passing float args (usually 32: %f0 - %f31)
251 //
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000252 unsigned const NumOfFloatArgRegs;
Ruchira Sasanka2563a982002-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 Sasankac4d4b762001-10-16 01:23:19 +0000257 int const InvalidRegNum;
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000258
259
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000260 // ======================== Private Methods =============================
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000261
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000262 // The following methods are used to color special live ranges (e.g.
Chris Lattnerf57b8452002-04-27 06:56:12 +0000263 // function args and return values etc.) with specific hardware registers
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000264 // as required. See SparcRegInfo.cpp for the implementation.
265 //
Vikram S. Advefe09fb22002-07-08 23:34:10 +0000266 void suggestReg4RetAddr(MachineInstr *RetMI,
Chris Lattner699683c2002-02-04 05:59:25 +0000267 LiveRangeInfo &LRI) const;
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000268
Vikram S. Adve106604e2002-09-28 16:56:59 +0000269 void suggestReg4CallAddr(MachineInstr *CallMI, LiveRangeInfo &LRI) const;
Vikram S. Advefe09fb22002-07-08 23:34:10 +0000270
271 void InitializeOutgoingArg(MachineInstr* CallMI, AddedInstrns *CallAI,
Vikram S. Adve242a8082002-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 Lattner3c3c82d2003-01-15 21:14:32 +0000278 int getRegType(const Type* type) const;
Chris Lattner699683c2002-02-04 05:59:25 +0000279 int getRegType(const LiveRange *LR) const;
Vikram S. Advefe09fb22002-07-08 23:34:10 +0000280 int getRegType(int unifiedRegNum) const;
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +0000281
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000282 // Used to generate a copy instruction based on the register class of
283 // value.
284 //
Chris Lattner699683c2002-02-04 05:59:25 +0000285 MachineInstr *cpValue2RegMI(Value *Val, unsigned DestReg,
286 int RegType) const;
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +0000287
288
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000289 // The following 2 methods are used to order the instructions addeed by
Chris Lattnerf57b8452002-04-27 06:56:12 +0000290 // the register allocator in association with function calling. See
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000291 // SparcRegInfo.cpp for more details
292 //
Chris Lattner697954c2002-01-20 22:54:45 +0000293 void moveInst2OrdVec(std::vector<MachineInstr *> &OrdVec,
294 MachineInstr *UnordInst,
295 PhyRegAlloc &PRA) const;
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +0000296
Chris Lattner697954c2002-01-20 22:54:45 +0000297 void OrderAddedInstrns(std::vector<MachineInstr *> &UnordVec,
298 std::vector<MachineInstr *> &OrdVec,
299 PhyRegAlloc &PRA) const;
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +0000300
301
Vikram S. Adve6d783112002-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 Sasankaae4bcd72001-11-10 21:20:43 +0000307
Vikram S. Adve6d783112002-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 Lattner699683c2002-02-04 05:59:25 +0000312public:
313 UltraSparcRegInfo(const UltraSparc &tgt);
Ruchira Sasankae38bd5332001-09-15 00:30:44 +0000314
Vikram S. Advedd558992002-03-18 03:02:42 +0000315 // To find the register class used for a specified Type
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000316 //
Vikram S. Advefe09fb22002-07-08 23:34:10 +0000317 unsigned getRegClassIDOfType(const Type *type,
318 bool isCCReg = false) const;
Ruchira Sasankae38bd5332001-09-15 00:30:44 +0000319
Vikram S. Advefe09fb22002-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. Advedd558992002-03-18 03:02:42 +0000324
Chris Lattner699683c2002-02-04 05:59:25 +0000325 // getZeroRegNum - returns the register that contains always zero this is the
326 // unified register number
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000327 //
Chris Lattner699683c2002-02-04 05:59:25 +0000328 virtual int getZeroRegNum() const;
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000329
Chris Lattner699683c2002-02-04 05:59:25 +0000330 // getCallAddressReg - returns the reg used for pushing the address when a
Chris Lattnerf57b8452002-04-27 06:56:12 +0000331 // function is called. This can be used for other purposes between calls
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000332 //
Chris Lattner699683c2002-02-04 05:59:25 +0000333 unsigned getCallAddressReg() const;
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000334
Ruchira Sasanka2563a982002-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 Lattner699683c2002-02-04 05:59:25 +0000339 unsigned getReturnAddressReg() const;
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000340
Vikram S. Adve242a8082002-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 Sasanka2563a982002-01-07 20:28:49 +0000347 // The following methods are used to color special live ranges (e.g.
Chris Lattnerf57b8452002-04-27 06:56:12 +0000348 // function args and return values etc.) with specific hardware registers
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000349 // as required. See SparcRegInfo.cpp for the implementation for Sparc.
350 //
Chris Lattnerb7653df2002-04-08 22:03:57 +0000351 void suggestRegs4MethodArgs(const Function *Meth,
Ruchira Sasankaab304c42001-09-30 23:19:57 +0000352 LiveRangeInfo& LRI) const;
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000353
Vikram S. Advefe09fb22002-07-08 23:34:10 +0000354 void suggestRegs4CallArgs(MachineInstr *CallMI,
Vikram S. Adve106604e2002-09-28 16:56:59 +0000355 LiveRangeInfo& LRI) const;
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000356
Vikram S. Advefe09fb22002-07-08 23:34:10 +0000357 void suggestReg4RetValue(MachineInstr *RetMI,
Chris Lattner697954c2002-01-20 22:54:45 +0000358 LiveRangeInfo& LRI) const;
Vikram S. Advefe09fb22002-07-08 23:34:10 +0000359
Chris Lattnerb7653df2002-04-08 22:03:57 +0000360 void colorMethodArgs(const Function *Meth, LiveRangeInfo &LRI,
Chris Lattner699683c2002-02-04 05:59:25 +0000361 AddedInstrns *FirstAI) const;
Ruchira Sasankaab304c42001-09-30 23:19:57 +0000362
Vikram S. Advefe09fb22002-07-08 23:34:10 +0000363 void colorCallArgs(MachineInstr *CallMI, LiveRangeInfo &LRI,
Chris Lattner699683c2002-02-04 05:59:25 +0000364 AddedInstrns *CallAI, PhyRegAlloc &PRA,
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000365 const BasicBlock *BB) const;
Ruchira Sasankaab304c42001-09-30 23:19:57 +0000366
Vikram S. Advefe09fb22002-07-08 23:34:10 +0000367 void colorRetValue(MachineInstr *RetI, LiveRangeInfo& LRI,
Chris Lattner699683c2002-02-04 05:59:25 +0000368 AddedInstrns *RetAI) const;
Ruchira Sasankaab304c42001-09-30 23:19:57 +0000369
370
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000371 // method used for printing a register for debugging purposes
372 //
Chris Lattner699683c2002-02-04 05:59:25 +0000373 static void printReg(const LiveRange *LR);
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000374
Vikram S. Advefe09fb22002-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 Sasanka2563a982002-01-07 20:28:49 +0000378 //
Vikram S. Advefe09fb22002-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 Lattnerc6495ee2001-09-14 03:56:45 +0000384 return reg;
Vikram S. Advefe09fb22002-07-08 23:34:10 +0000385 }
386 else if (regClassID == FloatRegClassID) {
387 assert(reg < 64 && "Invalid reg. number");
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000388 return reg + 32; // we have 32 int regs
Vikram S. Advefe09fb22002-07-08 23:34:10 +0000389 }
390 else if (regClassID == FloatCCRegClassID) {
391 assert(reg < 4 && "Invalid reg. number");
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000392 return reg + 32 + 64; // 32 int, 64 float
Vikram S. Advefe09fb22002-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 Sasankac4d4b762001-10-16 01:23:19 +0000399 return InvalidRegNum;
Vikram S. Advefe09fb22002-07-08 23:34:10 +0000400 }
Ruchira Sasankae38bd5332001-09-15 00:30:44 +0000401 else
Vikram S. Advefe09fb22002-07-08 23:34:10 +0000402 assert(0 && "Invalid register class");
Chris Lattner6dad5062001-11-07 13:49:12 +0000403 return 0;
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000404 }
Vikram S. Advefe09fb22002-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 Lattnerb82d97e2002-07-25 06:08:32 +0000415 return 0;
Vikram S. Advefe09fb22002-07-08 23:34:10 +0000416 }
417
418 // Returns the assembly-language name of the specified machine register.
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000419 //
Chris Lattner95685682002-08-12 21:25:05 +0000420 virtual const char * const getUnifiedRegName(int reg) const;
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000421
422
Ruchira Sasanka2563a982002-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 Lattner699683c2002-02-04 05:59:25 +0000428 inline int getSpilledRegSize(int RegType) const {
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000429 return 8;
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000430 }
431
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000432
Vikram S. Advea44c6c02002-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 Sasanka2563a982002-01-07 20:28:49 +0000435 //
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000436 const Value * getCallInstRetVal(const MachineInstr *CallMI) const;
Vikram S. Advea44c6c02002-03-31 19:04:50 +0000437 const Value * getCallInstIndirectAddrVal(const MachineInstr *CallMI) const;
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000438
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000439 // The following methods are used to generate "copy" machine instructions
440 // for an architecture.
441 //
Vikram S. Advefe09fb22002-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 Sasankac4d4b762001-10-16 01:23:19 +0000450
Vikram S. Advefe09fb22002-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 Sasankac4d4b762001-10-16 01:23:19 +0000462
Vikram S. Adve242a8082002-05-19 15:25:51 +0000463 void cpValue2Value(Value *Src, Value *Dest,
Anand Shuklacfb22d32002-06-25 20:55:50 +0000464 std::vector<MachineInstr*>& mvec) const;
Ruchira Sasankaef1b0cb2001-11-03 17:13:27 +0000465
Ruchira Sasanka2563a982002-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 Lattner699683c2002-02-04 05:59:25 +0000469 inline bool isRegVolatile(int RegClassID, int Reg) const {
470 return MachineRegClassArr[RegClassID]->isRegVolatile(Reg);
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000471 }
472
473
Chris Lattner699683c2002-02-04 05:59:25 +0000474 virtual unsigned getFramePointer() const;
475 virtual unsigned getStackPointer() const;
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000476
Chris Lattner699683c2002-02-04 05:59:25 +0000477 virtual int getInvalidRegNum() const {
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000478 return InvalidRegNum;
479 }
480
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000481 // This method inserts the caller saving code for call instructions
482 //
Anand Shukla24787fa2002-07-11 00:16:28 +0000483 void insertCallerSavingCode(std::vector<MachineInstr*>& instrnsBefore,
484 std::vector<MachineInstr*>& instrnsAfter,
Vikram S. Adve6a49a1e2002-07-10 21:42:42 +0000485 MachineInstr *MInst,
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000486 const BasicBlock *BB, PhyRegAlloc &PRA ) const;
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000487};
488
489
490
Chris Lattnerc6495ee2001-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 Lattnerd0f166a2002-12-29 03:13:05 +0000501class UltraSparcSchedInfo: public TargetSchedInfo {
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000502public:
Chris Lattner699683c2002-02-04 05:59:25 +0000503 UltraSparcSchedInfo(const TargetMachine &tgt);
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000504protected:
Chris Lattner699683c2002-02-04 05:59:25 +0000505 virtual void initializeResources();
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000506};
507
Chris Lattnerf6e0e282001-09-14 04:32:55 +0000508
509//---------------------------------------------------------------------------
Vikram S. Advec1521632001-10-22 13:31:53 +0000510// class UltraSparcFrameInfo
511//
512// Purpose:
513// Interface to stack frame layout info for the UltraSPARC.
Vikram S. Adve00521d72001-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. Advec1521632001-10-22 13:31:53 +0000516//---------------------------------------------------------------------------
517
Chris Lattnerda62ac62002-12-28 20:20:24 +0000518class UltraSparcFrameInfo: public TargetFrameInfo {
519 const TargetMachine &target;
Vikram S. Advec1521632001-10-22 13:31:53 +0000520public:
Chris Lattnerda62ac62002-12-28 20:20:24 +0000521 UltraSparcFrameInfo(const TargetMachine &TM)
522 : TargetFrameInfo(StackGrowsDown, StackFrameSizeAlignment, 0), target(TM) {}
Vikram S. Adve7f37fe52001-11-08 04:55:13 +0000523
524public:
Vikram S. Advee1f72802002-09-16 15:39:26 +0000525 // These methods provide constant parameters of the frame layout.
526 //
Chris Lattnerf57b8452002-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. Adve7f37fe52001-11-08 04:55:13 +0000532
Vikram S. Advee1f72802002-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. Adve7f37fe52001-11-08 04:55:13 +0000541 // These methods compute offsets using the frame contents for a
Chris Lattnerf57b8452002-04-27 06:56:12 +0000542 // particular function. The frame contents are obtained from the
543 // MachineCodeInfoForMethod object for the given function.
Vikram S. Adve7f37fe52001-11-08 04:55:13 +0000544 //
Misha Brukmanfce11432002-10-28 00:28:31 +0000545 int getFirstIncomingArgOffset (MachineFunction& mcInfo,
Vikram S. Adve6d783112002-04-25 04:40:24 +0000546 bool& growUp) const
Vikram S. Adve7f37fe52001-11-08 04:55:13 +0000547 {
Vikram S. Adve6d783112002-04-25 04:40:24 +0000548 growUp = true; // arguments area grows upwards
Vikram S. Adve7f37fe52001-11-08 04:55:13 +0000549 return FirstIncomingArgOffsetFromFP;
550 }
Misha Brukmanfce11432002-10-28 00:28:31 +0000551 int getFirstOutgoingArgOffset (MachineFunction& mcInfo,
Vikram S. Adve6d783112002-04-25 04:40:24 +0000552 bool& growUp) const
Vikram S. Adve7f37fe52001-11-08 04:55:13 +0000553 {
Vikram S. Adve6d783112002-04-25 04:40:24 +0000554 growUp = true; // arguments area grows upwards
Vikram S. Adve7f37fe52001-11-08 04:55:13 +0000555 return FirstOutgoingArgOffsetFromSP;
556 }
Misha Brukmanfce11432002-10-28 00:28:31 +0000557 int getFirstOptionalOutgoingArgOffset(MachineFunction& mcInfo,
Vikram S. Adve6d783112002-04-25 04:40:24 +0000558 bool& growUp)const
Vikram S. Adve7f37fe52001-11-08 04:55:13 +0000559 {
Vikram S. Adve6d783112002-04-25 04:40:24 +0000560 growUp = true; // arguments area grows upwards
Vikram S. Adve7f37fe52001-11-08 04:55:13 +0000561 return FirstOptionalOutgoingArgOffsetFromSP;
562 }
563
Misha Brukmanfce11432002-10-28 00:28:31 +0000564 int getFirstAutomaticVarOffset (MachineFunction& mcInfo,
Vikram S. Adve6d783112002-04-25 04:40:24 +0000565 bool& growUp) const;
Misha Brukmanfce11432002-10-28 00:28:31 +0000566 int getRegSpillAreaOffset (MachineFunction& mcInfo,
Vikram S. Adve6d783112002-04-25 04:40:24 +0000567 bool& growUp) const;
Misha Brukmanfce11432002-10-28 00:28:31 +0000568 int getTmpAreaOffset (MachineFunction& mcInfo,
Vikram S. Adve6d783112002-04-25 04:40:24 +0000569 bool& growUp) const;
Misha Brukmanfce11432002-10-28 00:28:31 +0000570 int getDynamicAreaOffset (MachineFunction& mcInfo,
Vikram S. Adve6d783112002-04-25 04:40:24 +0000571 bool& growUp) const;
Vikram S. Adve7f37fe52001-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 Lattnerda62ac62002-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. Adve7f37fe52001-11-08 04:55:13 +0000617
618private:
Vikram S. Advee1f72802002-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 Lattnerda62ac62002-12-28 20:20:24 +0000626 Alignment assumptions and other invariants:
Vikram S. Advee1f72802002-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. Adve5afff3b2001-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. Adve7f37fe52001-11-08 04:55:13 +0000664 static const int StackFrameSizeAlignment = 16;
Vikram S. Advec1521632001-10-22 13:31:53 +0000665 static const int MinStackFrameSize = 176;
Vikram S. Adve7f37fe52001-11-08 04:55:13 +0000666 static const int NumFixedOutgoingArgs = 6;
667 static const int SizeOfEachArgOnStack = 8;
Vikram S. Adve5afff3b2001-11-09 02:15:52 +0000668 static const int FirstIncomingArgOffsetFromFP = 128 + OFFSET;
669 static const int FirstOptionalIncomingArgOffsetFromFP = 176 + OFFSET;
Vikram S. Advee1f72802002-09-16 15:39:26 +0000670 static const int StaticAreaOffsetFromFP = 0 + OFFSET;
Vikram S. Adve5afff3b2001-11-09 02:15:52 +0000671 static const int FirstOutgoingArgOffsetFromSP = 128 + OFFSET;
672 static const int FirstOptionalOutgoingArgOffsetFromSP = 176 + OFFSET;
Vikram S. Advec1521632001-10-22 13:31:53 +0000673};
674
675
Vikram S. Adve5afff3b2001-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 Lattnerdde12622002-12-29 02:50:33 +0000684struct UltraSparcCacheInfo: public TargetCacheInfo {
685 UltraSparcCacheInfo(const TargetMachine &T) : TargetCacheInfo(T) {}
Vikram S. Adve5afff3b2001-11-09 02:15:52 +0000686};
687
Vikram S. Advec1521632001-10-22 13:31:53 +0000688
689//---------------------------------------------------------------------------
Vikram S. Adved55697c2002-09-20 00:52:09 +0000690// class UltraSparcOptInfo
691//
692// Purpose:
693// Interface to machine-level optimization routines for the UltraSPARC.
694//---------------------------------------------------------------------------
695
Chris Lattnerdde12622002-12-29 02:50:33 +0000696struct UltraSparcOptInfo: public TargetOptInfo {
697 UltraSparcOptInfo(const TargetMachine &T) : TargetOptInfo(T) {}
Vikram S. Adved55697c2002-09-20 00:52:09 +0000698
699 virtual bool IsUselessCopy (const MachineInstr* MI) const;
700};
701
702
703//---------------------------------------------------------------------------
Chris Lattnerf6e0e282001-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. Adve339084b2001-09-18 13:04:24 +0000710// for classes such as InstrInfo, SchedInfo and RegInfo.
Chris Lattnerf6e0e282001-09-14 04:32:55 +0000711//---------------------------------------------------------------------------
712
713class UltraSparc : public TargetMachine {
Vikram S. Adve339084b2001-09-18 13:04:24 +0000714 UltraSparcInstrInfo instrInfo;
715 UltraSparcSchedInfo schedInfo;
716 UltraSparcRegInfo regInfo;
Vikram S. Advec1521632001-10-22 13:31:53 +0000717 UltraSparcFrameInfo frameInfo;
Vikram S. Adve5afff3b2001-11-09 02:15:52 +0000718 UltraSparcCacheInfo cacheInfo;
Vikram S. Adved55697c2002-09-20 00:52:09 +0000719 UltraSparcOptInfo optInfo;
Chris Lattnerf6e0e282001-09-14 04:32:55 +0000720public:
721 UltraSparc();
Vikram S. Adved55697c2002-09-20 00:52:09 +0000722
Chris Lattner3501fea2003-01-14 22:00:31 +0000723 virtual const TargetInstrInfo &getInstrInfo() const { return instrInfo; }
Chris Lattnerd0f166a2002-12-29 03:13:05 +0000724 virtual const TargetSchedInfo &getSchedInfo() const { return schedInfo; }
725 virtual const TargetRegInfo &getRegInfo() const { return regInfo; }
Chris Lattnerda62ac62002-12-28 20:20:24 +0000726 virtual const TargetFrameInfo &getFrameInfo() const { return frameInfo; }
Chris Lattnerdde12622002-12-29 02:50:33 +0000727 virtual const TargetCacheInfo &getCacheInfo() const { return cacheInfo; }
728 virtual const TargetOptInfo &getOptInfo() const { return optInfo; }
Chris Lattner32f600a2001-09-19 13:47:12 +0000729
Chris Lattner63342052002-10-29 21:12:46 +0000730 virtual bool addPassesToEmitAssembly(PassManager &PM, std::ostream &Out);
Chris Lattner4f946372002-10-28 01:03:43 +0000731
Chris Lattnerc66583e2002-10-29 22:01:44 +0000732 // getPrologEpilogInsertionPass - Inserts prolog/epilog code.
733 Pass* getPrologEpilogInsertionPass();
Chris Lattnerf6e0e282001-09-14 04:32:55 +0000734
Vikram S. Advee1f72802002-09-16 15:39:26 +0000735 // getFunctionAsmPrinterPass - Writes out machine code for a single function
Chris Lattnerc66583e2002-10-29 22:01:44 +0000736 Pass* getFunctionAsmPrinterPass(std::ostream &Out);
Vikram S. Advee1f72802002-09-16 15:39:26 +0000737
738 // getModuleAsmPrinterPass - Writes generated machine code to assembly file.
Chris Lattnerc66583e2002-10-29 22:01:44 +0000739 Pass* getModuleAsmPrinterPass(std::ostream &Out);
Vikram S. Advee1f72802002-09-16 15:39:26 +0000740
741 // getEmitBytecodeToAsmPass - Emits final LLVM bytecode to assembly file.
Chris Lattnerc66583e2002-10-29 22:01:44 +0000742 Pass* getEmitBytecodeToAsmPass(std::ostream &Out);
Chris Lattner6edfcc52002-02-03 07:51:17 +0000743};
Chris Lattnerf6e0e282001-09-14 04:32:55 +0000744
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000745#endif