blob: d914a6c96909d5715d2fd72ac315e567b0e4818b [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
Misha Brukmana98cd452003-05-20 20:32:24 +000051namespace V9 {
52 enum SparcMachineOpCode {
Chris Lattner9a3d63b2001-09-19 15:56:23 +000053#define I(ENUM, OPCODESTRING, NUMOPERANDS, RESULTPOS, MAXIMM, IMMSE, \
54 NUMDELAYSLOTS, LATENCY, SCHEDCLASS, INSTFLAGS) \
55 ENUM,
56#include "SparcInstr.def"
Chris Lattnerc6495ee2001-09-14 03:56:45 +000057
Misha Brukmana98cd452003-05-20 20:32:24 +000058 // End-of-array marker
59 INVALID_OPCODE,
60 NUM_REAL_OPCODES = PHI, // number of valid opcodes
61 NUM_TOTAL_OPCODES = INVALID_OPCODE
62 };
63}
Chris Lattnerc6495ee2001-09-14 03:56:45 +000064
Chris Lattnerc6495ee2001-09-14 03:56:45 +000065
Chris Lattner9a3d63b2001-09-19 15:56:23 +000066// Array of machine instruction descriptions...
Chris Lattner3501fea2003-01-14 22:00:31 +000067extern const TargetInstrDescriptor SparcMachineInstrDesc[];
Chris Lattnerc6495ee2001-09-14 03:56:45 +000068
69
70//---------------------------------------------------------------------------
71// class UltraSparcInstrInfo
72//
73// Purpose:
74// Information about individual instructions.
75// Most information is stored in the SparcMachineInstrDesc array above.
76// Other information is computed on demand, and most such functions
Chris Lattner3501fea2003-01-14 22:00:31 +000077// default to member functions in base class TargetInstrInfo.
Chris Lattnerc6495ee2001-09-14 03:56:45 +000078//---------------------------------------------------------------------------
79
Chris Lattner3501fea2003-01-14 22:00:31 +000080struct UltraSparcInstrInfo : public TargetInstrInfo {
Chris Lattner047bbaf2002-10-29 15:45:20 +000081 UltraSparcInstrInfo();
Vikram S. Adve4c5fe2d2001-11-14 18:48:36 +000082
83 //
Vikram S. Advedd558992002-03-18 03:02:42 +000084 // All immediate constants are in position 1 except the
Vikram S. Advee1f72802002-09-16 15:39:26 +000085 // store instructions and SETxx.
Vikram S. Adve4c5fe2d2001-11-14 18:48:36 +000086 //
Vikram S. Advedd558992002-03-18 03:02:42 +000087 virtual int getImmedConstantPos(MachineOpCode opCode) const {
Vikram S. Adve4c5fe2d2001-11-14 18:48:36 +000088 bool ignore;
Misha Brukmana98cd452003-05-20 20:32:24 +000089 if (this->maxImmedConstant(opCode, ignore) != 0) {
90 // 1st store opcode
91 assert(! this->isStore((MachineOpCode) V9::STB - 1));
92 // last store opcode
93 assert(! this->isStore((MachineOpCode) V9::STXFSR + 1));
94
95 if (opCode == V9::SETSW || opCode == V9::SETUW ||
96 opCode == V9::SETX || opCode == V9::SETHI)
97 return 0;
98 if (opCode >= V9::STB && opCode <= V9::STXFSR)
99 return 2;
100 return 1;
101 }
Vikram S. Adve4c5fe2d2001-11-14 18:48:36 +0000102 else
103 return -1;
104 }
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000105
Misha Brukmana98cd452003-05-20 20:32:24 +0000106 virtual bool hasResultInterlock(MachineOpCode opCode) const
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000107 {
108 // All UltraSPARC instructions have interlocks (note that delay slots
109 // are not considered here).
110 // However, instructions that use the result of an FCMP produce a
111 // 9-cycle stall if they are issued less than 3 cycles after the FCMP.
112 // Force the compiler to insert a software interlock (i.e., gap of
113 // 2 other groups, including NOPs if necessary).
Misha Brukmana98cd452003-05-20 20:32:24 +0000114 return (opCode == V9::FCMPS || opCode == V9::FCMPD || opCode == V9::FCMPQ);
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000115 }
116
Vikram S. Adve5684c4e2001-10-18 00:02:06 +0000117 //-------------------------------------------------------------------------
Vikram S. Advee1f72802002-09-16 15:39:26 +0000118 // Queries about representation of LLVM quantities (e.g., constants)
119 //-------------------------------------------------------------------------
120
121 virtual bool ConstantMayNotFitInImmedField(const Constant* CV,
122 const Instruction* I) const;
123
124 //-------------------------------------------------------------------------
Vikram S. Adve5684c4e2001-10-18 00:02:06 +0000125 // Code generation support for creating individual machine instructions
126 //-------------------------------------------------------------------------
Vikram S. Adved55697c2002-09-20 00:52:09 +0000127
128 // Get certain common op codes for the current target. This and all the
129 // Create* methods below should be moved to a machine code generation class
130 //
Misha Brukmana98cd452003-05-20 20:32:24 +0000131 virtual MachineOpCode getNOPOpCode() const { return V9::NOP; }
Vikram S. Adved55697c2002-09-20 00:52:09 +0000132
Vikram S. Adve5684c4e2001-10-18 00:02:06 +0000133 // Create an instruction sequence to put the constant `val' into
Vikram S. Adve242a8082002-05-19 15:25:51 +0000134 // the virtual register `dest'. `val' may be a Constant or a
135 // GlobalValue, viz., the constant address of a global variable or function.
136 // The generated instructions are returned in `mvec'.
137 // Any temp. registers (TmpInstruction) created are recorded in mcfi.
138 // Any stack space required is allocated via mcff.
Vikram S. Adve5684c4e2001-10-18 00:02:06 +0000139 //
Vikram S. Adve242a8082002-05-19 15:25:51 +0000140 virtual void CreateCodeToLoadConst(const TargetMachine& target,
141 Function* F,
Vikram S. Advedd558992002-03-18 03:02:42 +0000142 Value* val,
Vikram S. Adve5684c4e2001-10-18 00:02:06 +0000143 Instruction* dest,
Vikram S. Adve242a8082002-05-19 15:25:51 +0000144 std::vector<MachineInstr*>& mvec,
145 MachineCodeForInstruction& mcfi) const;
Vikram S. Adve7f37fe52001-11-08 04:55:13 +0000146
Vikram S. Adve5afff3b2001-11-09 02:15:52 +0000147 // Create an instruction sequence to copy an integer value `val'
148 // to a floating point value `dest' by copying to memory and back.
149 // val must be an integral type. dest must be a Float or Double.
Vikram S. Adve242a8082002-05-19 15:25:51 +0000150 // The generated instructions are returned in `mvec'.
151 // Any temp. registers (TmpInstruction) created are recorded in mcfi.
152 // Any stack space required is allocated via mcff.
Vikram S. Adve7f37fe52001-11-08 04:55:13 +0000153 //
Vikram S. Adve242a8082002-05-19 15:25:51 +0000154 virtual void CreateCodeToCopyIntToFloat(const TargetMachine& target,
155 Function* F,
156 Value* val,
157 Instruction* dest,
158 std::vector<MachineInstr*>& mvec,
159 MachineCodeForInstruction& mcfi) const;
Vikram S. Adve5afff3b2001-11-09 02:15:52 +0000160
161 // Similarly, create an instruction sequence to copy an FP value
162 // `val' to an integer value `dest' by copying to memory and back.
Vikram S. Adve242a8082002-05-19 15:25:51 +0000163 // The generated instructions are returned in `mvec'.
164 // Any temp. registers (TmpInstruction) created are recorded in mcfi.
165 // Any stack space required is allocated via mcff.
Vikram S. Adve5afff3b2001-11-09 02:15:52 +0000166 //
Vikram S. Adve242a8082002-05-19 15:25:51 +0000167 virtual void CreateCodeToCopyFloatToInt(const TargetMachine& target,
168 Function* F,
169 Value* val,
170 Instruction* dest,
171 std::vector<MachineInstr*>& mvec,
172 MachineCodeForInstruction& mcfi) const;
173
174 // Create instruction(s) to copy src to dest, for arbitrary types
175 // The generated instructions are returned in `mvec'.
176 // Any temp. registers (TmpInstruction) created are recorded in mcfi.
177 // Any stack space required is allocated via mcff.
178 //
Vikram S. Advedd558992002-03-18 03:02:42 +0000179 virtual void CreateCopyInstructionsByType(const TargetMachine& target,
Vikram S. Adve242a8082002-05-19 15:25:51 +0000180 Function* F,
181 Value* src,
182 Instruction* dest,
183 std::vector<MachineInstr*>& mvec,
184 MachineCodeForInstruction& mcfi) const;
185
186 // Create instruction sequence to produce a sign-extended register value
187 // from an arbitrary sized value (sized in bits, not bytes).
Vikram S. Advef36f06b2002-09-05 18:34:31 +0000188 // The generated instructions are appended to `mvec'.
189 // Any temp. registers (TmpInstruction) created are recorded in mcfi.
Vikram S. Adve242a8082002-05-19 15:25:51 +0000190 // Any stack space required is allocated via mcff.
191 //
192 virtual void CreateSignExtensionInstructions(const TargetMachine& target,
193 Function* F,
Vikram S. Advef36f06b2002-09-05 18:34:31 +0000194 Value* srcVal,
Vikram S. Adve5cedede2002-09-27 14:29:45 +0000195 Value* destVal,
196 unsigned int numLowBits,
Vikram S. Advef36f06b2002-09-05 18:34:31 +0000197 std::vector<MachineInstr*>& mvec,
198 MachineCodeForInstruction& mcfi) const;
199
200 // Create instruction sequence to produce a zero-extended register value
201 // from an arbitrary sized value (sized in bits, not bytes).
202 // The generated instructions are appended to `mvec'.
203 // Any temp. registers (TmpInstruction) created are recorded in mcfi.
204 // Any stack space required is allocated via mcff.
205 //
206 virtual void CreateZeroExtensionInstructions(const TargetMachine& target,
207 Function* F,
208 Value* srcVal,
Vikram S. Adve5cedede2002-09-27 14:29:45 +0000209 Value* destVal,
210 unsigned int numLowBits,
Vikram S. Adve242a8082002-05-19 15:25:51 +0000211 std::vector<MachineInstr*>& mvec,
212 MachineCodeForInstruction& mcfi) const;
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000213};
214
Ruchira Sasankae38bd5332001-09-15 00:30:44 +0000215
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000216//----------------------------------------------------------------------------
217// class UltraSparcRegInfo
218//
Chris Lattnerd0f166a2002-12-29 03:13:05 +0000219// This class implements the virtual class TargetRegInfo for Sparc.
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000220//
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000221//----------------------------------------------------------------------------
222
Chris Lattnerd0f166a2002-12-29 03:13:05 +0000223class UltraSparcRegInfo : public TargetRegInfo {
Ruchira Sasankaab304c42001-09-30 23:19:57 +0000224 // The actual register classes in the Sparc
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000225 //
Ruchira Sasankae38bd5332001-09-15 00:30:44 +0000226 enum RegClassIDs {
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000227 IntRegClassID, // Integer
228 FloatRegClassID, // Float (both single/double)
229 IntCCRegClassID, // Int Condition Code
230 FloatCCRegClassID // Float Condition code
Ruchira Sasankae38bd5332001-09-15 00:30:44 +0000231 };
232
Ruchira Sasankaab304c42001-09-30 23:19:57 +0000233
234 // Type of registers available in Sparc. There can be several reg types
235 // in the same class. For instace, the float reg class has Single/Double
236 // types
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000237 //
Ruchira Sasankaab304c42001-09-30 23:19:57 +0000238 enum RegTypes {
239 IntRegType,
240 FPSingleRegType,
241 FPDoubleRegType,
242 IntCCRegType,
243 FloatCCRegType
244 };
245
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000246 // **** WARNING: If the above enum order is changed, also modify
Ruchira Sasankae38bd5332001-09-15 00:30:44 +0000247 // getRegisterClassOfValue method below since it assumes this particular
248 // order for efficiency.
249
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000250
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000251 // Number of registers used for passing int args (usually 6: %o0 - %o5)
252 //
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000253 unsigned const NumOfIntArgRegs;
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000254
255 // Number of registers used for passing float args (usually 32: %f0 - %f31)
256 //
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000257 unsigned const NumOfFloatArgRegs;
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000258
259 // An out of bound register number that can be used to initialize register
260 // numbers. Useful for error detection.
261 //
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000262 int const InvalidRegNum;
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000263
264
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000265 // ======================== Private Methods =============================
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000266
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000267 // The following methods are used to color special live ranges (e.g.
Chris Lattnerf57b8452002-04-27 06:56:12 +0000268 // function args and return values etc.) with specific hardware registers
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000269 // as required. See SparcRegInfo.cpp for the implementation.
270 //
Vikram S. Advefe09fb22002-07-08 23:34:10 +0000271 void suggestReg4RetAddr(MachineInstr *RetMI,
Chris Lattner699683c2002-02-04 05:59:25 +0000272 LiveRangeInfo &LRI) const;
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000273
Vikram S. Adve106604e2002-09-28 16:56:59 +0000274 void suggestReg4CallAddr(MachineInstr *CallMI, LiveRangeInfo &LRI) const;
Vikram S. Advefe09fb22002-07-08 23:34:10 +0000275
276 void InitializeOutgoingArg(MachineInstr* CallMI, AddedInstrns *CallAI,
Vikram S. Adve242a8082002-05-19 15:25:51 +0000277 PhyRegAlloc &PRA, LiveRange* LR,
278 unsigned regType, unsigned RegClassID,
279 int UniArgReg, unsigned int argNo,
280 std::vector<MachineInstr *>& AddedInstrnsBefore)
281 const;
282
Chris Lattner3c3c82d2003-01-15 21:14:32 +0000283 int getRegType(const Type* type) const;
Chris Lattner699683c2002-02-04 05:59:25 +0000284 int getRegType(const LiveRange *LR) const;
Vikram S. Advefe09fb22002-07-08 23:34:10 +0000285 int getRegType(int unifiedRegNum) const;
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +0000286
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000287 // Used to generate a copy instruction based on the register class of
288 // value.
289 //
Chris Lattner699683c2002-02-04 05:59:25 +0000290 MachineInstr *cpValue2RegMI(Value *Val, unsigned DestReg,
291 int RegType) const;
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +0000292
293
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000294 // The following 2 methods are used to order the instructions addeed by
Chris Lattnerf57b8452002-04-27 06:56:12 +0000295 // the register allocator in association with function calling. See
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000296 // SparcRegInfo.cpp for more details
297 //
Chris Lattner697954c2002-01-20 22:54:45 +0000298 void moveInst2OrdVec(std::vector<MachineInstr *> &OrdVec,
299 MachineInstr *UnordInst,
300 PhyRegAlloc &PRA) const;
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +0000301
Chris Lattner697954c2002-01-20 22:54:45 +0000302 void OrderAddedInstrns(std::vector<MachineInstr *> &UnordVec,
303 std::vector<MachineInstr *> &OrdVec,
304 PhyRegAlloc &PRA) const;
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +0000305
306
Vikram S. Adve6d783112002-04-25 04:40:24 +0000307 // Compute which register can be used for an argument, if any
308 //
309 int regNumForIntArg(bool inCallee, bool isVarArgsCall,
310 unsigned argNo, unsigned intArgNo, unsigned fpArgNo,
311 unsigned& regClassId) const;
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +0000312
Vikram S. Adve6d783112002-04-25 04:40:24 +0000313 int regNumForFPArg(unsigned RegType, bool inCallee, bool isVarArgsCall,
314 unsigned argNo, unsigned intArgNo, unsigned fpArgNo,
315 unsigned& regClassId) const;
316
Chris Lattner699683c2002-02-04 05:59:25 +0000317public:
318 UltraSparcRegInfo(const UltraSparc &tgt);
Ruchira Sasankae38bd5332001-09-15 00:30:44 +0000319
Vikram S. Advedd558992002-03-18 03:02:42 +0000320 // To find the register class used for a specified Type
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000321 //
Vikram S. Advefe09fb22002-07-08 23:34:10 +0000322 unsigned getRegClassIDOfType(const Type *type,
323 bool isCCReg = false) const;
Ruchira Sasankae38bd5332001-09-15 00:30:44 +0000324
Vikram S. Advefe09fb22002-07-08 23:34:10 +0000325 // To find the register class to which a specified register belongs
326 //
327 unsigned getRegClassIDOfReg(int unifiedRegNum) const;
328 unsigned getRegClassIDOfRegType(int regType) const;
Vikram S. Advedd558992002-03-18 03:02:42 +0000329
Chris Lattner699683c2002-02-04 05:59:25 +0000330 // getZeroRegNum - returns the register that contains always zero this is the
331 // unified register number
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000332 //
Chris Lattner699683c2002-02-04 05:59:25 +0000333 virtual int getZeroRegNum() const;
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000334
Chris Lattner699683c2002-02-04 05:59:25 +0000335 // getCallAddressReg - returns the reg used for pushing the address when a
Chris Lattnerf57b8452002-04-27 06:56:12 +0000336 // function is called. This can be used for other purposes between calls
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000337 //
Chris Lattner699683c2002-02-04 05:59:25 +0000338 unsigned getCallAddressReg() const;
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000339
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000340 // Returns the register containing the return address.
341 // It should be made sure that this register contains the return
342 // value when a return instruction is reached.
343 //
Chris Lattner699683c2002-02-04 05:59:25 +0000344 unsigned getReturnAddressReg() const;
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000345
Vikram S. Adve242a8082002-05-19 15:25:51 +0000346 // Number of registers used for passing int args (usually 6: %o0 - %o5)
347 // and float args (usually 32: %f0 - %f31)
348 //
349 unsigned const GetNumOfIntArgRegs() const { return NumOfIntArgRegs; }
350 unsigned const GetNumOfFloatArgRegs() const { return NumOfFloatArgRegs; }
351
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000352 // The following methods are used to color special live ranges (e.g.
Chris Lattnerf57b8452002-04-27 06:56:12 +0000353 // function args and return values etc.) with specific hardware registers
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000354 // as required. See SparcRegInfo.cpp for the implementation for Sparc.
355 //
Chris Lattnerb7653df2002-04-08 22:03:57 +0000356 void suggestRegs4MethodArgs(const Function *Meth,
Ruchira Sasankaab304c42001-09-30 23:19:57 +0000357 LiveRangeInfo& LRI) const;
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000358
Vikram S. Advefe09fb22002-07-08 23:34:10 +0000359 void suggestRegs4CallArgs(MachineInstr *CallMI,
Vikram S. Adve106604e2002-09-28 16:56:59 +0000360 LiveRangeInfo& LRI) const;
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000361
Vikram S. Advefe09fb22002-07-08 23:34:10 +0000362 void suggestReg4RetValue(MachineInstr *RetMI,
Chris Lattner697954c2002-01-20 22:54:45 +0000363 LiveRangeInfo& LRI) const;
Vikram S. Advefe09fb22002-07-08 23:34:10 +0000364
Chris Lattnerb7653df2002-04-08 22:03:57 +0000365 void colorMethodArgs(const Function *Meth, LiveRangeInfo &LRI,
Chris Lattner699683c2002-02-04 05:59:25 +0000366 AddedInstrns *FirstAI) const;
Ruchira Sasankaab304c42001-09-30 23:19:57 +0000367
Vikram S. Advefe09fb22002-07-08 23:34:10 +0000368 void colorCallArgs(MachineInstr *CallMI, LiveRangeInfo &LRI,
Chris Lattner699683c2002-02-04 05:59:25 +0000369 AddedInstrns *CallAI, PhyRegAlloc &PRA,
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000370 const BasicBlock *BB) const;
Ruchira Sasankaab304c42001-09-30 23:19:57 +0000371
Vikram S. Advefe09fb22002-07-08 23:34:10 +0000372 void colorRetValue(MachineInstr *RetI, LiveRangeInfo& LRI,
Chris Lattner699683c2002-02-04 05:59:25 +0000373 AddedInstrns *RetAI) const;
Ruchira Sasankaab304c42001-09-30 23:19:57 +0000374
375
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000376 // method used for printing a register for debugging purposes
377 //
Chris Lattner699683c2002-02-04 05:59:25 +0000378 static void printReg(const LiveRange *LR);
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000379
Vikram S. Advefe09fb22002-07-08 23:34:10 +0000380 // Each register class has a seperate space for register IDs. To convert
381 // a regId in a register class to a common Id, or vice versa,
382 // we use the folloing methods.
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000383 //
Vikram S. Advefe09fb22002-07-08 23:34:10 +0000384 // This method provides a unique number for each register
385 inline int getUnifiedRegNum(unsigned regClassID, int reg) const {
386
387 if (regClassID == IntRegClassID) {
388 assert(reg < 32 && "Invalid reg. number");
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000389 return reg;
Vikram S. Advefe09fb22002-07-08 23:34:10 +0000390 }
391 else if (regClassID == FloatRegClassID) {
392 assert(reg < 64 && "Invalid reg. number");
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000393 return reg + 32; // we have 32 int regs
Vikram S. Advefe09fb22002-07-08 23:34:10 +0000394 }
395 else if (regClassID == FloatCCRegClassID) {
396 assert(reg < 4 && "Invalid reg. number");
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000397 return reg + 32 + 64; // 32 int, 64 float
Vikram S. Advefe09fb22002-07-08 23:34:10 +0000398 }
399 else if (regClassID == IntCCRegClassID ) {
400 assert(reg == 0 && "Invalid reg. number");
401 return reg + 4+ 32 + 64; // only one int CC reg
402 }
403 else if (reg==InvalidRegNum) {
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000404 return InvalidRegNum;
Vikram S. Advefe09fb22002-07-08 23:34:10 +0000405 }
Ruchira Sasankae38bd5332001-09-15 00:30:44 +0000406 else
Vikram S. Advefe09fb22002-07-08 23:34:10 +0000407 assert(0 && "Invalid register class");
Chris Lattner6dad5062001-11-07 13:49:12 +0000408 return 0;
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000409 }
Vikram S. Advefe09fb22002-07-08 23:34:10 +0000410
411 // This method converts the unified number to the number in its class,
412 // and returns the class ID in regClassID.
413 inline int getClassRegNum(int ureg, unsigned& regClassID) const {
414 if (ureg < 32) { regClassID = IntRegClassID; return ureg; }
415 else if (ureg < 32+64) { regClassID = FloatRegClassID; return ureg-32; }
416 else if (ureg < 4 +96) { regClassID = FloatCCRegClassID; return ureg-96; }
417 else if (ureg < 1 +100) { regClassID = IntCCRegClassID; return ureg-100;}
418 else if (ureg == InvalidRegNum) { return InvalidRegNum; }
419 else { assert(0 && "Invalid unified register number"); }
Chris Lattnerb82d97e2002-07-25 06:08:32 +0000420 return 0;
Vikram S. Advefe09fb22002-07-08 23:34:10 +0000421 }
422
423 // Returns the assembly-language name of the specified machine register.
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000424 //
Chris Lattner95685682002-08-12 21:25:05 +0000425 virtual const char * const getUnifiedRegName(int reg) const;
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000426
427
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000428 // returns the # of bytes of stack space allocated for each register
429 // type. For Sparc, currently we allocate 8 bytes on stack for all
430 // register types. We can optimize this later if necessary to save stack
431 // space (However, should make sure that stack alignment is correct)
432 //
Chris Lattner699683c2002-02-04 05:59:25 +0000433 inline int getSpilledRegSize(int RegType) const {
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000434 return 8;
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000435 }
436
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000437
Vikram S. Advea44c6c02002-03-31 19:04:50 +0000438 // To obtain the return value and the indirect call address (if any)
439 // contained in a CALL machine instruction
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000440 //
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000441 const Value * getCallInstRetVal(const MachineInstr *CallMI) const;
Vikram S. Advea44c6c02002-03-31 19:04:50 +0000442 const Value * getCallInstIndirectAddrVal(const MachineInstr *CallMI) const;
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000443
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000444 // The following methods are used to generate "copy" machine instructions
445 // for an architecture.
446 //
Vikram S. Advefe09fb22002-07-08 23:34:10 +0000447 // The function regTypeNeedsScratchReg() can be used to check whether a
448 // scratch register is needed to copy a register of type `regType' to
449 // or from memory. If so, such a scratch register can be provided by
450 // the caller (e.g., if it knows which regsiters are free); otherwise
451 // an arbitrary one will be chosen and spilled by the copy instructions.
452 //
453 bool regTypeNeedsScratchReg(int RegType,
454 int& scratchRegClassId) const;
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000455
Vikram S. Advefe09fb22002-07-08 23:34:10 +0000456 void cpReg2RegMI(std::vector<MachineInstr*>& mvec,
457 unsigned SrcReg, unsigned DestReg,
458 int RegType) const;
459
460 void cpReg2MemMI(std::vector<MachineInstr*>& mvec,
461 unsigned SrcReg, unsigned DestPtrReg,
462 int Offset, int RegType, int scratchReg = -1) const;
463
464 void cpMem2RegMI(std::vector<MachineInstr*>& mvec,
465 unsigned SrcPtrReg, int Offset, unsigned DestReg,
466 int RegType, int scratchReg = -1) const;
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000467
Vikram S. Adve242a8082002-05-19 15:25:51 +0000468 void cpValue2Value(Value *Src, Value *Dest,
Anand Shuklacfb22d32002-06-25 20:55:50 +0000469 std::vector<MachineInstr*>& mvec) const;
Ruchira Sasankaef1b0cb2001-11-03 17:13:27 +0000470
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000471 // To see whether a register is a volatile (i.e., whehter it must be
472 // preserved acorss calls)
473 //
Chris Lattner699683c2002-02-04 05:59:25 +0000474 inline bool isRegVolatile(int RegClassID, int Reg) const {
475 return MachineRegClassArr[RegClassID]->isRegVolatile(Reg);
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000476 }
477
478
Chris Lattner699683c2002-02-04 05:59:25 +0000479 virtual unsigned getFramePointer() const;
480 virtual unsigned getStackPointer() const;
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000481
Chris Lattner699683c2002-02-04 05:59:25 +0000482 virtual int getInvalidRegNum() const {
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000483 return InvalidRegNum;
484 }
485
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000486 // This method inserts the caller saving code for call instructions
487 //
Anand Shukla24787fa2002-07-11 00:16:28 +0000488 void insertCallerSavingCode(std::vector<MachineInstr*>& instrnsBefore,
489 std::vector<MachineInstr*>& instrnsAfter,
Vikram S. Adve6a49a1e2002-07-10 21:42:42 +0000490 MachineInstr *MInst,
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000491 const BasicBlock *BB, PhyRegAlloc &PRA ) const;
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000492};
493
494
495
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000496
497//---------------------------------------------------------------------------
498// class UltraSparcSchedInfo
499//
500// Purpose:
501// Interface to instruction scheduling information for UltraSPARC.
502// The parameter values above are based on UltraSPARC IIi.
503//---------------------------------------------------------------------------
504
505
Chris Lattnerd0f166a2002-12-29 03:13:05 +0000506class UltraSparcSchedInfo: public TargetSchedInfo {
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000507public:
Chris Lattner699683c2002-02-04 05:59:25 +0000508 UltraSparcSchedInfo(const TargetMachine &tgt);
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000509protected:
Chris Lattner699683c2002-02-04 05:59:25 +0000510 virtual void initializeResources();
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000511};
512
Chris Lattnerf6e0e282001-09-14 04:32:55 +0000513
514//---------------------------------------------------------------------------
Vikram S. Advec1521632001-10-22 13:31:53 +0000515// class UltraSparcFrameInfo
516//
517// Purpose:
518// Interface to stack frame layout info for the UltraSPARC.
Vikram S. Adve00521d72001-11-12 23:26:35 +0000519// Starting offsets for each area of the stack frame are aligned at
520// a multiple of getStackFrameSizeAlignment().
Vikram S. Advec1521632001-10-22 13:31:53 +0000521//---------------------------------------------------------------------------
522
Chris Lattnerda62ac62002-12-28 20:20:24 +0000523class UltraSparcFrameInfo: public TargetFrameInfo {
524 const TargetMachine &target;
Vikram S. Advec1521632001-10-22 13:31:53 +0000525public:
Chris Lattnerda62ac62002-12-28 20:20:24 +0000526 UltraSparcFrameInfo(const TargetMachine &TM)
527 : TargetFrameInfo(StackGrowsDown, StackFrameSizeAlignment, 0), target(TM) {}
Vikram S. Adve7f37fe52001-11-08 04:55:13 +0000528
529public:
Vikram S. Advee1f72802002-09-16 15:39:26 +0000530 // These methods provide constant parameters of the frame layout.
531 //
Chris Lattnerf57b8452002-04-27 06:56:12 +0000532 int getStackFrameSizeAlignment() const { return StackFrameSizeAlignment;}
533 int getMinStackFrameSize() const { return MinStackFrameSize; }
534 int getNumFixedOutgoingArgs() const { return NumFixedOutgoingArgs; }
535 int getSizeOfEachArgOnStack() const { return SizeOfEachArgOnStack; }
536 bool argsOnStackHaveFixedSize() const { return true; }
Vikram S. Adve7f37fe52001-11-08 04:55:13 +0000537
Vikram S. Advee1f72802002-09-16 15:39:26 +0000538 // This method adjusts a stack offset to meet alignment rules of target.
539 // The fixed OFFSET (0x7ff) must be subtracted and the result aligned.
540 virtual int adjustAlignment (int unalignedOffset,
541 bool growUp,
542 unsigned int align) const {
543 return unalignedOffset + (growUp? +1:-1)*((unalignedOffset-OFFSET) % align);
544 }
545
Vikram S. Adve7f37fe52001-11-08 04:55:13 +0000546 // These methods compute offsets using the frame contents for a
Chris Lattnerf57b8452002-04-27 06:56:12 +0000547 // particular function. The frame contents are obtained from the
548 // MachineCodeInfoForMethod object for the given function.
Vikram S. Adve7f37fe52001-11-08 04:55:13 +0000549 //
Misha Brukmanfce11432002-10-28 00:28:31 +0000550 int getFirstIncomingArgOffset (MachineFunction& mcInfo,
Vikram S. Adve6d783112002-04-25 04:40:24 +0000551 bool& growUp) const
Vikram S. Adve7f37fe52001-11-08 04:55:13 +0000552 {
Vikram S. Adve6d783112002-04-25 04:40:24 +0000553 growUp = true; // arguments area grows upwards
Vikram S. Adve7f37fe52001-11-08 04:55:13 +0000554 return FirstIncomingArgOffsetFromFP;
555 }
Misha Brukmanfce11432002-10-28 00:28:31 +0000556 int getFirstOutgoingArgOffset (MachineFunction& mcInfo,
Vikram S. Adve6d783112002-04-25 04:40:24 +0000557 bool& growUp) const
Vikram S. Adve7f37fe52001-11-08 04:55:13 +0000558 {
Vikram S. Adve6d783112002-04-25 04:40:24 +0000559 growUp = true; // arguments area grows upwards
Vikram S. Adve7f37fe52001-11-08 04:55:13 +0000560 return FirstOutgoingArgOffsetFromSP;
561 }
Misha Brukmanfce11432002-10-28 00:28:31 +0000562 int getFirstOptionalOutgoingArgOffset(MachineFunction& mcInfo,
Vikram S. Adve6d783112002-04-25 04:40:24 +0000563 bool& growUp)const
Vikram S. Adve7f37fe52001-11-08 04:55:13 +0000564 {
Vikram S. Adve6d783112002-04-25 04:40:24 +0000565 growUp = true; // arguments area grows upwards
Vikram S. Adve7f37fe52001-11-08 04:55:13 +0000566 return FirstOptionalOutgoingArgOffsetFromSP;
567 }
568
Misha Brukmanfce11432002-10-28 00:28:31 +0000569 int getFirstAutomaticVarOffset (MachineFunction& mcInfo,
Vikram S. Adve6d783112002-04-25 04:40:24 +0000570 bool& growUp) const;
Misha Brukmanfce11432002-10-28 00:28:31 +0000571 int getRegSpillAreaOffset (MachineFunction& mcInfo,
Vikram S. Adve6d783112002-04-25 04:40:24 +0000572 bool& growUp) const;
Misha Brukmanfce11432002-10-28 00:28:31 +0000573 int getTmpAreaOffset (MachineFunction& mcInfo,
Vikram S. Adve6d783112002-04-25 04:40:24 +0000574 bool& growUp) const;
Misha Brukmanfce11432002-10-28 00:28:31 +0000575 int getDynamicAreaOffset (MachineFunction& mcInfo,
Vikram S. Adve6d783112002-04-25 04:40:24 +0000576 bool& growUp) const;
Vikram S. Adve7f37fe52001-11-08 04:55:13 +0000577
578 //
579 // These methods specify the base register used for each stack area
580 // (generally FP or SP)
581 //
582 virtual int getIncomingArgBaseRegNum() const {
583 return (int) target.getRegInfo().getFramePointer();
584 }
585 virtual int getOutgoingArgBaseRegNum() const {
586 return (int) target.getRegInfo().getStackPointer();
587 }
588 virtual int getOptionalOutgoingArgBaseRegNum() const {
589 return (int) target.getRegInfo().getStackPointer();
590 }
591 virtual int getAutomaticVarBaseRegNum() const {
592 return (int) target.getRegInfo().getFramePointer();
593 }
594 virtual int getRegSpillAreaBaseRegNum() const {
595 return (int) target.getRegInfo().getFramePointer();
596 }
597 virtual int getDynamicAreaBaseRegNum() const {
598 return (int) target.getRegInfo().getStackPointer();
599 }
Chris Lattnerda62ac62002-12-28 20:20:24 +0000600
601 virtual int getIncomingArgOffset(MachineFunction& mcInfo,
602 unsigned argNum) const {
603 assert(argsOnStackHaveFixedSize());
604
605 unsigned relativeOffset = argNum * getSizeOfEachArgOnStack();
606 bool growUp; // do args grow up or down
607 int firstArg = getFirstIncomingArgOffset(mcInfo, growUp);
608 return growUp ? firstArg + relativeOffset : firstArg - relativeOffset;
609 }
610
611 virtual int getOutgoingArgOffset(MachineFunction& mcInfo,
612 unsigned argNum) const {
613 assert(argsOnStackHaveFixedSize());
614 //assert(((int) argNum - this->getNumFixedOutgoingArgs())
615 // <= (int) mcInfo.getInfo()->getMaxOptionalNumArgs());
616
617 unsigned relativeOffset = argNum * getSizeOfEachArgOnStack();
618 bool growUp; // do args grow up or down
619 int firstArg = getFirstOutgoingArgOffset(mcInfo, growUp);
620 return growUp ? firstArg + relativeOffset : firstArg - relativeOffset;
621 }
Vikram S. Adve7f37fe52001-11-08 04:55:13 +0000622
623private:
Vikram S. Advee1f72802002-09-16 15:39:26 +0000624 /*----------------------------------------------------------------------
625 This diagram shows the stack frame layout used by llc on Sparc V9.
626 Note that only the location of automatic variables, spill area,
627 temporary storage, and dynamically allocated stack area are chosen
628 by us. The rest conform to the Sparc V9 ABI.
629 All stack addresses are offset by OFFSET = 0x7ff (2047).
630
Chris Lattnerda62ac62002-12-28 20:20:24 +0000631 Alignment assumptions and other invariants:
Vikram S. Advee1f72802002-09-16 15:39:26 +0000632 (1) %sp+OFFSET and %fp+OFFSET are always aligned on 16-byte boundary
633 (2) Variables in automatic, spill, temporary, or dynamic regions
634 are aligned according to their size as in all memory accesses.
635 (3) Everything below the dynamically allocated stack area is only used
636 during a call to another function, so it is never needed when
637 the current function is active. This is why space can be allocated
638 dynamically by incrementing %sp any time within the function.
639
640 STACK FRAME LAYOUT:
641
642 ...
643 %fp+OFFSET+176 Optional extra incoming arguments# 1..N
644 %fp+OFFSET+168 Incoming argument #6
645 ... ...
646 %fp+OFFSET+128 Incoming argument #1
647 ... ...
648 ---%fp+OFFSET-0--------Bottom of caller's stack frame--------------------
649 %fp+OFFSET-8 Automatic variables <-- ****TOP OF STACK FRAME****
650 Spill area
651 Temporary storage
652 ...
653
654 %sp+OFFSET+176+8N Bottom of dynamically allocated stack area
655 %sp+OFFSET+168+8N Optional extra outgoing argument# N
656 ... ...
657 %sp+OFFSET+176 Optional extra outgoing argument# 1
658 %sp+OFFSET+168 Outgoing argument #6
659 ... ...
660 %sp+OFFSET+128 Outgoing argument #1
661 %sp+OFFSET+120 Save area for %i7
662 ... ...
663 %sp+OFFSET+0 Save area for %l0 <-- ****BOTTOM OF STACK FRAME****
664
665 *----------------------------------------------------------------------*/
666
Vikram S. Adve5afff3b2001-11-09 02:15:52 +0000667 // All stack addresses must be offset by 0x7ff (2047) on Sparc V9.
668 static const int OFFSET = (int) 0x7ff;
Vikram S. Adve7f37fe52001-11-08 04:55:13 +0000669 static const int StackFrameSizeAlignment = 16;
Vikram S. Advec1521632001-10-22 13:31:53 +0000670 static const int MinStackFrameSize = 176;
Vikram S. Adve7f37fe52001-11-08 04:55:13 +0000671 static const int NumFixedOutgoingArgs = 6;
672 static const int SizeOfEachArgOnStack = 8;
Vikram S. Adve5afff3b2001-11-09 02:15:52 +0000673 static const int FirstIncomingArgOffsetFromFP = 128 + OFFSET;
674 static const int FirstOptionalIncomingArgOffsetFromFP = 176 + OFFSET;
Vikram S. Advee1f72802002-09-16 15:39:26 +0000675 static const int StaticAreaOffsetFromFP = 0 + OFFSET;
Vikram S. Adve5afff3b2001-11-09 02:15:52 +0000676 static const int FirstOutgoingArgOffsetFromSP = 128 + OFFSET;
677 static const int FirstOptionalOutgoingArgOffsetFromSP = 176 + OFFSET;
Vikram S. Advec1521632001-10-22 13:31:53 +0000678};
679
680
Vikram S. Adve5afff3b2001-11-09 02:15:52 +0000681//---------------------------------------------------------------------------
682// class UltraSparcCacheInfo
683//
684// Purpose:
685// Interface to cache parameters for the UltraSPARC.
686// Just use defaults for now.
687//---------------------------------------------------------------------------
688
Chris Lattnerdde12622002-12-29 02:50:33 +0000689struct UltraSparcCacheInfo: public TargetCacheInfo {
690 UltraSparcCacheInfo(const TargetMachine &T) : TargetCacheInfo(T) {}
Vikram S. Adve5afff3b2001-11-09 02:15:52 +0000691};
692
Vikram S. Advec1521632001-10-22 13:31:53 +0000693
694//---------------------------------------------------------------------------
Vikram S. Adved55697c2002-09-20 00:52:09 +0000695// class UltraSparcOptInfo
696//
697// Purpose:
698// Interface to machine-level optimization routines for the UltraSPARC.
699//---------------------------------------------------------------------------
700
Chris Lattnerdde12622002-12-29 02:50:33 +0000701struct UltraSparcOptInfo: public TargetOptInfo {
702 UltraSparcOptInfo(const TargetMachine &T) : TargetOptInfo(T) {}
Vikram S. Adved55697c2002-09-20 00:52:09 +0000703
704 virtual bool IsUselessCopy (const MachineInstr* MI) const;
705};
706
Vikram S. Adved55697c2002-09-20 00:52:09 +0000707//---------------------------------------------------------------------------
Chris Lattnerf6e0e282001-09-14 04:32:55 +0000708// class UltraSparcMachine
709//
710// Purpose:
711// Primary interface to machine description for the UltraSPARC.
712// Primarily just initializes machine-dependent parameters in
713// class TargetMachine, and creates machine-dependent subclasses
Vikram S. Adve339084b2001-09-18 13:04:24 +0000714// for classes such as InstrInfo, SchedInfo and RegInfo.
Chris Lattnerf6e0e282001-09-14 04:32:55 +0000715//---------------------------------------------------------------------------
716
717class UltraSparc : public TargetMachine {
Vikram S. Adve339084b2001-09-18 13:04:24 +0000718 UltraSparcInstrInfo instrInfo;
719 UltraSparcSchedInfo schedInfo;
720 UltraSparcRegInfo regInfo;
Vikram S. Advec1521632001-10-22 13:31:53 +0000721 UltraSparcFrameInfo frameInfo;
Vikram S. Adve5afff3b2001-11-09 02:15:52 +0000722 UltraSparcCacheInfo cacheInfo;
Vikram S. Adved55697c2002-09-20 00:52:09 +0000723 UltraSparcOptInfo optInfo;
Chris Lattnerf6e0e282001-09-14 04:32:55 +0000724public:
725 UltraSparc();
Vikram S. Adved55697c2002-09-20 00:52:09 +0000726
Chris Lattner3501fea2003-01-14 22:00:31 +0000727 virtual const TargetInstrInfo &getInstrInfo() const { return instrInfo; }
Chris Lattnerd0f166a2002-12-29 03:13:05 +0000728 virtual const TargetSchedInfo &getSchedInfo() const { return schedInfo; }
729 virtual const TargetRegInfo &getRegInfo() const { return regInfo; }
Chris Lattnerda62ac62002-12-28 20:20:24 +0000730 virtual const TargetFrameInfo &getFrameInfo() const { return frameInfo; }
Chris Lattnerdde12622002-12-29 02:50:33 +0000731 virtual const TargetCacheInfo &getCacheInfo() const { return cacheInfo; }
732 virtual const TargetOptInfo &getOptInfo() const { return optInfo; }
Chris Lattner32f600a2001-09-19 13:47:12 +0000733
Chris Lattner63342052002-10-29 21:12:46 +0000734 virtual bool addPassesToEmitAssembly(PassManager &PM, std::ostream &Out);
Chris Lattner4f946372002-10-28 01:03:43 +0000735
Chris Lattnerc66583e2002-10-29 22:01:44 +0000736 // getPrologEpilogInsertionPass - Inserts prolog/epilog code.
737 Pass* getPrologEpilogInsertionPass();
Chris Lattnerf6e0e282001-09-14 04:32:55 +0000738
Vikram S. Advee1f72802002-09-16 15:39:26 +0000739 // getFunctionAsmPrinterPass - Writes out machine code for a single function
Chris Lattnerc66583e2002-10-29 22:01:44 +0000740 Pass* getFunctionAsmPrinterPass(std::ostream &Out);
Vikram S. Advee1f72802002-09-16 15:39:26 +0000741
742 // getModuleAsmPrinterPass - Writes generated machine code to assembly file.
Chris Lattnerc66583e2002-10-29 22:01:44 +0000743 Pass* getModuleAsmPrinterPass(std::ostream &Out);
Vikram S. Advee1f72802002-09-16 15:39:26 +0000744
745 // getEmitBytecodeToAsmPass - Emits final LLVM bytecode to assembly file.
Chris Lattnerc66583e2002-10-29 22:01:44 +0000746 Pass* getEmitBytecodeToAsmPass(std::ostream &Out);
Chris Lattner6edfcc52002-02-03 07:51:17 +0000747};
Chris Lattnerf6e0e282001-09-14 04:32:55 +0000748
Chris Lattner795ba6c2003-01-15 21:36:50 +0000749int64_t GetConstantValueAsSignedInt(const Value *V, bool &isValidConstant);
750
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000751#endif