blob: 0ad163c0815bfedcbebbb615cc6e291e9ba1a777 [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
Misha Brukmane9d88382003-05-24 00:09:50 +000011#include "llvm/CodeGen/MachineInstrBuilder.h"
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +000012#include "llvm/Target/TargetMachine.h"
Chris Lattnerd0f166a2002-12-29 03:13:05 +000013#include "llvm/Target/TargetSchedInfo.h"
Chris Lattner8bd66e62002-12-28 21:00:25 +000014#include "llvm/Target/TargetFrameInfo.h"
Chris Lattnerdde12622002-12-29 02:50:33 +000015#include "llvm/Target/TargetCacheInfo.h"
Chris Lattnerd0f166a2002-12-29 03:13:05 +000016#include "llvm/Target/TargetRegInfo.h"
Chris Lattnerdde12622002-12-29 02:50:33 +000017#include "llvm/Target/TargetOptInfo.h"
Chris Lattnerc6495ee2001-09-14 03:56:45 +000018#include "llvm/Type.h"
Misha Brukmane9d88382003-05-24 00:09:50 +000019#include "SparcRegClassInfo.h"
Chris Lattner46cbff62001-09-14 16:56:32 +000020#include <sys/types.h>
Chris Lattnerc6495ee2001-09-14 03:56:45 +000021
Chris Lattner4387e312002-02-03 23:42:19 +000022class LiveRange;
Chris Lattnerf6e0e282001-09-14 04:32:55 +000023class UltraSparc;
Chris Lattner4387e312002-02-03 23:42:19 +000024class PhyRegAlloc;
Chris Lattner9aa697b2002-04-09 05:16:36 +000025class Pass;
Chris Lattner4387e312002-02-03 23:42:19 +000026
Chris Lattnerc6495ee2001-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 Lattnerc6495ee2001-09-14 03:56:45 +000043
44//---------------------------------------------------------------------------
45// enum SparcMachineOpCode.
Chris Lattner3501fea2003-01-14 22:00:31 +000046// const TargetInstrDescriptor SparcMachineInstrDesc[]
Chris Lattnerc6495ee2001-09-14 03:56:45 +000047//
48// Purpose:
49// Description of UltraSparc machine instructions.
50//
51//---------------------------------------------------------------------------
52
Misha Brukmana98cd452003-05-20 20:32:24 +000053namespace V9 {
54 enum SparcMachineOpCode {
Chris Lattner9a3d63b2001-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 Lattnerc6495ee2001-09-14 03:56:45 +000059
Misha Brukmana98cd452003-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 Lattnerc6495ee2001-09-14 03:56:45 +000066
Chris Lattnerc6495ee2001-09-14 03:56:45 +000067
Chris Lattner9a3d63b2001-09-19 15:56:23 +000068// Array of machine instruction descriptions...
Chris Lattner3501fea2003-01-14 22:00:31 +000069extern const TargetInstrDescriptor SparcMachineInstrDesc[];
Chris Lattnerc6495ee2001-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 Lattner3501fea2003-01-14 22:00:31 +000079// default to member functions in base class TargetInstrInfo.
Chris Lattnerc6495ee2001-09-14 03:56:45 +000080//---------------------------------------------------------------------------
81
Chris Lattner3501fea2003-01-14 22:00:31 +000082struct UltraSparcInstrInfo : public TargetInstrInfo {
Chris Lattner047bbaf2002-10-29 15:45:20 +000083 UltraSparcInstrInfo();
Vikram S. Adve4c5fe2d2001-11-14 18:48:36 +000084
85 //
Vikram S. Advedd558992002-03-18 03:02:42 +000086 // All immediate constants are in position 1 except the
Vikram S. Advee1f72802002-09-16 15:39:26 +000087 // store instructions and SETxx.
Vikram S. Adve4c5fe2d2001-11-14 18:48:36 +000088 //
Vikram S. Advedd558992002-03-18 03:02:42 +000089 virtual int getImmedConstantPos(MachineOpCode opCode) const {
Vikram S. Adve4c5fe2d2001-11-14 18:48:36 +000090 bool ignore;
Misha Brukmana98cd452003-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. Adve4c5fe2d2001-11-14 18:48:36 +0000104 else
105 return -1;
106 }
Misha Brukmane9d88382003-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 Lattnerc6495ee2001-09-14 03:56:45 +0000134
Misha Brukmana98cd452003-05-20 20:32:24 +0000135 virtual bool hasResultInterlock(MachineOpCode opCode) const
Chris Lattnerc6495ee2001-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 Brukmana98cd452003-05-20 20:32:24 +0000143 return (opCode == V9::FCMPS || opCode == V9::FCMPD || opCode == V9::FCMPQ);
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000144 }
145
Vikram S. Adve5684c4e2001-10-18 00:02:06 +0000146 //-------------------------------------------------------------------------
Vikram S. Advee1f72802002-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. Adve5684c4e2001-10-18 00:02:06 +0000154 // Code generation support for creating individual machine instructions
155 //-------------------------------------------------------------------------
Vikram S. Adved55697c2002-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 Brukmana98cd452003-05-20 20:32:24 +0000160 virtual MachineOpCode getNOPOpCode() const { return V9::NOP; }
Vikram S. Adved55697c2002-09-20 00:52:09 +0000161
Vikram S. Adve5684c4e2001-10-18 00:02:06 +0000162 // Create an instruction sequence to put the constant `val' into
Vikram S. Adve242a8082002-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. Adve5684c4e2001-10-18 00:02:06 +0000168 //
Vikram S. Adve242a8082002-05-19 15:25:51 +0000169 virtual void CreateCodeToLoadConst(const TargetMachine& target,
170 Function* F,
Vikram S. Advedd558992002-03-18 03:02:42 +0000171 Value* val,
Vikram S. Adve5684c4e2001-10-18 00:02:06 +0000172 Instruction* dest,
Vikram S. Adve242a8082002-05-19 15:25:51 +0000173 std::vector<MachineInstr*>& mvec,
174 MachineCodeForInstruction& mcfi) const;
Vikram S. Adve7f37fe52001-11-08 04:55:13 +0000175
Vikram S. Adve5afff3b2001-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. Adve242a8082002-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. Adve7f37fe52001-11-08 04:55:13 +0000182 //
Vikram S. Adve242a8082002-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. Adve5afff3b2001-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. Adve242a8082002-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. Adve5afff3b2001-11-09 02:15:52 +0000195 //
Vikram S. Adve242a8082002-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. Advedd558992002-03-18 03:02:42 +0000208 virtual void CreateCopyInstructionsByType(const TargetMachine& target,
Vikram S. Adve242a8082002-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. Advef36f06b2002-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. Adve242a8082002-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. Advef36f06b2002-09-05 18:34:31 +0000223 Value* srcVal,
Vikram S. Adve5cedede2002-09-27 14:29:45 +0000224 Value* destVal,
225 unsigned int numLowBits,
Vikram S. Advef36f06b2002-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. Adve5cedede2002-09-27 14:29:45 +0000238 Value* destVal,
239 unsigned int numLowBits,
Vikram S. Adve242a8082002-05-19 15:25:51 +0000240 std::vector<MachineInstr*>& mvec,
241 MachineCodeForInstruction& mcfi) const;
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000242};
243
Ruchira Sasankae38bd5332001-09-15 00:30:44 +0000244
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000245//----------------------------------------------------------------------------
246// class UltraSparcRegInfo
247//
Chris Lattnerd0f166a2002-12-29 03:13:05 +0000248// This class implements the virtual class TargetRegInfo for Sparc.
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000249//
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000250//----------------------------------------------------------------------------
251
Chris Lattnerd0f166a2002-12-29 03:13:05 +0000252class UltraSparcRegInfo : public TargetRegInfo {
Ruchira Sasankaab304c42001-09-30 23:19:57 +0000253 // The actual register classes in the Sparc
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000254 //
Ruchira Sasankae38bd5332001-09-15 00:30:44 +0000255 enum RegClassIDs {
Ruchira Sasanka2563a982002-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 Sasankae38bd5332001-09-15 00:30:44 +0000260 };
261
Ruchira Sasankaab304c42001-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 Sasanka2563a982002-01-07 20:28:49 +0000266 //
Ruchira Sasankaab304c42001-09-30 23:19:57 +0000267 enum RegTypes {
268 IntRegType,
269 FPSingleRegType,
270 FPDoubleRegType,
271 IntCCRegType,
272 FloatCCRegType
273 };
274
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000275 // **** WARNING: If the above enum order is changed, also modify
Ruchira Sasankae38bd5332001-09-15 00:30:44 +0000276 // getRegisterClassOfValue method below since it assumes this particular
277 // order for efficiency.
278
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000279
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000280 // Number of registers used for passing int args (usually 6: %o0 - %o5)
281 //
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000282 unsigned const NumOfIntArgRegs;
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000283
284 // Number of registers used for passing float args (usually 32: %f0 - %f31)
285 //
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000286 unsigned const NumOfFloatArgRegs;
Ruchira Sasanka2563a982002-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 Sasankac4d4b762001-10-16 01:23:19 +0000291 int const InvalidRegNum;
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000292
293
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000294 // ======================== Private Methods =============================
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000295
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000296 // The following methods are used to color special live ranges (e.g.
Chris Lattnerf57b8452002-04-27 06:56:12 +0000297 // function args and return values etc.) with specific hardware registers
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000298 // as required. See SparcRegInfo.cpp for the implementation.
299 //
Vikram S. Advefe09fb22002-07-08 23:34:10 +0000300 void suggestReg4RetAddr(MachineInstr *RetMI,
Chris Lattner699683c2002-02-04 05:59:25 +0000301 LiveRangeInfo &LRI) const;
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000302
Vikram S. Adve106604e2002-09-28 16:56:59 +0000303 void suggestReg4CallAddr(MachineInstr *CallMI, LiveRangeInfo &LRI) const;
Vikram S. Advefe09fb22002-07-08 23:34:10 +0000304
305 void InitializeOutgoingArg(MachineInstr* CallMI, AddedInstrns *CallAI,
Vikram S. Adve242a8082002-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 Lattner3c3c82d2003-01-15 21:14:32 +0000312 int getRegType(const Type* type) const;
Chris Lattner699683c2002-02-04 05:59:25 +0000313 int getRegType(const LiveRange *LR) const;
Vikram S. Advefe09fb22002-07-08 23:34:10 +0000314 int getRegType(int unifiedRegNum) const;
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +0000315
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000316 // Used to generate a copy instruction based on the register class of
317 // value.
318 //
Chris Lattner699683c2002-02-04 05:59:25 +0000319 MachineInstr *cpValue2RegMI(Value *Val, unsigned DestReg,
320 int RegType) const;
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +0000321
322
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000323 // The following 2 methods are used to order the instructions addeed by
Chris Lattnerf57b8452002-04-27 06:56:12 +0000324 // the register allocator in association with function calling. See
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000325 // SparcRegInfo.cpp for more details
326 //
Chris Lattner697954c2002-01-20 22:54:45 +0000327 void moveInst2OrdVec(std::vector<MachineInstr *> &OrdVec,
328 MachineInstr *UnordInst,
329 PhyRegAlloc &PRA) const;
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +0000330
Chris Lattner697954c2002-01-20 22:54:45 +0000331 void OrderAddedInstrns(std::vector<MachineInstr *> &UnordVec,
332 std::vector<MachineInstr *> &OrdVec,
333 PhyRegAlloc &PRA) const;
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +0000334
335
Vikram S. Adve6d783112002-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 Sasankaae4bcd72001-11-10 21:20:43 +0000341
Vikram S. Adve6d783112002-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 Lattner699683c2002-02-04 05:59:25 +0000346public:
347 UltraSparcRegInfo(const UltraSparc &tgt);
Ruchira Sasankae38bd5332001-09-15 00:30:44 +0000348
Vikram S. Advedd558992002-03-18 03:02:42 +0000349 // To find the register class used for a specified Type
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000350 //
Vikram S. Advefe09fb22002-07-08 23:34:10 +0000351 unsigned getRegClassIDOfType(const Type *type,
352 bool isCCReg = false) const;
Ruchira Sasankae38bd5332001-09-15 00:30:44 +0000353
Vikram S. Advefe09fb22002-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. Advedd558992002-03-18 03:02:42 +0000358
Chris Lattner699683c2002-02-04 05:59:25 +0000359 // getZeroRegNum - returns the register that contains always zero this is the
360 // unified register number
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000361 //
Chris Lattner699683c2002-02-04 05:59:25 +0000362 virtual int getZeroRegNum() const;
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000363
Chris Lattner699683c2002-02-04 05:59:25 +0000364 // getCallAddressReg - returns the reg used for pushing the address when a
Chris Lattnerf57b8452002-04-27 06:56:12 +0000365 // function is called. This can be used for other purposes between calls
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000366 //
Chris Lattner699683c2002-02-04 05:59:25 +0000367 unsigned getCallAddressReg() const;
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000368
Ruchira Sasanka2563a982002-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 Lattner699683c2002-02-04 05:59:25 +0000373 unsigned getReturnAddressReg() const;
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000374
Vikram S. Adve242a8082002-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 Sasanka2563a982002-01-07 20:28:49 +0000381 // The following methods are used to color special live ranges (e.g.
Chris Lattnerf57b8452002-04-27 06:56:12 +0000382 // function args and return values etc.) with specific hardware registers
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000383 // as required. See SparcRegInfo.cpp for the implementation for Sparc.
384 //
Chris Lattnerb7653df2002-04-08 22:03:57 +0000385 void suggestRegs4MethodArgs(const Function *Meth,
Ruchira Sasankaab304c42001-09-30 23:19:57 +0000386 LiveRangeInfo& LRI) const;
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000387
Vikram S. Advefe09fb22002-07-08 23:34:10 +0000388 void suggestRegs4CallArgs(MachineInstr *CallMI,
Vikram S. Adve106604e2002-09-28 16:56:59 +0000389 LiveRangeInfo& LRI) const;
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000390
Vikram S. Advefe09fb22002-07-08 23:34:10 +0000391 void suggestReg4RetValue(MachineInstr *RetMI,
Chris Lattner697954c2002-01-20 22:54:45 +0000392 LiveRangeInfo& LRI) const;
Vikram S. Advefe09fb22002-07-08 23:34:10 +0000393
Chris Lattnerb7653df2002-04-08 22:03:57 +0000394 void colorMethodArgs(const Function *Meth, LiveRangeInfo &LRI,
Chris Lattner699683c2002-02-04 05:59:25 +0000395 AddedInstrns *FirstAI) const;
Ruchira Sasankaab304c42001-09-30 23:19:57 +0000396
Vikram S. Advefe09fb22002-07-08 23:34:10 +0000397 void colorCallArgs(MachineInstr *CallMI, LiveRangeInfo &LRI,
Chris Lattner699683c2002-02-04 05:59:25 +0000398 AddedInstrns *CallAI, PhyRegAlloc &PRA,
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000399 const BasicBlock *BB) const;
Ruchira Sasankaab304c42001-09-30 23:19:57 +0000400
Vikram S. Advefe09fb22002-07-08 23:34:10 +0000401 void colorRetValue(MachineInstr *RetI, LiveRangeInfo& LRI,
Chris Lattner699683c2002-02-04 05:59:25 +0000402 AddedInstrns *RetAI) const;
Ruchira Sasankaab304c42001-09-30 23:19:57 +0000403
404
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000405 // method used for printing a register for debugging purposes
406 //
Chris Lattner699683c2002-02-04 05:59:25 +0000407 static void printReg(const LiveRange *LR);
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000408
Vikram S. Advefe09fb22002-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 Sasanka2563a982002-01-07 20:28:49 +0000412 //
Vikram S. Advefe09fb22002-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 Lattnerc6495ee2001-09-14 03:56:45 +0000418 return reg;
Vikram S. Advefe09fb22002-07-08 23:34:10 +0000419 }
420 else if (regClassID == FloatRegClassID) {
421 assert(reg < 64 && "Invalid reg. number");
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000422 return reg + 32; // we have 32 int regs
Vikram S. Advefe09fb22002-07-08 23:34:10 +0000423 }
424 else if (regClassID == FloatCCRegClassID) {
425 assert(reg < 4 && "Invalid reg. number");
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000426 return reg + 32 + 64; // 32 int, 64 float
Vikram S. Advefe09fb22002-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 Sasankac4d4b762001-10-16 01:23:19 +0000433 return InvalidRegNum;
Vikram S. Advefe09fb22002-07-08 23:34:10 +0000434 }
Ruchira Sasankae38bd5332001-09-15 00:30:44 +0000435 else
Vikram S. Advefe09fb22002-07-08 23:34:10 +0000436 assert(0 && "Invalid register class");
Chris Lattner6dad5062001-11-07 13:49:12 +0000437 return 0;
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000438 }
Vikram S. Advefe09fb22002-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 Lattnerb82d97e2002-07-25 06:08:32 +0000449 return 0;
Vikram S. Advefe09fb22002-07-08 23:34:10 +0000450 }
451
452 // Returns the assembly-language name of the specified machine register.
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000453 //
Chris Lattner95685682002-08-12 21:25:05 +0000454 virtual const char * const getUnifiedRegName(int reg) const;
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000455
456
Ruchira Sasanka2563a982002-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 Lattner699683c2002-02-04 05:59:25 +0000462 inline int getSpilledRegSize(int RegType) const {
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000463 return 8;
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000464 }
465
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000466
Vikram S. Advea44c6c02002-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 Sasanka2563a982002-01-07 20:28:49 +0000469 //
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000470 const Value * getCallInstRetVal(const MachineInstr *CallMI) const;
Vikram S. Advea44c6c02002-03-31 19:04:50 +0000471 const Value * getCallInstIndirectAddrVal(const MachineInstr *CallMI) const;
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000472
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000473 // The following methods are used to generate "copy" machine instructions
474 // for an architecture.
475 //
Vikram S. Advefe09fb22002-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 Sasankac4d4b762001-10-16 01:23:19 +0000484
Vikram S. Advefe09fb22002-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 Sasankac4d4b762001-10-16 01:23:19 +0000496
Vikram S. Adve242a8082002-05-19 15:25:51 +0000497 void cpValue2Value(Value *Src, Value *Dest,
Anand Shuklacfb22d32002-06-25 20:55:50 +0000498 std::vector<MachineInstr*>& mvec) const;
Ruchira Sasankaef1b0cb2001-11-03 17:13:27 +0000499
Ruchira Sasanka2563a982002-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 Lattner699683c2002-02-04 05:59:25 +0000503 inline bool isRegVolatile(int RegClassID, int Reg) const {
504 return MachineRegClassArr[RegClassID]->isRegVolatile(Reg);
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000505 }
506
507
Chris Lattner699683c2002-02-04 05:59:25 +0000508 virtual unsigned getFramePointer() const;
509 virtual unsigned getStackPointer() const;
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000510
Chris Lattner699683c2002-02-04 05:59:25 +0000511 virtual int getInvalidRegNum() const {
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000512 return InvalidRegNum;
513 }
514
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000515 // This method inserts the caller saving code for call instructions
516 //
Anand Shukla24787fa2002-07-11 00:16:28 +0000517 void insertCallerSavingCode(std::vector<MachineInstr*>& instrnsBefore,
518 std::vector<MachineInstr*>& instrnsAfter,
Vikram S. Adve6a49a1e2002-07-10 21:42:42 +0000519 MachineInstr *MInst,
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000520 const BasicBlock *BB, PhyRegAlloc &PRA ) const;
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000521};
522
523
524
Chris Lattnerc6495ee2001-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 Lattnerd0f166a2002-12-29 03:13:05 +0000535class UltraSparcSchedInfo: public TargetSchedInfo {
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000536public:
Chris Lattner699683c2002-02-04 05:59:25 +0000537 UltraSparcSchedInfo(const TargetMachine &tgt);
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000538protected:
Chris Lattner699683c2002-02-04 05:59:25 +0000539 virtual void initializeResources();
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000540};
541
Chris Lattnerf6e0e282001-09-14 04:32:55 +0000542
543//---------------------------------------------------------------------------
Vikram S. Advec1521632001-10-22 13:31:53 +0000544// class UltraSparcFrameInfo
545//
546// Purpose:
547// Interface to stack frame layout info for the UltraSPARC.
Vikram S. Adve00521d72001-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. Advec1521632001-10-22 13:31:53 +0000550//---------------------------------------------------------------------------
551
Chris Lattnerda62ac62002-12-28 20:20:24 +0000552class UltraSparcFrameInfo: public TargetFrameInfo {
553 const TargetMachine &target;
Vikram S. Advec1521632001-10-22 13:31:53 +0000554public:
Chris Lattnerda62ac62002-12-28 20:20:24 +0000555 UltraSparcFrameInfo(const TargetMachine &TM)
556 : TargetFrameInfo(StackGrowsDown, StackFrameSizeAlignment, 0), target(TM) {}
Vikram S. Adve7f37fe52001-11-08 04:55:13 +0000557
558public:
Vikram S. Advee1f72802002-09-16 15:39:26 +0000559 // These methods provide constant parameters of the frame layout.
560 //
Chris Lattnerf57b8452002-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. Adve7f37fe52001-11-08 04:55:13 +0000566
Vikram S. Advee1f72802002-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. Adve7f37fe52001-11-08 04:55:13 +0000575 // These methods compute offsets using the frame contents for a
Chris Lattnerf57b8452002-04-27 06:56:12 +0000576 // particular function. The frame contents are obtained from the
577 // MachineCodeInfoForMethod object for the given function.
Vikram S. Adve7f37fe52001-11-08 04:55:13 +0000578 //
Misha Brukmanfce11432002-10-28 00:28:31 +0000579 int getFirstIncomingArgOffset (MachineFunction& mcInfo,
Vikram S. Adve6d783112002-04-25 04:40:24 +0000580 bool& growUp) const
Vikram S. Adve7f37fe52001-11-08 04:55:13 +0000581 {
Vikram S. Adve6d783112002-04-25 04:40:24 +0000582 growUp = true; // arguments area grows upwards
Vikram S. Adve7f37fe52001-11-08 04:55:13 +0000583 return FirstIncomingArgOffsetFromFP;
584 }
Misha Brukmanfce11432002-10-28 00:28:31 +0000585 int getFirstOutgoingArgOffset (MachineFunction& mcInfo,
Vikram S. Adve6d783112002-04-25 04:40:24 +0000586 bool& growUp) const
Vikram S. Adve7f37fe52001-11-08 04:55:13 +0000587 {
Vikram S. Adve6d783112002-04-25 04:40:24 +0000588 growUp = true; // arguments area grows upwards
Vikram S. Adve7f37fe52001-11-08 04:55:13 +0000589 return FirstOutgoingArgOffsetFromSP;
590 }
Misha Brukmanfce11432002-10-28 00:28:31 +0000591 int getFirstOptionalOutgoingArgOffset(MachineFunction& mcInfo,
Vikram S. Adve6d783112002-04-25 04:40:24 +0000592 bool& growUp)const
Vikram S. Adve7f37fe52001-11-08 04:55:13 +0000593 {
Vikram S. Adve6d783112002-04-25 04:40:24 +0000594 growUp = true; // arguments area grows upwards
Vikram S. Adve7f37fe52001-11-08 04:55:13 +0000595 return FirstOptionalOutgoingArgOffsetFromSP;
596 }
597
Misha Brukmanfce11432002-10-28 00:28:31 +0000598 int getFirstAutomaticVarOffset (MachineFunction& mcInfo,
Vikram S. Adve6d783112002-04-25 04:40:24 +0000599 bool& growUp) const;
Misha Brukmanfce11432002-10-28 00:28:31 +0000600 int getRegSpillAreaOffset (MachineFunction& mcInfo,
Vikram S. Adve6d783112002-04-25 04:40:24 +0000601 bool& growUp) const;
Misha Brukmanfce11432002-10-28 00:28:31 +0000602 int getTmpAreaOffset (MachineFunction& mcInfo,
Vikram S. Adve6d783112002-04-25 04:40:24 +0000603 bool& growUp) const;
Misha Brukmanfce11432002-10-28 00:28:31 +0000604 int getDynamicAreaOffset (MachineFunction& mcInfo,
Vikram S. Adve6d783112002-04-25 04:40:24 +0000605 bool& growUp) const;
Vikram S. Adve7f37fe52001-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 Lattnerda62ac62002-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. Adve7f37fe52001-11-08 04:55:13 +0000651
652private:
Vikram S. Advee1f72802002-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 Lattnerda62ac62002-12-28 20:20:24 +0000660 Alignment assumptions and other invariants:
Vikram S. Advee1f72802002-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. Adve5afff3b2001-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. Adve7f37fe52001-11-08 04:55:13 +0000698 static const int StackFrameSizeAlignment = 16;
Vikram S. Advec1521632001-10-22 13:31:53 +0000699 static const int MinStackFrameSize = 176;
Vikram S. Adve7f37fe52001-11-08 04:55:13 +0000700 static const int NumFixedOutgoingArgs = 6;
701 static const int SizeOfEachArgOnStack = 8;
Vikram S. Adve5afff3b2001-11-09 02:15:52 +0000702 static const int FirstIncomingArgOffsetFromFP = 128 + OFFSET;
703 static const int FirstOptionalIncomingArgOffsetFromFP = 176 + OFFSET;
Vikram S. Advee1f72802002-09-16 15:39:26 +0000704 static const int StaticAreaOffsetFromFP = 0 + OFFSET;
Vikram S. Adve5afff3b2001-11-09 02:15:52 +0000705 static const int FirstOutgoingArgOffsetFromSP = 128 + OFFSET;
706 static const int FirstOptionalOutgoingArgOffsetFromSP = 176 + OFFSET;
Vikram S. Advec1521632001-10-22 13:31:53 +0000707};
708
709
Vikram S. Adve5afff3b2001-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 Lattnerdde12622002-12-29 02:50:33 +0000718struct UltraSparcCacheInfo: public TargetCacheInfo {
719 UltraSparcCacheInfo(const TargetMachine &T) : TargetCacheInfo(T) {}
Vikram S. Adve5afff3b2001-11-09 02:15:52 +0000720};
721
Vikram S. Advec1521632001-10-22 13:31:53 +0000722
723//---------------------------------------------------------------------------
Vikram S. Adved55697c2002-09-20 00:52:09 +0000724// class UltraSparcOptInfo
725//
726// Purpose:
727// Interface to machine-level optimization routines for the UltraSPARC.
728//---------------------------------------------------------------------------
729
Chris Lattnerdde12622002-12-29 02:50:33 +0000730struct UltraSparcOptInfo: public TargetOptInfo {
731 UltraSparcOptInfo(const TargetMachine &T) : TargetOptInfo(T) {}
Vikram S. Adved55697c2002-09-20 00:52:09 +0000732
733 virtual bool IsUselessCopy (const MachineInstr* MI) const;
734};
735
Vikram S. Adved55697c2002-09-20 00:52:09 +0000736//---------------------------------------------------------------------------
Chris Lattnerf6e0e282001-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. Adve339084b2001-09-18 13:04:24 +0000743// for classes such as InstrInfo, SchedInfo and RegInfo.
Chris Lattnerf6e0e282001-09-14 04:32:55 +0000744//---------------------------------------------------------------------------
745
746class UltraSparc : public TargetMachine {
Vikram S. Adve339084b2001-09-18 13:04:24 +0000747 UltraSparcInstrInfo instrInfo;
748 UltraSparcSchedInfo schedInfo;
749 UltraSparcRegInfo regInfo;
Vikram S. Advec1521632001-10-22 13:31:53 +0000750 UltraSparcFrameInfo frameInfo;
Vikram S. Adve5afff3b2001-11-09 02:15:52 +0000751 UltraSparcCacheInfo cacheInfo;
Vikram S. Adved55697c2002-09-20 00:52:09 +0000752 UltraSparcOptInfo optInfo;
Chris Lattnerf6e0e282001-09-14 04:32:55 +0000753public:
754 UltraSparc();
Vikram S. Adved55697c2002-09-20 00:52:09 +0000755
Chris Lattner3501fea2003-01-14 22:00:31 +0000756 virtual const TargetInstrInfo &getInstrInfo() const { return instrInfo; }
Chris Lattnerd0f166a2002-12-29 03:13:05 +0000757 virtual const TargetSchedInfo &getSchedInfo() const { return schedInfo; }
758 virtual const TargetRegInfo &getRegInfo() const { return regInfo; }
Chris Lattnerda62ac62002-12-28 20:20:24 +0000759 virtual const TargetFrameInfo &getFrameInfo() const { return frameInfo; }
Chris Lattnerdde12622002-12-29 02:50:33 +0000760 virtual const TargetCacheInfo &getCacheInfo() const { return cacheInfo; }
761 virtual const TargetOptInfo &getOptInfo() const { return optInfo; }
Chris Lattner32f600a2001-09-19 13:47:12 +0000762
Chris Lattner63342052002-10-29 21:12:46 +0000763 virtual bool addPassesToEmitAssembly(PassManager &PM, std::ostream &Out);
Chris Lattner4f946372002-10-28 01:03:43 +0000764
Chris Lattnerc66583e2002-10-29 22:01:44 +0000765 // getPrologEpilogInsertionPass - Inserts prolog/epilog code.
766 Pass* getPrologEpilogInsertionPass();
Chris Lattnerf6e0e282001-09-14 04:32:55 +0000767
Vikram S. Advee1f72802002-09-16 15:39:26 +0000768 // getFunctionAsmPrinterPass - Writes out machine code for a single function
Chris Lattnerc66583e2002-10-29 22:01:44 +0000769 Pass* getFunctionAsmPrinterPass(std::ostream &Out);
Vikram S. Advee1f72802002-09-16 15:39:26 +0000770
771 // getModuleAsmPrinterPass - Writes generated machine code to assembly file.
Chris Lattnerc66583e2002-10-29 22:01:44 +0000772 Pass* getModuleAsmPrinterPass(std::ostream &Out);
Vikram S. Advee1f72802002-09-16 15:39:26 +0000773
774 // getEmitBytecodeToAsmPass - Emits final LLVM bytecode to assembly file.
Chris Lattnerc66583e2002-10-29 22:01:44 +0000775 Pass* getEmitBytecodeToAsmPass(std::ostream &Out);
Chris Lattner6edfcc52002-02-03 07:51:17 +0000776};
Chris Lattnerf6e0e282001-09-14 04:32:55 +0000777
Chris Lattner795ba6c2003-01-15 21:36:50 +0000778int64_t GetConstantValueAsSignedInt(const Value *V, bool &isValidConstant);
779
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000780#endif