blob: 23188df7e64e36d6196397f46a575b75de4d15ab [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//---------------------------------------------------------------------------
Chris Lattner20b1ea02001-09-14 03:47:57 +000069// class UltraSparcSchedInfo
70//
71// Purpose:
72// Scheduling information for the UltraSPARC.
73// Primarily just initializes machine-dependent parameters in
74// class MachineSchedInfo.
75//---------------------------------------------------------------------------
76
77/*ctor*/
78UltraSparcSchedInfo::UltraSparcSchedInfo(const MachineInstrInfo* mii)
79 : MachineSchedInfo((unsigned int) SPARC_NUM_SCHED_CLASSES,
80 mii,
81 SparcRUsageDesc,
82 SparcInstrUsageDeltas,
83 SparcInstrIssueDeltas,
84 sizeof(SparcInstrUsageDeltas)/sizeof(InstrRUsageDelta),
85 sizeof(SparcInstrIssueDeltas)/sizeof(InstrIssueDelta))
86{
87 maxNumIssueTotal = 4;
88 longestIssueConflict = 0; // computed from issuesGaps[]
89
90 branchMispredictPenalty = 4; // 4 for SPARC IIi
91 branchTargetUnknownPenalty = 2; // 2 for SPARC IIi
92 l1DCacheMissPenalty = 8; // 7 or 9 for SPARC IIi
93 l1ICacheMissPenalty = 8; // ? for SPARC IIi
94
95 inOrderLoads = true; // true for SPARC IIi
96 inOrderIssue = true; // true for SPARC IIi
97 inOrderExec = false; // false for most architectures
98 inOrderRetire= true; // true for most architectures
99
100 // must be called after above parameters are initialized.
101 this->initializeResources();
102}
103
104void
105UltraSparcSchedInfo::initializeResources()
106{
107 // Compute MachineSchedInfo::instrRUsages and MachineSchedInfo::issueGaps
108 MachineSchedInfo::initializeResources();
109
110 // Machine-dependent fixups go here. None for now.
111}
112
113
Ruchira Sasankae38bd5332001-09-15 00:30:44 +0000114
Ruchira Sasankae38bd5332001-09-15 00:30:44 +0000115
Chris Lattner20b1ea02001-09-14 03:47:57 +0000116//---------------------------------------------------------------------------
117// class UltraSparcMachine
118//
119// Purpose:
120// Primary interface to machine description for the UltraSPARC.
121// Primarily just initializes machine-dependent parameters in
122// class TargetMachine, and creates machine-dependent subclasses
123// for classes such as MachineInstrInfo.
124//
125//---------------------------------------------------------------------------
126
Vikram S. Adve0fb49802001-09-18 13:01:29 +0000127UltraSparc::UltraSparc()
128 : TargetMachine("UltraSparc-Native"),
129 instrInfo(),
130 schedInfo(&instrInfo),
131 regInfo( this )
132{
Chris Lattner20b1ea02001-09-14 03:47:57 +0000133 optSizeForSubWordData = 4;
134 minMemOpWordSize = 8;
135 maxAtomicMemOpWordSize = 8;
Chris Lattner20b1ea02001-09-14 03:47:57 +0000136}
137
Ruchira Sasankae38bd5332001-09-15 00:30:44 +0000138
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000139
140
141
142bool UltraSparc::compileMethod(Method *M) {
143
Vikram S. Adve0fb49802001-09-18 13:01:29 +0000144 if (SelectInstructionsForMethod(M, *this))
145 {
146 cerr << "Instruction selection failed for method " << M->getName()
147 << "\n\n";
148 return true;
149 }
Ruchira Sasankae38bd5332001-09-15 00:30:44 +0000150
Vikram S. Adve0fb49802001-09-18 13:01:29 +0000151 if (ScheduleInstructionsWithSSA(M, *this))
152 {
153 cerr << "Instruction scheduling before allocation failed for method "
154 << M->getName() << "\n\n";
155 return true;
156 }
Chris Lattner20b1ea02001-09-14 03:47:57 +0000157
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000158 AllocateRegisters(M, *this); // allocate registers
159
160
Chris Lattner20b1ea02001-09-14 03:47:57 +0000161 return false;
162}
Chris Lattnerf6e0e282001-09-14 04:32:55 +0000163
Ruchira Sasanka89fb46b2001-09-18 22:52:44 +0000164
165