blob: 4ca66163ac16151441a246aed61ea2d1dc227e7c [file] [log] [blame]
Vikram S. Adve7f37fe52001-11-08 04:55:13 +00001// $Id$ -*- C++ -*--
2//***************************************************************************
3// File:
4// SparcInternals.h
5//
6// Purpose:
7// This file defines stuff that is to be private to the Sparc
8// backend, but is shared among different portions of the backend.
9//**************************************************************************/
10
Chris Lattnerc6495ee2001-09-14 03:56:45 +000011
12#ifndef SPARC_INTERNALS_H
13#define SPARC_INTERNALS_H
14
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +000015#include "llvm/Target/TargetMachine.h"
Vikram S. Adve339084b2001-09-18 13:04:24 +000016#include "llvm/Target/MachineSchedInfo.h"
Vikram S. Adve5afff3b2001-11-09 02:15:52 +000017#include "llvm/Target/MachineFrameInfo.h"
18#include "llvm/Target/MachineCacheInfo.h"
Chris Lattner699683c2002-02-04 05:59:25 +000019#include "llvm/Target/MachineRegInfo.h"
Chris Lattnerc6495ee2001-09-14 03:56:45 +000020#include "llvm/Type.h"
Chris Lattner46cbff62001-09-14 16:56:32 +000021#include <sys/types.h>
Chris Lattnerc6495ee2001-09-14 03:56:45 +000022
Chris Lattner4387e312002-02-03 23:42:19 +000023class LiveRange;
Chris Lattnerf6e0e282001-09-14 04:32:55 +000024class UltraSparc;
Chris Lattner4387e312002-02-03 23:42:19 +000025class PhyRegAlloc;
Chris Lattner9aa697b2002-04-09 05:16:36 +000026class Pass;
Chris Lattner4387e312002-02-03 23:42:19 +000027
Chris Lattner9aa697b2002-04-09 05:16:36 +000028Pass *createPrologEpilogCodeInserter(TargetMachine &TM);
Chris Lattnerf6e0e282001-09-14 04:32:55 +000029
Chris Lattnerc6495ee2001-09-14 03:56:45 +000030// OpCodeMask definitions for the Sparc V9
31//
32const OpCodeMask Immed = 0x00002000; // immed or reg operand?
33const OpCodeMask Annul = 0x20000000; // annul delay instr?
34const OpCodeMask PredictTaken = 0x00080000; // predict branch taken?
35
36
37enum SparcInstrSchedClass {
38 SPARC_NONE, /* Instructions with no scheduling restrictions */
39 SPARC_IEUN, /* Integer class that can use IEU0 or IEU1 */
40 SPARC_IEU0, /* Integer class IEU0 */
41 SPARC_IEU1, /* Integer class IEU1 */
42 SPARC_FPM, /* FP Multiply or Divide instructions */
43 SPARC_FPA, /* All other FP instructions */
44 SPARC_CTI, /* Control-transfer instructions */
45 SPARC_LD, /* Load instructions */
46 SPARC_ST, /* Store instructions */
47 SPARC_SINGLE, /* Instructions that must issue by themselves */
48
49 SPARC_INV, /* This should stay at the end for the next value */
50 SPARC_NUM_SCHED_CLASSES = SPARC_INV
51};
52
Chris Lattnerc6495ee2001-09-14 03:56:45 +000053
54//---------------------------------------------------------------------------
55// enum SparcMachineOpCode.
56// const MachineInstrDescriptor SparcMachineInstrDesc[]
57//
58// Purpose:
59// Description of UltraSparc machine instructions.
60//
61//---------------------------------------------------------------------------
62
Chris Lattnerc6495ee2001-09-14 03:56:45 +000063enum SparcMachineOpCode {
Chris Lattner9a3d63b2001-09-19 15:56:23 +000064#define I(ENUM, OPCODESTRING, NUMOPERANDS, RESULTPOS, MAXIMM, IMMSE, \
65 NUMDELAYSLOTS, LATENCY, SCHEDCLASS, INSTFLAGS) \
66 ENUM,
67#include "SparcInstr.def"
Chris Lattnerc6495ee2001-09-14 03:56:45 +000068
Chris Lattnerc6495ee2001-09-14 03:56:45 +000069 // End-of-array marker
70 INVALID_OPCODE,
Vikram S. Advec1521632001-10-22 13:31:53 +000071 NUM_REAL_OPCODES = PHI, // number of valid opcodes
Chris Lattnerc6495ee2001-09-14 03:56:45 +000072 NUM_TOTAL_OPCODES = INVALID_OPCODE
73};
74
Chris Lattnerc6495ee2001-09-14 03:56:45 +000075
Chris Lattner9a3d63b2001-09-19 15:56:23 +000076// Array of machine instruction descriptions...
77extern const MachineInstrDescriptor SparcMachineInstrDesc[];
Chris Lattnerc6495ee2001-09-14 03:56:45 +000078
79
80//---------------------------------------------------------------------------
81// class UltraSparcInstrInfo
82//
83// Purpose:
84// Information about individual instructions.
85// Most information is stored in the SparcMachineInstrDesc array above.
86// Other information is computed on demand, and most such functions
87// default to member functions in base class MachineInstrInfo.
88//---------------------------------------------------------------------------
89
90class UltraSparcInstrInfo : public MachineInstrInfo {
91public:
Vikram S. Adve7f37fe52001-11-08 04:55:13 +000092 /*ctor*/ UltraSparcInstrInfo(const TargetMachine& tgt);
Vikram S. Adve4c5fe2d2001-11-14 18:48:36 +000093
94 //
Vikram S. Advedd558992002-03-18 03:02:42 +000095 // All immediate constants are in position 1 except the
Vikram S. Adve4c5fe2d2001-11-14 18:48:36 +000096 // store instructions.
97 //
Vikram S. Advedd558992002-03-18 03:02:42 +000098 virtual int getImmedConstantPos(MachineOpCode opCode) const {
Vikram S. Adve4c5fe2d2001-11-14 18:48:36 +000099 bool ignore;
100 if (this->maxImmedConstant(opCode, ignore) != 0)
101 {
102 assert(! this->isStore((MachineOpCode) STB - 1)); // first store is STB
103 assert(! this->isStore((MachineOpCode) STD + 1)); // last store is STD
Vikram S. Advedd558992002-03-18 03:02:42 +0000104 return (opCode >= STB && opCode <= STD)? 2 : 1;
Vikram S. Adve4c5fe2d2001-11-14 18:48:36 +0000105 }
106 else
107 return -1;
108 }
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000109
Vikram S. Adve5684c4e2001-10-18 00:02:06 +0000110 virtual bool hasResultInterlock (MachineOpCode opCode) const
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000111 {
112 // All UltraSPARC instructions have interlocks (note that delay slots
113 // are not considered here).
114 // However, instructions that use the result of an FCMP produce a
115 // 9-cycle stall if they are issued less than 3 cycles after the FCMP.
116 // Force the compiler to insert a software interlock (i.e., gap of
117 // 2 other groups, including NOPs if necessary).
118 return (opCode == FCMPS || opCode == FCMPD || opCode == FCMPQ);
119 }
120
Vikram S. Adve5684c4e2001-10-18 00:02:06 +0000121 //-------------------------------------------------------------------------
122 // Code generation support for creating individual machine instructions
123 //-------------------------------------------------------------------------
Ruchira Sasankaab304c42001-09-30 23:19:57 +0000124
Vikram S. Adve5684c4e2001-10-18 00:02:06 +0000125 // Create an instruction sequence to put the constant `val' into
126 // the virtual register `dest'. The generated instructions are
127 // returned in `minstrVec'. Any temporary registers (TmpInstruction)
128 // created are returned in `tempVec'.
129 //
Chris Lattnerf57b8452002-04-27 06:56:12 +0000130 virtual void CreateCodeToLoadConst(Function *F,
Vikram S. Advedd558992002-03-18 03:02:42 +0000131 Value* val,
Vikram S. Adve5684c4e2001-10-18 00:02:06 +0000132 Instruction* dest,
Chris Lattner697954c2002-01-20 22:54:45 +0000133 std::vector<MachineInstr*>& minstrVec,
134 std::vector<TmpInstruction*>& tmp) const;
Vikram S. Adve7f37fe52001-11-08 04:55:13 +0000135
136
Vikram S. Adve5afff3b2001-11-09 02:15:52 +0000137 // Create an instruction sequence to copy an integer value `val'
138 // to a floating point value `dest' by copying to memory and back.
139 // val must be an integral type. dest must be a Float or Double.
Vikram S. Adve7f37fe52001-11-08 04:55:13 +0000140 // The generated instructions are returned in `minstrVec'.
141 // Any temp. registers (TmpInstruction) created are returned in `tempVec'.
142 //
Chris Lattnerf57b8452002-04-27 06:56:12 +0000143 virtual void CreateCodeToCopyIntToFloat(Function* F,
Vikram S. Adve7f37fe52001-11-08 04:55:13 +0000144 Value* val,
145 Instruction* dest,
Chris Lattner697954c2002-01-20 22:54:45 +0000146 std::vector<MachineInstr*>& minstr,
147 std::vector<TmpInstruction*>& temp,
Vikram S. Adve7f37fe52001-11-08 04:55:13 +0000148 TargetMachine& target) const;
Vikram S. Adve5afff3b2001-11-09 02:15:52 +0000149
150 // Similarly, create an instruction sequence to copy an FP value
151 // `val' to an integer value `dest' by copying to memory and back.
152 // See the previous function for information about return values.
153 //
Chris Lattnerf57b8452002-04-27 06:56:12 +0000154 virtual void CreateCodeToCopyFloatToInt(Function* F,
Vikram S. Adve5afff3b2001-11-09 02:15:52 +0000155 Value* val,
156 Instruction* dest,
Chris Lattner697954c2002-01-20 22:54:45 +0000157 std::vector<MachineInstr*>& minstr,
158 std::vector<TmpInstruction*>& temp,
Vikram S. Adve5afff3b2001-11-09 02:15:52 +0000159 TargetMachine& target) const;
Ruchira Sasanka67a463a2001-11-12 14:45:33 +0000160
161 // create copy instruction(s)
Vikram S. Advedd558992002-03-18 03:02:42 +0000162 virtual void CreateCopyInstructionsByType(const TargetMachine& target,
Chris Lattnerf57b8452002-04-27 06:56:12 +0000163 Function* F,
Vikram S. Advedd558992002-03-18 03:02:42 +0000164 Value* src,
165 Instruction* dest,
166 std::vector<MachineInstr*>& minstr) const;
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000167};
168
Ruchira Sasankae38bd5332001-09-15 00:30:44 +0000169
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000170//----------------------------------------------------------------------------
171// class UltraSparcRegInfo
172//
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000173// This class implements the virtual class MachineRegInfo for Sparc.
174//
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000175//----------------------------------------------------------------------------
176
Chris Lattner699683c2002-02-04 05:59:25 +0000177class UltraSparcRegInfo : public MachineRegInfo {
Ruchira Sasankaab304c42001-09-30 23:19:57 +0000178 // The actual register classes in the Sparc
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000179 //
Ruchira Sasankae38bd5332001-09-15 00:30:44 +0000180 enum RegClassIDs {
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000181 IntRegClassID, // Integer
182 FloatRegClassID, // Float (both single/double)
183 IntCCRegClassID, // Int Condition Code
184 FloatCCRegClassID // Float Condition code
Ruchira Sasankae38bd5332001-09-15 00:30:44 +0000185 };
186
Ruchira Sasankaab304c42001-09-30 23:19:57 +0000187
188 // Type of registers available in Sparc. There can be several reg types
189 // in the same class. For instace, the float reg class has Single/Double
190 // types
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000191 //
Ruchira Sasankaab304c42001-09-30 23:19:57 +0000192 enum RegTypes {
193 IntRegType,
194 FPSingleRegType,
195 FPDoubleRegType,
196 IntCCRegType,
197 FloatCCRegType
198 };
199
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000200 // **** WARNING: If the above enum order is changed, also modify
Ruchira Sasankae38bd5332001-09-15 00:30:44 +0000201 // getRegisterClassOfValue method below since it assumes this particular
202 // order for efficiency.
203
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000204
205 // reverse pointer to get info about the ultra sparc machine
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000206 //
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000207 const UltraSparc *const UltraSparcInfo;
208
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000209 // Number of registers used for passing int args (usually 6: %o0 - %o5)
210 //
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000211 unsigned const NumOfIntArgRegs;
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000212
213 // Number of registers used for passing float args (usually 32: %f0 - %f31)
214 //
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000215 unsigned const NumOfFloatArgRegs;
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000216
217 // An out of bound register number that can be used to initialize register
218 // numbers. Useful for error detection.
219 //
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000220 int const InvalidRegNum;
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000221
222
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000223 // ======================== Private Methods =============================
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000224
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000225 // The following methods are used to color special live ranges (e.g.
Chris Lattnerf57b8452002-04-27 06:56:12 +0000226 // function args and return values etc.) with specific hardware registers
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000227 // as required. See SparcRegInfo.cpp for the implementation.
228 //
Chris Lattner699683c2002-02-04 05:59:25 +0000229 void setCallOrRetArgCol(LiveRange *LR, unsigned RegNo,
230 const MachineInstr *MI,
231 std::hash_map<const MachineInstr *,
232 AddedInstrns *> &AIMap) const;
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000233
Chris Lattner699683c2002-02-04 05:59:25 +0000234 MachineInstr *getCopy2RegMI(const Value *SrcVal, unsigned Reg,
235 unsigned RegClassID) const;
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000236
Chris Lattner699683c2002-02-04 05:59:25 +0000237 void suggestReg4RetAddr(const MachineInstr *RetMI,
238 LiveRangeInfo &LRI) const;
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000239
Chris Lattner699683c2002-02-04 05:59:25 +0000240 void suggestReg4CallAddr(const MachineInstr *CallMI, LiveRangeInfo &LRI,
Chris Lattner697954c2002-01-20 22:54:45 +0000241 std::vector<RegClass *> RCList) const;
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000242
243
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000244
245 // The following methods are used to find the addresses etc. contained
246 // in specail machine instructions like CALL/RET
247 //
Chris Lattner699683c2002-02-04 05:59:25 +0000248 Value *getValue4ReturnAddr(const MachineInstr *MInst) const;
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000249 const Value *getCallInstRetAddr(const MachineInstr *CallMI) const;
Chris Lattner699683c2002-02-04 05:59:25 +0000250 unsigned getCallInstNumArgs(const MachineInstr *CallMI) const;
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000251
252
Chris Lattnerf57b8452002-04-27 06:56:12 +0000253 // The following 3 methods are used to find the RegType (see enum above)
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000254 // of a LiveRange, Value and using the unified RegClassID
Chris Lattner699683c2002-02-04 05:59:25 +0000255 int getRegType(const LiveRange *LR) const;
256 int getRegType(const Value *Val) const;
257 int getRegType(int reg) const;
Ruchira Sasankaab304c42001-09-30 23:19:57 +0000258
Ruchira Sasankaab304c42001-09-30 23:19:57 +0000259
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000260 // The following methods are used to generate copy instructions to move
261 // data between condition code registers
262 //
Chris Lattner699683c2002-02-04 05:59:25 +0000263 MachineInstr *cpCCR2IntMI(unsigned IntReg) const;
264 MachineInstr *cpInt2CCRMI(unsigned IntReg) const;
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +0000265
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000266 // Used to generate a copy instruction based on the register class of
267 // value.
268 //
Chris Lattner699683c2002-02-04 05:59:25 +0000269 MachineInstr *cpValue2RegMI(Value *Val, unsigned DestReg,
270 int RegType) const;
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +0000271
272
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000273 // The following 2 methods are used to order the instructions addeed by
Chris Lattnerf57b8452002-04-27 06:56:12 +0000274 // the register allocator in association with function calling. See
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000275 // SparcRegInfo.cpp for more details
276 //
Chris Lattner697954c2002-01-20 22:54:45 +0000277 void moveInst2OrdVec(std::vector<MachineInstr *> &OrdVec,
278 MachineInstr *UnordInst,
279 PhyRegAlloc &PRA) const;
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +0000280
Chris Lattner697954c2002-01-20 22:54:45 +0000281 void OrderAddedInstrns(std::vector<MachineInstr *> &UnordVec,
282 std::vector<MachineInstr *> &OrdVec,
283 PhyRegAlloc &PRA) const;
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +0000284
285
Vikram S. Adve6d783112002-04-25 04:40:24 +0000286 // Compute which register can be used for an argument, if any
287 //
288 int regNumForIntArg(bool inCallee, bool isVarArgsCall,
289 unsigned argNo, unsigned intArgNo, unsigned fpArgNo,
290 unsigned& regClassId) const;
Ruchira Sasankaae4bcd72001-11-10 21:20:43 +0000291
Vikram S. Adve6d783112002-04-25 04:40:24 +0000292 int regNumForFPArg(unsigned RegType, bool inCallee, bool isVarArgsCall,
293 unsigned argNo, unsigned intArgNo, unsigned fpArgNo,
294 unsigned& regClassId) const;
295
Chris Lattner699683c2002-02-04 05:59:25 +0000296public:
297 UltraSparcRegInfo(const UltraSparc &tgt);
Ruchira Sasankae38bd5332001-09-15 00:30:44 +0000298
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000299 // To get complete machine information structure using the machine register
300 // information
301 //
Chris Lattner699683c2002-02-04 05:59:25 +0000302 inline const UltraSparc &getUltraSparcInfo() const {
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000303 return *UltraSparcInfo;
304 }
305
Vikram S. Advedd558992002-03-18 03:02:42 +0000306 // To find the register class used for a specified Type
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000307 //
Vikram S. Advedd558992002-03-18 03:02:42 +0000308 inline unsigned getRegClassIDOfType(const Type *type,
309 bool isCCReg = false) const {
310 Type::PrimitiveID ty = type->getPrimitiveID();
Ruchira Sasankae38bd5332001-09-15 00:30:44 +0000311 unsigned res;
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000312
Chris Lattnerc9aa7df2002-03-29 03:51:11 +0000313 // FIXME: Comparing types like this isn't very safe...
Chris Lattner699683c2002-02-04 05:59:25 +0000314 if ((ty && ty <= Type::LongTyID) || (ty == Type::LabelTyID) ||
Chris Lattnerc9aa7df2002-03-29 03:51:11 +0000315 (ty == Type::FunctionTyID) || (ty == Type::PointerTyID) )
Chris Lattner699683c2002-02-04 05:59:25 +0000316 res = IntRegClassID; // sparc int reg (ty=0: void)
317 else if (ty <= Type::DoubleTyID)
Ruchira Sasankae38bd5332001-09-15 00:30:44 +0000318 res = FloatRegClassID; // sparc float reg class
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000319 else {
Chris Lattner49b8a9c2002-02-24 23:02:40 +0000320 //std::cerr << "TypeID: " << ty << "\n";
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000321 assert(0 && "Cannot resolve register class for type");
Chris Lattner8e5c0b42001-11-07 14:01:59 +0000322 return 0;
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000323 }
Ruchira Sasankae38bd5332001-09-15 00:30:44 +0000324
325 if(isCCReg)
326 return res + 2; // corresponidng condition code regiser
Ruchira Sasankae38bd5332001-09-15 00:30:44 +0000327 else
328 return res;
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000329 }
Ruchira Sasankae38bd5332001-09-15 00:30:44 +0000330
Vikram S. Advedd558992002-03-18 03:02:42 +0000331 // To find the register class of a Value
332 //
333 inline unsigned getRegClassIDOfValue(const Value *Val,
334 bool isCCReg = false) const {
335 return getRegClassIDOfType(Val->getType(), isCCReg);
336 }
337
338
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000339
Chris Lattner699683c2002-02-04 05:59:25 +0000340 // getZeroRegNum - returns the register that contains always zero this is the
341 // unified register number
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000342 //
Chris Lattner699683c2002-02-04 05:59:25 +0000343 virtual int getZeroRegNum() const;
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000344
Chris Lattner699683c2002-02-04 05:59:25 +0000345 // getCallAddressReg - returns the reg used for pushing the address when a
Chris Lattnerf57b8452002-04-27 06:56:12 +0000346 // function is called. This can be used for other purposes between calls
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000347 //
Chris Lattner699683c2002-02-04 05:59:25 +0000348 unsigned getCallAddressReg() const;
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000349
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000350 // Returns the register containing the return address.
351 // It should be made sure that this register contains the return
352 // value when a return instruction is reached.
353 //
Chris Lattner699683c2002-02-04 05:59:25 +0000354 unsigned getReturnAddressReg() const;
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000355
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000356
357
358 // The following methods are used to color special live ranges (e.g.
Chris Lattnerf57b8452002-04-27 06:56:12 +0000359 // function args and return values etc.) with specific hardware registers
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000360 // as required. See SparcRegInfo.cpp for the implementation for Sparc.
361 //
Chris Lattnerb7653df2002-04-08 22:03:57 +0000362 void suggestRegs4MethodArgs(const Function *Meth,
Ruchira Sasankaab304c42001-09-30 23:19:57 +0000363 LiveRangeInfo& LRI) const;
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000364
Chris Lattner699683c2002-02-04 05:59:25 +0000365 void suggestRegs4CallArgs(const MachineInstr *CallMI,
Chris Lattner697954c2002-01-20 22:54:45 +0000366 LiveRangeInfo& LRI,
367 std::vector<RegClass *> RCL) const;
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000368
Chris Lattner699683c2002-02-04 05:59:25 +0000369 void suggestReg4RetValue(const MachineInstr *RetMI,
Chris Lattner697954c2002-01-20 22:54:45 +0000370 LiveRangeInfo& LRI) const;
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000371
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000372
Chris Lattnerb7653df2002-04-08 22:03:57 +0000373 void colorMethodArgs(const Function *Meth, LiveRangeInfo &LRI,
Chris Lattner699683c2002-02-04 05:59:25 +0000374 AddedInstrns *FirstAI) const;
Ruchira Sasankaab304c42001-09-30 23:19:57 +0000375
Chris Lattner699683c2002-02-04 05:59:25 +0000376 void colorCallArgs(const MachineInstr *CallMI, LiveRangeInfo &LRI,
377 AddedInstrns *CallAI, PhyRegAlloc &PRA,
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000378 const BasicBlock *BB) const;
Ruchira Sasankaab304c42001-09-30 23:19:57 +0000379
Chris Lattner699683c2002-02-04 05:59:25 +0000380 void colorRetValue(const MachineInstr *RetI, LiveRangeInfo& LRI,
381 AddedInstrns *RetAI) const;
Ruchira Sasankaab304c42001-09-30 23:19:57 +0000382
383
Ruchira Sasankaab304c42001-09-30 23:19:57 +0000384
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000385 // method used for printing a register for debugging purposes
386 //
Chris Lattner699683c2002-02-04 05:59:25 +0000387 static void printReg(const LiveRange *LR);
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000388
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000389 // this method provides a unique number for each register
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000390 //
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000391 inline int getUnifiedRegNum(int RegClassID, int reg) const {
392
393 if( RegClassID == IntRegClassID && reg < 32 )
394 return reg;
395 else if ( RegClassID == FloatRegClassID && reg < 64)
396 return reg + 32; // we have 32 int regs
Ruchira Sasankae38bd5332001-09-15 00:30:44 +0000397 else if( RegClassID == FloatCCRegClassID && reg < 4)
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000398 return reg + 32 + 64; // 32 int, 64 float
Ruchira Sasankae38bd5332001-09-15 00:30:44 +0000399 else if( RegClassID == IntCCRegClassID )
Vikram S. Advedd558992002-03-18 03:02:42 +0000400 return reg + 4+ 32 + 64; // only int cc reg
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000401 else if (reg==InvalidRegNum)
402 return InvalidRegNum;
Ruchira Sasankae38bd5332001-09-15 00:30:44 +0000403 else
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000404 assert(0 && "Invalid register class or reg number");
Chris Lattner6dad5062001-11-07 13:49:12 +0000405 return 0;
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000406 }
407
408 // given the unified register number, this gives the name
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000409 // for generating assembly code or debugging.
410 //
Chris Lattner699683c2002-02-04 05:59:25 +0000411 virtual const std::string getUnifiedRegName(int reg) const;
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000412
413
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000414 // returns the # of bytes of stack space allocated for each register
415 // type. For Sparc, currently we allocate 8 bytes on stack for all
416 // register types. We can optimize this later if necessary to save stack
417 // space (However, should make sure that stack alignment is correct)
418 //
Chris Lattner699683c2002-02-04 05:59:25 +0000419 inline int getSpilledRegSize(int RegType) const {
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000420 return 8;
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000421 }
422
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000423
Vikram S. Advea44c6c02002-03-31 19:04:50 +0000424 // To obtain the return value and the indirect call address (if any)
425 // contained in a CALL machine instruction
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000426 //
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000427 const Value * getCallInstRetVal(const MachineInstr *CallMI) const;
Vikram S. Advea44c6c02002-03-31 19:04:50 +0000428 const Value * getCallInstIndirectAddrVal(const MachineInstr *CallMI) const;
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000429
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000430
431 // The following methods are used to generate "copy" machine instructions
432 // for an architecture.
433 //
Chris Lattner699683c2002-02-04 05:59:25 +0000434 MachineInstr * cpReg2RegMI(unsigned SrcReg, unsigned DestReg,
435 int RegType) const;
Vikram S. Adve6d783112002-04-25 04:40:24 +0000436
Chris Lattner699683c2002-02-04 05:59:25 +0000437 MachineInstr * cpReg2MemMI(unsigned SrcReg, unsigned DestPtrReg,
438 int Offset, int RegType) const;
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000439
Chris Lattner699683c2002-02-04 05:59:25 +0000440 MachineInstr * cpMem2RegMI(unsigned SrcPtrReg, int Offset,
441 unsigned DestReg, int RegType) const;
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000442
Ruchira Sasankaef1b0cb2001-11-03 17:13:27 +0000443 MachineInstr* cpValue2Value(Value *Src, Value *Dest) const;
444
445
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000446 // To see whether a register is a volatile (i.e., whehter it must be
447 // preserved acorss calls)
448 //
Chris Lattner699683c2002-02-04 05:59:25 +0000449 inline bool isRegVolatile(int RegClassID, int Reg) const {
450 return MachineRegClassArr[RegClassID]->isRegVolatile(Reg);
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000451 }
452
453
Chris Lattner699683c2002-02-04 05:59:25 +0000454 virtual unsigned getFramePointer() const;
455 virtual unsigned getStackPointer() const;
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000456
Chris Lattner699683c2002-02-04 05:59:25 +0000457 virtual int getInvalidRegNum() const {
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000458 return InvalidRegNum;
459 }
460
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000461 // This method inserts the caller saving code for call instructions
462 //
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000463 void insertCallerSavingCode(const MachineInstr *MInst,
464 const BasicBlock *BB, PhyRegAlloc &PRA ) const;
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000465};
466
467
468
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000469
470//---------------------------------------------------------------------------
471// class UltraSparcSchedInfo
472//
473// Purpose:
474// Interface to instruction scheduling information for UltraSPARC.
475// The parameter values above are based on UltraSPARC IIi.
476//---------------------------------------------------------------------------
477
478
479class UltraSparcSchedInfo: public MachineSchedInfo {
480public:
Chris Lattner699683c2002-02-04 05:59:25 +0000481 UltraSparcSchedInfo(const TargetMachine &tgt);
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000482protected:
Chris Lattner699683c2002-02-04 05:59:25 +0000483 virtual void initializeResources();
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000484};
485
Chris Lattnerf6e0e282001-09-14 04:32:55 +0000486
487//---------------------------------------------------------------------------
Vikram S. Advec1521632001-10-22 13:31:53 +0000488// class UltraSparcFrameInfo
489//
490// Purpose:
491// Interface to stack frame layout info for the UltraSPARC.
Vikram S. Adve00521d72001-11-12 23:26:35 +0000492// Starting offsets for each area of the stack frame are aligned at
493// a multiple of getStackFrameSizeAlignment().
Vikram S. Advec1521632001-10-22 13:31:53 +0000494//---------------------------------------------------------------------------
495
Vikram S. Adve7f37fe52001-11-08 04:55:13 +0000496class UltraSparcFrameInfo: public MachineFrameInfo {
Vikram S. Advec1521632001-10-22 13:31:53 +0000497public:
Chris Lattner699683c2002-02-04 05:59:25 +0000498 UltraSparcFrameInfo(const TargetMachine &tgt) : MachineFrameInfo(tgt) {}
Vikram S. Adve7f37fe52001-11-08 04:55:13 +0000499
500public:
Chris Lattnerf57b8452002-04-27 06:56:12 +0000501 int getStackFrameSizeAlignment() const { return StackFrameSizeAlignment;}
502 int getMinStackFrameSize() const { return MinStackFrameSize; }
503 int getNumFixedOutgoingArgs() const { return NumFixedOutgoingArgs; }
504 int getSizeOfEachArgOnStack() const { return SizeOfEachArgOnStack; }
505 bool argsOnStackHaveFixedSize() const { return true; }
Vikram S. Adve7f37fe52001-11-08 04:55:13 +0000506
507 //
508 // These methods compute offsets using the frame contents for a
Chris Lattnerf57b8452002-04-27 06:56:12 +0000509 // particular function. The frame contents are obtained from the
510 // MachineCodeInfoForMethod object for the given function.
Vikram S. Adve7f37fe52001-11-08 04:55:13 +0000511 //
512 int getFirstIncomingArgOffset (MachineCodeForMethod& mcInfo,
Vikram S. Adve6d783112002-04-25 04:40:24 +0000513 bool& growUp) const
Vikram S. Adve7f37fe52001-11-08 04:55:13 +0000514 {
Vikram S. Adve6d783112002-04-25 04:40:24 +0000515 growUp = true; // arguments area grows upwards
Vikram S. Adve7f37fe52001-11-08 04:55:13 +0000516 return FirstIncomingArgOffsetFromFP;
517 }
518 int getFirstOutgoingArgOffset (MachineCodeForMethod& mcInfo,
Vikram S. Adve6d783112002-04-25 04:40:24 +0000519 bool& growUp) const
Vikram S. Adve7f37fe52001-11-08 04:55:13 +0000520 {
Vikram S. Adve6d783112002-04-25 04:40:24 +0000521 growUp = true; // arguments area grows upwards
Vikram S. Adve7f37fe52001-11-08 04:55:13 +0000522 return FirstOutgoingArgOffsetFromSP;
523 }
524 int getFirstOptionalOutgoingArgOffset(MachineCodeForMethod& mcInfo,
Vikram S. Adve6d783112002-04-25 04:40:24 +0000525 bool& growUp)const
Vikram S. Adve7f37fe52001-11-08 04:55:13 +0000526 {
Vikram S. Adve6d783112002-04-25 04:40:24 +0000527 growUp = true; // arguments area grows upwards
Vikram S. Adve7f37fe52001-11-08 04:55:13 +0000528 return FirstOptionalOutgoingArgOffsetFromSP;
529 }
530
531 int getFirstAutomaticVarOffset (MachineCodeForMethod& mcInfo,
Vikram S. Adve6d783112002-04-25 04:40:24 +0000532 bool& growUp) const;
Vikram S. Adve7f37fe52001-11-08 04:55:13 +0000533 int getRegSpillAreaOffset (MachineCodeForMethod& mcInfo,
Vikram S. Adve6d783112002-04-25 04:40:24 +0000534 bool& growUp) const;
Vikram S. Adve7f37fe52001-11-08 04:55:13 +0000535 int getTmpAreaOffset (MachineCodeForMethod& mcInfo,
Vikram S. Adve6d783112002-04-25 04:40:24 +0000536 bool& growUp) const;
Vikram S. Adve7f37fe52001-11-08 04:55:13 +0000537 int getDynamicAreaOffset (MachineCodeForMethod& mcInfo,
Vikram S. Adve6d783112002-04-25 04:40:24 +0000538 bool& growUp) const;
Vikram S. Adve7f37fe52001-11-08 04:55:13 +0000539
540 //
541 // These methods specify the base register used for each stack area
542 // (generally FP or SP)
543 //
544 virtual int getIncomingArgBaseRegNum() const {
545 return (int) target.getRegInfo().getFramePointer();
546 }
547 virtual int getOutgoingArgBaseRegNum() const {
548 return (int) target.getRegInfo().getStackPointer();
549 }
550 virtual int getOptionalOutgoingArgBaseRegNum() const {
551 return (int) target.getRegInfo().getStackPointer();
552 }
553 virtual int getAutomaticVarBaseRegNum() const {
554 return (int) target.getRegInfo().getFramePointer();
555 }
556 virtual int getRegSpillAreaBaseRegNum() const {
557 return (int) target.getRegInfo().getFramePointer();
558 }
559 virtual int getDynamicAreaBaseRegNum() const {
560 return (int) target.getRegInfo().getStackPointer();
561 }
562
563private:
Vikram S. Adve5afff3b2001-11-09 02:15:52 +0000564 // All stack addresses must be offset by 0x7ff (2047) on Sparc V9.
565 static const int OFFSET = (int) 0x7ff;
Vikram S. Adve7f37fe52001-11-08 04:55:13 +0000566 static const int StackFrameSizeAlignment = 16;
Vikram S. Advec1521632001-10-22 13:31:53 +0000567 static const int MinStackFrameSize = 176;
Vikram S. Adve7f37fe52001-11-08 04:55:13 +0000568 static const int NumFixedOutgoingArgs = 6;
569 static const int SizeOfEachArgOnStack = 8;
Ruchira Sasanka67a463a2001-11-12 14:45:33 +0000570 static const int StaticAreaOffsetFromFP = 0 + OFFSET;
Vikram S. Adve5afff3b2001-11-09 02:15:52 +0000571 static const int FirstIncomingArgOffsetFromFP = 128 + OFFSET;
572 static const int FirstOptionalIncomingArgOffsetFromFP = 176 + OFFSET;
573 static const int FirstOutgoingArgOffsetFromSP = 128 + OFFSET;
574 static const int FirstOptionalOutgoingArgOffsetFromSP = 176 + OFFSET;
Vikram S. Advec1521632001-10-22 13:31:53 +0000575};
576
577
Vikram S. Adve5afff3b2001-11-09 02:15:52 +0000578//---------------------------------------------------------------------------
579// class UltraSparcCacheInfo
580//
581// Purpose:
582// Interface to cache parameters for the UltraSPARC.
583// Just use defaults for now.
584//---------------------------------------------------------------------------
585
586class UltraSparcCacheInfo: public MachineCacheInfo {
587public:
Chris Lattner7327d7e2002-02-04 00:04:35 +0000588 UltraSparcCacheInfo(const TargetMachine &T) : MachineCacheInfo(T) {}
Vikram S. Adve5afff3b2001-11-09 02:15:52 +0000589};
590
Vikram S. Advec1521632001-10-22 13:31:53 +0000591
592//---------------------------------------------------------------------------
Chris Lattnerf6e0e282001-09-14 04:32:55 +0000593// class UltraSparcMachine
594//
595// Purpose:
596// Primary interface to machine description for the UltraSPARC.
597// Primarily just initializes machine-dependent parameters in
598// class TargetMachine, and creates machine-dependent subclasses
Vikram S. Adve339084b2001-09-18 13:04:24 +0000599// for classes such as InstrInfo, SchedInfo and RegInfo.
Chris Lattnerf6e0e282001-09-14 04:32:55 +0000600//---------------------------------------------------------------------------
601
602class UltraSparc : public TargetMachine {
Vikram S. Adve339084b2001-09-18 13:04:24 +0000603private:
604 UltraSparcInstrInfo instrInfo;
605 UltraSparcSchedInfo schedInfo;
606 UltraSparcRegInfo regInfo;
Vikram S. Advec1521632001-10-22 13:31:53 +0000607 UltraSparcFrameInfo frameInfo;
Vikram S. Adve5afff3b2001-11-09 02:15:52 +0000608 UltraSparcCacheInfo cacheInfo;
Chris Lattnerf6e0e282001-09-14 04:32:55 +0000609public:
610 UltraSparc();
Vikram S. Adve339084b2001-09-18 13:04:24 +0000611
Chris Lattner32f600a2001-09-19 13:47:12 +0000612 virtual const MachineInstrInfo &getInstrInfo() const { return instrInfo; }
613 virtual const MachineSchedInfo &getSchedInfo() const { return schedInfo; }
614 virtual const MachineRegInfo &getRegInfo() const { return regInfo; }
Vikram S. Adve7f37fe52001-11-08 04:55:13 +0000615 virtual const MachineFrameInfo &getFrameInfo() const { return frameInfo; }
Vikram S. Adve5afff3b2001-11-09 02:15:52 +0000616 virtual const MachineCacheInfo &getCacheInfo() const { return cacheInfo; }
Chris Lattner32f600a2001-09-19 13:47:12 +0000617
618 //
Chris Lattner4387e312002-02-03 23:42:19 +0000619 // addPassesToEmitAssembly - Add passes to the specified pass manager to get
620 // assembly langage code emited. For sparc, we have to do ...
Chris Lattner32f600a2001-09-19 13:47:12 +0000621 //
Chris Lattner4387e312002-02-03 23:42:19 +0000622 virtual void addPassesToEmitAssembly(PassManager &PM, std::ostream &Out);
Chris Lattnerf6e0e282001-09-14 04:32:55 +0000623
Chris Lattner4387e312002-02-03 23:42:19 +0000624private:
Chris Lattnerf57b8452002-04-27 06:56:12 +0000625 Pass *getFunctionAsmPrinterPass(PassManager &PM, std::ostream &Out);
Chris Lattner4387e312002-02-03 23:42:19 +0000626 Pass *getModuleAsmPrinterPass(PassManager &PM, std::ostream &Out);
Chris Lattner9530a6f2002-02-11 22:35:46 +0000627 Pass *getEmitBytecodeToAsmPass(std::ostream &Out);
Chris Lattner6edfcc52002-02-03 07:51:17 +0000628};
Chris Lattnerf6e0e282001-09-14 04:32:55 +0000629
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000630#endif