blob: 9de9bc9cadc26a6607e67214e41a64ca448b9d91 [file] [log] [blame]
Vikram S. Adve0fb49802001-09-18 13:01:29 +00001// $Id$
Chris Lattner20b1ea02001-09-14 03:47:57 +00002//***************************************************************************
3// File:
4// Sparc.cpp
5//
6// Purpose:
7//
8// History:
9// 7/15/01 - Vikram Adve - Created
10//**************************************************************************/
11
Chris Lattner46cbff62001-09-14 16:56:32 +000012#include "llvm/Target/Sparc.h"
Chris Lattner20b1ea02001-09-14 03:47:57 +000013#include "SparcInternals.h"
14#include "llvm/Method.h"
15#include "llvm/CodeGen/InstrScheduling.h"
16#include "llvm/CodeGen/InstrSelection.h"
17
Ruchira Sasankae38bd5332001-09-15 00:30:44 +000018#include "llvm/Analysis/LiveVar/MethodLiveVarInfo.h"
19#include "llvm/CodeGen/PhyRegAlloc.h"
20
Chris Lattner9a3d63b2001-09-19 15:56:23 +000021// Build the MachineInstruction Description Array...
22const MachineInstrDescriptor SparcMachineInstrDesc[] = {
23#define I(ENUM, OPCODESTRING, NUMOPERANDS, RESULTPOS, MAXIMM, IMMSE, \
24 NUMDELAYSLOTS, LATENCY, SCHEDCLASS, INSTFLAGS) \
25 { OPCODESTRING, NUMOPERANDS, RESULTPOS, MAXIMM, IMMSE, \
26 NUMDELAYSLOTS, LATENCY, SCHEDCLASS, INSTFLAGS },
27#include "SparcInstr.def"
28};
Vikram S. Adve0fb49802001-09-18 13:01:29 +000029
30//----------------------------------------------------------------------------
Chris Lattner46cbff62001-09-14 16:56:32 +000031// allocateSparcTargetMachine - Allocate and return a subclass of TargetMachine
32// that implements the Sparc backend. (the llvm/CodeGen/Sparc.h interface)
Vikram S. Adve0fb49802001-09-18 13:01:29 +000033//----------------------------------------------------------------------------
Chris Lattner46cbff62001-09-14 16:56:32 +000034//
Ruchira Sasankacc3ccac2001-10-15 16:25:28 +000035
Chris Lattner46cbff62001-09-14 16:56:32 +000036TargetMachine *allocateSparcTargetMachine() { return new UltraSparc(); }
Chris Lattner20b1ea02001-09-14 03:47:57 +000037
38
Vikram S. Adve0fb49802001-09-18 13:01:29 +000039//----------------------------------------------------------------------------
40// Entry point for register allocation for a module
41//----------------------------------------------------------------------------
42
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +000043void AllocateRegisters(Method *M, TargetMachine &TM)
Vikram S. Adve0fb49802001-09-18 13:01:29 +000044{
45
46 if ( (M)->isExternal() ) // don't process prototypes
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +000047 return;
Vikram S. Adve0fb49802001-09-18 13:01:29 +000048
49 if( DEBUG_RA ) {
Chris Lattner1e23ed72001-10-15 18:15:27 +000050 cerr << endl << "******************** Method "<< (M)->getName();
51 cerr << " ********************" <<endl;
Vikram S. Adve0fb49802001-09-18 13:01:29 +000052 }
53
54 MethodLiveVarInfo LVI(M ); // Analyze live varaibles
55 LVI.analyze();
56
57
58 PhyRegAlloc PRA(M, TM , &LVI); // allocate registers
59 PRA.allocateRegisters();
60
61
Chris Lattner1e23ed72001-10-15 18:15:27 +000062 if( DEBUG_RA ) cerr << endl << "Register allocation complete!" << endl;
Vikram S. Adve0fb49802001-09-18 13:01:29 +000063
Vikram S. Adve0fb49802001-09-18 13:01:29 +000064}
65
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +000066
67
Chris Lattner20b1ea02001-09-14 03:47:57 +000068//---------------------------------------------------------------------------
69// class UltraSparcInstrInfo
70//
71// Purpose:
72// Information about individual instructions.
73// Most information is stored in the SparcMachineInstrDesc array above.
74// Other information is computed on demand, and most such functions
75// default to member functions in base class MachineInstrInfo.
76//---------------------------------------------------------------------------
77
78/*ctor*/
79UltraSparcInstrInfo::UltraSparcInstrInfo()
80 : MachineInstrInfo(SparcMachineInstrDesc,
81 /*descSize = */ NUM_TOTAL_OPCODES,
82 /*numRealOpCodes = */ NUM_REAL_OPCODES)
83{
84}
85
86
87//---------------------------------------------------------------------------
88// class UltraSparcSchedInfo
89//
90// Purpose:
91// Scheduling information for the UltraSPARC.
92// Primarily just initializes machine-dependent parameters in
93// class MachineSchedInfo.
94//---------------------------------------------------------------------------
95
96/*ctor*/
97UltraSparcSchedInfo::UltraSparcSchedInfo(const MachineInstrInfo* mii)
98 : MachineSchedInfo((unsigned int) SPARC_NUM_SCHED_CLASSES,
99 mii,
100 SparcRUsageDesc,
101 SparcInstrUsageDeltas,
102 SparcInstrIssueDeltas,
103 sizeof(SparcInstrUsageDeltas)/sizeof(InstrRUsageDelta),
104 sizeof(SparcInstrIssueDeltas)/sizeof(InstrIssueDelta))
105{
106 maxNumIssueTotal = 4;
107 longestIssueConflict = 0; // computed from issuesGaps[]
108
109 branchMispredictPenalty = 4; // 4 for SPARC IIi
110 branchTargetUnknownPenalty = 2; // 2 for SPARC IIi
111 l1DCacheMissPenalty = 8; // 7 or 9 for SPARC IIi
112 l1ICacheMissPenalty = 8; // ? for SPARC IIi
113
114 inOrderLoads = true; // true for SPARC IIi
115 inOrderIssue = true; // true for SPARC IIi
116 inOrderExec = false; // false for most architectures
117 inOrderRetire= true; // true for most architectures
118
119 // must be called after above parameters are initialized.
120 this->initializeResources();
121}
122
123void
124UltraSparcSchedInfo::initializeResources()
125{
126 // Compute MachineSchedInfo::instrRUsages and MachineSchedInfo::issueGaps
127 MachineSchedInfo::initializeResources();
128
129 // Machine-dependent fixups go here. None for now.
130}
131
132
Ruchira Sasankae38bd5332001-09-15 00:30:44 +0000133
Ruchira Sasankae38bd5332001-09-15 00:30:44 +0000134
Chris Lattner20b1ea02001-09-14 03:47:57 +0000135//---------------------------------------------------------------------------
136// class UltraSparcMachine
137//
138// Purpose:
139// Primary interface to machine description for the UltraSPARC.
140// Primarily just initializes machine-dependent parameters in
141// class TargetMachine, and creates machine-dependent subclasses
142// for classes such as MachineInstrInfo.
143//
144//---------------------------------------------------------------------------
145
Vikram S. Adve0fb49802001-09-18 13:01:29 +0000146UltraSparc::UltraSparc()
147 : TargetMachine("UltraSparc-Native"),
148 instrInfo(),
149 schedInfo(&instrInfo),
150 regInfo( this )
151{
Chris Lattner20b1ea02001-09-14 03:47:57 +0000152 optSizeForSubWordData = 4;
153 minMemOpWordSize = 8;
154 maxAtomicMemOpWordSize = 8;
Chris Lattner20b1ea02001-09-14 03:47:57 +0000155}
156
Ruchira Sasankae38bd5332001-09-15 00:30:44 +0000157
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000158
159
160
161bool UltraSparc::compileMethod(Method *M) {
162
Vikram S. Adve0fb49802001-09-18 13:01:29 +0000163 if (SelectInstructionsForMethod(M, *this))
164 {
165 cerr << "Instruction selection failed for method " << M->getName()
166 << "\n\n";
167 return true;
168 }
Ruchira Sasankae38bd5332001-09-15 00:30:44 +0000169
Vikram S. Adve0fb49802001-09-18 13:01:29 +0000170 if (ScheduleInstructionsWithSSA(M, *this))
171 {
172 cerr << "Instruction scheduling before allocation failed for method "
173 << M->getName() << "\n\n";
174 return true;
175 }
Chris Lattner20b1ea02001-09-14 03:47:57 +0000176
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000177 AllocateRegisters(M, *this); // allocate registers
178
179
Chris Lattner20b1ea02001-09-14 03:47:57 +0000180 return false;
181}
Chris Lattnerf6e0e282001-09-14 04:32:55 +0000182
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000183
184