blob: f2caf388423108e1332c4542741ceb1959d9f10d [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
21
Vikram S. Adve0fb49802001-09-18 13:01:29 +000022//***************************** Internal Functions *************************/
23
24//----------------------------------------------------------------------------
Chris Lattner46cbff62001-09-14 16:56:32 +000025// allocateSparcTargetMachine - Allocate and return a subclass of TargetMachine
26// that implements the Sparc backend. (the llvm/CodeGen/Sparc.h interface)
Vikram S. Adve0fb49802001-09-18 13:01:29 +000027//----------------------------------------------------------------------------
Chris Lattner46cbff62001-09-14 16:56:32 +000028//
29TargetMachine *allocateSparcTargetMachine() { return new UltraSparc(); }
Chris Lattner20b1ea02001-09-14 03:47:57 +000030
31
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +000032
Vikram S. Adve0fb49802001-09-18 13:01:29 +000033//----------------------------------------------------------------------------
34// Entry point for register allocation for a module
35//----------------------------------------------------------------------------
36
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +000037void AllocateRegisters(Method *M, TargetMachine &TM)
Vikram S. Adve0fb49802001-09-18 13:01:29 +000038{
39
40 if ( (M)->isExternal() ) // don't process prototypes
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +000041 return;
Vikram S. Adve0fb49802001-09-18 13:01:29 +000042
43 if( DEBUG_RA ) {
44 cout << endl << "******************** Method "<< (M)->getName();
45 cout << " ********************" <<endl;
46 }
47
48 MethodLiveVarInfo LVI(M ); // Analyze live varaibles
49 LVI.analyze();
50
51
52 PhyRegAlloc PRA(M, TM , &LVI); // allocate registers
53 PRA.allocateRegisters();
54
55
56 if( DEBUG_RA ) cout << endl << "Register allocation complete!" << endl;
57
Vikram S. Adve0fb49802001-09-18 13:01:29 +000058}
59
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +000060
61
62
Vikram S. Adve0fb49802001-09-18 13:01:29 +000063//***************************** External Classes **************************/
64
65
Chris Lattner20b1ea02001-09-14 03:47:57 +000066//---------------------------------------------------------------------------
67// class UltraSparcInstrInfo
68//
69// Purpose:
70// Information about individual instructions.
71// Most information is stored in the SparcMachineInstrDesc array above.
72// Other information is computed on demand, and most such functions
73// default to member functions in base class MachineInstrInfo.
74//---------------------------------------------------------------------------
75
76/*ctor*/
77UltraSparcInstrInfo::UltraSparcInstrInfo()
78 : MachineInstrInfo(SparcMachineInstrDesc,
79 /*descSize = */ NUM_TOTAL_OPCODES,
80 /*numRealOpCodes = */ NUM_REAL_OPCODES)
81{
82}
83
84
85//---------------------------------------------------------------------------
86// class UltraSparcSchedInfo
87//
88// Purpose:
89// Scheduling information for the UltraSPARC.
90// Primarily just initializes machine-dependent parameters in
91// class MachineSchedInfo.
92//---------------------------------------------------------------------------
93
94/*ctor*/
95UltraSparcSchedInfo::UltraSparcSchedInfo(const MachineInstrInfo* mii)
96 : MachineSchedInfo((unsigned int) SPARC_NUM_SCHED_CLASSES,
97 mii,
98 SparcRUsageDesc,
99 SparcInstrUsageDeltas,
100 SparcInstrIssueDeltas,
101 sizeof(SparcInstrUsageDeltas)/sizeof(InstrRUsageDelta),
102 sizeof(SparcInstrIssueDeltas)/sizeof(InstrIssueDelta))
103{
104 maxNumIssueTotal = 4;
105 longestIssueConflict = 0; // computed from issuesGaps[]
106
107 branchMispredictPenalty = 4; // 4 for SPARC IIi
108 branchTargetUnknownPenalty = 2; // 2 for SPARC IIi
109 l1DCacheMissPenalty = 8; // 7 or 9 for SPARC IIi
110 l1ICacheMissPenalty = 8; // ? for SPARC IIi
111
112 inOrderLoads = true; // true for SPARC IIi
113 inOrderIssue = true; // true for SPARC IIi
114 inOrderExec = false; // false for most architectures
115 inOrderRetire= true; // true for most architectures
116
117 // must be called after above parameters are initialized.
118 this->initializeResources();
119}
120
121void
122UltraSparcSchedInfo::initializeResources()
123{
124 // Compute MachineSchedInfo::instrRUsages and MachineSchedInfo::issueGaps
125 MachineSchedInfo::initializeResources();
126
127 // Machine-dependent fixups go here. None for now.
128}
129
130
Ruchira Sasankae38bd5332001-09-15 00:30:44 +0000131
Ruchira Sasankae38bd5332001-09-15 00:30:44 +0000132
Chris Lattner20b1ea02001-09-14 03:47:57 +0000133//---------------------------------------------------------------------------
134// class UltraSparcMachine
135//
136// Purpose:
137// Primary interface to machine description for the UltraSPARC.
138// Primarily just initializes machine-dependent parameters in
139// class TargetMachine, and creates machine-dependent subclasses
140// for classes such as MachineInstrInfo.
141//
142//---------------------------------------------------------------------------
143
Vikram S. Adve0fb49802001-09-18 13:01:29 +0000144UltraSparc::UltraSparc()
145 : TargetMachine("UltraSparc-Native"),
146 instrInfo(),
147 schedInfo(&instrInfo),
148 regInfo( this )
149{
Chris Lattner20b1ea02001-09-14 03:47:57 +0000150 optSizeForSubWordData = 4;
151 minMemOpWordSize = 8;
152 maxAtomicMemOpWordSize = 8;
Chris Lattner20b1ea02001-09-14 03:47:57 +0000153}
154
Ruchira Sasankae38bd5332001-09-15 00:30:44 +0000155
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000156
157
158
159bool UltraSparc::compileMethod(Method *M) {
160
Vikram S. Adve0fb49802001-09-18 13:01:29 +0000161 if (SelectInstructionsForMethod(M, *this))
162 {
163 cerr << "Instruction selection failed for method " << M->getName()
164 << "\n\n";
165 return true;
166 }
Ruchira Sasankae38bd5332001-09-15 00:30:44 +0000167
Vikram S. Adve0fb49802001-09-18 13:01:29 +0000168 if (ScheduleInstructionsWithSSA(M, *this))
169 {
170 cerr << "Instruction scheduling before allocation failed for method "
171 << M->getName() << "\n\n";
172 return true;
173 }
Chris Lattner20b1ea02001-09-14 03:47:57 +0000174
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000175 AllocateRegisters(M, *this); // allocate registers
176
177
Chris Lattner20b1ea02001-09-14 03:47:57 +0000178 return false;
179}
Chris Lattnerf6e0e282001-09-14 04:32:55 +0000180
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000181
182