blob: e43b0f3867fdf31b393d87347417ccc9b92489f4 [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"
John Criswell7a73b802003-06-30 21:59:07 +000020#include "Config/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 Lattner9aa697b2002-04-09 05:16:36 +000024class Pass;
Chris Lattner4387e312002-02-03 23:42:19 +000025
Chris Lattnerc6495ee2001-09-14 03:56:45 +000026enum SparcInstrSchedClass {
27 SPARC_NONE, /* Instructions with no scheduling restrictions */
28 SPARC_IEUN, /* Integer class that can use IEU0 or IEU1 */
29 SPARC_IEU0, /* Integer class IEU0 */
30 SPARC_IEU1, /* Integer class IEU1 */
31 SPARC_FPM, /* FP Multiply or Divide instructions */
32 SPARC_FPA, /* All other FP instructions */
33 SPARC_CTI, /* Control-transfer instructions */
34 SPARC_LD, /* Load instructions */
35 SPARC_ST, /* Store instructions */
36 SPARC_SINGLE, /* Instructions that must issue by themselves */
37
38 SPARC_INV, /* This should stay at the end for the next value */
39 SPARC_NUM_SCHED_CLASSES = SPARC_INV
40};
41
Chris Lattnerc6495ee2001-09-14 03:56:45 +000042
43//---------------------------------------------------------------------------
44// enum SparcMachineOpCode.
Chris Lattner3501fea2003-01-14 22:00:31 +000045// const TargetInstrDescriptor SparcMachineInstrDesc[]
Chris Lattnerc6495ee2001-09-14 03:56:45 +000046//
47// Purpose:
48// Description of UltraSparc machine instructions.
49//
50//---------------------------------------------------------------------------
51
Misha Brukmana98cd452003-05-20 20:32:24 +000052namespace V9 {
53 enum SparcMachineOpCode {
Chris Lattner9a3d63b2001-09-19 15:56:23 +000054#define I(ENUM, OPCODESTRING, NUMOPERANDS, RESULTPOS, MAXIMM, IMMSE, \
55 NUMDELAYSLOTS, LATENCY, SCHEDCLASS, INSTFLAGS) \
56 ENUM,
57#include "SparcInstr.def"
Chris Lattnerc6495ee2001-09-14 03:56:45 +000058
Misha Brukmana98cd452003-05-20 20:32:24 +000059 // End-of-array marker
60 INVALID_OPCODE,
61 NUM_REAL_OPCODES = PHI, // number of valid opcodes
62 NUM_TOTAL_OPCODES = INVALID_OPCODE
63 };
64}
Chris Lattnerc6495ee2001-09-14 03:56:45 +000065
Chris Lattnerc6495ee2001-09-14 03:56:45 +000066
Chris Lattner9a3d63b2001-09-19 15:56:23 +000067// Array of machine instruction descriptions...
Chris Lattner3501fea2003-01-14 22:00:31 +000068extern const TargetInstrDescriptor SparcMachineInstrDesc[];
Chris Lattnerc6495ee2001-09-14 03:56:45 +000069
70
71//---------------------------------------------------------------------------
72// class UltraSparcInstrInfo
73//
74// Purpose:
75// Information about individual instructions.
76// Most information is stored in the SparcMachineInstrDesc array above.
77// Other information is computed on demand, and most such functions
Chris Lattner3501fea2003-01-14 22:00:31 +000078// default to member functions in base class TargetInstrInfo.
Chris Lattnerc6495ee2001-09-14 03:56:45 +000079//---------------------------------------------------------------------------
80
Chris Lattner3501fea2003-01-14 22:00:31 +000081struct UltraSparcInstrInfo : public TargetInstrInfo {
Chris Lattner047bbaf2002-10-29 15:45:20 +000082 UltraSparcInstrInfo();
Vikram S. Adve4c5fe2d2001-11-14 18:48:36 +000083
84 //
Vikram S. Advedd558992002-03-18 03:02:42 +000085 // All immediate constants are in position 1 except the
Vikram S. Advee1f72802002-09-16 15:39:26 +000086 // store instructions and SETxx.
Vikram S. Adve4c5fe2d2001-11-14 18:48:36 +000087 //
Vikram S. Advedd558992002-03-18 03:02:42 +000088 virtual int getImmedConstantPos(MachineOpCode opCode) const {
Vikram S. Adve4c5fe2d2001-11-14 18:48:36 +000089 bool ignore;
Misha Brukmana98cd452003-05-20 20:32:24 +000090 if (this->maxImmedConstant(opCode, ignore) != 0) {
91 // 1st store opcode
Misha Brukman3c4cf152003-05-27 22:44:44 +000092 assert(! this->isStore((MachineOpCode) V9::STBr - 1));
Misha Brukmana98cd452003-05-20 20:32:24 +000093 // last store opcode
Misha Brukman3c4cf152003-05-27 22:44:44 +000094 assert(! this->isStore((MachineOpCode) V9::STXFSRi + 1));
Misha Brukmana98cd452003-05-20 20:32:24 +000095
96 if (opCode == V9::SETSW || opCode == V9::SETUW ||
97 opCode == V9::SETX || opCode == V9::SETHI)
98 return 0;
Misha Brukman3c4cf152003-05-27 22:44:44 +000099 if (opCode >= V9::STBr && opCode <= V9::STXFSRi)
Misha Brukmana98cd452003-05-20 20:32:24 +0000100 return 2;
101 return 1;
102 }
Vikram S. Adve4c5fe2d2001-11-14 18:48:36 +0000103 else
104 return -1;
105 }
Misha Brukmane9d88382003-05-24 00:09:50 +0000106
107 /// createNOPinstr - returns the target's implementation of NOP, which is
108 /// usually a pseudo-instruction, implemented by a degenerate version of
Misha Brukman79caf1f2003-05-27 22:01:10 +0000109 /// another instruction, e.g. X86: xchg ax, ax; SparcV9: sethi 0, g0
Misha Brukmane9d88382003-05-24 00:09:50 +0000110 ///
111 MachineInstr* createNOPinstr() const {
Misha Brukman79caf1f2003-05-27 22:01:10 +0000112 return BuildMI(V9::SETHI, 2).addZImm(0).addReg(SparcIntRegClass::g0);
Misha Brukmane9d88382003-05-24 00:09:50 +0000113 }
114
Misha Brukman12745c52003-05-24 01:08:43 +0000115 /// isNOPinstr - not having a special NOP opcode, we need to know if a given
116 /// instruction is interpreted as an `official' NOP instr, i.e., there may be
117 /// more than one way to `do nothing' but only one canonical way to slack off.
Misha Brukmane9d88382003-05-24 00:09:50 +0000118 ///
119 bool isNOPinstr(const MachineInstr &MI) const {
120 // Make sure the instruction is EXACTLY `sethi g0, 0'
121 if (MI.getOpcode() == V9::SETHI && MI.getNumOperands() == 2) {
122 const MachineOperand &op0 = MI.getOperand(0), &op1 = MI.getOperand(1);
Misha Brukman79caf1f2003-05-27 22:01:10 +0000123 if (op0.isImmediate() && op0.getImmedValue() == 0 &&
124 op1.isMachineRegister() &&
125 op1.getMachineRegNum() == SparcIntRegClass::g0)
Misha Brukmane9d88382003-05-24 00:09:50 +0000126 {
127 return true;
128 }
129 }
130 return false;
131 }
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000132
Misha Brukmana98cd452003-05-20 20:32:24 +0000133 virtual bool hasResultInterlock(MachineOpCode opCode) const
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000134 {
135 // All UltraSPARC instructions have interlocks (note that delay slots
136 // are not considered here).
137 // However, instructions that use the result of an FCMP produce a
138 // 9-cycle stall if they are issued less than 3 cycles after the FCMP.
139 // Force the compiler to insert a software interlock (i.e., gap of
140 // 2 other groups, including NOPs if necessary).
Misha Brukmana98cd452003-05-20 20:32:24 +0000141 return (opCode == V9::FCMPS || opCode == V9::FCMPD || opCode == V9::FCMPQ);
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000142 }
143
Vikram S. Adve5684c4e2001-10-18 00:02:06 +0000144 //-------------------------------------------------------------------------
Vikram S. Advee1f72802002-09-16 15:39:26 +0000145 // Queries about representation of LLVM quantities (e.g., constants)
146 //-------------------------------------------------------------------------
147
148 virtual bool ConstantMayNotFitInImmedField(const Constant* CV,
149 const Instruction* I) const;
150
151 //-------------------------------------------------------------------------
Vikram S. Adve5684c4e2001-10-18 00:02:06 +0000152 // Code generation support for creating individual machine instructions
153 //-------------------------------------------------------------------------
Vikram S. Adved55697c2002-09-20 00:52:09 +0000154
155 // Get certain common op codes for the current target. This and all the
156 // Create* methods below should be moved to a machine code generation class
157 //
Misha Brukmana98cd452003-05-20 20:32:24 +0000158 virtual MachineOpCode getNOPOpCode() const { return V9::NOP; }
Vikram S. Adved55697c2002-09-20 00:52:09 +0000159
Vikram S. Adveada280f2003-07-29 19:54:41 +0000160 // Get the value of an integral constant in the form that must
161 // be put into the machine register. The specified constant is interpreted
162 // as (i.e., converted if necessary to) the specified destination type. The
163 // result is always returned as an uint64_t, since the representation of
164 // int64_t and uint64_t are identical. The argument can be any known const.
165 //
166 // isValidConstant is set to true if a valid constant was found.
167 //
168 virtual uint64_t ConvertConstantToIntType(const TargetMachine &target,
169 const Value *V,
170 const Type *destType,
171 bool &isValidConstant) const;
172
Vikram S. Adve5684c4e2001-10-18 00:02:06 +0000173 // Create an instruction sequence to put the constant `val' into
Vikram S. Adve242a8082002-05-19 15:25:51 +0000174 // the virtual register `dest'. `val' may be a Constant or a
175 // GlobalValue, viz., the constant address of a global variable or function.
176 // The generated instructions are returned in `mvec'.
177 // Any temp. registers (TmpInstruction) created are recorded in mcfi.
178 // Any stack space required is allocated via mcff.
Vikram S. Adve5684c4e2001-10-18 00:02:06 +0000179 //
Vikram S. Adve242a8082002-05-19 15:25:51 +0000180 virtual void CreateCodeToLoadConst(const TargetMachine& target,
181 Function* F,
Vikram S. Advedd558992002-03-18 03:02:42 +0000182 Value* val,
Vikram S. Adve5684c4e2001-10-18 00:02:06 +0000183 Instruction* dest,
Vikram S. Adve242a8082002-05-19 15:25:51 +0000184 std::vector<MachineInstr*>& mvec,
185 MachineCodeForInstruction& mcfi) const;
Vikram S. Adve7f37fe52001-11-08 04:55:13 +0000186
Vikram S. Adve5afff3b2001-11-09 02:15:52 +0000187 // Create an instruction sequence to copy an integer value `val'
188 // to a floating point value `dest' by copying to memory and back.
189 // val must be an integral type. dest must be a Float or Double.
Vikram S. Adve242a8082002-05-19 15:25:51 +0000190 // The generated instructions are returned in `mvec'.
191 // Any temp. registers (TmpInstruction) created are recorded in mcfi.
192 // Any stack space required is allocated via mcff.
Vikram S. Adve7f37fe52001-11-08 04:55:13 +0000193 //
Vikram S. Adve242a8082002-05-19 15:25:51 +0000194 virtual void CreateCodeToCopyIntToFloat(const TargetMachine& target,
195 Function* F,
196 Value* val,
197 Instruction* dest,
198 std::vector<MachineInstr*>& mvec,
199 MachineCodeForInstruction& mcfi) const;
Vikram S. Adve5afff3b2001-11-09 02:15:52 +0000200
201 // Similarly, create an instruction sequence to copy an FP value
202 // `val' to an integer value `dest' by copying to memory and back.
Vikram S. Adve242a8082002-05-19 15:25:51 +0000203 // 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.
Vikram S. Adve5afff3b2001-11-09 02:15:52 +0000206 //
Vikram S. Adve242a8082002-05-19 15:25:51 +0000207 virtual void CreateCodeToCopyFloatToInt(const TargetMachine& target,
208 Function* F,
209 Value* val,
210 Instruction* dest,
211 std::vector<MachineInstr*>& mvec,
212 MachineCodeForInstruction& mcfi) const;
213
214 // Create instruction(s) to copy src to dest, for arbitrary types
215 // The generated instructions are returned in `mvec'.
216 // Any temp. registers (TmpInstruction) created are recorded in mcfi.
217 // Any stack space required is allocated via mcff.
218 //
Vikram S. Advedd558992002-03-18 03:02:42 +0000219 virtual void CreateCopyInstructionsByType(const TargetMachine& target,
Vikram S. Adve242a8082002-05-19 15:25:51 +0000220 Function* F,
221 Value* src,
222 Instruction* dest,
223 std::vector<MachineInstr*>& mvec,
224 MachineCodeForInstruction& mcfi) const;
225
226 // Create instruction sequence to produce a sign-extended register value
227 // from an arbitrary sized value (sized in bits, not bytes).
Vikram S. Advef36f06b2002-09-05 18:34:31 +0000228 // The generated instructions are appended to `mvec'.
229 // Any temp. registers (TmpInstruction) created are recorded in mcfi.
Vikram S. Adve242a8082002-05-19 15:25:51 +0000230 // Any stack space required is allocated via mcff.
231 //
232 virtual void CreateSignExtensionInstructions(const TargetMachine& target,
233 Function* F,
Vikram S. Advef36f06b2002-09-05 18:34:31 +0000234 Value* srcVal,
Vikram S. Adve5cedede2002-09-27 14:29:45 +0000235 Value* destVal,
236 unsigned int numLowBits,
Vikram S. Advef36f06b2002-09-05 18:34:31 +0000237 std::vector<MachineInstr*>& mvec,
238 MachineCodeForInstruction& mcfi) const;
239
240 // Create instruction sequence to produce a zero-extended register value
241 // from an arbitrary sized value (sized in bits, not bytes).
242 // The generated instructions are appended to `mvec'.
243 // Any temp. registers (TmpInstruction) created are recorded in mcfi.
244 // Any stack space required is allocated via mcff.
245 //
246 virtual void CreateZeroExtensionInstructions(const TargetMachine& target,
247 Function* F,
248 Value* srcVal,
Vikram S. Adve5cedede2002-09-27 14:29:45 +0000249 Value* destVal,
250 unsigned int numLowBits,
Vikram S. Adve242a8082002-05-19 15:25:51 +0000251 std::vector<MachineInstr*>& mvec,
252 MachineCodeForInstruction& mcfi) const;
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000253};
254
Ruchira Sasankae38bd5332001-09-15 00:30:44 +0000255
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000256//----------------------------------------------------------------------------
257// class UltraSparcRegInfo
258//
Chris Lattnerd0f166a2002-12-29 03:13:05 +0000259// This class implements the virtual class TargetRegInfo for Sparc.
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000260//
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000261//----------------------------------------------------------------------------
262
Chris Lattnerd0f166a2002-12-29 03:13:05 +0000263class UltraSparcRegInfo : public TargetRegInfo {
Ruchira Sasankae38bd5332001-09-15 00:30:44 +0000264
Vikram S. Adve46d3f8e2003-07-06 19:53:59 +0000265private:
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000266
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000267 // Number of registers used for passing int args (usually 6: %o0 - %o5)
268 //
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000269 unsigned const NumOfIntArgRegs;
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000270
271 // Number of registers used for passing float args (usually 32: %f0 - %f31)
272 //
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000273 unsigned const NumOfFloatArgRegs;
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000274
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000275 // ======================== Private Methods =============================
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000276
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000277 // The following methods are used to color special live ranges (e.g.
Chris Lattnerf57b8452002-04-27 06:56:12 +0000278 // function args and return values etc.) with specific hardware registers
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000279 // as required. See SparcRegInfo.cpp for the implementation.
280 //
Vikram S. Advefe09fb22002-07-08 23:34:10 +0000281 void suggestReg4RetAddr(MachineInstr *RetMI,
Chris Lattner699683c2002-02-04 05:59:25 +0000282 LiveRangeInfo &LRI) const;
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000283
Vikram S. Adve106604e2002-09-28 16:56:59 +0000284 void suggestReg4CallAddr(MachineInstr *CallMI, LiveRangeInfo &LRI) const;
Vikram S. Advefe09fb22002-07-08 23:34:10 +0000285
Vikram S. Adved0d06ad2003-05-31 07:32:01 +0000286 // Helper used by the all the getRegType() functions.
Vikram S. Adve78a4f232003-05-27 00:02:22 +0000287 int getRegTypeForClassAndType(unsigned regClassID, const Type* type) const;
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +0000288
Chris Lattner699683c2002-02-04 05:59:25 +0000289public:
Misha Brukmand3d97be2003-05-30 20:12:42 +0000290 // Type of registers available in Sparc. There can be several reg types
291 // in the same class. For instace, the float reg class has Single/Double
292 // types
293 //
294 enum RegTypes {
295 IntRegType,
296 FPSingleRegType,
297 FPDoubleRegType,
298 IntCCRegType,
299 FloatCCRegType,
300 SpecialRegType
301 };
302
Misha Brukmande11f2d2003-07-07 16:52:39 +0000303 // The actual register classes in the Sparc
304 //
305 // **** WARNING: If this enum order is changed, also modify
306 // getRegisterClassOfValue method below since it assumes this particular
307 // order for efficiency.
308 //
309 enum RegClassIDs {
310 IntRegClassID, // Integer
311 FloatRegClassID, // Float (both single/double)
312 IntCCRegClassID, // Int Condition Code
313 FloatCCRegClassID, // Float Condition code
314 SpecialRegClassID // Special (unallocated) registers
315 };
316
Chris Lattner699683c2002-02-04 05:59:25 +0000317 UltraSparcRegInfo(const UltraSparc &tgt);
Ruchira Sasankae38bd5332001-09-15 00:30:44 +0000318
Vikram S. Advedd558992002-03-18 03:02:42 +0000319 // To find the register class used for a specified Type
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000320 //
Vikram S. Advefe09fb22002-07-08 23:34:10 +0000321 unsigned getRegClassIDOfType(const Type *type,
322 bool isCCReg = false) const;
Ruchira Sasankae38bd5332001-09-15 00:30:44 +0000323
Vikram S. Advefe09fb22002-07-08 23:34:10 +0000324 // To find the register class to which a specified register belongs
325 //
Vikram S. Advefe09fb22002-07-08 23:34:10 +0000326 unsigned getRegClassIDOfRegType(int regType) const;
Vikram S. Advedd558992002-03-18 03:02:42 +0000327
Chris Lattner699683c2002-02-04 05:59:25 +0000328 // getZeroRegNum - returns the register that contains always zero this is the
329 // unified register number
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000330 //
Chris Lattner699683c2002-02-04 05:59:25 +0000331 virtual int getZeroRegNum() const;
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000332
Chris Lattner699683c2002-02-04 05:59:25 +0000333 // getCallAddressReg - returns the reg used for pushing the address when a
Chris Lattnerf57b8452002-04-27 06:56:12 +0000334 // function is called. This can be used for other purposes between calls
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000335 //
Chris Lattner699683c2002-02-04 05:59:25 +0000336 unsigned getCallAddressReg() const;
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000337
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000338 // Returns the register containing the return address.
339 // It should be made sure that this register contains the return
340 // value when a return instruction is reached.
341 //
Chris Lattner699683c2002-02-04 05:59:25 +0000342 unsigned getReturnAddressReg() const;
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000343
Vikram S. Adve242a8082002-05-19 15:25:51 +0000344 // Number of registers used for passing int args (usually 6: %o0 - %o5)
345 // and float args (usually 32: %f0 - %f31)
346 //
Vikram S. Adve5b1b47b2003-05-25 15:59:47 +0000347 unsigned const getNumOfIntArgRegs() const { return NumOfIntArgRegs; }
348 unsigned const getNumOfFloatArgRegs() const { return NumOfFloatArgRegs; }
Vikram S. Adve242a8082002-05-19 15:25:51 +0000349
Vikram S. Adved0d06ad2003-05-31 07:32:01 +0000350 // Compute which register can be used for an argument, if any
351 //
352 int regNumForIntArg(bool inCallee, bool isVarArgsCall,
353 unsigned argNo, unsigned& regClassId) const;
354
355 int regNumForFPArg(unsigned RegType, bool inCallee, bool isVarArgsCall,
356 unsigned argNo, unsigned& regClassId) const;
357
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000358 // 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
Vikram S. Advefe09fb22002-07-08 23:34:10 +0000365 void suggestRegs4CallArgs(MachineInstr *CallMI,
Vikram S. Adve106604e2002-09-28 16:56:59 +0000366 LiveRangeInfo& LRI) const;
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000367
Vikram S. Advefe09fb22002-07-08 23:34:10 +0000368 void suggestReg4RetValue(MachineInstr *RetMI,
Chris Lattner697954c2002-01-20 22:54:45 +0000369 LiveRangeInfo& LRI) const;
Vikram S. Advefe09fb22002-07-08 23:34:10 +0000370
Vikram S. Adveada280f2003-07-29 19:54:41 +0000371 void colorMethodArgs(const Function *Meth, LiveRangeInfo& LRI,
372 std::vector<MachineInstr*>& InstrnsBefore,
373 std::vector<MachineInstr*>& InstrnsAfter) const;
Ruchira Sasankaab304c42001-09-30 23:19:57 +0000374
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000375 // method used for printing a register for debugging purposes
376 //
Vikram S. Adve78a4f232003-05-27 00:02:22 +0000377 void printReg(const LiveRange *LR) const;
Vikram S. Advefe09fb22002-07-08 23:34:10 +0000378
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000379 // returns the # of bytes of stack space allocated for each register
380 // type. For Sparc, currently we allocate 8 bytes on stack for all
381 // register types. We can optimize this later if necessary to save stack
382 // space (However, should make sure that stack alignment is correct)
383 //
Chris Lattner699683c2002-02-04 05:59:25 +0000384 inline int getSpilledRegSize(int RegType) const {
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000385 return 8;
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000386 }
387
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000388
Vikram S. Advea44c6c02002-03-31 19:04:50 +0000389 // To obtain the return value and the indirect call address (if any)
390 // contained in a CALL machine instruction
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000391 //
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000392 const Value * getCallInstRetVal(const MachineInstr *CallMI) const;
Vikram S. Advea44c6c02002-03-31 19:04:50 +0000393 const Value * getCallInstIndirectAddrVal(const MachineInstr *CallMI) const;
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000394
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000395 // The following methods are used to generate "copy" machine instructions
396 // for an architecture.
397 //
Vikram S. Advefe09fb22002-07-08 23:34:10 +0000398 // The function regTypeNeedsScratchReg() can be used to check whether a
399 // scratch register is needed to copy a register of type `regType' to
400 // or from memory. If so, such a scratch register can be provided by
401 // the caller (e.g., if it knows which regsiters are free); otherwise
402 // an arbitrary one will be chosen and spilled by the copy instructions.
403 //
404 bool regTypeNeedsScratchReg(int RegType,
405 int& scratchRegClassId) const;
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000406
Vikram S. Advefe09fb22002-07-08 23:34:10 +0000407 void cpReg2RegMI(std::vector<MachineInstr*>& mvec,
408 unsigned SrcReg, unsigned DestReg,
409 int RegType) const;
410
411 void cpReg2MemMI(std::vector<MachineInstr*>& mvec,
412 unsigned SrcReg, unsigned DestPtrReg,
413 int Offset, int RegType, int scratchReg = -1) const;
414
415 void cpMem2RegMI(std::vector<MachineInstr*>& mvec,
416 unsigned SrcPtrReg, int Offset, unsigned DestReg,
417 int RegType, int scratchReg = -1) const;
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000418
Vikram S. Adve242a8082002-05-19 15:25:51 +0000419 void cpValue2Value(Value *Src, Value *Dest,
Anand Shuklacfb22d32002-06-25 20:55:50 +0000420 std::vector<MachineInstr*>& mvec) const;
Ruchira Sasankaef1b0cb2001-11-03 17:13:27 +0000421
Vikram S. Adved0d06ad2003-05-31 07:32:01 +0000422 // Get the register type for a register identified different ways.
Vikram S. Adve7dc7de52003-07-25 21:12:15 +0000423 // Note that getRegTypeForLR(LR) != getRegTypeForDataType(LR->getType())!
424 // The reg class of a LR depends both on the Value types in it and whether
425 // they are CC registers or not (for example).
426 int getRegTypeForDataType(const Type* type) const;
427 int getRegTypeForLR(const LiveRange *LR) const;
Vikram S. Adved0d06ad2003-05-31 07:32:01 +0000428 int getRegType(int unifiedRegNum) const;
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000429
Chris Lattner699683c2002-02-04 05:59:25 +0000430 virtual unsigned getFramePointer() const;
431 virtual unsigned getStackPointer() const;
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000432};
433
434
435
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000436
437//---------------------------------------------------------------------------
438// class UltraSparcSchedInfo
439//
440// Purpose:
441// Interface to instruction scheduling information for UltraSPARC.
442// The parameter values above are based on UltraSPARC IIi.
443//---------------------------------------------------------------------------
444
445
Chris Lattnerd0f166a2002-12-29 03:13:05 +0000446class UltraSparcSchedInfo: public TargetSchedInfo {
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000447public:
Chris Lattner699683c2002-02-04 05:59:25 +0000448 UltraSparcSchedInfo(const TargetMachine &tgt);
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000449protected:
Chris Lattner699683c2002-02-04 05:59:25 +0000450 virtual void initializeResources();
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000451};
452
Chris Lattnerf6e0e282001-09-14 04:32:55 +0000453
454//---------------------------------------------------------------------------
Vikram S. Advec1521632001-10-22 13:31:53 +0000455// class UltraSparcFrameInfo
456//
457// Purpose:
458// Interface to stack frame layout info for the UltraSPARC.
Vikram S. Adve00521d72001-11-12 23:26:35 +0000459// Starting offsets for each area of the stack frame are aligned at
460// a multiple of getStackFrameSizeAlignment().
Vikram S. Advec1521632001-10-22 13:31:53 +0000461//---------------------------------------------------------------------------
462
Chris Lattnerda62ac62002-12-28 20:20:24 +0000463class UltraSparcFrameInfo: public TargetFrameInfo {
464 const TargetMachine &target;
Vikram S. Advec1521632001-10-22 13:31:53 +0000465public:
Chris Lattnerda62ac62002-12-28 20:20:24 +0000466 UltraSparcFrameInfo(const TargetMachine &TM)
467 : TargetFrameInfo(StackGrowsDown, StackFrameSizeAlignment, 0), target(TM) {}
Vikram S. Adve7f37fe52001-11-08 04:55:13 +0000468
469public:
Vikram S. Advee1f72802002-09-16 15:39:26 +0000470 // These methods provide constant parameters of the frame layout.
471 //
Chris Lattnerf57b8452002-04-27 06:56:12 +0000472 int getStackFrameSizeAlignment() const { return StackFrameSizeAlignment;}
473 int getMinStackFrameSize() const { return MinStackFrameSize; }
474 int getNumFixedOutgoingArgs() const { return NumFixedOutgoingArgs; }
475 int getSizeOfEachArgOnStack() const { return SizeOfEachArgOnStack; }
476 bool argsOnStackHaveFixedSize() const { return true; }
Vikram S. Adve7f37fe52001-11-08 04:55:13 +0000477
Vikram S. Advee1f72802002-09-16 15:39:26 +0000478 // This method adjusts a stack offset to meet alignment rules of target.
479 // The fixed OFFSET (0x7ff) must be subtracted and the result aligned.
480 virtual int adjustAlignment (int unalignedOffset,
481 bool growUp,
482 unsigned int align) const {
483 return unalignedOffset + (growUp? +1:-1)*((unalignedOffset-OFFSET) % align);
484 }
485
Vikram S. Adve7f37fe52001-11-08 04:55:13 +0000486 // These methods compute offsets using the frame contents for a
Chris Lattnerf57b8452002-04-27 06:56:12 +0000487 // particular function. The frame contents are obtained from the
488 // MachineCodeInfoForMethod object for the given function.
Vikram S. Adve7f37fe52001-11-08 04:55:13 +0000489 //
Misha Brukmanfce11432002-10-28 00:28:31 +0000490 int getFirstIncomingArgOffset (MachineFunction& mcInfo,
Vikram S. Adve6d783112002-04-25 04:40:24 +0000491 bool& growUp) const
Vikram S. Adve7f37fe52001-11-08 04:55:13 +0000492 {
Vikram S. Adve6d783112002-04-25 04:40:24 +0000493 growUp = true; // arguments area grows upwards
Vikram S. Adve7f37fe52001-11-08 04:55:13 +0000494 return FirstIncomingArgOffsetFromFP;
495 }
Misha Brukmanfce11432002-10-28 00:28:31 +0000496 int getFirstOutgoingArgOffset (MachineFunction& mcInfo,
Vikram S. Adve6d783112002-04-25 04:40:24 +0000497 bool& growUp) const
Vikram S. Adve7f37fe52001-11-08 04:55:13 +0000498 {
Vikram S. Adve6d783112002-04-25 04:40:24 +0000499 growUp = true; // arguments area grows upwards
Vikram S. Adve7f37fe52001-11-08 04:55:13 +0000500 return FirstOutgoingArgOffsetFromSP;
501 }
Misha Brukmanfce11432002-10-28 00:28:31 +0000502 int getFirstOptionalOutgoingArgOffset(MachineFunction& mcInfo,
Vikram S. Adve6d783112002-04-25 04:40:24 +0000503 bool& growUp)const
Vikram S. Adve7f37fe52001-11-08 04:55:13 +0000504 {
Vikram S. Adve6d783112002-04-25 04:40:24 +0000505 growUp = true; // arguments area grows upwards
Vikram S. Adve7f37fe52001-11-08 04:55:13 +0000506 return FirstOptionalOutgoingArgOffsetFromSP;
507 }
508
Misha Brukmanfce11432002-10-28 00:28:31 +0000509 int getFirstAutomaticVarOffset (MachineFunction& mcInfo,
Vikram S. Adve6d783112002-04-25 04:40:24 +0000510 bool& growUp) const;
Misha Brukmanfce11432002-10-28 00:28:31 +0000511 int getRegSpillAreaOffset (MachineFunction& mcInfo,
Vikram S. Adve6d783112002-04-25 04:40:24 +0000512 bool& growUp) const;
Misha Brukmanfce11432002-10-28 00:28:31 +0000513 int getTmpAreaOffset (MachineFunction& mcInfo,
Vikram S. Adve6d783112002-04-25 04:40:24 +0000514 bool& growUp) const;
Misha Brukmanfce11432002-10-28 00:28:31 +0000515 int getDynamicAreaOffset (MachineFunction& mcInfo,
Vikram S. Adve6d783112002-04-25 04:40:24 +0000516 bool& growUp) const;
Vikram S. Adve7f37fe52001-11-08 04:55:13 +0000517
518 //
519 // These methods specify the base register used for each stack area
520 // (generally FP or SP)
521 //
522 virtual int getIncomingArgBaseRegNum() const {
523 return (int) target.getRegInfo().getFramePointer();
524 }
525 virtual int getOutgoingArgBaseRegNum() const {
526 return (int) target.getRegInfo().getStackPointer();
527 }
528 virtual int getOptionalOutgoingArgBaseRegNum() const {
529 return (int) target.getRegInfo().getStackPointer();
530 }
531 virtual int getAutomaticVarBaseRegNum() const {
532 return (int) target.getRegInfo().getFramePointer();
533 }
534 virtual int getRegSpillAreaBaseRegNum() const {
535 return (int) target.getRegInfo().getFramePointer();
536 }
537 virtual int getDynamicAreaBaseRegNum() const {
538 return (int) target.getRegInfo().getStackPointer();
539 }
Chris Lattnerda62ac62002-12-28 20:20:24 +0000540
541 virtual int getIncomingArgOffset(MachineFunction& mcInfo,
542 unsigned argNum) const {
543 assert(argsOnStackHaveFixedSize());
544
545 unsigned relativeOffset = argNum * getSizeOfEachArgOnStack();
546 bool growUp; // do args grow up or down
547 int firstArg = getFirstIncomingArgOffset(mcInfo, growUp);
548 return growUp ? firstArg + relativeOffset : firstArg - relativeOffset;
549 }
550
551 virtual int getOutgoingArgOffset(MachineFunction& mcInfo,
552 unsigned argNum) const {
553 assert(argsOnStackHaveFixedSize());
554 //assert(((int) argNum - this->getNumFixedOutgoingArgs())
555 // <= (int) mcInfo.getInfo()->getMaxOptionalNumArgs());
556
557 unsigned relativeOffset = argNum * getSizeOfEachArgOnStack();
558 bool growUp; // do args grow up or down
559 int firstArg = getFirstOutgoingArgOffset(mcInfo, growUp);
560 return growUp ? firstArg + relativeOffset : firstArg - relativeOffset;
561 }
Vikram S. Adve7f37fe52001-11-08 04:55:13 +0000562
563private:
Vikram S. Advee1f72802002-09-16 15:39:26 +0000564 /*----------------------------------------------------------------------
565 This diagram shows the stack frame layout used by llc on Sparc V9.
566 Note that only the location of automatic variables, spill area,
567 temporary storage, and dynamically allocated stack area are chosen
568 by us. The rest conform to the Sparc V9 ABI.
569 All stack addresses are offset by OFFSET = 0x7ff (2047).
570
Chris Lattnerda62ac62002-12-28 20:20:24 +0000571 Alignment assumptions and other invariants:
Vikram S. Advee1f72802002-09-16 15:39:26 +0000572 (1) %sp+OFFSET and %fp+OFFSET are always aligned on 16-byte boundary
573 (2) Variables in automatic, spill, temporary, or dynamic regions
574 are aligned according to their size as in all memory accesses.
575 (3) Everything below the dynamically allocated stack area is only used
576 during a call to another function, so it is never needed when
577 the current function is active. This is why space can be allocated
578 dynamically by incrementing %sp any time within the function.
579
580 STACK FRAME LAYOUT:
581
582 ...
583 %fp+OFFSET+176 Optional extra incoming arguments# 1..N
584 %fp+OFFSET+168 Incoming argument #6
585 ... ...
586 %fp+OFFSET+128 Incoming argument #1
587 ... ...
588 ---%fp+OFFSET-0--------Bottom of caller's stack frame--------------------
589 %fp+OFFSET-8 Automatic variables <-- ****TOP OF STACK FRAME****
590 Spill area
591 Temporary storage
592 ...
593
594 %sp+OFFSET+176+8N Bottom of dynamically allocated stack area
595 %sp+OFFSET+168+8N Optional extra outgoing argument# N
596 ... ...
597 %sp+OFFSET+176 Optional extra outgoing argument# 1
598 %sp+OFFSET+168 Outgoing argument #6
599 ... ...
600 %sp+OFFSET+128 Outgoing argument #1
601 %sp+OFFSET+120 Save area for %i7
602 ... ...
603 %sp+OFFSET+0 Save area for %l0 <-- ****BOTTOM OF STACK FRAME****
604
605 *----------------------------------------------------------------------*/
606
Vikram S. Adve5afff3b2001-11-09 02:15:52 +0000607 // All stack addresses must be offset by 0x7ff (2047) on Sparc V9.
608 static const int OFFSET = (int) 0x7ff;
Vikram S. Adve7f37fe52001-11-08 04:55:13 +0000609 static const int StackFrameSizeAlignment = 16;
Vikram S. Advec1521632001-10-22 13:31:53 +0000610 static const int MinStackFrameSize = 176;
Vikram S. Adve7f37fe52001-11-08 04:55:13 +0000611 static const int NumFixedOutgoingArgs = 6;
612 static const int SizeOfEachArgOnStack = 8;
Vikram S. Adve5afff3b2001-11-09 02:15:52 +0000613 static const int FirstIncomingArgOffsetFromFP = 128 + OFFSET;
614 static const int FirstOptionalIncomingArgOffsetFromFP = 176 + OFFSET;
Vikram S. Advee1f72802002-09-16 15:39:26 +0000615 static const int StaticAreaOffsetFromFP = 0 + OFFSET;
Vikram S. Adve5afff3b2001-11-09 02:15:52 +0000616 static const int FirstOutgoingArgOffsetFromSP = 128 + OFFSET;
617 static const int FirstOptionalOutgoingArgOffsetFromSP = 176 + OFFSET;
Vikram S. Advec1521632001-10-22 13:31:53 +0000618};
619
620
Vikram S. Adve5afff3b2001-11-09 02:15:52 +0000621//---------------------------------------------------------------------------
622// class UltraSparcCacheInfo
623//
624// Purpose:
625// Interface to cache parameters for the UltraSPARC.
626// Just use defaults for now.
627//---------------------------------------------------------------------------
628
Chris Lattnerdde12622002-12-29 02:50:33 +0000629struct UltraSparcCacheInfo: public TargetCacheInfo {
630 UltraSparcCacheInfo(const TargetMachine &T) : TargetCacheInfo(T) {}
Vikram S. Adve5afff3b2001-11-09 02:15:52 +0000631};
632
Vikram S. Advec1521632001-10-22 13:31:53 +0000633
634//---------------------------------------------------------------------------
Vikram S. Adved55697c2002-09-20 00:52:09 +0000635// class UltraSparcOptInfo
636//
637// Purpose:
638// Interface to machine-level optimization routines for the UltraSPARC.
639//---------------------------------------------------------------------------
640
Chris Lattnerdde12622002-12-29 02:50:33 +0000641struct UltraSparcOptInfo: public TargetOptInfo {
642 UltraSparcOptInfo(const TargetMachine &T) : TargetOptInfo(T) {}
Vikram S. Adved55697c2002-09-20 00:52:09 +0000643
644 virtual bool IsUselessCopy (const MachineInstr* MI) const;
645};
646
Misha Brukman79caf1f2003-05-27 22:01:10 +0000647/// createAddRegNumToValuesPass - this pass adds unsigned register numbers to
648/// instructions, since that's not done by the Sparc InstSelector, but that's
649/// how the target-independent register allocator in the JIT likes to see
650/// instructions. This pass enables the usage of the JIT register allocator(s).
651Pass *createAddRegNumToValuesPass();
652
Vikram S. Adved55697c2002-09-20 00:52:09 +0000653//---------------------------------------------------------------------------
Chris Lattnerf6e0e282001-09-14 04:32:55 +0000654// class UltraSparcMachine
655//
656// Purpose:
657// Primary interface to machine description for the UltraSPARC.
658// Primarily just initializes machine-dependent parameters in
659// class TargetMachine, and creates machine-dependent subclasses
Vikram S. Adve339084b2001-09-18 13:04:24 +0000660// for classes such as InstrInfo, SchedInfo and RegInfo.
Chris Lattnerf6e0e282001-09-14 04:32:55 +0000661//---------------------------------------------------------------------------
662
663class UltraSparc : public TargetMachine {
Vikram S. Adve339084b2001-09-18 13:04:24 +0000664 UltraSparcInstrInfo instrInfo;
665 UltraSparcSchedInfo schedInfo;
666 UltraSparcRegInfo regInfo;
Vikram S. Advec1521632001-10-22 13:31:53 +0000667 UltraSparcFrameInfo frameInfo;
Vikram S. Adve5afff3b2001-11-09 02:15:52 +0000668 UltraSparcCacheInfo cacheInfo;
Vikram S. Adved55697c2002-09-20 00:52:09 +0000669 UltraSparcOptInfo optInfo;
Chris Lattnerf6e0e282001-09-14 04:32:55 +0000670public:
671 UltraSparc();
Vikram S. Adved55697c2002-09-20 00:52:09 +0000672
Chris Lattner3501fea2003-01-14 22:00:31 +0000673 virtual const TargetInstrInfo &getInstrInfo() const { return instrInfo; }
Chris Lattnerd0f166a2002-12-29 03:13:05 +0000674 virtual const TargetSchedInfo &getSchedInfo() const { return schedInfo; }
675 virtual const TargetRegInfo &getRegInfo() const { return regInfo; }
Chris Lattnerda62ac62002-12-28 20:20:24 +0000676 virtual const TargetFrameInfo &getFrameInfo() const { return frameInfo; }
Chris Lattnerdde12622002-12-29 02:50:33 +0000677 virtual const TargetCacheInfo &getCacheInfo() const { return cacheInfo; }
678 virtual const TargetOptInfo &getOptInfo() const { return optInfo; }
Chris Lattner32f600a2001-09-19 13:47:12 +0000679
Chris Lattner63342052002-10-29 21:12:46 +0000680 virtual bool addPassesToEmitAssembly(PassManager &PM, std::ostream &Out);
Misha Brukman79caf1f2003-05-27 22:01:10 +0000681 virtual bool addPassesToJITCompile(PassManager &PM);
682 virtual bool addPassesToEmitMachineCode(PassManager &PM,
683 MachineCodeEmitter &MCE);
Chris Lattner4f946372002-10-28 01:03:43 +0000684
Chris Lattnerc66583e2002-10-29 22:01:44 +0000685 // getPrologEpilogInsertionPass - Inserts prolog/epilog code.
686 Pass* getPrologEpilogInsertionPass();
Chris Lattnerf6e0e282001-09-14 04:32:55 +0000687
Vikram S. Advee1f72802002-09-16 15:39:26 +0000688 // getFunctionAsmPrinterPass - Writes out machine code for a single function
Chris Lattnerc66583e2002-10-29 22:01:44 +0000689 Pass* getFunctionAsmPrinterPass(std::ostream &Out);
Vikram S. Advee1f72802002-09-16 15:39:26 +0000690
691 // getModuleAsmPrinterPass - Writes generated machine code to assembly file.
Chris Lattnerc66583e2002-10-29 22:01:44 +0000692 Pass* getModuleAsmPrinterPass(std::ostream &Out);
Vikram S. Advee1f72802002-09-16 15:39:26 +0000693
694 // getEmitBytecodeToAsmPass - Emits final LLVM bytecode to assembly file.
Chris Lattnerc66583e2002-10-29 22:01:44 +0000695 Pass* getEmitBytecodeToAsmPass(std::ostream &Out);
Chris Lattner6edfcc52002-02-03 07:51:17 +0000696};
Chris Lattnerf6e0e282001-09-14 04:32:55 +0000697
Chris Lattnerfb4d20b2003-06-16 15:31:09 +0000698Pass *getFunctionInfo(std::ostream &out);
699
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000700#endif