blob: 0ad163c0815bfedcbebbb615cc6e291e9ba1a777 [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
Misha Brukmand21a02a2003-05-24 00:09:50 +000011#include "llvm/CodeGen/MachineInstrBuilder.h"
Ruchira Sasankadfc6c882001-09-18 22:52:44 +000012#include "llvm/Target/TargetMachine.h"
Chris Lattnerf9781b52002-12-29 03:13:05 +000013#include "llvm/Target/TargetSchedInfo.h"
Chris Lattner871e5912002-12-28 21:00:25 +000014#include "llvm/Target/TargetFrameInfo.h"
Chris Lattner83d835d2002-12-29 02:50:33 +000015#include "llvm/Target/TargetCacheInfo.h"
Chris Lattnerf9781b52002-12-29 03:13:05 +000016#include "llvm/Target/TargetRegInfo.h"
Chris Lattner83d835d2002-12-29 02:50:33 +000017#include "llvm/Target/TargetOptInfo.h"
Chris Lattner5fae0de2001-09-14 03:56:45 +000018#include "llvm/Type.h"
Misha Brukmand21a02a2003-05-24 00:09:50 +000019#include "SparcRegClassInfo.h"
Chris Lattner8d44b992001-09-14 16:56:32 +000020#include <sys/types.h>
Chris Lattner5fae0de2001-09-14 03:56:45 +000021
Chris Lattner38aa77b2002-02-03 23:42:19 +000022class LiveRange;
Chris Lattnerf8464e42001-09-14 04:32:55 +000023class UltraSparc;
Chris Lattner38aa77b2002-02-03 23:42:19 +000024class PhyRegAlloc;
Chris Lattner35b90c22002-04-09 05:16:36 +000025class Pass;
Chris Lattner38aa77b2002-02-03 23:42:19 +000026
Chris Lattner5fae0de2001-09-14 03:56:45 +000027enum SparcInstrSchedClass {
28 SPARC_NONE, /* Instructions with no scheduling restrictions */
29 SPARC_IEUN, /* Integer class that can use IEU0 or IEU1 */
30 SPARC_IEU0, /* Integer class IEU0 */
31 SPARC_IEU1, /* Integer class IEU1 */
32 SPARC_FPM, /* FP Multiply or Divide instructions */
33 SPARC_FPA, /* All other FP instructions */
34 SPARC_CTI, /* Control-transfer instructions */
35 SPARC_LD, /* Load instructions */
36 SPARC_ST, /* Store instructions */
37 SPARC_SINGLE, /* Instructions that must issue by themselves */
38
39 SPARC_INV, /* This should stay at the end for the next value */
40 SPARC_NUM_SCHED_CLASSES = SPARC_INV
41};
42
Chris Lattner5fae0de2001-09-14 03:56:45 +000043
44//---------------------------------------------------------------------------
45// enum SparcMachineOpCode.
Chris Lattnerb4d58d72003-01-14 22:00:31 +000046// const TargetInstrDescriptor SparcMachineInstrDesc[]
Chris Lattner5fae0de2001-09-14 03:56:45 +000047//
48// Purpose:
49// Description of UltraSparc machine instructions.
50//
51//---------------------------------------------------------------------------
52
Misha Brukman56f4fa12003-05-20 20:32:24 +000053namespace V9 {
54 enum SparcMachineOpCode {
Chris Lattnere86a0232001-09-19 15:56:23 +000055#define I(ENUM, OPCODESTRING, NUMOPERANDS, RESULTPOS, MAXIMM, IMMSE, \
56 NUMDELAYSLOTS, LATENCY, SCHEDCLASS, INSTFLAGS) \
57 ENUM,
58#include "SparcInstr.def"
Chris Lattner5fae0de2001-09-14 03:56:45 +000059
Misha Brukman56f4fa12003-05-20 20:32:24 +000060 // End-of-array marker
61 INVALID_OPCODE,
62 NUM_REAL_OPCODES = PHI, // number of valid opcodes
63 NUM_TOTAL_OPCODES = INVALID_OPCODE
64 };
65}
Chris Lattner5fae0de2001-09-14 03:56:45 +000066
Chris Lattner5fae0de2001-09-14 03:56:45 +000067
Chris Lattnere86a0232001-09-19 15:56:23 +000068// Array of machine instruction descriptions...
Chris Lattnerb4d58d72003-01-14 22:00:31 +000069extern const TargetInstrDescriptor SparcMachineInstrDesc[];
Chris Lattner5fae0de2001-09-14 03:56:45 +000070
71
72//---------------------------------------------------------------------------
73// class UltraSparcInstrInfo
74//
75// Purpose:
76// Information about individual instructions.
77// Most information is stored in the SparcMachineInstrDesc array above.
78// Other information is computed on demand, and most such functions
Chris Lattnerb4d58d72003-01-14 22:00:31 +000079// default to member functions in base class TargetInstrInfo.
Chris Lattner5fae0de2001-09-14 03:56:45 +000080//---------------------------------------------------------------------------
81
Chris Lattnerb4d58d72003-01-14 22:00:31 +000082struct UltraSparcInstrInfo : public TargetInstrInfo {
Chris Lattner01efae02002-10-29 15:45:20 +000083 UltraSparcInstrInfo();
Vikram S. Adve7e833072001-11-14 18:48:36 +000084
85 //
Vikram S. Adve0513e012002-03-18 03:02:42 +000086 // All immediate constants are in position 1 except the
Vikram S. Adve36d3e032002-09-16 15:39:26 +000087 // store instructions and SETxx.
Vikram S. Adve7e833072001-11-14 18:48:36 +000088 //
Vikram S. Adve0513e012002-03-18 03:02:42 +000089 virtual int getImmedConstantPos(MachineOpCode opCode) const {
Vikram S. Adve7e833072001-11-14 18:48:36 +000090 bool ignore;
Misha Brukman56f4fa12003-05-20 20:32:24 +000091 if (this->maxImmedConstant(opCode, ignore) != 0) {
92 // 1st store opcode
93 assert(! this->isStore((MachineOpCode) V9::STB - 1));
94 // last store opcode
95 assert(! this->isStore((MachineOpCode) V9::STXFSR + 1));
96
97 if (opCode == V9::SETSW || opCode == V9::SETUW ||
98 opCode == V9::SETX || opCode == V9::SETHI)
99 return 0;
100 if (opCode >= V9::STB && opCode <= V9::STXFSR)
101 return 2;
102 return 1;
103 }
Vikram S. Adve7e833072001-11-14 18:48:36 +0000104 else
105 return -1;
106 }
Misha Brukmand21a02a2003-05-24 00:09:50 +0000107
108 /// createNOPinstr - returns the target's implementation of NOP, which is
109 /// usually a pseudo-instruction, implemented by a degenerate version of
110 /// another instruction, e.g. X86: xchg ax, ax; SparcV9: sethi g0, 0
111 ///
112 MachineInstr* createNOPinstr() const {
113 return BuildMI(V9::SETHI, 2).addReg(SparcIntRegClass::g0).addZImm(0);
114 }
115
116 /// isNOPinstr - since we no longer have a special NOP opcode, we need to know
117 /// if a given instruction is interpreted as an `official' NOP instr, i.e.,
118 /// there may be more than one way to `do nothing' but only one canonical
119 /// way to slack off.
120 ///
121 bool isNOPinstr(const MachineInstr &MI) const {
122 // Make sure the instruction is EXACTLY `sethi g0, 0'
123 if (MI.getOpcode() == V9::SETHI && MI.getNumOperands() == 2) {
124 const MachineOperand &op0 = MI.getOperand(0), &op1 = MI.getOperand(1);
125 if (op0.isMachineRegister() &&
126 op0.getMachineRegNum() == SparcIntRegClass::g0 &&
127 op1.isImmediate() && op1.getImmedValue() == 0)
128 {
129 return true;
130 }
131 }
132 return false;
133 }
Chris Lattner5fae0de2001-09-14 03:56:45 +0000134
Misha Brukman56f4fa12003-05-20 20:32:24 +0000135 virtual bool hasResultInterlock(MachineOpCode opCode) const
Chris Lattner5fae0de2001-09-14 03:56:45 +0000136 {
137 // All UltraSPARC instructions have interlocks (note that delay slots
138 // are not considered here).
139 // However, instructions that use the result of an FCMP produce a
140 // 9-cycle stall if they are issued less than 3 cycles after the FCMP.
141 // Force the compiler to insert a software interlock (i.e., gap of
142 // 2 other groups, including NOPs if necessary).
Misha Brukman56f4fa12003-05-20 20:32:24 +0000143 return (opCode == V9::FCMPS || opCode == V9::FCMPD || opCode == V9::FCMPQ);
Chris Lattner5fae0de2001-09-14 03:56:45 +0000144 }
145
Vikram S. Adve505130c2001-10-18 00:02:06 +0000146 //-------------------------------------------------------------------------
Vikram S. Adve36d3e032002-09-16 15:39:26 +0000147 // Queries about representation of LLVM quantities (e.g., constants)
148 //-------------------------------------------------------------------------
149
150 virtual bool ConstantMayNotFitInImmedField(const Constant* CV,
151 const Instruction* I) const;
152
153 //-------------------------------------------------------------------------
Vikram S. Adve505130c2001-10-18 00:02:06 +0000154 // Code generation support for creating individual machine instructions
155 //-------------------------------------------------------------------------
Vikram S. Advebbf45f62002-09-20 00:52:09 +0000156
157 // Get certain common op codes for the current target. This and all the
158 // Create* methods below should be moved to a machine code generation class
159 //
Misha Brukman56f4fa12003-05-20 20:32:24 +0000160 virtual MachineOpCode getNOPOpCode() const { return V9::NOP; }
Vikram S. Advebbf45f62002-09-20 00:52:09 +0000161
Vikram S. Adve505130c2001-10-18 00:02:06 +0000162 // Create an instruction sequence to put the constant `val' into
Vikram S. Advee9327f02002-05-19 15:25:51 +0000163 // the virtual register `dest'. `val' may be a Constant or a
164 // GlobalValue, viz., the constant address of a global variable or function.
165 // The generated instructions are returned in `mvec'.
166 // Any temp. registers (TmpInstruction) created are recorded in mcfi.
167 // Any stack space required is allocated via mcff.
Vikram S. Adve505130c2001-10-18 00:02:06 +0000168 //
Vikram S. Advee9327f02002-05-19 15:25:51 +0000169 virtual void CreateCodeToLoadConst(const TargetMachine& target,
170 Function* F,
Vikram S. Adve0513e012002-03-18 03:02:42 +0000171 Value* val,
Vikram S. Adve505130c2001-10-18 00:02:06 +0000172 Instruction* dest,
Vikram S. Advee9327f02002-05-19 15:25:51 +0000173 std::vector<MachineInstr*>& mvec,
174 MachineCodeForInstruction& mcfi) const;
Vikram S. Adve6fcb2892001-11-08 04:55:13 +0000175
Vikram S. Adve367f34f2001-11-09 02:15:52 +0000176 // Create an instruction sequence to copy an integer value `val'
177 // to a floating point value `dest' by copying to memory and back.
178 // val must be an integral type. dest must be a Float or Double.
Vikram S. Advee9327f02002-05-19 15:25:51 +0000179 // The generated instructions are returned in `mvec'.
180 // Any temp. registers (TmpInstruction) created are recorded in mcfi.
181 // Any stack space required is allocated via mcff.
Vikram S. Adve6fcb2892001-11-08 04:55:13 +0000182 //
Vikram S. Advee9327f02002-05-19 15:25:51 +0000183 virtual void CreateCodeToCopyIntToFloat(const TargetMachine& target,
184 Function* F,
185 Value* val,
186 Instruction* dest,
187 std::vector<MachineInstr*>& mvec,
188 MachineCodeForInstruction& mcfi) const;
Vikram S. Adve367f34f2001-11-09 02:15:52 +0000189
190 // Similarly, create an instruction sequence to copy an FP value
191 // `val' to an integer value `dest' by copying to memory and back.
Vikram S. Advee9327f02002-05-19 15:25:51 +0000192 // The generated instructions are returned in `mvec'.
193 // Any temp. registers (TmpInstruction) created are recorded in mcfi.
194 // Any stack space required is allocated via mcff.
Vikram S. Adve367f34f2001-11-09 02:15:52 +0000195 //
Vikram S. Advee9327f02002-05-19 15:25:51 +0000196 virtual void CreateCodeToCopyFloatToInt(const TargetMachine& target,
197 Function* F,
198 Value* val,
199 Instruction* dest,
200 std::vector<MachineInstr*>& mvec,
201 MachineCodeForInstruction& mcfi) const;
202
203 // Create instruction(s) to copy src to dest, for arbitrary types
204 // The generated instructions are returned in `mvec'.
205 // Any temp. registers (TmpInstruction) created are recorded in mcfi.
206 // Any stack space required is allocated via mcff.
207 //
Vikram S. Adve0513e012002-03-18 03:02:42 +0000208 virtual void CreateCopyInstructionsByType(const TargetMachine& target,
Vikram S. Advee9327f02002-05-19 15:25:51 +0000209 Function* F,
210 Value* src,
211 Instruction* dest,
212 std::vector<MachineInstr*>& mvec,
213 MachineCodeForInstruction& mcfi) const;
214
215 // Create instruction sequence to produce a sign-extended register value
216 // from an arbitrary sized value (sized in bits, not bytes).
Vikram S. Advef5d585d2002-09-05 18:34:31 +0000217 // The generated instructions are appended to `mvec'.
218 // Any temp. registers (TmpInstruction) created are recorded in mcfi.
Vikram S. Advee9327f02002-05-19 15:25:51 +0000219 // Any stack space required is allocated via mcff.
220 //
221 virtual void CreateSignExtensionInstructions(const TargetMachine& target,
222 Function* F,
Vikram S. Advef5d585d2002-09-05 18:34:31 +0000223 Value* srcVal,
Vikram S. Adve40e23472002-09-27 14:29:45 +0000224 Value* destVal,
225 unsigned int numLowBits,
Vikram S. Advef5d585d2002-09-05 18:34:31 +0000226 std::vector<MachineInstr*>& mvec,
227 MachineCodeForInstruction& mcfi) const;
228
229 // Create instruction sequence to produce a zero-extended register value
230 // from an arbitrary sized value (sized in bits, not bytes).
231 // The generated instructions are appended to `mvec'.
232 // Any temp. registers (TmpInstruction) created are recorded in mcfi.
233 // Any stack space required is allocated via mcff.
234 //
235 virtual void CreateZeroExtensionInstructions(const TargetMachine& target,
236 Function* F,
237 Value* srcVal,
Vikram S. Adve40e23472002-09-27 14:29:45 +0000238 Value* destVal,
239 unsigned int numLowBits,
Vikram S. Advee9327f02002-05-19 15:25:51 +0000240 std::vector<MachineInstr*>& mvec,
241 MachineCodeForInstruction& mcfi) const;
Chris Lattner5fae0de2001-09-14 03:56:45 +0000242};
243
Ruchira Sasanka7d144a82001-09-15 00:30:44 +0000244
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000245//----------------------------------------------------------------------------
246// class UltraSparcRegInfo
247//
Chris Lattnerf9781b52002-12-29 03:13:05 +0000248// This class implements the virtual class TargetRegInfo for Sparc.
Ruchira Sasanka57386b52002-01-07 20:28:49 +0000249//
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000250//----------------------------------------------------------------------------
251
Chris Lattnerf9781b52002-12-29 03:13:05 +0000252class UltraSparcRegInfo : public TargetRegInfo {
Ruchira Sasanka560b0ad2001-09-30 23:19:57 +0000253 // The actual register classes in the Sparc
Ruchira Sasanka57386b52002-01-07 20:28:49 +0000254 //
Ruchira Sasanka7d144a82001-09-15 00:30:44 +0000255 enum RegClassIDs {
Ruchira Sasanka57386b52002-01-07 20:28:49 +0000256 IntRegClassID, // Integer
257 FloatRegClassID, // Float (both single/double)
258 IntCCRegClassID, // Int Condition Code
259 FloatCCRegClassID // Float Condition code
Ruchira Sasanka7d144a82001-09-15 00:30:44 +0000260 };
261
Ruchira Sasanka560b0ad2001-09-30 23:19:57 +0000262
263 // Type of registers available in Sparc. There can be several reg types
264 // in the same class. For instace, the float reg class has Single/Double
265 // types
Ruchira Sasanka57386b52002-01-07 20:28:49 +0000266 //
Ruchira Sasanka560b0ad2001-09-30 23:19:57 +0000267 enum RegTypes {
268 IntRegType,
269 FPSingleRegType,
270 FPDoubleRegType,
271 IntCCRegType,
272 FloatCCRegType
273 };
274
Ruchira Sasanka57386b52002-01-07 20:28:49 +0000275 // **** WARNING: If the above enum order is changed, also modify
Ruchira Sasanka7d144a82001-09-15 00:30:44 +0000276 // getRegisterClassOfValue method below since it assumes this particular
277 // order for efficiency.
278
Chris Lattner5fae0de2001-09-14 03:56:45 +0000279
Ruchira Sasanka57386b52002-01-07 20:28:49 +0000280 // Number of registers used for passing int args (usually 6: %o0 - %o5)
281 //
Chris Lattner5fae0de2001-09-14 03:56:45 +0000282 unsigned const NumOfIntArgRegs;
Ruchira Sasanka57386b52002-01-07 20:28:49 +0000283
284 // Number of registers used for passing float args (usually 32: %f0 - %f31)
285 //
Chris Lattner5fae0de2001-09-14 03:56:45 +0000286 unsigned const NumOfFloatArgRegs;
Ruchira Sasanka57386b52002-01-07 20:28:49 +0000287
288 // An out of bound register number that can be used to initialize register
289 // numbers. Useful for error detection.
290 //
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +0000291 int const InvalidRegNum;
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000292
293
Ruchira Sasanka57386b52002-01-07 20:28:49 +0000294 // ======================== Private Methods =============================
Chris Lattner5fae0de2001-09-14 03:56:45 +0000295
Ruchira Sasanka57386b52002-01-07 20:28:49 +0000296 // The following methods are used to color special live ranges (e.g.
Chris Lattnerc8e66542002-04-27 06:56:12 +0000297 // function args and return values etc.) with specific hardware registers
Ruchira Sasanka57386b52002-01-07 20:28:49 +0000298 // as required. See SparcRegInfo.cpp for the implementation.
299 //
Vikram S. Adve5eb69422002-07-08 23:34:10 +0000300 void suggestReg4RetAddr(MachineInstr *RetMI,
Chris Lattner5216cc52002-02-04 05:59:25 +0000301 LiveRangeInfo &LRI) const;
Ruchira Sasanka086bf0f2001-10-15 16:25:28 +0000302
Vikram S. Advecce628a2002-09-28 16:56:59 +0000303 void suggestReg4CallAddr(MachineInstr *CallMI, LiveRangeInfo &LRI) const;
Vikram S. Adve5eb69422002-07-08 23:34:10 +0000304
305 void InitializeOutgoingArg(MachineInstr* CallMI, AddedInstrns *CallAI,
Vikram S. Advee9327f02002-05-19 15:25:51 +0000306 PhyRegAlloc &PRA, LiveRange* LR,
307 unsigned regType, unsigned RegClassID,
308 int UniArgReg, unsigned int argNo,
309 std::vector<MachineInstr *>& AddedInstrnsBefore)
310 const;
311
Chris Lattnerf9fd5912003-01-15 21:14:32 +0000312 int getRegType(const Type* type) const;
Chris Lattner5216cc52002-02-04 05:59:25 +0000313 int getRegType(const LiveRange *LR) const;
Vikram S. Adve5eb69422002-07-08 23:34:10 +0000314 int getRegType(int unifiedRegNum) const;
Ruchira Sasanka9d8950d2001-11-03 19:59:59 +0000315
Ruchira Sasanka57386b52002-01-07 20:28:49 +0000316 // Used to generate a copy instruction based on the register class of
317 // value.
318 //
Chris Lattner5216cc52002-02-04 05:59:25 +0000319 MachineInstr *cpValue2RegMI(Value *Val, unsigned DestReg,
320 int RegType) const;
Ruchira Sasanka0c085982001-11-10 21:20:43 +0000321
322
Ruchira Sasanka57386b52002-01-07 20:28:49 +0000323 // The following 2 methods are used to order the instructions addeed by
Chris Lattnerc8e66542002-04-27 06:56:12 +0000324 // the register allocator in association with function calling. See
Ruchira Sasanka57386b52002-01-07 20:28:49 +0000325 // SparcRegInfo.cpp for more details
326 //
Chris Lattner7f74a562002-01-20 22:54:45 +0000327 void moveInst2OrdVec(std::vector<MachineInstr *> &OrdVec,
328 MachineInstr *UnordInst,
329 PhyRegAlloc &PRA) const;
Ruchira Sasanka0c085982001-11-10 21:20:43 +0000330
Chris Lattner7f74a562002-01-20 22:54:45 +0000331 void OrderAddedInstrns(std::vector<MachineInstr *> &UnordVec,
332 std::vector<MachineInstr *> &OrdVec,
333 PhyRegAlloc &PRA) const;
Ruchira Sasanka0c085982001-11-10 21:20:43 +0000334
335
Vikram S. Advea77a8ee2002-04-25 04:40:24 +0000336 // Compute which register can be used for an argument, if any
337 //
338 int regNumForIntArg(bool inCallee, bool isVarArgsCall,
339 unsigned argNo, unsigned intArgNo, unsigned fpArgNo,
340 unsigned& regClassId) const;
Ruchira Sasanka0c085982001-11-10 21:20:43 +0000341
Vikram S. Advea77a8ee2002-04-25 04:40:24 +0000342 int regNumForFPArg(unsigned RegType, bool inCallee, bool isVarArgsCall,
343 unsigned argNo, unsigned intArgNo, unsigned fpArgNo,
344 unsigned& regClassId) const;
345
Chris Lattner5216cc52002-02-04 05:59:25 +0000346public:
347 UltraSparcRegInfo(const UltraSparc &tgt);
Ruchira Sasanka7d144a82001-09-15 00:30:44 +0000348
Vikram S. Adve0513e012002-03-18 03:02:42 +0000349 // To find the register class used for a specified Type
Ruchira Sasanka57386b52002-01-07 20:28:49 +0000350 //
Vikram S. Adve5eb69422002-07-08 23:34:10 +0000351 unsigned getRegClassIDOfType(const Type *type,
352 bool isCCReg = false) const;
Ruchira Sasanka7d144a82001-09-15 00:30:44 +0000353
Vikram S. Adve5eb69422002-07-08 23:34:10 +0000354 // To find the register class to which a specified register belongs
355 //
356 unsigned getRegClassIDOfReg(int unifiedRegNum) const;
357 unsigned getRegClassIDOfRegType(int regType) const;
Vikram S. Adve0513e012002-03-18 03:02:42 +0000358
Chris Lattner5216cc52002-02-04 05:59:25 +0000359 // getZeroRegNum - returns the register that contains always zero this is the
360 // unified register number
Ruchira Sasanka57386b52002-01-07 20:28:49 +0000361 //
Chris Lattner5216cc52002-02-04 05:59:25 +0000362 virtual int getZeroRegNum() const;
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000363
Chris Lattner5216cc52002-02-04 05:59:25 +0000364 // getCallAddressReg - returns the reg used for pushing the address when a
Chris Lattnerc8e66542002-04-27 06:56:12 +0000365 // function is called. This can be used for other purposes between calls
Ruchira Sasanka57386b52002-01-07 20:28:49 +0000366 //
Chris Lattner5216cc52002-02-04 05:59:25 +0000367 unsigned getCallAddressReg() const;
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000368
Ruchira Sasanka57386b52002-01-07 20:28:49 +0000369 // Returns the register containing the return address.
370 // It should be made sure that this register contains the return
371 // value when a return instruction is reached.
372 //
Chris Lattner5216cc52002-02-04 05:59:25 +0000373 unsigned getReturnAddressReg() const;
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000374
Vikram S. Advee9327f02002-05-19 15:25:51 +0000375 // Number of registers used for passing int args (usually 6: %o0 - %o5)
376 // and float args (usually 32: %f0 - %f31)
377 //
378 unsigned const GetNumOfIntArgRegs() const { return NumOfIntArgRegs; }
379 unsigned const GetNumOfFloatArgRegs() const { return NumOfFloatArgRegs; }
380
Ruchira Sasanka57386b52002-01-07 20:28:49 +0000381 // The following methods are used to color special live ranges (e.g.
Chris Lattnerc8e66542002-04-27 06:56:12 +0000382 // function args and return values etc.) with specific hardware registers
Ruchira Sasanka57386b52002-01-07 20:28:49 +0000383 // as required. See SparcRegInfo.cpp for the implementation for Sparc.
384 //
Chris Lattnerf739fa82002-04-08 22:03:57 +0000385 void suggestRegs4MethodArgs(const Function *Meth,
Ruchira Sasanka560b0ad2001-09-30 23:19:57 +0000386 LiveRangeInfo& LRI) const;
Chris Lattner5fae0de2001-09-14 03:56:45 +0000387
Vikram S. Adve5eb69422002-07-08 23:34:10 +0000388 void suggestRegs4CallArgs(MachineInstr *CallMI,
Vikram S. Advecce628a2002-09-28 16:56:59 +0000389 LiveRangeInfo& LRI) const;
Chris Lattner5fae0de2001-09-14 03:56:45 +0000390
Vikram S. Adve5eb69422002-07-08 23:34:10 +0000391 void suggestReg4RetValue(MachineInstr *RetMI,
Chris Lattner7f74a562002-01-20 22:54:45 +0000392 LiveRangeInfo& LRI) const;
Vikram S. Adve5eb69422002-07-08 23:34:10 +0000393
Chris Lattnerf739fa82002-04-08 22:03:57 +0000394 void colorMethodArgs(const Function *Meth, LiveRangeInfo &LRI,
Chris Lattner5216cc52002-02-04 05:59:25 +0000395 AddedInstrns *FirstAI) const;
Ruchira Sasanka560b0ad2001-09-30 23:19:57 +0000396
Vikram S. Adve5eb69422002-07-08 23:34:10 +0000397 void colorCallArgs(MachineInstr *CallMI, LiveRangeInfo &LRI,
Chris Lattner5216cc52002-02-04 05:59:25 +0000398 AddedInstrns *CallAI, PhyRegAlloc &PRA,
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000399 const BasicBlock *BB) const;
Ruchira Sasanka560b0ad2001-09-30 23:19:57 +0000400
Vikram S. Adve5eb69422002-07-08 23:34:10 +0000401 void colorRetValue(MachineInstr *RetI, LiveRangeInfo& LRI,
Chris Lattner5216cc52002-02-04 05:59:25 +0000402 AddedInstrns *RetAI) const;
Ruchira Sasanka560b0ad2001-09-30 23:19:57 +0000403
404
Ruchira Sasanka57386b52002-01-07 20:28:49 +0000405 // method used for printing a register for debugging purposes
406 //
Chris Lattner5216cc52002-02-04 05:59:25 +0000407 static void printReg(const LiveRange *LR);
Ruchira Sasankadfc6c882001-09-18 22:52:44 +0000408
Vikram S. Adve5eb69422002-07-08 23:34:10 +0000409 // Each register class has a seperate space for register IDs. To convert
410 // a regId in a register class to a common Id, or vice versa,
411 // we use the folloing methods.
Ruchira Sasanka57386b52002-01-07 20:28:49 +0000412 //
Vikram S. Adve5eb69422002-07-08 23:34:10 +0000413 // This method provides a unique number for each register
414 inline int getUnifiedRegNum(unsigned regClassID, int reg) const {
415
416 if (regClassID == IntRegClassID) {
417 assert(reg < 32 && "Invalid reg. number");
Chris Lattner5fae0de2001-09-14 03:56:45 +0000418 return reg;
Vikram S. Adve5eb69422002-07-08 23:34:10 +0000419 }
420 else if (regClassID == FloatRegClassID) {
421 assert(reg < 64 && "Invalid reg. number");
Chris Lattner5fae0de2001-09-14 03:56:45 +0000422 return reg + 32; // we have 32 int regs
Vikram S. Adve5eb69422002-07-08 23:34:10 +0000423 }
424 else if (regClassID == FloatCCRegClassID) {
425 assert(reg < 4 && "Invalid reg. number");
Chris Lattner5fae0de2001-09-14 03:56:45 +0000426 return reg + 32 + 64; // 32 int, 64 float
Vikram S. Adve5eb69422002-07-08 23:34:10 +0000427 }
428 else if (regClassID == IntCCRegClassID ) {
429 assert(reg == 0 && "Invalid reg. number");
430 return reg + 4+ 32 + 64; // only one int CC reg
431 }
432 else if (reg==InvalidRegNum) {
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +0000433 return InvalidRegNum;
Vikram S. Adve5eb69422002-07-08 23:34:10 +0000434 }
Ruchira Sasanka7d144a82001-09-15 00:30:44 +0000435 else
Vikram S. Adve5eb69422002-07-08 23:34:10 +0000436 assert(0 && "Invalid register class");
Chris Lattner5e030832001-11-07 13:49:12 +0000437 return 0;
Chris Lattner5fae0de2001-09-14 03:56:45 +0000438 }
Vikram S. Adve5eb69422002-07-08 23:34:10 +0000439
440 // This method converts the unified number to the number in its class,
441 // and returns the class ID in regClassID.
442 inline int getClassRegNum(int ureg, unsigned& regClassID) const {
443 if (ureg < 32) { regClassID = IntRegClassID; return ureg; }
444 else if (ureg < 32+64) { regClassID = FloatRegClassID; return ureg-32; }
445 else if (ureg < 4 +96) { regClassID = FloatCCRegClassID; return ureg-96; }
446 else if (ureg < 1 +100) { regClassID = IntCCRegClassID; return ureg-100;}
447 else if (ureg == InvalidRegNum) { return InvalidRegNum; }
448 else { assert(0 && "Invalid unified register number"); }
Chris Lattner3091e112002-07-25 06:08:32 +0000449 return 0;
Vikram S. Adve5eb69422002-07-08 23:34:10 +0000450 }
451
452 // Returns the assembly-language name of the specified machine register.
Ruchira Sasanka57386b52002-01-07 20:28:49 +0000453 //
Chris Lattner56e91662002-08-12 21:25:05 +0000454 virtual const char * const getUnifiedRegName(int reg) const;
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000455
456
Ruchira Sasanka57386b52002-01-07 20:28:49 +0000457 // returns the # of bytes of stack space allocated for each register
458 // type. For Sparc, currently we allocate 8 bytes on stack for all
459 // register types. We can optimize this later if necessary to save stack
460 // space (However, should make sure that stack alignment is correct)
461 //
Chris Lattner5216cc52002-02-04 05:59:25 +0000462 inline int getSpilledRegSize(int RegType) const {
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000463 return 8;
Ruchira Sasanka4cfbfd52002-01-07 19:20:28 +0000464 }
465
Ruchira Sasanka57386b52002-01-07 20:28:49 +0000466
Vikram S. Adve02662bd2002-03-31 19:04:50 +0000467 // To obtain the return value and the indirect call address (if any)
468 // contained in a CALL machine instruction
Ruchira Sasanka57386b52002-01-07 20:28:49 +0000469 //
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000470 const Value * getCallInstRetVal(const MachineInstr *CallMI) const;
Vikram S. Adve02662bd2002-03-31 19:04:50 +0000471 const Value * getCallInstIndirectAddrVal(const MachineInstr *CallMI) const;
Ruchira Sasanka24729a32001-10-21 16:43:41 +0000472
Ruchira Sasanka57386b52002-01-07 20:28:49 +0000473 // The following methods are used to generate "copy" machine instructions
474 // for an architecture.
475 //
Vikram S. Adve5eb69422002-07-08 23:34:10 +0000476 // The function regTypeNeedsScratchReg() can be used to check whether a
477 // scratch register is needed to copy a register of type `regType' to
478 // or from memory. If so, such a scratch register can be provided by
479 // the caller (e.g., if it knows which regsiters are free); otherwise
480 // an arbitrary one will be chosen and spilled by the copy instructions.
481 //
482 bool regTypeNeedsScratchReg(int RegType,
483 int& scratchRegClassId) const;
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +0000484
Vikram S. Adve5eb69422002-07-08 23:34:10 +0000485 void cpReg2RegMI(std::vector<MachineInstr*>& mvec,
486 unsigned SrcReg, unsigned DestReg,
487 int RegType) const;
488
489 void cpReg2MemMI(std::vector<MachineInstr*>& mvec,
490 unsigned SrcReg, unsigned DestPtrReg,
491 int Offset, int RegType, int scratchReg = -1) const;
492
493 void cpMem2RegMI(std::vector<MachineInstr*>& mvec,
494 unsigned SrcPtrReg, int Offset, unsigned DestReg,
495 int RegType, int scratchReg = -1) const;
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +0000496
Vikram S. Advee9327f02002-05-19 15:25:51 +0000497 void cpValue2Value(Value *Src, Value *Dest,
Anand Shukla458496c2002-06-25 20:55:50 +0000498 std::vector<MachineInstr*>& mvec) const;
Ruchira Sasankab7a39722001-11-03 17:13:27 +0000499
Ruchira Sasanka57386b52002-01-07 20:28:49 +0000500 // To see whether a register is a volatile (i.e., whehter it must be
501 // preserved acorss calls)
502 //
Chris Lattner5216cc52002-02-04 05:59:25 +0000503 inline bool isRegVolatile(int RegClassID, int Reg) const {
504 return MachineRegClassArr[RegClassID]->isRegVolatile(Reg);
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +0000505 }
506
507
Chris Lattner5216cc52002-02-04 05:59:25 +0000508 virtual unsigned getFramePointer() const;
509 virtual unsigned getStackPointer() const;
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +0000510
Chris Lattner5216cc52002-02-04 05:59:25 +0000511 virtual int getInvalidRegNum() const {
Ruchira Sasanka5b8971f2001-10-16 01:23:19 +0000512 return InvalidRegNum;
513 }
514
Ruchira Sasanka57386b52002-01-07 20:28:49 +0000515 // This method inserts the caller saving code for call instructions
516 //
Anand Shuklacf764682002-07-11 00:16:28 +0000517 void insertCallerSavingCode(std::vector<MachineInstr*>& instrnsBefore,
518 std::vector<MachineInstr*>& instrnsAfter,
Vikram S. Advec5f8b522002-07-10 21:42:42 +0000519 MachineInstr *MInst,
Ruchira Sasanka9c38dbc2001-10-28 18:15:12 +0000520 const BasicBlock *BB, PhyRegAlloc &PRA ) const;
Chris Lattner5fae0de2001-09-14 03:56:45 +0000521};
522
523
524
Chris Lattner5fae0de2001-09-14 03:56:45 +0000525
526//---------------------------------------------------------------------------
527// class UltraSparcSchedInfo
528//
529// Purpose:
530// Interface to instruction scheduling information for UltraSPARC.
531// The parameter values above are based on UltraSPARC IIi.
532//---------------------------------------------------------------------------
533
534
Chris Lattnerf9781b52002-12-29 03:13:05 +0000535class UltraSparcSchedInfo: public TargetSchedInfo {
Chris Lattner5fae0de2001-09-14 03:56:45 +0000536public:
Chris Lattner5216cc52002-02-04 05:59:25 +0000537 UltraSparcSchedInfo(const TargetMachine &tgt);
Chris Lattner5fae0de2001-09-14 03:56:45 +0000538protected:
Chris Lattner5216cc52002-02-04 05:59:25 +0000539 virtual void initializeResources();
Chris Lattner5fae0de2001-09-14 03:56:45 +0000540};
541
Chris Lattnerf8464e42001-09-14 04:32:55 +0000542
543//---------------------------------------------------------------------------
Vikram S. Adve7c1a8d62001-10-22 13:31:53 +0000544// class UltraSparcFrameInfo
545//
546// Purpose:
547// Interface to stack frame layout info for the UltraSPARC.
Vikram S. Adve6e9422e2001-11-12 23:26:35 +0000548// Starting offsets for each area of the stack frame are aligned at
549// a multiple of getStackFrameSizeAlignment().
Vikram S. Adve7c1a8d62001-10-22 13:31:53 +0000550//---------------------------------------------------------------------------
551
Chris Lattnerfe9b7052002-12-28 20:20:24 +0000552class UltraSparcFrameInfo: public TargetFrameInfo {
553 const TargetMachine &target;
Vikram S. Adve7c1a8d62001-10-22 13:31:53 +0000554public:
Chris Lattnerfe9b7052002-12-28 20:20:24 +0000555 UltraSparcFrameInfo(const TargetMachine &TM)
556 : TargetFrameInfo(StackGrowsDown, StackFrameSizeAlignment, 0), target(TM) {}
Vikram S. Adve6fcb2892001-11-08 04:55:13 +0000557
558public:
Vikram S. Adve36d3e032002-09-16 15:39:26 +0000559 // These methods provide constant parameters of the frame layout.
560 //
Chris Lattnerc8e66542002-04-27 06:56:12 +0000561 int getStackFrameSizeAlignment() const { return StackFrameSizeAlignment;}
562 int getMinStackFrameSize() const { return MinStackFrameSize; }
563 int getNumFixedOutgoingArgs() const { return NumFixedOutgoingArgs; }
564 int getSizeOfEachArgOnStack() const { return SizeOfEachArgOnStack; }
565 bool argsOnStackHaveFixedSize() const { return true; }
Vikram S. Adve6fcb2892001-11-08 04:55:13 +0000566
Vikram S. Adve36d3e032002-09-16 15:39:26 +0000567 // This method adjusts a stack offset to meet alignment rules of target.
568 // The fixed OFFSET (0x7ff) must be subtracted and the result aligned.
569 virtual int adjustAlignment (int unalignedOffset,
570 bool growUp,
571 unsigned int align) const {
572 return unalignedOffset + (growUp? +1:-1)*((unalignedOffset-OFFSET) % align);
573 }
574
Vikram S. Adve6fcb2892001-11-08 04:55:13 +0000575 // These methods compute offsets using the frame contents for a
Chris Lattnerc8e66542002-04-27 06:56:12 +0000576 // particular function. The frame contents are obtained from the
577 // MachineCodeInfoForMethod object for the given function.
Vikram S. Adve6fcb2892001-11-08 04:55:13 +0000578 //
Misha Brukman7ae7f842002-10-28 00:28:31 +0000579 int getFirstIncomingArgOffset (MachineFunction& mcInfo,
Vikram S. Advea77a8ee2002-04-25 04:40:24 +0000580 bool& growUp) const
Vikram S. Adve6fcb2892001-11-08 04:55:13 +0000581 {
Vikram S. Advea77a8ee2002-04-25 04:40:24 +0000582 growUp = true; // arguments area grows upwards
Vikram S. Adve6fcb2892001-11-08 04:55:13 +0000583 return FirstIncomingArgOffsetFromFP;
584 }
Misha Brukman7ae7f842002-10-28 00:28:31 +0000585 int getFirstOutgoingArgOffset (MachineFunction& mcInfo,
Vikram S. Advea77a8ee2002-04-25 04:40:24 +0000586 bool& growUp) const
Vikram S. Adve6fcb2892001-11-08 04:55:13 +0000587 {
Vikram S. Advea77a8ee2002-04-25 04:40:24 +0000588 growUp = true; // arguments area grows upwards
Vikram S. Adve6fcb2892001-11-08 04:55:13 +0000589 return FirstOutgoingArgOffsetFromSP;
590 }
Misha Brukman7ae7f842002-10-28 00:28:31 +0000591 int getFirstOptionalOutgoingArgOffset(MachineFunction& mcInfo,
Vikram S. Advea77a8ee2002-04-25 04:40:24 +0000592 bool& growUp)const
Vikram S. Adve6fcb2892001-11-08 04:55:13 +0000593 {
Vikram S. Advea77a8ee2002-04-25 04:40:24 +0000594 growUp = true; // arguments area grows upwards
Vikram S. Adve6fcb2892001-11-08 04:55:13 +0000595 return FirstOptionalOutgoingArgOffsetFromSP;
596 }
597
Misha Brukman7ae7f842002-10-28 00:28:31 +0000598 int getFirstAutomaticVarOffset (MachineFunction& mcInfo,
Vikram S. Advea77a8ee2002-04-25 04:40:24 +0000599 bool& growUp) const;
Misha Brukman7ae7f842002-10-28 00:28:31 +0000600 int getRegSpillAreaOffset (MachineFunction& mcInfo,
Vikram S. Advea77a8ee2002-04-25 04:40:24 +0000601 bool& growUp) const;
Misha Brukman7ae7f842002-10-28 00:28:31 +0000602 int getTmpAreaOffset (MachineFunction& mcInfo,
Vikram S. Advea77a8ee2002-04-25 04:40:24 +0000603 bool& growUp) const;
Misha Brukman7ae7f842002-10-28 00:28:31 +0000604 int getDynamicAreaOffset (MachineFunction& mcInfo,
Vikram S. Advea77a8ee2002-04-25 04:40:24 +0000605 bool& growUp) const;
Vikram S. Adve6fcb2892001-11-08 04:55:13 +0000606
607 //
608 // These methods specify the base register used for each stack area
609 // (generally FP or SP)
610 //
611 virtual int getIncomingArgBaseRegNum() const {
612 return (int) target.getRegInfo().getFramePointer();
613 }
614 virtual int getOutgoingArgBaseRegNum() const {
615 return (int) target.getRegInfo().getStackPointer();
616 }
617 virtual int getOptionalOutgoingArgBaseRegNum() const {
618 return (int) target.getRegInfo().getStackPointer();
619 }
620 virtual int getAutomaticVarBaseRegNum() const {
621 return (int) target.getRegInfo().getFramePointer();
622 }
623 virtual int getRegSpillAreaBaseRegNum() const {
624 return (int) target.getRegInfo().getFramePointer();
625 }
626 virtual int getDynamicAreaBaseRegNum() const {
627 return (int) target.getRegInfo().getStackPointer();
628 }
Chris Lattnerfe9b7052002-12-28 20:20:24 +0000629
630 virtual int getIncomingArgOffset(MachineFunction& mcInfo,
631 unsigned argNum) const {
632 assert(argsOnStackHaveFixedSize());
633
634 unsigned relativeOffset = argNum * getSizeOfEachArgOnStack();
635 bool growUp; // do args grow up or down
636 int firstArg = getFirstIncomingArgOffset(mcInfo, growUp);
637 return growUp ? firstArg + relativeOffset : firstArg - relativeOffset;
638 }
639
640 virtual int getOutgoingArgOffset(MachineFunction& mcInfo,
641 unsigned argNum) const {
642 assert(argsOnStackHaveFixedSize());
643 //assert(((int) argNum - this->getNumFixedOutgoingArgs())
644 // <= (int) mcInfo.getInfo()->getMaxOptionalNumArgs());
645
646 unsigned relativeOffset = argNum * getSizeOfEachArgOnStack();
647 bool growUp; // do args grow up or down
648 int firstArg = getFirstOutgoingArgOffset(mcInfo, growUp);
649 return growUp ? firstArg + relativeOffset : firstArg - relativeOffset;
650 }
Vikram S. Adve6fcb2892001-11-08 04:55:13 +0000651
652private:
Vikram S. Adve36d3e032002-09-16 15:39:26 +0000653 /*----------------------------------------------------------------------
654 This diagram shows the stack frame layout used by llc on Sparc V9.
655 Note that only the location of automatic variables, spill area,
656 temporary storage, and dynamically allocated stack area are chosen
657 by us. The rest conform to the Sparc V9 ABI.
658 All stack addresses are offset by OFFSET = 0x7ff (2047).
659
Chris Lattnerfe9b7052002-12-28 20:20:24 +0000660 Alignment assumptions and other invariants:
Vikram S. Adve36d3e032002-09-16 15:39:26 +0000661 (1) %sp+OFFSET and %fp+OFFSET are always aligned on 16-byte boundary
662 (2) Variables in automatic, spill, temporary, or dynamic regions
663 are aligned according to their size as in all memory accesses.
664 (3) Everything below the dynamically allocated stack area is only used
665 during a call to another function, so it is never needed when
666 the current function is active. This is why space can be allocated
667 dynamically by incrementing %sp any time within the function.
668
669 STACK FRAME LAYOUT:
670
671 ...
672 %fp+OFFSET+176 Optional extra incoming arguments# 1..N
673 %fp+OFFSET+168 Incoming argument #6
674 ... ...
675 %fp+OFFSET+128 Incoming argument #1
676 ... ...
677 ---%fp+OFFSET-0--------Bottom of caller's stack frame--------------------
678 %fp+OFFSET-8 Automatic variables <-- ****TOP OF STACK FRAME****
679 Spill area
680 Temporary storage
681 ...
682
683 %sp+OFFSET+176+8N Bottom of dynamically allocated stack area
684 %sp+OFFSET+168+8N Optional extra outgoing argument# N
685 ... ...
686 %sp+OFFSET+176 Optional extra outgoing argument# 1
687 %sp+OFFSET+168 Outgoing argument #6
688 ... ...
689 %sp+OFFSET+128 Outgoing argument #1
690 %sp+OFFSET+120 Save area for %i7
691 ... ...
692 %sp+OFFSET+0 Save area for %l0 <-- ****BOTTOM OF STACK FRAME****
693
694 *----------------------------------------------------------------------*/
695
Vikram S. Adve367f34f2001-11-09 02:15:52 +0000696 // All stack addresses must be offset by 0x7ff (2047) on Sparc V9.
697 static const int OFFSET = (int) 0x7ff;
Vikram S. Adve6fcb2892001-11-08 04:55:13 +0000698 static const int StackFrameSizeAlignment = 16;
Vikram S. Adve7c1a8d62001-10-22 13:31:53 +0000699 static const int MinStackFrameSize = 176;
Vikram S. Adve6fcb2892001-11-08 04:55:13 +0000700 static const int NumFixedOutgoingArgs = 6;
701 static const int SizeOfEachArgOnStack = 8;
Vikram S. Adve367f34f2001-11-09 02:15:52 +0000702 static const int FirstIncomingArgOffsetFromFP = 128 + OFFSET;
703 static const int FirstOptionalIncomingArgOffsetFromFP = 176 + OFFSET;
Vikram S. Adve36d3e032002-09-16 15:39:26 +0000704 static const int StaticAreaOffsetFromFP = 0 + OFFSET;
Vikram S. Adve367f34f2001-11-09 02:15:52 +0000705 static const int FirstOutgoingArgOffsetFromSP = 128 + OFFSET;
706 static const int FirstOptionalOutgoingArgOffsetFromSP = 176 + OFFSET;
Vikram S. Adve7c1a8d62001-10-22 13:31:53 +0000707};
708
709
Vikram S. Adve367f34f2001-11-09 02:15:52 +0000710//---------------------------------------------------------------------------
711// class UltraSparcCacheInfo
712//
713// Purpose:
714// Interface to cache parameters for the UltraSPARC.
715// Just use defaults for now.
716//---------------------------------------------------------------------------
717
Chris Lattner83d835d2002-12-29 02:50:33 +0000718struct UltraSparcCacheInfo: public TargetCacheInfo {
719 UltraSparcCacheInfo(const TargetMachine &T) : TargetCacheInfo(T) {}
Vikram S. Adve367f34f2001-11-09 02:15:52 +0000720};
721
Vikram S. Adve7c1a8d62001-10-22 13:31:53 +0000722
723//---------------------------------------------------------------------------
Vikram S. Advebbf45f62002-09-20 00:52:09 +0000724// class UltraSparcOptInfo
725//
726// Purpose:
727// Interface to machine-level optimization routines for the UltraSPARC.
728//---------------------------------------------------------------------------
729
Chris Lattner83d835d2002-12-29 02:50:33 +0000730struct UltraSparcOptInfo: public TargetOptInfo {
731 UltraSparcOptInfo(const TargetMachine &T) : TargetOptInfo(T) {}
Vikram S. Advebbf45f62002-09-20 00:52:09 +0000732
733 virtual bool IsUselessCopy (const MachineInstr* MI) const;
734};
735
Vikram S. Advebbf45f62002-09-20 00:52:09 +0000736//---------------------------------------------------------------------------
Chris Lattnerf8464e42001-09-14 04:32:55 +0000737// class UltraSparcMachine
738//
739// Purpose:
740// Primary interface to machine description for the UltraSPARC.
741// Primarily just initializes machine-dependent parameters in
742// class TargetMachine, and creates machine-dependent subclasses
Vikram S. Adve514180e2001-09-18 13:04:24 +0000743// for classes such as InstrInfo, SchedInfo and RegInfo.
Chris Lattnerf8464e42001-09-14 04:32:55 +0000744//---------------------------------------------------------------------------
745
746class UltraSparc : public TargetMachine {
Vikram S. Adve514180e2001-09-18 13:04:24 +0000747 UltraSparcInstrInfo instrInfo;
748 UltraSparcSchedInfo schedInfo;
749 UltraSparcRegInfo regInfo;
Vikram S. Adve7c1a8d62001-10-22 13:31:53 +0000750 UltraSparcFrameInfo frameInfo;
Vikram S. Adve367f34f2001-11-09 02:15:52 +0000751 UltraSparcCacheInfo cacheInfo;
Vikram S. Advebbf45f62002-09-20 00:52:09 +0000752 UltraSparcOptInfo optInfo;
Chris Lattnerf8464e42001-09-14 04:32:55 +0000753public:
754 UltraSparc();
Vikram S. Advebbf45f62002-09-20 00:52:09 +0000755
Chris Lattnerb4d58d72003-01-14 22:00:31 +0000756 virtual const TargetInstrInfo &getInstrInfo() const { return instrInfo; }
Chris Lattnerf9781b52002-12-29 03:13:05 +0000757 virtual const TargetSchedInfo &getSchedInfo() const { return schedInfo; }
758 virtual const TargetRegInfo &getRegInfo() const { return regInfo; }
Chris Lattnerfe9b7052002-12-28 20:20:24 +0000759 virtual const TargetFrameInfo &getFrameInfo() const { return frameInfo; }
Chris Lattner83d835d2002-12-29 02:50:33 +0000760 virtual const TargetCacheInfo &getCacheInfo() const { return cacheInfo; }
761 virtual const TargetOptInfo &getOptInfo() const { return optInfo; }
Chris Lattner518da4f2001-09-19 13:47:12 +0000762
Chris Lattner5667f0e2002-10-29 21:12:46 +0000763 virtual bool addPassesToEmitAssembly(PassManager &PM, std::ostream &Out);
Chris Lattnere94db672002-10-28 01:03:43 +0000764
Chris Lattnere2ac2712002-10-29 22:01:44 +0000765 // getPrologEpilogInsertionPass - Inserts prolog/epilog code.
766 Pass* getPrologEpilogInsertionPass();
Chris Lattnerf8464e42001-09-14 04:32:55 +0000767
Vikram S. Adve36d3e032002-09-16 15:39:26 +0000768 // getFunctionAsmPrinterPass - Writes out machine code for a single function
Chris Lattnere2ac2712002-10-29 22:01:44 +0000769 Pass* getFunctionAsmPrinterPass(std::ostream &Out);
Vikram S. Adve36d3e032002-09-16 15:39:26 +0000770
771 // getModuleAsmPrinterPass - Writes generated machine code to assembly file.
Chris Lattnere2ac2712002-10-29 22:01:44 +0000772 Pass* getModuleAsmPrinterPass(std::ostream &Out);
Vikram S. Adve36d3e032002-09-16 15:39:26 +0000773
774 // getEmitBytecodeToAsmPass - Emits final LLVM bytecode to assembly file.
Chris Lattnere2ac2712002-10-29 22:01:44 +0000775 Pass* getEmitBytecodeToAsmPass(std::ostream &Out);
Chris Lattner92a49c52002-02-03 07:51:17 +0000776};
Chris Lattnerf8464e42001-09-14 04:32:55 +0000777
Chris Lattnerdea36ca2003-01-15 21:36:50 +0000778int64_t GetConstantValueAsSignedInt(const Value *V, bool &isValidConstant);
779
Chris Lattner5fae0de2001-09-14 03:56:45 +0000780#endif