blob: ec04d3b8d2c029af8cefeebf2ea2775bbaf462bf [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
Misha Brukman12745c52003-05-24 01:08:43 +0000116 /// isNOPinstr - not having a special NOP opcode, we need to know if a given
117 /// instruction is interpreted as an `official' NOP instr, i.e., there may be
118 /// more than one way to `do nothing' but only one canonical way to slack off.
Misha Brukmane9d88382003-05-24 00:09:50 +0000119 ///
120 bool isNOPinstr(const MachineInstr &MI) const {
121 // Make sure the instruction is EXACTLY `sethi g0, 0'
122 if (MI.getOpcode() == V9::SETHI && MI.getNumOperands() == 2) {
123 const MachineOperand &op0 = MI.getOperand(0), &op1 = MI.getOperand(1);
124 if (op0.isMachineRegister() &&
125 op0.getMachineRegNum() == SparcIntRegClass::g0 &&
126 op1.isImmediate() && op1.getImmedValue() == 0)
127 {
128 return true;
129 }
130 }
131 return false;
132 }
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000133
Misha Brukmana98cd452003-05-20 20:32:24 +0000134 virtual bool hasResultInterlock(MachineOpCode opCode) const
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000135 {
136 // All UltraSPARC instructions have interlocks (note that delay slots
137 // are not considered here).
138 // However, instructions that use the result of an FCMP produce a
139 // 9-cycle stall if they are issued less than 3 cycles after the FCMP.
140 // Force the compiler to insert a software interlock (i.e., gap of
141 // 2 other groups, including NOPs if necessary).
Misha Brukmana98cd452003-05-20 20:32:24 +0000142 return (opCode == V9::FCMPS || opCode == V9::FCMPD || opCode == V9::FCMPQ);
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000143 }
144
Vikram S. Adve5684c4e2001-10-18 00:02:06 +0000145 //-------------------------------------------------------------------------
Vikram S. Advee1f72802002-09-16 15:39:26 +0000146 // Queries about representation of LLVM quantities (e.g., constants)
147 //-------------------------------------------------------------------------
148
149 virtual bool ConstantMayNotFitInImmedField(const Constant* CV,
150 const Instruction* I) const;
151
152 //-------------------------------------------------------------------------
Vikram S. Adve5684c4e2001-10-18 00:02:06 +0000153 // Code generation support for creating individual machine instructions
154 //-------------------------------------------------------------------------
Vikram S. Adved55697c2002-09-20 00:52:09 +0000155
156 // Get certain common op codes for the current target. This and all the
157 // Create* methods below should be moved to a machine code generation class
158 //
Misha Brukmana98cd452003-05-20 20:32:24 +0000159 virtual MachineOpCode getNOPOpCode() const { return V9::NOP; }
Vikram S. Adved55697c2002-09-20 00:52:09 +0000160
Vikram S. Adve5684c4e2001-10-18 00:02:06 +0000161 // Create an instruction sequence to put the constant `val' into
Vikram S. Adve242a8082002-05-19 15:25:51 +0000162 // the virtual register `dest'. `val' may be a Constant or a
163 // GlobalValue, viz., the constant address of a global variable or function.
164 // The generated instructions are returned in `mvec'.
165 // Any temp. registers (TmpInstruction) created are recorded in mcfi.
166 // Any stack space required is allocated via mcff.
Vikram S. Adve5684c4e2001-10-18 00:02:06 +0000167 //
Vikram S. Adve242a8082002-05-19 15:25:51 +0000168 virtual void CreateCodeToLoadConst(const TargetMachine& target,
169 Function* F,
Vikram S. Advedd558992002-03-18 03:02:42 +0000170 Value* val,
Vikram S. Adve5684c4e2001-10-18 00:02:06 +0000171 Instruction* dest,
Vikram S. Adve242a8082002-05-19 15:25:51 +0000172 std::vector<MachineInstr*>& mvec,
173 MachineCodeForInstruction& mcfi) const;
Vikram S. Adve7f37fe52001-11-08 04:55:13 +0000174
Vikram S. Adve5afff3b2001-11-09 02:15:52 +0000175 // Create an instruction sequence to copy an integer value `val'
176 // to a floating point value `dest' by copying to memory and back.
177 // val must be an integral type. dest must be a Float or Double.
Vikram S. Adve242a8082002-05-19 15:25:51 +0000178 // The generated instructions are returned in `mvec'.
179 // Any temp. registers (TmpInstruction) created are recorded in mcfi.
180 // Any stack space required is allocated via mcff.
Vikram S. Adve7f37fe52001-11-08 04:55:13 +0000181 //
Vikram S. Adve242a8082002-05-19 15:25:51 +0000182 virtual void CreateCodeToCopyIntToFloat(const TargetMachine& target,
183 Function* F,
184 Value* val,
185 Instruction* dest,
186 std::vector<MachineInstr*>& mvec,
187 MachineCodeForInstruction& mcfi) const;
Vikram S. Adve5afff3b2001-11-09 02:15:52 +0000188
189 // Similarly, create an instruction sequence to copy an FP value
190 // `val' to an integer value `dest' by copying to memory and back.
Vikram S. Adve242a8082002-05-19 15:25:51 +0000191 // The generated instructions are returned in `mvec'.
192 // Any temp. registers (TmpInstruction) created are recorded in mcfi.
193 // Any stack space required is allocated via mcff.
Vikram S. Adve5afff3b2001-11-09 02:15:52 +0000194 //
Vikram S. Adve242a8082002-05-19 15:25:51 +0000195 virtual void CreateCodeToCopyFloatToInt(const TargetMachine& target,
196 Function* F,
197 Value* val,
198 Instruction* dest,
199 std::vector<MachineInstr*>& mvec,
200 MachineCodeForInstruction& mcfi) const;
201
202 // Create instruction(s) to copy src to dest, for arbitrary types
203 // The generated instructions are returned in `mvec'.
204 // Any temp. registers (TmpInstruction) created are recorded in mcfi.
205 // Any stack space required is allocated via mcff.
206 //
Vikram S. Advedd558992002-03-18 03:02:42 +0000207 virtual void CreateCopyInstructionsByType(const TargetMachine& target,
Vikram S. Adve242a8082002-05-19 15:25:51 +0000208 Function* F,
209 Value* src,
210 Instruction* dest,
211 std::vector<MachineInstr*>& mvec,
212 MachineCodeForInstruction& mcfi) const;
213
214 // Create instruction sequence to produce a sign-extended register value
215 // from an arbitrary sized value (sized in bits, not bytes).
Vikram S. Advef36f06b2002-09-05 18:34:31 +0000216 // The generated instructions are appended to `mvec'.
217 // Any temp. registers (TmpInstruction) created are recorded in mcfi.
Vikram S. Adve242a8082002-05-19 15:25:51 +0000218 // Any stack space required is allocated via mcff.
219 //
220 virtual void CreateSignExtensionInstructions(const TargetMachine& target,
221 Function* F,
Vikram S. Advef36f06b2002-09-05 18:34:31 +0000222 Value* srcVal,
Vikram S. Adve5cedede2002-09-27 14:29:45 +0000223 Value* destVal,
224 unsigned int numLowBits,
Vikram S. Advef36f06b2002-09-05 18:34:31 +0000225 std::vector<MachineInstr*>& mvec,
226 MachineCodeForInstruction& mcfi) const;
227
228 // Create instruction sequence to produce a zero-extended register value
229 // from an arbitrary sized value (sized in bits, not bytes).
230 // The generated instructions are appended to `mvec'.
231 // Any temp. registers (TmpInstruction) created are recorded in mcfi.
232 // Any stack space required is allocated via mcff.
233 //
234 virtual void CreateZeroExtensionInstructions(const TargetMachine& target,
235 Function* F,
236 Value* srcVal,
Vikram S. Adve5cedede2002-09-27 14:29:45 +0000237 Value* destVal,
238 unsigned int numLowBits,
Vikram S. Adve242a8082002-05-19 15:25:51 +0000239 std::vector<MachineInstr*>& mvec,
240 MachineCodeForInstruction& mcfi) const;
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000241};
242
Ruchira Sasankae38bd5332001-09-15 00:30:44 +0000243
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000244//----------------------------------------------------------------------------
245// class UltraSparcRegInfo
246//
Chris Lattnerd0f166a2002-12-29 03:13:05 +0000247// This class implements the virtual class TargetRegInfo for Sparc.
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000248//
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000249//----------------------------------------------------------------------------
250
Chris Lattnerd0f166a2002-12-29 03:13:05 +0000251class UltraSparcRegInfo : public TargetRegInfo {
Ruchira Sasankaab304c42001-09-30 23:19:57 +0000252 // The actual register classes in the Sparc
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000253 //
Ruchira Sasankae38bd5332001-09-15 00:30:44 +0000254 enum RegClassIDs {
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000255 IntRegClassID, // Integer
256 FloatRegClassID, // Float (both single/double)
257 IntCCRegClassID, // Int Condition Code
258 FloatCCRegClassID // Float Condition code
Ruchira Sasankae38bd5332001-09-15 00:30:44 +0000259 };
260
Ruchira Sasankaab304c42001-09-30 23:19:57 +0000261
262 // Type of registers available in Sparc. There can be several reg types
263 // in the same class. For instace, the float reg class has Single/Double
264 // types
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000265 //
Ruchira Sasankaab304c42001-09-30 23:19:57 +0000266 enum RegTypes {
267 IntRegType,
268 FPSingleRegType,
269 FPDoubleRegType,
270 IntCCRegType,
271 FloatCCRegType
272 };
273
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000274 // **** WARNING: If the above enum order is changed, also modify
Ruchira Sasankae38bd5332001-09-15 00:30:44 +0000275 // getRegisterClassOfValue method below since it assumes this particular
276 // order for efficiency.
277
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000278
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000279 // Number of registers used for passing int args (usually 6: %o0 - %o5)
280 //
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000281 unsigned const NumOfIntArgRegs;
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000282
283 // Number of registers used for passing float args (usually 32: %f0 - %f31)
284 //
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000285 unsigned const NumOfFloatArgRegs;
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000286
287 // An out of bound register number that can be used to initialize register
288 // numbers. Useful for error detection.
289 //
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000290 int const InvalidRegNum;
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000291
292
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000293 // ======================== Private Methods =============================
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000294
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000295 // The following methods are used to color special live ranges (e.g.
Chris Lattnerf57b8452002-04-27 06:56:12 +0000296 // function args and return values etc.) with specific hardware registers
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000297 // as required. See SparcRegInfo.cpp for the implementation.
298 //
Vikram S. Advefe09fb22002-07-08 23:34:10 +0000299 void suggestReg4RetAddr(MachineInstr *RetMI,
Chris Lattner699683c2002-02-04 05:59:25 +0000300 LiveRangeInfo &LRI) const;
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000301
Vikram S. Adve106604e2002-09-28 16:56:59 +0000302 void suggestReg4CallAddr(MachineInstr *CallMI, LiveRangeInfo &LRI) const;
Vikram S. Advefe09fb22002-07-08 23:34:10 +0000303
304 void InitializeOutgoingArg(MachineInstr* CallMI, AddedInstrns *CallAI,
Vikram S. Adve242a8082002-05-19 15:25:51 +0000305 PhyRegAlloc &PRA, LiveRange* LR,
306 unsigned regType, unsigned RegClassID,
307 int UniArgReg, unsigned int argNo,
308 std::vector<MachineInstr *>& AddedInstrnsBefore)
309 const;
310
Chris Lattner3c3c82d2003-01-15 21:14:32 +0000311 int getRegType(const Type* type) const;
Chris Lattner699683c2002-02-04 05:59:25 +0000312 int getRegType(const LiveRange *LR) const;
Vikram S. Advefe09fb22002-07-08 23:34:10 +0000313 int getRegType(int unifiedRegNum) const;
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +0000314
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000315 // Used to generate a copy instruction based on the register class of
316 // value.
317 //
Chris Lattner699683c2002-02-04 05:59:25 +0000318 MachineInstr *cpValue2RegMI(Value *Val, unsigned DestReg,
319 int RegType) const;
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +0000320
321
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000322 // The following 2 methods are used to order the instructions addeed by
Chris Lattnerf57b8452002-04-27 06:56:12 +0000323 // the register allocator in association with function calling. See
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000324 // SparcRegInfo.cpp for more details
325 //
Chris Lattner697954c2002-01-20 22:54:45 +0000326 void moveInst2OrdVec(std::vector<MachineInstr *> &OrdVec,
327 MachineInstr *UnordInst,
328 PhyRegAlloc &PRA) const;
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +0000329
Chris Lattner697954c2002-01-20 22:54:45 +0000330 void OrderAddedInstrns(std::vector<MachineInstr *> &UnordVec,
331 std::vector<MachineInstr *> &OrdVec,
332 PhyRegAlloc &PRA) const;
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +0000333
334
Vikram S. Adve6d783112002-04-25 04:40:24 +0000335 // Compute which register can be used for an argument, if any
336 //
337 int regNumForIntArg(bool inCallee, bool isVarArgsCall,
338 unsigned argNo, unsigned intArgNo, unsigned fpArgNo,
339 unsigned& regClassId) const;
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +0000340
Vikram S. Adve6d783112002-04-25 04:40:24 +0000341 int regNumForFPArg(unsigned RegType, bool inCallee, bool isVarArgsCall,
342 unsigned argNo, unsigned intArgNo, unsigned fpArgNo,
343 unsigned& regClassId) const;
344
Chris Lattner699683c2002-02-04 05:59:25 +0000345public:
346 UltraSparcRegInfo(const UltraSparc &tgt);
Ruchira Sasankae38bd5332001-09-15 00:30:44 +0000347
Vikram S. Advedd558992002-03-18 03:02:42 +0000348 // To find the register class used for a specified Type
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000349 //
Vikram S. Advefe09fb22002-07-08 23:34:10 +0000350 unsigned getRegClassIDOfType(const Type *type,
351 bool isCCReg = false) const;
Ruchira Sasankae38bd5332001-09-15 00:30:44 +0000352
Vikram S. Advefe09fb22002-07-08 23:34:10 +0000353 // To find the register class to which a specified register belongs
354 //
355 unsigned getRegClassIDOfReg(int unifiedRegNum) const;
356 unsigned getRegClassIDOfRegType(int regType) const;
Vikram S. Advedd558992002-03-18 03:02:42 +0000357
Chris Lattner699683c2002-02-04 05:59:25 +0000358 // getZeroRegNum - returns the register that contains always zero this is the
359 // unified register number
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000360 //
Chris Lattner699683c2002-02-04 05:59:25 +0000361 virtual int getZeroRegNum() const;
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000362
Chris Lattner699683c2002-02-04 05:59:25 +0000363 // getCallAddressReg - returns the reg used for pushing the address when a
Chris Lattnerf57b8452002-04-27 06:56:12 +0000364 // function is called. This can be used for other purposes between calls
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000365 //
Chris Lattner699683c2002-02-04 05:59:25 +0000366 unsigned getCallAddressReg() const;
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000367
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000368 // Returns the register containing the return address.
369 // It should be made sure that this register contains the return
370 // value when a return instruction is reached.
371 //
Chris Lattner699683c2002-02-04 05:59:25 +0000372 unsigned getReturnAddressReg() const;
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000373
Vikram S. Adve242a8082002-05-19 15:25:51 +0000374 // Number of registers used for passing int args (usually 6: %o0 - %o5)
375 // and float args (usually 32: %f0 - %f31)
376 //
377 unsigned const GetNumOfIntArgRegs() const { return NumOfIntArgRegs; }
378 unsigned const GetNumOfFloatArgRegs() const { return NumOfFloatArgRegs; }
379
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000380 // The following methods are used to color special live ranges (e.g.
Chris Lattnerf57b8452002-04-27 06:56:12 +0000381 // function args and return values etc.) with specific hardware registers
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000382 // as required. See SparcRegInfo.cpp for the implementation for Sparc.
383 //
Chris Lattnerb7653df2002-04-08 22:03:57 +0000384 void suggestRegs4MethodArgs(const Function *Meth,
Ruchira Sasankaab304c42001-09-30 23:19:57 +0000385 LiveRangeInfo& LRI) const;
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000386
Vikram S. Advefe09fb22002-07-08 23:34:10 +0000387 void suggestRegs4CallArgs(MachineInstr *CallMI,
Vikram S. Adve106604e2002-09-28 16:56:59 +0000388 LiveRangeInfo& LRI) const;
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000389
Vikram S. Advefe09fb22002-07-08 23:34:10 +0000390 void suggestReg4RetValue(MachineInstr *RetMI,
Chris Lattner697954c2002-01-20 22:54:45 +0000391 LiveRangeInfo& LRI) const;
Vikram S. Advefe09fb22002-07-08 23:34:10 +0000392
Chris Lattnerb7653df2002-04-08 22:03:57 +0000393 void colorMethodArgs(const Function *Meth, LiveRangeInfo &LRI,
Chris Lattner699683c2002-02-04 05:59:25 +0000394 AddedInstrns *FirstAI) const;
Ruchira Sasankaab304c42001-09-30 23:19:57 +0000395
Vikram S. Advefe09fb22002-07-08 23:34:10 +0000396 void colorCallArgs(MachineInstr *CallMI, LiveRangeInfo &LRI,
Chris Lattner699683c2002-02-04 05:59:25 +0000397 AddedInstrns *CallAI, PhyRegAlloc &PRA,
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000398 const BasicBlock *BB) const;
Ruchira Sasankaab304c42001-09-30 23:19:57 +0000399
Vikram S. Advefe09fb22002-07-08 23:34:10 +0000400 void colorRetValue(MachineInstr *RetI, LiveRangeInfo& LRI,
Chris Lattner699683c2002-02-04 05:59:25 +0000401 AddedInstrns *RetAI) const;
Ruchira Sasankaab304c42001-09-30 23:19:57 +0000402
403
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000404 // method used for printing a register for debugging purposes
405 //
Chris Lattner699683c2002-02-04 05:59:25 +0000406 static void printReg(const LiveRange *LR);
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000407
Vikram S. Advefe09fb22002-07-08 23:34:10 +0000408 // Each register class has a seperate space for register IDs. To convert
409 // a regId in a register class to a common Id, or vice versa,
410 // we use the folloing methods.
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000411 //
Vikram S. Advefe09fb22002-07-08 23:34:10 +0000412 // This method provides a unique number for each register
413 inline int getUnifiedRegNum(unsigned regClassID, int reg) const {
414
415 if (regClassID == IntRegClassID) {
416 assert(reg < 32 && "Invalid reg. number");
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000417 return reg;
Vikram S. Advefe09fb22002-07-08 23:34:10 +0000418 }
419 else if (regClassID == FloatRegClassID) {
420 assert(reg < 64 && "Invalid reg. number");
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000421 return reg + 32; // we have 32 int regs
Vikram S. Advefe09fb22002-07-08 23:34:10 +0000422 }
423 else if (regClassID == FloatCCRegClassID) {
424 assert(reg < 4 && "Invalid reg. number");
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000425 return reg + 32 + 64; // 32 int, 64 float
Vikram S. Advefe09fb22002-07-08 23:34:10 +0000426 }
427 else if (regClassID == IntCCRegClassID ) {
428 assert(reg == 0 && "Invalid reg. number");
429 return reg + 4+ 32 + 64; // only one int CC reg
430 }
431 else if (reg==InvalidRegNum) {
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000432 return InvalidRegNum;
Vikram S. Advefe09fb22002-07-08 23:34:10 +0000433 }
Ruchira Sasankae38bd5332001-09-15 00:30:44 +0000434 else
Vikram S. Advefe09fb22002-07-08 23:34:10 +0000435 assert(0 && "Invalid register class");
Chris Lattner6dad5062001-11-07 13:49:12 +0000436 return 0;
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000437 }
Vikram S. Advefe09fb22002-07-08 23:34:10 +0000438
439 // This method converts the unified number to the number in its class,
440 // and returns the class ID in regClassID.
441 inline int getClassRegNum(int ureg, unsigned& regClassID) const {
442 if (ureg < 32) { regClassID = IntRegClassID; return ureg; }
443 else if (ureg < 32+64) { regClassID = FloatRegClassID; return ureg-32; }
444 else if (ureg < 4 +96) { regClassID = FloatCCRegClassID; return ureg-96; }
445 else if (ureg < 1 +100) { regClassID = IntCCRegClassID; return ureg-100;}
446 else if (ureg == InvalidRegNum) { return InvalidRegNum; }
447 else { assert(0 && "Invalid unified register number"); }
Chris Lattnerb82d97e2002-07-25 06:08:32 +0000448 return 0;
Vikram S. Advefe09fb22002-07-08 23:34:10 +0000449 }
450
451 // Returns the assembly-language name of the specified machine register.
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000452 //
Chris Lattner95685682002-08-12 21:25:05 +0000453 virtual const char * const getUnifiedRegName(int reg) const;
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000454
455
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000456 // returns the # of bytes of stack space allocated for each register
457 // type. For Sparc, currently we allocate 8 bytes on stack for all
458 // register types. We can optimize this later if necessary to save stack
459 // space (However, should make sure that stack alignment is correct)
460 //
Chris Lattner699683c2002-02-04 05:59:25 +0000461 inline int getSpilledRegSize(int RegType) const {
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000462 return 8;
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000463 }
464
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000465
Vikram S. Advea44c6c02002-03-31 19:04:50 +0000466 // To obtain the return value and the indirect call address (if any)
467 // contained in a CALL machine instruction
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000468 //
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000469 const Value * getCallInstRetVal(const MachineInstr *CallMI) const;
Vikram S. Advea44c6c02002-03-31 19:04:50 +0000470 const Value * getCallInstIndirectAddrVal(const MachineInstr *CallMI) const;
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000471
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000472 // The following methods are used to generate "copy" machine instructions
473 // for an architecture.
474 //
Vikram S. Advefe09fb22002-07-08 23:34:10 +0000475 // The function regTypeNeedsScratchReg() can be used to check whether a
476 // scratch register is needed to copy a register of type `regType' to
477 // or from memory. If so, such a scratch register can be provided by
478 // the caller (e.g., if it knows which regsiters are free); otherwise
479 // an arbitrary one will be chosen and spilled by the copy instructions.
480 //
481 bool regTypeNeedsScratchReg(int RegType,
482 int& scratchRegClassId) const;
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000483
Vikram S. Advefe09fb22002-07-08 23:34:10 +0000484 void cpReg2RegMI(std::vector<MachineInstr*>& mvec,
485 unsigned SrcReg, unsigned DestReg,
486 int RegType) const;
487
488 void cpReg2MemMI(std::vector<MachineInstr*>& mvec,
489 unsigned SrcReg, unsigned DestPtrReg,
490 int Offset, int RegType, int scratchReg = -1) const;
491
492 void cpMem2RegMI(std::vector<MachineInstr*>& mvec,
493 unsigned SrcPtrReg, int Offset, unsigned DestReg,
494 int RegType, int scratchReg = -1) const;
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000495
Vikram S. Adve242a8082002-05-19 15:25:51 +0000496 void cpValue2Value(Value *Src, Value *Dest,
Anand Shuklacfb22d32002-06-25 20:55:50 +0000497 std::vector<MachineInstr*>& mvec) const;
Ruchira Sasankaef1b0cb2001-11-03 17:13:27 +0000498
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000499 // To see whether a register is a volatile (i.e., whehter it must be
500 // preserved acorss calls)
501 //
Chris Lattner699683c2002-02-04 05:59:25 +0000502 inline bool isRegVolatile(int RegClassID, int Reg) const {
503 return MachineRegClassArr[RegClassID]->isRegVolatile(Reg);
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000504 }
505
506
Chris Lattner699683c2002-02-04 05:59:25 +0000507 virtual unsigned getFramePointer() const;
508 virtual unsigned getStackPointer() const;
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000509
Chris Lattner699683c2002-02-04 05:59:25 +0000510 virtual int getInvalidRegNum() const {
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000511 return InvalidRegNum;
512 }
513
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000514 // This method inserts the caller saving code for call instructions
515 //
Anand Shukla24787fa2002-07-11 00:16:28 +0000516 void insertCallerSavingCode(std::vector<MachineInstr*>& instrnsBefore,
517 std::vector<MachineInstr*>& instrnsAfter,
Vikram S. Adve6a49a1e2002-07-10 21:42:42 +0000518 MachineInstr *MInst,
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000519 const BasicBlock *BB, PhyRegAlloc &PRA ) const;
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000520};
521
522
523
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000524
525//---------------------------------------------------------------------------
526// class UltraSparcSchedInfo
527//
528// Purpose:
529// Interface to instruction scheduling information for UltraSPARC.
530// The parameter values above are based on UltraSPARC IIi.
531//---------------------------------------------------------------------------
532
533
Chris Lattnerd0f166a2002-12-29 03:13:05 +0000534class UltraSparcSchedInfo: public TargetSchedInfo {
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000535public:
Chris Lattner699683c2002-02-04 05:59:25 +0000536 UltraSparcSchedInfo(const TargetMachine &tgt);
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000537protected:
Chris Lattner699683c2002-02-04 05:59:25 +0000538 virtual void initializeResources();
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000539};
540
Chris Lattnerf6e0e282001-09-14 04:32:55 +0000541
542//---------------------------------------------------------------------------
Vikram S. Advec1521632001-10-22 13:31:53 +0000543// class UltraSparcFrameInfo
544//
545// Purpose:
546// Interface to stack frame layout info for the UltraSPARC.
Vikram S. Adve00521d72001-11-12 23:26:35 +0000547// Starting offsets for each area of the stack frame are aligned at
548// a multiple of getStackFrameSizeAlignment().
Vikram S. Advec1521632001-10-22 13:31:53 +0000549//---------------------------------------------------------------------------
550
Chris Lattnerda62ac62002-12-28 20:20:24 +0000551class UltraSparcFrameInfo: public TargetFrameInfo {
552 const TargetMachine &target;
Vikram S. Advec1521632001-10-22 13:31:53 +0000553public:
Chris Lattnerda62ac62002-12-28 20:20:24 +0000554 UltraSparcFrameInfo(const TargetMachine &TM)
555 : TargetFrameInfo(StackGrowsDown, StackFrameSizeAlignment, 0), target(TM) {}
Vikram S. Adve7f37fe52001-11-08 04:55:13 +0000556
557public:
Vikram S. Advee1f72802002-09-16 15:39:26 +0000558 // These methods provide constant parameters of the frame layout.
559 //
Chris Lattnerf57b8452002-04-27 06:56:12 +0000560 int getStackFrameSizeAlignment() const { return StackFrameSizeAlignment;}
561 int getMinStackFrameSize() const { return MinStackFrameSize; }
562 int getNumFixedOutgoingArgs() const { return NumFixedOutgoingArgs; }
563 int getSizeOfEachArgOnStack() const { return SizeOfEachArgOnStack; }
564 bool argsOnStackHaveFixedSize() const { return true; }
Vikram S. Adve7f37fe52001-11-08 04:55:13 +0000565
Vikram S. Advee1f72802002-09-16 15:39:26 +0000566 // This method adjusts a stack offset to meet alignment rules of target.
567 // The fixed OFFSET (0x7ff) must be subtracted and the result aligned.
568 virtual int adjustAlignment (int unalignedOffset,
569 bool growUp,
570 unsigned int align) const {
571 return unalignedOffset + (growUp? +1:-1)*((unalignedOffset-OFFSET) % align);
572 }
573
Vikram S. Adve7f37fe52001-11-08 04:55:13 +0000574 // These methods compute offsets using the frame contents for a
Chris Lattnerf57b8452002-04-27 06:56:12 +0000575 // particular function. The frame contents are obtained from the
576 // MachineCodeInfoForMethod object for the given function.
Vikram S. Adve7f37fe52001-11-08 04:55:13 +0000577 //
Misha Brukmanfce11432002-10-28 00:28:31 +0000578 int getFirstIncomingArgOffset (MachineFunction& mcInfo,
Vikram S. Adve6d783112002-04-25 04:40:24 +0000579 bool& growUp) const
Vikram S. Adve7f37fe52001-11-08 04:55:13 +0000580 {
Vikram S. Adve6d783112002-04-25 04:40:24 +0000581 growUp = true; // arguments area grows upwards
Vikram S. Adve7f37fe52001-11-08 04:55:13 +0000582 return FirstIncomingArgOffsetFromFP;
583 }
Misha Brukmanfce11432002-10-28 00:28:31 +0000584 int getFirstOutgoingArgOffset (MachineFunction& mcInfo,
Vikram S. Adve6d783112002-04-25 04:40:24 +0000585 bool& growUp) const
Vikram S. Adve7f37fe52001-11-08 04:55:13 +0000586 {
Vikram S. Adve6d783112002-04-25 04:40:24 +0000587 growUp = true; // arguments area grows upwards
Vikram S. Adve7f37fe52001-11-08 04:55:13 +0000588 return FirstOutgoingArgOffsetFromSP;
589 }
Misha Brukmanfce11432002-10-28 00:28:31 +0000590 int getFirstOptionalOutgoingArgOffset(MachineFunction& mcInfo,
Vikram S. Adve6d783112002-04-25 04:40:24 +0000591 bool& growUp)const
Vikram S. Adve7f37fe52001-11-08 04:55:13 +0000592 {
Vikram S. Adve6d783112002-04-25 04:40:24 +0000593 growUp = true; // arguments area grows upwards
Vikram S. Adve7f37fe52001-11-08 04:55:13 +0000594 return FirstOptionalOutgoingArgOffsetFromSP;
595 }
596
Misha Brukmanfce11432002-10-28 00:28:31 +0000597 int getFirstAutomaticVarOffset (MachineFunction& mcInfo,
Vikram S. Adve6d783112002-04-25 04:40:24 +0000598 bool& growUp) const;
Misha Brukmanfce11432002-10-28 00:28:31 +0000599 int getRegSpillAreaOffset (MachineFunction& mcInfo,
Vikram S. Adve6d783112002-04-25 04:40:24 +0000600 bool& growUp) const;
Misha Brukmanfce11432002-10-28 00:28:31 +0000601 int getTmpAreaOffset (MachineFunction& mcInfo,
Vikram S. Adve6d783112002-04-25 04:40:24 +0000602 bool& growUp) const;
Misha Brukmanfce11432002-10-28 00:28:31 +0000603 int getDynamicAreaOffset (MachineFunction& mcInfo,
Vikram S. Adve6d783112002-04-25 04:40:24 +0000604 bool& growUp) const;
Vikram S. Adve7f37fe52001-11-08 04:55:13 +0000605
606 //
607 // These methods specify the base register used for each stack area
608 // (generally FP or SP)
609 //
610 virtual int getIncomingArgBaseRegNum() const {
611 return (int) target.getRegInfo().getFramePointer();
612 }
613 virtual int getOutgoingArgBaseRegNum() const {
614 return (int) target.getRegInfo().getStackPointer();
615 }
616 virtual int getOptionalOutgoingArgBaseRegNum() const {
617 return (int) target.getRegInfo().getStackPointer();
618 }
619 virtual int getAutomaticVarBaseRegNum() const {
620 return (int) target.getRegInfo().getFramePointer();
621 }
622 virtual int getRegSpillAreaBaseRegNum() const {
623 return (int) target.getRegInfo().getFramePointer();
624 }
625 virtual int getDynamicAreaBaseRegNum() const {
626 return (int) target.getRegInfo().getStackPointer();
627 }
Chris Lattnerda62ac62002-12-28 20:20:24 +0000628
629 virtual int getIncomingArgOffset(MachineFunction& mcInfo,
630 unsigned argNum) const {
631 assert(argsOnStackHaveFixedSize());
632
633 unsigned relativeOffset = argNum * getSizeOfEachArgOnStack();
634 bool growUp; // do args grow up or down
635 int firstArg = getFirstIncomingArgOffset(mcInfo, growUp);
636 return growUp ? firstArg + relativeOffset : firstArg - relativeOffset;
637 }
638
639 virtual int getOutgoingArgOffset(MachineFunction& mcInfo,
640 unsigned argNum) const {
641 assert(argsOnStackHaveFixedSize());
642 //assert(((int) argNum - this->getNumFixedOutgoingArgs())
643 // <= (int) mcInfo.getInfo()->getMaxOptionalNumArgs());
644
645 unsigned relativeOffset = argNum * getSizeOfEachArgOnStack();
646 bool growUp; // do args grow up or down
647 int firstArg = getFirstOutgoingArgOffset(mcInfo, growUp);
648 return growUp ? firstArg + relativeOffset : firstArg - relativeOffset;
649 }
Vikram S. Adve7f37fe52001-11-08 04:55:13 +0000650
651private:
Vikram S. Advee1f72802002-09-16 15:39:26 +0000652 /*----------------------------------------------------------------------
653 This diagram shows the stack frame layout used by llc on Sparc V9.
654 Note that only the location of automatic variables, spill area,
655 temporary storage, and dynamically allocated stack area are chosen
656 by us. The rest conform to the Sparc V9 ABI.
657 All stack addresses are offset by OFFSET = 0x7ff (2047).
658
Chris Lattnerda62ac62002-12-28 20:20:24 +0000659 Alignment assumptions and other invariants:
Vikram S. Advee1f72802002-09-16 15:39:26 +0000660 (1) %sp+OFFSET and %fp+OFFSET are always aligned on 16-byte boundary
661 (2) Variables in automatic, spill, temporary, or dynamic regions
662 are aligned according to their size as in all memory accesses.
663 (3) Everything below the dynamically allocated stack area is only used
664 during a call to another function, so it is never needed when
665 the current function is active. This is why space can be allocated
666 dynamically by incrementing %sp any time within the function.
667
668 STACK FRAME LAYOUT:
669
670 ...
671 %fp+OFFSET+176 Optional extra incoming arguments# 1..N
672 %fp+OFFSET+168 Incoming argument #6
673 ... ...
674 %fp+OFFSET+128 Incoming argument #1
675 ... ...
676 ---%fp+OFFSET-0--------Bottom of caller's stack frame--------------------
677 %fp+OFFSET-8 Automatic variables <-- ****TOP OF STACK FRAME****
678 Spill area
679 Temporary storage
680 ...
681
682 %sp+OFFSET+176+8N Bottom of dynamically allocated stack area
683 %sp+OFFSET+168+8N Optional extra outgoing argument# N
684 ... ...
685 %sp+OFFSET+176 Optional extra outgoing argument# 1
686 %sp+OFFSET+168 Outgoing argument #6
687 ... ...
688 %sp+OFFSET+128 Outgoing argument #1
689 %sp+OFFSET+120 Save area for %i7
690 ... ...
691 %sp+OFFSET+0 Save area for %l0 <-- ****BOTTOM OF STACK FRAME****
692
693 *----------------------------------------------------------------------*/
694
Vikram S. Adve5afff3b2001-11-09 02:15:52 +0000695 // All stack addresses must be offset by 0x7ff (2047) on Sparc V9.
696 static const int OFFSET = (int) 0x7ff;
Vikram S. Adve7f37fe52001-11-08 04:55:13 +0000697 static const int StackFrameSizeAlignment = 16;
Vikram S. Advec1521632001-10-22 13:31:53 +0000698 static const int MinStackFrameSize = 176;
Vikram S. Adve7f37fe52001-11-08 04:55:13 +0000699 static const int NumFixedOutgoingArgs = 6;
700 static const int SizeOfEachArgOnStack = 8;
Vikram S. Adve5afff3b2001-11-09 02:15:52 +0000701 static const int FirstIncomingArgOffsetFromFP = 128 + OFFSET;
702 static const int FirstOptionalIncomingArgOffsetFromFP = 176 + OFFSET;
Vikram S. Advee1f72802002-09-16 15:39:26 +0000703 static const int StaticAreaOffsetFromFP = 0 + OFFSET;
Vikram S. Adve5afff3b2001-11-09 02:15:52 +0000704 static const int FirstOutgoingArgOffsetFromSP = 128 + OFFSET;
705 static const int FirstOptionalOutgoingArgOffsetFromSP = 176 + OFFSET;
Vikram S. Advec1521632001-10-22 13:31:53 +0000706};
707
708
Vikram S. Adve5afff3b2001-11-09 02:15:52 +0000709//---------------------------------------------------------------------------
710// class UltraSparcCacheInfo
711//
712// Purpose:
713// Interface to cache parameters for the UltraSPARC.
714// Just use defaults for now.
715//---------------------------------------------------------------------------
716
Chris Lattnerdde12622002-12-29 02:50:33 +0000717struct UltraSparcCacheInfo: public TargetCacheInfo {
718 UltraSparcCacheInfo(const TargetMachine &T) : TargetCacheInfo(T) {}
Vikram S. Adve5afff3b2001-11-09 02:15:52 +0000719};
720
Vikram S. Advec1521632001-10-22 13:31:53 +0000721
722//---------------------------------------------------------------------------
Vikram S. Adved55697c2002-09-20 00:52:09 +0000723// class UltraSparcOptInfo
724//
725// Purpose:
726// Interface to machine-level optimization routines for the UltraSPARC.
727//---------------------------------------------------------------------------
728
Chris Lattnerdde12622002-12-29 02:50:33 +0000729struct UltraSparcOptInfo: public TargetOptInfo {
730 UltraSparcOptInfo(const TargetMachine &T) : TargetOptInfo(T) {}
Vikram S. Adved55697c2002-09-20 00:52:09 +0000731
732 virtual bool IsUselessCopy (const MachineInstr* MI) const;
733};
734
Vikram S. Adved55697c2002-09-20 00:52:09 +0000735//---------------------------------------------------------------------------
Chris Lattnerf6e0e282001-09-14 04:32:55 +0000736// class UltraSparcMachine
737//
738// Purpose:
739// Primary interface to machine description for the UltraSPARC.
740// Primarily just initializes machine-dependent parameters in
741// class TargetMachine, and creates machine-dependent subclasses
Vikram S. Adve339084b2001-09-18 13:04:24 +0000742// for classes such as InstrInfo, SchedInfo and RegInfo.
Chris Lattnerf6e0e282001-09-14 04:32:55 +0000743//---------------------------------------------------------------------------
744
745class UltraSparc : public TargetMachine {
Vikram S. Adve339084b2001-09-18 13:04:24 +0000746 UltraSparcInstrInfo instrInfo;
747 UltraSparcSchedInfo schedInfo;
748 UltraSparcRegInfo regInfo;
Vikram S. Advec1521632001-10-22 13:31:53 +0000749 UltraSparcFrameInfo frameInfo;
Vikram S. Adve5afff3b2001-11-09 02:15:52 +0000750 UltraSparcCacheInfo cacheInfo;
Vikram S. Adved55697c2002-09-20 00:52:09 +0000751 UltraSparcOptInfo optInfo;
Chris Lattnerf6e0e282001-09-14 04:32:55 +0000752public:
753 UltraSparc();
Vikram S. Adved55697c2002-09-20 00:52:09 +0000754
Chris Lattner3501fea2003-01-14 22:00:31 +0000755 virtual const TargetInstrInfo &getInstrInfo() const { return instrInfo; }
Chris Lattnerd0f166a2002-12-29 03:13:05 +0000756 virtual const TargetSchedInfo &getSchedInfo() const { return schedInfo; }
757 virtual const TargetRegInfo &getRegInfo() const { return regInfo; }
Chris Lattnerda62ac62002-12-28 20:20:24 +0000758 virtual const TargetFrameInfo &getFrameInfo() const { return frameInfo; }
Chris Lattnerdde12622002-12-29 02:50:33 +0000759 virtual const TargetCacheInfo &getCacheInfo() const { return cacheInfo; }
760 virtual const TargetOptInfo &getOptInfo() const { return optInfo; }
Chris Lattner32f600a2001-09-19 13:47:12 +0000761
Chris Lattner63342052002-10-29 21:12:46 +0000762 virtual bool addPassesToEmitAssembly(PassManager &PM, std::ostream &Out);
Chris Lattner4f946372002-10-28 01:03:43 +0000763
Chris Lattnerc66583e2002-10-29 22:01:44 +0000764 // getPrologEpilogInsertionPass - Inserts prolog/epilog code.
765 Pass* getPrologEpilogInsertionPass();
Chris Lattnerf6e0e282001-09-14 04:32:55 +0000766
Vikram S. Advee1f72802002-09-16 15:39:26 +0000767 // getFunctionAsmPrinterPass - Writes out machine code for a single function
Chris Lattnerc66583e2002-10-29 22:01:44 +0000768 Pass* getFunctionAsmPrinterPass(std::ostream &Out);
Vikram S. Advee1f72802002-09-16 15:39:26 +0000769
770 // getModuleAsmPrinterPass - Writes generated machine code to assembly file.
Chris Lattnerc66583e2002-10-29 22:01:44 +0000771 Pass* getModuleAsmPrinterPass(std::ostream &Out);
Vikram S. Advee1f72802002-09-16 15:39:26 +0000772
773 // getEmitBytecodeToAsmPass - Emits final LLVM bytecode to assembly file.
Chris Lattnerc66583e2002-10-29 22:01:44 +0000774 Pass* getEmitBytecodeToAsmPass(std::ostream &Out);
Chris Lattner6edfcc52002-02-03 07:51:17 +0000775};
Chris Lattnerf6e0e282001-09-14 04:32:55 +0000776
Chris Lattner795ba6c2003-01-15 21:36:50 +0000777int64_t GetConstantValueAsSignedInt(const Value *V, bool &isValidConstant);
778
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000779#endif