blob: c27b9d01ac0fa8ad8a1bf61aff282d5714c4109a [file] [log] [blame]
Chris Lattner035dfbe2002-08-09 20:08:06 +00001//===-- SparcInternals.h ----------------------------------------*- C++ -*-===//
Vikram S. Adve7f37fe52001-11-08 04:55:13 +00002//
John Criswell856ba762003-10-21 15:17:13 +00003// The LLVM Compiler Infrastructure
4//
5// This file was developed by the LLVM research group and is distributed under
6// the University of Illinois Open Source License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
Chris Lattner035dfbe2002-08-09 20:08:06 +000010// This file defines stuff that is to be private to the Sparc backend, but is
11// shared among different portions of the backend.
12//
13//===----------------------------------------------------------------------===//
Chris Lattnerc6495ee2001-09-14 03:56:45 +000014
15#ifndef SPARC_INTERNALS_H
16#define SPARC_INTERNALS_H
17
Misha Brukmane9d88382003-05-24 00:09:50 +000018#include "llvm/CodeGen/MachineInstrBuilder.h"
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +000019#include "llvm/Target/TargetMachine.h"
Chris Lattnerd0f166a2002-12-29 03:13:05 +000020#include "llvm/Target/TargetSchedInfo.h"
Chris Lattner8bd66e62002-12-28 21:00:25 +000021#include "llvm/Target/TargetFrameInfo.h"
Chris Lattnerdde12622002-12-29 02:50:33 +000022#include "llvm/Target/TargetCacheInfo.h"
Chris Lattnerd0f166a2002-12-29 03:13:05 +000023#include "llvm/Target/TargetRegInfo.h"
Chris Lattnerc6495ee2001-09-14 03:56:45 +000024#include "llvm/Type.h"
Misha Brukmane9d88382003-05-24 00:09:50 +000025#include "SparcRegClassInfo.h"
John Criswell7a73b802003-06-30 21:59:07 +000026#include "Config/sys/types.h"
Chris Lattnerc6495ee2001-09-14 03:56:45 +000027
Chris Lattner4387e312002-02-03 23:42:19 +000028class LiveRange;
Chris Lattnerf6e0e282001-09-14 04:32:55 +000029class UltraSparc;
Chris Lattner9aa697b2002-04-09 05:16:36 +000030class Pass;
Chris Lattner4387e312002-02-03 23:42:19 +000031
Chris Lattnerc6495ee2001-09-14 03:56:45 +000032enum SparcInstrSchedClass {
33 SPARC_NONE, /* Instructions with no scheduling restrictions */
34 SPARC_IEUN, /* Integer class that can use IEU0 or IEU1 */
35 SPARC_IEU0, /* Integer class IEU0 */
36 SPARC_IEU1, /* Integer class IEU1 */
37 SPARC_FPM, /* FP Multiply or Divide instructions */
38 SPARC_FPA, /* All other FP instructions */
39 SPARC_CTI, /* Control-transfer instructions */
40 SPARC_LD, /* Load instructions */
41 SPARC_ST, /* Store instructions */
42 SPARC_SINGLE, /* Instructions that must issue by themselves */
43
44 SPARC_INV, /* This should stay at the end for the next value */
45 SPARC_NUM_SCHED_CLASSES = SPARC_INV
46};
47
Chris Lattnerc6495ee2001-09-14 03:56:45 +000048
49//---------------------------------------------------------------------------
50// enum SparcMachineOpCode.
Chris Lattner3501fea2003-01-14 22:00:31 +000051// const TargetInstrDescriptor SparcMachineInstrDesc[]
Chris Lattnerc6495ee2001-09-14 03:56:45 +000052//
53// Purpose:
54// Description of UltraSparc machine instructions.
55//
56//---------------------------------------------------------------------------
57
Misha Brukmana98cd452003-05-20 20:32:24 +000058namespace V9 {
59 enum SparcMachineOpCode {
Chris Lattner9a3d63b2001-09-19 15:56:23 +000060#define I(ENUM, OPCODESTRING, NUMOPERANDS, RESULTPOS, MAXIMM, IMMSE, \
61 NUMDELAYSLOTS, LATENCY, SCHEDCLASS, INSTFLAGS) \
62 ENUM,
63#include "SparcInstr.def"
Chris Lattnerc6495ee2001-09-14 03:56:45 +000064
Misha Brukmana98cd452003-05-20 20:32:24 +000065 // End-of-array marker
66 INVALID_OPCODE,
67 NUM_REAL_OPCODES = PHI, // number of valid opcodes
68 NUM_TOTAL_OPCODES = INVALID_OPCODE
69 };
70}
Chris Lattnerc6495ee2001-09-14 03:56:45 +000071
Chris Lattnerc6495ee2001-09-14 03:56:45 +000072
Chris Lattner9a3d63b2001-09-19 15:56:23 +000073// Array of machine instruction descriptions...
Chris Lattner3501fea2003-01-14 22:00:31 +000074extern const TargetInstrDescriptor SparcMachineInstrDesc[];
Chris Lattnerc6495ee2001-09-14 03:56:45 +000075
76
77//---------------------------------------------------------------------------
78// class UltraSparcInstrInfo
79//
80// Purpose:
81// Information about individual instructions.
82// Most information is stored in the SparcMachineInstrDesc array above.
83// Other information is computed on demand, and most such functions
Chris Lattner3501fea2003-01-14 22:00:31 +000084// default to member functions in base class TargetInstrInfo.
Chris Lattnerc6495ee2001-09-14 03:56:45 +000085//---------------------------------------------------------------------------
86
Chris Lattner3501fea2003-01-14 22:00:31 +000087struct UltraSparcInstrInfo : public TargetInstrInfo {
Chris Lattner047bbaf2002-10-29 15:45:20 +000088 UltraSparcInstrInfo();
Vikram S. Adve4c5fe2d2001-11-14 18:48:36 +000089
90 //
Vikram S. Advedd558992002-03-18 03:02:42 +000091 // All immediate constants are in position 1 except the
Vikram S. Advee1f72802002-09-16 15:39:26 +000092 // store instructions and SETxx.
Vikram S. Adve4c5fe2d2001-11-14 18:48:36 +000093 //
Vikram S. Advedd558992002-03-18 03:02:42 +000094 virtual int getImmedConstantPos(MachineOpCode opCode) const {
Vikram S. Adve4c5fe2d2001-11-14 18:48:36 +000095 bool ignore;
Misha Brukmana98cd452003-05-20 20:32:24 +000096 if (this->maxImmedConstant(opCode, ignore) != 0) {
97 // 1st store opcode
Misha Brukman3c4cf152003-05-27 22:44:44 +000098 assert(! this->isStore((MachineOpCode) V9::STBr - 1));
Misha Brukmana98cd452003-05-20 20:32:24 +000099 // last store opcode
Misha Brukman3c4cf152003-05-27 22:44:44 +0000100 assert(! this->isStore((MachineOpCode) V9::STXFSRi + 1));
Misha Brukmana98cd452003-05-20 20:32:24 +0000101
102 if (opCode == V9::SETSW || opCode == V9::SETUW ||
103 opCode == V9::SETX || opCode == V9::SETHI)
104 return 0;
Misha Brukman3c4cf152003-05-27 22:44:44 +0000105 if (opCode >= V9::STBr && opCode <= V9::STXFSRi)
Misha Brukmana98cd452003-05-20 20:32:24 +0000106 return 2;
107 return 1;
108 }
Vikram S. Adve4c5fe2d2001-11-14 18:48:36 +0000109 else
110 return -1;
111 }
Misha Brukmane9d88382003-05-24 00:09:50 +0000112
113 /// createNOPinstr - returns the target's implementation of NOP, which is
114 /// usually a pseudo-instruction, implemented by a degenerate version of
Misha Brukman79caf1f2003-05-27 22:01:10 +0000115 /// another instruction, e.g. X86: xchg ax, ax; SparcV9: sethi 0, g0
Misha Brukmane9d88382003-05-24 00:09:50 +0000116 ///
117 MachineInstr* createNOPinstr() const {
Misha Brukman79caf1f2003-05-27 22:01:10 +0000118 return BuildMI(V9::SETHI, 2).addZImm(0).addReg(SparcIntRegClass::g0);
Misha Brukmane9d88382003-05-24 00:09:50 +0000119 }
120
Misha Brukman12745c52003-05-24 01:08:43 +0000121 /// isNOPinstr - not having a special NOP opcode, we need to know if a given
122 /// instruction is interpreted as an `official' NOP instr, i.e., there may be
123 /// more than one way to `do nothing' but only one canonical way to slack off.
Misha Brukmane9d88382003-05-24 00:09:50 +0000124 ///
125 bool isNOPinstr(const MachineInstr &MI) const {
126 // Make sure the instruction is EXACTLY `sethi g0, 0'
127 if (MI.getOpcode() == V9::SETHI && MI.getNumOperands() == 2) {
128 const MachineOperand &op0 = MI.getOperand(0), &op1 = MI.getOperand(1);
Misha Brukman79caf1f2003-05-27 22:01:10 +0000129 if (op0.isImmediate() && op0.getImmedValue() == 0 &&
130 op1.isMachineRegister() &&
131 op1.getMachineRegNum() == SparcIntRegClass::g0)
Misha Brukmane9d88382003-05-24 00:09:50 +0000132 {
133 return true;
134 }
135 }
136 return false;
137 }
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000138
Misha Brukmana98cd452003-05-20 20:32:24 +0000139 virtual bool hasResultInterlock(MachineOpCode opCode) const
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000140 {
141 // All UltraSPARC instructions have interlocks (note that delay slots
142 // are not considered here).
143 // However, instructions that use the result of an FCMP produce a
144 // 9-cycle stall if they are issued less than 3 cycles after the FCMP.
145 // Force the compiler to insert a software interlock (i.e., gap of
146 // 2 other groups, including NOPs if necessary).
Misha Brukmana98cd452003-05-20 20:32:24 +0000147 return (opCode == V9::FCMPS || opCode == V9::FCMPD || opCode == V9::FCMPQ);
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000148 }
149
Vikram S. Adve5684c4e2001-10-18 00:02:06 +0000150 //-------------------------------------------------------------------------
Vikram S. Advee1f72802002-09-16 15:39:26 +0000151 // Queries about representation of LLVM quantities (e.g., constants)
152 //-------------------------------------------------------------------------
153
154 virtual bool ConstantMayNotFitInImmedField(const Constant* CV,
155 const Instruction* I) const;
156
157 //-------------------------------------------------------------------------
Vikram S. Adve5684c4e2001-10-18 00:02:06 +0000158 // Code generation support for creating individual machine instructions
159 //-------------------------------------------------------------------------
Vikram S. Adved55697c2002-09-20 00:52:09 +0000160
161 // Get certain common op codes for the current target. This and all the
162 // Create* methods below should be moved to a machine code generation class
163 //
Misha Brukmana98cd452003-05-20 20:32:24 +0000164 virtual MachineOpCode getNOPOpCode() const { return V9::NOP; }
Vikram S. Adved55697c2002-09-20 00:52:09 +0000165
Vikram S. Adveada280f2003-07-29 19:54:41 +0000166 // Get the value of an integral constant in the form that must
167 // be put into the machine register. The specified constant is interpreted
168 // as (i.e., converted if necessary to) the specified destination type. The
169 // result is always returned as an uint64_t, since the representation of
170 // int64_t and uint64_t are identical. The argument can be any known const.
171 //
172 // isValidConstant is set to true if a valid constant was found.
173 //
174 virtual uint64_t ConvertConstantToIntType(const TargetMachine &target,
175 const Value *V,
176 const Type *destType,
177 bool &isValidConstant) const;
178
Vikram S. Adve5684c4e2001-10-18 00:02:06 +0000179 // Create an instruction sequence to put the constant `val' into
Vikram S. Adve242a8082002-05-19 15:25:51 +0000180 // the virtual register `dest'. `val' may be a Constant or a
181 // GlobalValue, viz., the constant address of a global variable or function.
182 // The generated instructions are returned in `mvec'.
183 // Any temp. registers (TmpInstruction) created are recorded in mcfi.
184 // Any stack space required is allocated via mcff.
Vikram S. Adve5684c4e2001-10-18 00:02:06 +0000185 //
Vikram S. Adve242a8082002-05-19 15:25:51 +0000186 virtual void CreateCodeToLoadConst(const TargetMachine& target,
187 Function* F,
Vikram S. Advedd558992002-03-18 03:02:42 +0000188 Value* val,
Vikram S. Adve5684c4e2001-10-18 00:02:06 +0000189 Instruction* dest,
Vikram S. Adve242a8082002-05-19 15:25:51 +0000190 std::vector<MachineInstr*>& mvec,
191 MachineCodeForInstruction& mcfi) const;
Vikram S. Adve7f37fe52001-11-08 04:55:13 +0000192
Vikram S. Adve5afff3b2001-11-09 02:15:52 +0000193 // Create an instruction sequence to copy an integer value `val'
194 // to a floating point value `dest' by copying to memory and back.
195 // val must be an integral type. dest must be a Float or Double.
Vikram S. Adve242a8082002-05-19 15:25:51 +0000196 // The generated instructions are returned in `mvec'.
197 // Any temp. registers (TmpInstruction) created are recorded in mcfi.
198 // Any stack space required is allocated via mcff.
Vikram S. Adve7f37fe52001-11-08 04:55:13 +0000199 //
Vikram S. Adve242a8082002-05-19 15:25:51 +0000200 virtual void CreateCodeToCopyIntToFloat(const TargetMachine& target,
201 Function* F,
202 Value* val,
203 Instruction* dest,
204 std::vector<MachineInstr*>& mvec,
205 MachineCodeForInstruction& mcfi) const;
Vikram S. Adve5afff3b2001-11-09 02:15:52 +0000206
207 // Similarly, create an instruction sequence to copy an FP value
208 // `val' to an integer value `dest' by copying to memory and back.
Vikram S. Adve242a8082002-05-19 15:25:51 +0000209 // The generated instructions are returned in `mvec'.
210 // Any temp. registers (TmpInstruction) created are recorded in mcfi.
211 // Any stack space required is allocated via mcff.
Vikram S. Adve5afff3b2001-11-09 02:15:52 +0000212 //
Vikram S. Adve242a8082002-05-19 15:25:51 +0000213 virtual void CreateCodeToCopyFloatToInt(const TargetMachine& target,
214 Function* F,
215 Value* val,
216 Instruction* dest,
217 std::vector<MachineInstr*>& mvec,
218 MachineCodeForInstruction& mcfi) const;
219
220 // Create instruction(s) to copy src to dest, for arbitrary types
221 // The generated instructions are returned in `mvec'.
222 // Any temp. registers (TmpInstruction) created are recorded in mcfi.
223 // Any stack space required is allocated via mcff.
224 //
Vikram S. Advedd558992002-03-18 03:02:42 +0000225 virtual void CreateCopyInstructionsByType(const TargetMachine& target,
Vikram S. Adve242a8082002-05-19 15:25:51 +0000226 Function* F,
227 Value* src,
228 Instruction* dest,
229 std::vector<MachineInstr*>& mvec,
230 MachineCodeForInstruction& mcfi) const;
231
232 // Create instruction sequence to produce a sign-extended register value
233 // from an arbitrary sized value (sized in bits, not bytes).
Vikram S. Advef36f06b2002-09-05 18:34:31 +0000234 // The generated instructions are appended to `mvec'.
235 // Any temp. registers (TmpInstruction) created are recorded in mcfi.
Vikram S. Adve242a8082002-05-19 15:25:51 +0000236 // Any stack space required is allocated via mcff.
237 //
238 virtual void CreateSignExtensionInstructions(const TargetMachine& target,
239 Function* F,
Vikram S. Advef36f06b2002-09-05 18:34:31 +0000240 Value* srcVal,
Vikram S. Adve5cedede2002-09-27 14:29:45 +0000241 Value* destVal,
242 unsigned int numLowBits,
Vikram S. Advef36f06b2002-09-05 18:34:31 +0000243 std::vector<MachineInstr*>& mvec,
244 MachineCodeForInstruction& mcfi) const;
245
246 // Create instruction sequence to produce a zero-extended register value
247 // from an arbitrary sized value (sized in bits, not bytes).
248 // The generated instructions are appended to `mvec'.
249 // Any temp. registers (TmpInstruction) created are recorded in mcfi.
250 // Any stack space required is allocated via mcff.
251 //
252 virtual void CreateZeroExtensionInstructions(const TargetMachine& target,
253 Function* F,
254 Value* srcVal,
Vikram S. Adve5cedede2002-09-27 14:29:45 +0000255 Value* destVal,
256 unsigned int numLowBits,
Vikram S. Adve242a8082002-05-19 15:25:51 +0000257 std::vector<MachineInstr*>& mvec,
258 MachineCodeForInstruction& mcfi) const;
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000259};
260
Ruchira Sasankae38bd5332001-09-15 00:30:44 +0000261
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000262//----------------------------------------------------------------------------
263// class UltraSparcRegInfo
264//
Chris Lattnerd0f166a2002-12-29 03:13:05 +0000265// This class implements the virtual class TargetRegInfo for Sparc.
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000266//
Ruchira Sasanka20c82b12001-10-28 18:15:12 +0000267//----------------------------------------------------------------------------
268
Chris Lattnerd0f166a2002-12-29 03:13:05 +0000269class UltraSparcRegInfo : public TargetRegInfo {
Ruchira Sasankae38bd5332001-09-15 00:30:44 +0000270
Vikram S. Adve46d3f8e2003-07-06 19:53:59 +0000271private:
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000272
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000273 // Number of registers used for passing int args (usually 6: %o0 - %o5)
274 //
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000275 unsigned const NumOfIntArgRegs;
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000276
277 // Number of registers used for passing float args (usually 32: %f0 - %f31)
278 //
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000279 unsigned const NumOfFloatArgRegs;
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000280
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000281 // ======================== Private Methods =============================
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000282
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000283 // The following methods are used to color special live ranges (e.g.
Chris Lattnerf57b8452002-04-27 06:56:12 +0000284 // function args and return values etc.) with specific hardware registers
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000285 // as required. See SparcRegInfo.cpp for the implementation.
286 //
Vikram S. Advefe09fb22002-07-08 23:34:10 +0000287 void suggestReg4RetAddr(MachineInstr *RetMI,
Chris Lattner699683c2002-02-04 05:59:25 +0000288 LiveRangeInfo &LRI) const;
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +0000289
Vikram S. Adve106604e2002-09-28 16:56:59 +0000290 void suggestReg4CallAddr(MachineInstr *CallMI, LiveRangeInfo &LRI) const;
Vikram S. Advefe09fb22002-07-08 23:34:10 +0000291
Vikram S. Adved0d06ad2003-05-31 07:32:01 +0000292 // Helper used by the all the getRegType() functions.
Vikram S. Adve78a4f232003-05-27 00:02:22 +0000293 int getRegTypeForClassAndType(unsigned regClassID, const Type* type) const;
Ruchira Sasanka3839e6e2001-11-03 19:59:59 +0000294
Chris Lattner699683c2002-02-04 05:59:25 +0000295public:
Misha Brukmand3d97be2003-05-30 20:12:42 +0000296 // Type of registers available in Sparc. There can be several reg types
297 // in the same class. For instace, the float reg class has Single/Double
298 // types
299 //
300 enum RegTypes {
301 IntRegType,
302 FPSingleRegType,
303 FPDoubleRegType,
304 IntCCRegType,
305 FloatCCRegType,
306 SpecialRegType
307 };
308
Misha Brukmande11f2d2003-07-07 16:52:39 +0000309 // The actual register classes in the Sparc
310 //
311 // **** WARNING: If this enum order is changed, also modify
312 // getRegisterClassOfValue method below since it assumes this particular
313 // order for efficiency.
314 //
315 enum RegClassIDs {
316 IntRegClassID, // Integer
317 FloatRegClassID, // Float (both single/double)
318 IntCCRegClassID, // Int Condition Code
319 FloatCCRegClassID, // Float Condition code
320 SpecialRegClassID // Special (unallocated) registers
321 };
322
Chris Lattner699683c2002-02-04 05:59:25 +0000323 UltraSparcRegInfo(const UltraSparc &tgt);
Ruchira Sasankae38bd5332001-09-15 00:30:44 +0000324
Vikram S. Advedd558992002-03-18 03:02:42 +0000325 // To find the register class used for a specified Type
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000326 //
Vikram S. Advefe09fb22002-07-08 23:34:10 +0000327 unsigned getRegClassIDOfType(const Type *type,
328 bool isCCReg = false) const;
Ruchira Sasankae38bd5332001-09-15 00:30:44 +0000329
Vikram S. Advefe09fb22002-07-08 23:34:10 +0000330 // To find the register class to which a specified register belongs
331 //
Vikram S. Advefe09fb22002-07-08 23:34:10 +0000332 unsigned getRegClassIDOfRegType(int regType) const;
Vikram S. Advedd558992002-03-18 03:02:42 +0000333
Chris Lattner699683c2002-02-04 05:59:25 +0000334 // getZeroRegNum - returns the register that contains always zero this is the
335 // unified register number
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000336 //
Chris Lattner699683c2002-02-04 05:59:25 +0000337 virtual int getZeroRegNum() const;
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000338
Chris Lattner699683c2002-02-04 05:59:25 +0000339 // getCallAddressReg - returns the reg used for pushing the address when a
Chris Lattnerf57b8452002-04-27 06:56:12 +0000340 // function is called. This can be used for other purposes between calls
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000341 //
Chris Lattner699683c2002-02-04 05:59:25 +0000342 unsigned getCallAddressReg() const;
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000343
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000344 // Returns the register containing the return address.
345 // It should be made sure that this register contains the return
346 // value when a return instruction is reached.
347 //
Chris Lattner699683c2002-02-04 05:59:25 +0000348 unsigned getReturnAddressReg() const;
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000349
Vikram S. Adve242a8082002-05-19 15:25:51 +0000350 // Number of registers used for passing int args (usually 6: %o0 - %o5)
351 // and float args (usually 32: %f0 - %f31)
352 //
Vikram S. Adve5b1b47b2003-05-25 15:59:47 +0000353 unsigned const getNumOfIntArgRegs() const { return NumOfIntArgRegs; }
354 unsigned const getNumOfFloatArgRegs() const { return NumOfFloatArgRegs; }
Vikram S. Adve242a8082002-05-19 15:25:51 +0000355
Vikram S. Adved0d06ad2003-05-31 07:32:01 +0000356 // Compute which register can be used for an argument, if any
357 //
358 int regNumForIntArg(bool inCallee, bool isVarArgsCall,
359 unsigned argNo, unsigned& regClassId) const;
360
361 int regNumForFPArg(unsigned RegType, bool inCallee, bool isVarArgsCall,
362 unsigned argNo, unsigned& regClassId) const;
363
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000364 // The following methods are used to color special live ranges (e.g.
Chris Lattnerf57b8452002-04-27 06:56:12 +0000365 // function args and return values etc.) with specific hardware registers
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000366 // as required. See SparcRegInfo.cpp for the implementation for Sparc.
367 //
Chris Lattnerb7653df2002-04-08 22:03:57 +0000368 void suggestRegs4MethodArgs(const Function *Meth,
Ruchira Sasankaab304c42001-09-30 23:19:57 +0000369 LiveRangeInfo& LRI) const;
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000370
Vikram S. Advefe09fb22002-07-08 23:34:10 +0000371 void suggestRegs4CallArgs(MachineInstr *CallMI,
Vikram S. Adve106604e2002-09-28 16:56:59 +0000372 LiveRangeInfo& LRI) const;
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000373
Vikram S. Advefe09fb22002-07-08 23:34:10 +0000374 void suggestReg4RetValue(MachineInstr *RetMI,
Chris Lattner697954c2002-01-20 22:54:45 +0000375 LiveRangeInfo& LRI) const;
Vikram S. Advefe09fb22002-07-08 23:34:10 +0000376
Vikram S. Adveada280f2003-07-29 19:54:41 +0000377 void colorMethodArgs(const Function *Meth, LiveRangeInfo& LRI,
378 std::vector<MachineInstr*>& InstrnsBefore,
379 std::vector<MachineInstr*>& InstrnsAfter) const;
Ruchira Sasankaab304c42001-09-30 23:19:57 +0000380
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000381 // method used for printing a register for debugging purposes
382 //
Vikram S. Adve78a4f232003-05-27 00:02:22 +0000383 void printReg(const LiveRange *LR) const;
Vikram S. Advefe09fb22002-07-08 23:34:10 +0000384
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000385 // returns the # of bytes of stack space allocated for each register
386 // type. For Sparc, currently we allocate 8 bytes on stack for all
387 // register types. We can optimize this later if necessary to save stack
388 // space (However, should make sure that stack alignment is correct)
389 //
Chris Lattner699683c2002-02-04 05:59:25 +0000390 inline int getSpilledRegSize(int RegType) const {
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000391 return 8;
Ruchira Sasankad00982a2002-01-07 19:20:28 +0000392 }
393
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000394
Vikram S. Advea44c6c02002-03-31 19:04:50 +0000395 // To obtain the return value and the indirect call address (if any)
396 // contained in a CALL machine instruction
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000397 //
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000398 const Value * getCallInstRetVal(const MachineInstr *CallMI) const;
Vikram S. Advea44c6c02002-03-31 19:04:50 +0000399 const Value * getCallInstIndirectAddrVal(const MachineInstr *CallMI) const;
Ruchira Sasankab3b6f532001-10-21 16:43:41 +0000400
Ruchira Sasanka2563a982002-01-07 20:28:49 +0000401 // The following methods are used to generate "copy" machine instructions
402 // for an architecture.
403 //
Vikram S. Advefe09fb22002-07-08 23:34:10 +0000404 // The function regTypeNeedsScratchReg() can be used to check whether a
405 // scratch register is needed to copy a register of type `regType' to
406 // or from memory. If so, such a scratch register can be provided by
407 // the caller (e.g., if it knows which regsiters are free); otherwise
408 // an arbitrary one will be chosen and spilled by the copy instructions.
409 //
410 bool regTypeNeedsScratchReg(int RegType,
411 int& scratchRegClassId) const;
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000412
Vikram S. Advefe09fb22002-07-08 23:34:10 +0000413 void cpReg2RegMI(std::vector<MachineInstr*>& mvec,
414 unsigned SrcReg, unsigned DestReg,
415 int RegType) const;
416
417 void cpReg2MemMI(std::vector<MachineInstr*>& mvec,
418 unsigned SrcReg, unsigned DestPtrReg,
419 int Offset, int RegType, int scratchReg = -1) const;
420
421 void cpMem2RegMI(std::vector<MachineInstr*>& mvec,
422 unsigned SrcPtrReg, int Offset, unsigned DestReg,
423 int RegType, int scratchReg = -1) const;
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000424
Vikram S. Adve242a8082002-05-19 15:25:51 +0000425 void cpValue2Value(Value *Src, Value *Dest,
Anand Shuklacfb22d32002-06-25 20:55:50 +0000426 std::vector<MachineInstr*>& mvec) const;
Ruchira Sasankaef1b0cb2001-11-03 17:13:27 +0000427
Vikram S. Adved0d06ad2003-05-31 07:32:01 +0000428 // Get the register type for a register identified different ways.
Vikram S. Adve7dc7de52003-07-25 21:12:15 +0000429 // Note that getRegTypeForLR(LR) != getRegTypeForDataType(LR->getType())!
430 // The reg class of a LR depends both on the Value types in it and whether
431 // they are CC registers or not (for example).
432 int getRegTypeForDataType(const Type* type) const;
433 int getRegTypeForLR(const LiveRange *LR) const;
Vikram S. Adved0d06ad2003-05-31 07:32:01 +0000434 int getRegType(int unifiedRegNum) const;
Ruchira Sasankac4d4b762001-10-16 01:23:19 +0000435
Chris Lattner699683c2002-02-04 05:59:25 +0000436 virtual unsigned getFramePointer() const;
437 virtual unsigned getStackPointer() const;
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000438};
439
440
441
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000442
443//---------------------------------------------------------------------------
444// class UltraSparcSchedInfo
445//
446// Purpose:
447// Interface to instruction scheduling information for UltraSPARC.
448// The parameter values above are based on UltraSPARC IIi.
449//---------------------------------------------------------------------------
450
451
Chris Lattnerd0f166a2002-12-29 03:13:05 +0000452class UltraSparcSchedInfo: public TargetSchedInfo {
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000453public:
Chris Lattner699683c2002-02-04 05:59:25 +0000454 UltraSparcSchedInfo(const TargetMachine &tgt);
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000455protected:
Chris Lattner699683c2002-02-04 05:59:25 +0000456 virtual void initializeResources();
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000457};
458
Chris Lattnerf6e0e282001-09-14 04:32:55 +0000459
460//---------------------------------------------------------------------------
Vikram S. Advec1521632001-10-22 13:31:53 +0000461// class UltraSparcFrameInfo
462//
463// Purpose:
464// Interface to stack frame layout info for the UltraSPARC.
Vikram S. Adve00521d72001-11-12 23:26:35 +0000465// Starting offsets for each area of the stack frame are aligned at
466// a multiple of getStackFrameSizeAlignment().
Vikram S. Advec1521632001-10-22 13:31:53 +0000467//---------------------------------------------------------------------------
468
Chris Lattnerda62ac62002-12-28 20:20:24 +0000469class UltraSparcFrameInfo: public TargetFrameInfo {
470 const TargetMachine &target;
Vikram S. Advec1521632001-10-22 13:31:53 +0000471public:
Chris Lattnerda62ac62002-12-28 20:20:24 +0000472 UltraSparcFrameInfo(const TargetMachine &TM)
473 : TargetFrameInfo(StackGrowsDown, StackFrameSizeAlignment, 0), target(TM) {}
Vikram S. Adve7f37fe52001-11-08 04:55:13 +0000474
475public:
Vikram S. Advee1f72802002-09-16 15:39:26 +0000476 // These methods provide constant parameters of the frame layout.
477 //
Chris Lattnerf57b8452002-04-27 06:56:12 +0000478 int getStackFrameSizeAlignment() const { return StackFrameSizeAlignment;}
479 int getMinStackFrameSize() const { return MinStackFrameSize; }
480 int getNumFixedOutgoingArgs() const { return NumFixedOutgoingArgs; }
481 int getSizeOfEachArgOnStack() const { return SizeOfEachArgOnStack; }
482 bool argsOnStackHaveFixedSize() const { return true; }
Vikram S. Adve7f37fe52001-11-08 04:55:13 +0000483
Vikram S. Advee1f72802002-09-16 15:39:26 +0000484 // This method adjusts a stack offset to meet alignment rules of target.
485 // The fixed OFFSET (0x7ff) must be subtracted and the result aligned.
486 virtual int adjustAlignment (int unalignedOffset,
487 bool growUp,
488 unsigned int align) const {
489 return unalignedOffset + (growUp? +1:-1)*((unalignedOffset-OFFSET) % align);
490 }
491
Vikram S. Adve7f37fe52001-11-08 04:55:13 +0000492 // These methods compute offsets using the frame contents for a
Chris Lattnerf57b8452002-04-27 06:56:12 +0000493 // particular function. The frame contents are obtained from the
494 // MachineCodeInfoForMethod object for the given function.
Vikram S. Adve7f37fe52001-11-08 04:55:13 +0000495 //
Misha Brukmanfce11432002-10-28 00:28:31 +0000496 int getFirstIncomingArgOffset (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 FirstIncomingArgOffsetFromFP;
501 }
Misha Brukmanfce11432002-10-28 00:28:31 +0000502 int getFirstOutgoingArgOffset (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 FirstOutgoingArgOffsetFromSP;
507 }
Misha Brukmanfce11432002-10-28 00:28:31 +0000508 int getFirstOptionalOutgoingArgOffset(MachineFunction& mcInfo,
Vikram S. Adve6d783112002-04-25 04:40:24 +0000509 bool& growUp)const
Vikram S. Adve7f37fe52001-11-08 04:55:13 +0000510 {
Vikram S. Adve6d783112002-04-25 04:40:24 +0000511 growUp = true; // arguments area grows upwards
Vikram S. Adve7f37fe52001-11-08 04:55:13 +0000512 return FirstOptionalOutgoingArgOffsetFromSP;
513 }
514
Misha Brukmanfce11432002-10-28 00:28:31 +0000515 int getFirstAutomaticVarOffset (MachineFunction& mcInfo,
Vikram S. Adve6d783112002-04-25 04:40:24 +0000516 bool& growUp) const;
Misha Brukmanfce11432002-10-28 00:28:31 +0000517 int getRegSpillAreaOffset (MachineFunction& mcInfo,
Vikram S. Adve6d783112002-04-25 04:40:24 +0000518 bool& growUp) const;
Misha Brukmanfce11432002-10-28 00:28:31 +0000519 int getTmpAreaOffset (MachineFunction& mcInfo,
Vikram S. Adve6d783112002-04-25 04:40:24 +0000520 bool& growUp) const;
Misha Brukmanfce11432002-10-28 00:28:31 +0000521 int getDynamicAreaOffset (MachineFunction& mcInfo,
Vikram S. Adve6d783112002-04-25 04:40:24 +0000522 bool& growUp) const;
Vikram S. Adve7f37fe52001-11-08 04:55:13 +0000523
524 //
525 // These methods specify the base register used for each stack area
526 // (generally FP or SP)
527 //
528 virtual int getIncomingArgBaseRegNum() const {
529 return (int) target.getRegInfo().getFramePointer();
530 }
531 virtual int getOutgoingArgBaseRegNum() const {
532 return (int) target.getRegInfo().getStackPointer();
533 }
534 virtual int getOptionalOutgoingArgBaseRegNum() const {
535 return (int) target.getRegInfo().getStackPointer();
536 }
537 virtual int getAutomaticVarBaseRegNum() const {
538 return (int) target.getRegInfo().getFramePointer();
539 }
540 virtual int getRegSpillAreaBaseRegNum() const {
541 return (int) target.getRegInfo().getFramePointer();
542 }
543 virtual int getDynamicAreaBaseRegNum() const {
544 return (int) target.getRegInfo().getStackPointer();
545 }
Chris Lattnerda62ac62002-12-28 20:20:24 +0000546
547 virtual int getIncomingArgOffset(MachineFunction& mcInfo,
548 unsigned argNum) const {
549 assert(argsOnStackHaveFixedSize());
550
551 unsigned relativeOffset = argNum * getSizeOfEachArgOnStack();
552 bool growUp; // do args grow up or down
553 int firstArg = getFirstIncomingArgOffset(mcInfo, growUp);
554 return growUp ? firstArg + relativeOffset : firstArg - relativeOffset;
555 }
556
557 virtual int getOutgoingArgOffset(MachineFunction& mcInfo,
558 unsigned argNum) const {
559 assert(argsOnStackHaveFixedSize());
560 //assert(((int) argNum - this->getNumFixedOutgoingArgs())
561 // <= (int) mcInfo.getInfo()->getMaxOptionalNumArgs());
562
563 unsigned relativeOffset = argNum * getSizeOfEachArgOnStack();
564 bool growUp; // do args grow up or down
565 int firstArg = getFirstOutgoingArgOffset(mcInfo, growUp);
566 return growUp ? firstArg + relativeOffset : firstArg - relativeOffset;
567 }
Vikram S. Adve7f37fe52001-11-08 04:55:13 +0000568
569private:
Vikram S. Advee1f72802002-09-16 15:39:26 +0000570 /*----------------------------------------------------------------------
571 This diagram shows the stack frame layout used by llc on Sparc V9.
572 Note that only the location of automatic variables, spill area,
573 temporary storage, and dynamically allocated stack area are chosen
574 by us. The rest conform to the Sparc V9 ABI.
575 All stack addresses are offset by OFFSET = 0x7ff (2047).
576
Chris Lattnerda62ac62002-12-28 20:20:24 +0000577 Alignment assumptions and other invariants:
Vikram S. Advee1f72802002-09-16 15:39:26 +0000578 (1) %sp+OFFSET and %fp+OFFSET are always aligned on 16-byte boundary
579 (2) Variables in automatic, spill, temporary, or dynamic regions
580 are aligned according to their size as in all memory accesses.
581 (3) Everything below the dynamically allocated stack area is only used
582 during a call to another function, so it is never needed when
583 the current function is active. This is why space can be allocated
584 dynamically by incrementing %sp any time within the function.
585
586 STACK FRAME LAYOUT:
587
588 ...
589 %fp+OFFSET+176 Optional extra incoming arguments# 1..N
590 %fp+OFFSET+168 Incoming argument #6
591 ... ...
592 %fp+OFFSET+128 Incoming argument #1
593 ... ...
594 ---%fp+OFFSET-0--------Bottom of caller's stack frame--------------------
595 %fp+OFFSET-8 Automatic variables <-- ****TOP OF STACK FRAME****
596 Spill area
597 Temporary storage
598 ...
599
600 %sp+OFFSET+176+8N Bottom of dynamically allocated stack area
601 %sp+OFFSET+168+8N Optional extra outgoing argument# N
602 ... ...
603 %sp+OFFSET+176 Optional extra outgoing argument# 1
604 %sp+OFFSET+168 Outgoing argument #6
605 ... ...
606 %sp+OFFSET+128 Outgoing argument #1
607 %sp+OFFSET+120 Save area for %i7
608 ... ...
609 %sp+OFFSET+0 Save area for %l0 <-- ****BOTTOM OF STACK FRAME****
610
611 *----------------------------------------------------------------------*/
612
Vikram S. Adve5afff3b2001-11-09 02:15:52 +0000613 // All stack addresses must be offset by 0x7ff (2047) on Sparc V9.
614 static const int OFFSET = (int) 0x7ff;
Vikram S. Adve7f37fe52001-11-08 04:55:13 +0000615 static const int StackFrameSizeAlignment = 16;
Vikram S. Advec1521632001-10-22 13:31:53 +0000616 static const int MinStackFrameSize = 176;
Vikram S. Adve7f37fe52001-11-08 04:55:13 +0000617 static const int NumFixedOutgoingArgs = 6;
618 static const int SizeOfEachArgOnStack = 8;
Vikram S. Adve5afff3b2001-11-09 02:15:52 +0000619 static const int FirstIncomingArgOffsetFromFP = 128 + OFFSET;
620 static const int FirstOptionalIncomingArgOffsetFromFP = 176 + OFFSET;
Vikram S. Advee1f72802002-09-16 15:39:26 +0000621 static const int StaticAreaOffsetFromFP = 0 + OFFSET;
Vikram S. Adve5afff3b2001-11-09 02:15:52 +0000622 static const int FirstOutgoingArgOffsetFromSP = 128 + OFFSET;
623 static const int FirstOptionalOutgoingArgOffsetFromSP = 176 + OFFSET;
Vikram S. Advec1521632001-10-22 13:31:53 +0000624};
625
626
Vikram S. Adve5afff3b2001-11-09 02:15:52 +0000627//---------------------------------------------------------------------------
628// class UltraSparcCacheInfo
629//
630// Purpose:
631// Interface to cache parameters for the UltraSPARC.
632// Just use defaults for now.
633//---------------------------------------------------------------------------
634
Chris Lattnerdde12622002-12-29 02:50:33 +0000635struct UltraSparcCacheInfo: public TargetCacheInfo {
636 UltraSparcCacheInfo(const TargetMachine &T) : TargetCacheInfo(T) {}
Vikram S. Adve5afff3b2001-11-09 02:15:52 +0000637};
638
Vikram S. Advec1521632001-10-22 13:31:53 +0000639
Chris Lattner48e60792003-08-13 02:38:16 +0000640/// createStackSlotsPass - External interface to stack-slots pass that enters 2
641/// empty slots at the top of each function stack
642Pass *createStackSlotsPass(const TargetMachine &TM);
643
Chris Lattner67699ff2003-09-01 20:33:07 +0000644// Interface to pre-selection pass that specializes LLVM code for a target
645// machine.
646Pass *createPreSelectionPass(TargetMachine &Target);
647
648// External interface to peephole optimization pass operating on machine code.
649FunctionPass *createPeepholeOptsPass(TargetMachine &Target);
650
Chris Lattner48e60792003-08-13 02:38:16 +0000651
Vikram S. Adved55697c2002-09-20 00:52:09 +0000652//---------------------------------------------------------------------------
Chris Lattner48e60792003-08-13 02:38:16 +0000653// class UltraSparc
Chris Lattnerf6e0e282001-09-14 04:32:55 +0000654//
655// Purpose:
656// Primary interface to machine description for the UltraSPARC.
657// Primarily just initializes machine-dependent parameters in
658// class TargetMachine, and creates machine-dependent subclasses
Vikram S. Adve339084b2001-09-18 13:04:24 +0000659// for classes such as InstrInfo, SchedInfo and RegInfo.
Chris Lattnerf6e0e282001-09-14 04:32:55 +0000660//---------------------------------------------------------------------------
661
662class UltraSparc : public TargetMachine {
Vikram S. Adve339084b2001-09-18 13:04:24 +0000663 UltraSparcInstrInfo instrInfo;
664 UltraSparcSchedInfo schedInfo;
665 UltraSparcRegInfo regInfo;
Vikram S. Advec1521632001-10-22 13:31:53 +0000666 UltraSparcFrameInfo frameInfo;
Vikram S. Adve5afff3b2001-11-09 02:15:52 +0000667 UltraSparcCacheInfo cacheInfo;
Chris Lattnerf6e0e282001-09-14 04:32:55 +0000668public:
669 UltraSparc();
Vikram S. Adved55697c2002-09-20 00:52:09 +0000670
Chris Lattner3501fea2003-01-14 22:00:31 +0000671 virtual const TargetInstrInfo &getInstrInfo() const { return instrInfo; }
Chris Lattnerd0f166a2002-12-29 03:13:05 +0000672 virtual const TargetSchedInfo &getSchedInfo() const { return schedInfo; }
673 virtual const TargetRegInfo &getRegInfo() const { return regInfo; }
Chris Lattnerda62ac62002-12-28 20:20:24 +0000674 virtual const TargetFrameInfo &getFrameInfo() const { return frameInfo; }
Chris Lattnerdde12622002-12-29 02:50:33 +0000675 virtual const TargetCacheInfo &getCacheInfo() const { return cacheInfo; }
Chris Lattner32f600a2001-09-19 13:47:12 +0000676
Chris Lattner63342052002-10-29 21:12:46 +0000677 virtual bool addPassesToEmitAssembly(PassManager &PM, std::ostream &Out);
Brian Gaeked7d6bbe2003-08-14 06:04:29 +0000678 virtual bool addPassesToJITCompile(FunctionPassManager &PM);
679 virtual bool addPassesToEmitMachineCode(FunctionPassManager &PM,
Misha Brukman79caf1f2003-05-27 22:01:10 +0000680 MachineCodeEmitter &MCE);
Brian Gaeke17b53a82003-10-20 15:17:12 +0000681 virtual void replaceMachineCodeForFunction(void *Old, void *New);
Chris Lattner4f946372002-10-28 01:03:43 +0000682
Chris Lattnerc66583e2002-10-29 22:01:44 +0000683 // getPrologEpilogInsertionPass - Inserts prolog/epilog code.
Brian Gaeked7d6bbe2003-08-14 06:04:29 +0000684 FunctionPass* getPrologEpilogInsertionPass();
Chris Lattnerf6e0e282001-09-14 04:32:55 +0000685
Vikram S. Advee1f72802002-09-16 15:39:26 +0000686 // getFunctionAsmPrinterPass - Writes out machine code for a single function
Chris Lattnerc66583e2002-10-29 22:01:44 +0000687 Pass* getFunctionAsmPrinterPass(std::ostream &Out);
Vikram S. Advee1f72802002-09-16 15:39:26 +0000688
689 // getModuleAsmPrinterPass - Writes generated machine code to assembly file.
Chris Lattnerc66583e2002-10-29 22:01:44 +0000690 Pass* getModuleAsmPrinterPass(std::ostream &Out);
Vikram S. Advee1f72802002-09-16 15:39:26 +0000691
Brian Gaeke79c98032003-09-18 17:37:46 +0000692 // getBytecodeAsmPrinterPass - Emits final LLVM bytecode to assembly file.
693 Pass* getBytecodeAsmPrinterPass(std::ostream &Out);
Chris Lattner6edfcc52002-02-03 07:51:17 +0000694};
Chris Lattnerf6e0e282001-09-14 04:32:55 +0000695
Chris Lattnerc6495ee2001-09-14 03:56:45 +0000696#endif