ARMScheduleV6.td revision 199511
1//===- ARMScheduleV6.td - ARM v6 Scheduling Definitions ----*- tablegen -*-===//
2// 
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7// 
8//===----------------------------------------------------------------------===//
9//
10// This file defines the itinerary class data for the ARM v6 processors.
11//
12//===----------------------------------------------------------------------===//
13
14// Model based on ARM1176
15//
16// Scheduling information derived from "ARM1176JZF-S Technical Reference Manual".
17//
18def ARMV6Itineraries : ProcessorItineraries<[
19  //
20  // No operand cycles
21  InstrItinData<IIC_iALUx    , [InstrStage<1, [FU_Pipe0]>]>,
22  //
23  // Binary Instructions that produce a result
24  InstrItinData<IIC_iALUi    , [InstrStage<1, [FU_Pipe0]>], [2, 2]>,
25  InstrItinData<IIC_iALUr    , [InstrStage<1, [FU_Pipe0]>], [2, 2, 2]>,
26  InstrItinData<IIC_iALUsi   , [InstrStage<1, [FU_Pipe0]>], [2, 2, 1]>,
27  InstrItinData<IIC_iALUsr   , [InstrStage<2, [FU_Pipe0]>], [3, 3, 2, 1]>,
28  //
29  // Unary Instructions that produce a result
30  InstrItinData<IIC_iUNAr    , [InstrStage<1, [FU_Pipe0]>], [2, 2]>,
31  InstrItinData<IIC_iUNAsi   , [InstrStage<1, [FU_Pipe0]>], [2, 1]>,
32  InstrItinData<IIC_iUNAsr   , [InstrStage<2, [FU_Pipe0]>], [3, 2, 1]>,
33  //
34  // Compare instructions
35  InstrItinData<IIC_iCMPi    , [InstrStage<1, [FU_Pipe0]>], [2]>,
36  InstrItinData<IIC_iCMPr    , [InstrStage<1, [FU_Pipe0]>], [2, 2]>,
37  InstrItinData<IIC_iCMPsi   , [InstrStage<1, [FU_Pipe0]>], [2, 1]>,
38  InstrItinData<IIC_iCMPsr   , [InstrStage<2, [FU_Pipe0]>], [3, 2, 1]>,
39  //
40  // Move instructions, unconditional
41  InstrItinData<IIC_iMOVi    , [InstrStage<1, [FU_Pipe0]>], [2]>,
42  InstrItinData<IIC_iMOVr    , [InstrStage<1, [FU_Pipe0]>], [2, 2]>,
43  InstrItinData<IIC_iMOVsi   , [InstrStage<1, [FU_Pipe0]>], [2, 1]>,
44  InstrItinData<IIC_iMOVsr   , [InstrStage<2, [FU_Pipe0]>], [3, 2, 1]>,
45  //
46  // Move instructions, conditional
47  InstrItinData<IIC_iCMOVi   , [InstrStage<1, [FU_Pipe0]>], [3]>,
48  InstrItinData<IIC_iCMOVr   , [InstrStage<1, [FU_Pipe0]>], [3, 2]>,
49  InstrItinData<IIC_iCMOVsi  , [InstrStage<1, [FU_Pipe0]>], [3, 1]>,
50  InstrItinData<IIC_iCMOVsr  , [InstrStage<1, [FU_Pipe0]>], [4, 2, 1]>,
51
52  // Integer multiply pipeline
53  //
54  InstrItinData<IIC_iMUL16   , [InstrStage<1, [FU_Pipe0]>], [4, 1, 1]>,
55  InstrItinData<IIC_iMAC16   , [InstrStage<1, [FU_Pipe0]>], [4, 1, 1, 2]>,
56  InstrItinData<IIC_iMUL32   , [InstrStage<2, [FU_Pipe0]>], [5, 1, 1]>,
57  InstrItinData<IIC_iMAC32   , [InstrStage<2, [FU_Pipe0]>], [5, 1, 1, 2]>,
58  InstrItinData<IIC_iMUL64   , [InstrStage<3, [FU_Pipe0]>], [6, 1, 1]>,
59  InstrItinData<IIC_iMAC64   , [InstrStage<3, [FU_Pipe0]>], [6, 1, 1, 2]>,
60  
61  // Integer load pipeline
62  //
63  // Immediate offset
64  InstrItinData<IIC_iLoadi   , [InstrStage<1, [FU_Pipe0]>], [4, 1]>,
65  //
66  // Register offset
67  InstrItinData<IIC_iLoadr   , [InstrStage<1, [FU_Pipe0]>], [4, 1, 1]>,
68  //
69  // Scaled register offset, issues over 2 cycles
70  InstrItinData<IIC_iLoadsi  , [InstrStage<2, [FU_Pipe0]>], [5, 2, 1]>,
71  //
72  // Immediate offset with update
73  InstrItinData<IIC_iLoadiu  , [InstrStage<1, [FU_Pipe0]>], [4, 2, 1]>,
74  //
75  // Register offset with update
76  InstrItinData<IIC_iLoadru  , [InstrStage<1, [FU_Pipe0]>], [4, 2, 1, 1]>,
77  //
78  // Scaled register offset with update, issues over 2 cycles
79  InstrItinData<IIC_iLoadsiu , [InstrStage<2, [FU_Pipe0]>], [5, 2, 2, 1]>,
80
81  //
82  // Load multiple
83  InstrItinData<IIC_iLoadm   , [InstrStage<3, [FU_Pipe0]>]>,
84
85  // Integer store pipeline
86  //
87  // Immediate offset
88  InstrItinData<IIC_iStorei  , [InstrStage<1, [FU_Pipe0]>], [2, 1]>,
89  //
90  // Register offset
91  InstrItinData<IIC_iStorer  , [InstrStage<1, [FU_Pipe0]>], [2, 1, 1]>,
92
93  //
94  // Scaled register offset, issues over 2 cycles
95  InstrItinData<IIC_iStoresi , [InstrStage<2, [FU_Pipe0]>], [2, 2, 1]>,
96  //
97  // Immediate offset with update
98  InstrItinData<IIC_iStoreiu , [InstrStage<1, [FU_Pipe0]>], [2, 2, 1]>,
99  //
100  // Register offset with update
101  InstrItinData<IIC_iStoreru , [InstrStage<1, [FU_Pipe0]>], [2, 2, 1, 1]>,
102  //
103  // Scaled register offset with update, issues over 2 cycles
104  InstrItinData<IIC_iStoresiu, [InstrStage<2, [FU_Pipe0]>], [2, 2, 2, 1]>,
105  //
106  // Store multiple
107  InstrItinData<IIC_iStorem   , [InstrStage<3, [FU_Pipe0]>]>,
108  
109  // Branch
110  //
111  // no delay slots, so the latency of a branch is unimportant
112  InstrItinData<IIC_Br      , [InstrStage<1, [FU_Pipe0]>]>,
113
114  // VFP
115  // Issue through integer pipeline, and execute in NEON unit. We assume
116  // RunFast mode so that NFP pipeline is used for single-precision when
117  // possible.
118  //
119  // FP Special Register to Integer Register File Move
120  InstrItinData<IIC_fpSTAT , [InstrStage<1, [FU_Pipe0]>], [3]>,
121  //
122  // Single-precision FP Unary
123  InstrItinData<IIC_fpUNA32 , [InstrStage<1, [FU_Pipe0]>], [5, 2]>,
124  //
125  // Double-precision FP Unary
126  InstrItinData<IIC_fpUNA64 , [InstrStage<1, [FU_Pipe0]>], [5, 2]>,
127  //
128  // Single-precision FP Compare
129  InstrItinData<IIC_fpCMP32 , [InstrStage<1, [FU_Pipe0]>], [2, 2]>,
130  //
131  // Double-precision FP Compare
132  InstrItinData<IIC_fpCMP64 , [InstrStage<1, [FU_Pipe0]>], [2, 2]>,
133  //
134  // Single to Double FP Convert
135  InstrItinData<IIC_fpCVTSD , [InstrStage<1, [FU_Pipe0]>], [5, 2]>,
136  //
137  // Double to Single FP Convert
138  InstrItinData<IIC_fpCVTDS , [InstrStage<1, [FU_Pipe0]>], [5, 2]>,
139  //
140  // Single-Precision FP to Integer Convert
141  InstrItinData<IIC_fpCVTSI , [InstrStage<1, [FU_Pipe0]>], [9, 2]>,
142  //
143  // Double-Precision FP to Integer Convert
144  InstrItinData<IIC_fpCVTDI , [InstrStage<1, [FU_Pipe0]>], [9, 2]>,
145  //
146  // Integer to Single-Precision FP Convert
147  InstrItinData<IIC_fpCVTIS , [InstrStage<1, [FU_Pipe0]>], [9, 2]>,
148  //
149  // Integer to Double-Precision FP Convert
150  InstrItinData<IIC_fpCVTID , [InstrStage<1, [FU_Pipe0]>], [9, 2]>,
151  //
152  // Single-precision FP ALU
153  InstrItinData<IIC_fpALU32 , [InstrStage<1, [FU_Pipe0]>], [9, 2, 2]>,
154  //
155  // Double-precision FP ALU
156  InstrItinData<IIC_fpALU64 , [InstrStage<1, [FU_Pipe0]>], [9, 2, 2]>,
157  //
158  // Single-precision FP Multiply
159  InstrItinData<IIC_fpMUL32 , [InstrStage<1, [FU_Pipe0]>], [9, 2, 2]>,
160  //
161  // Double-precision FP Multiply
162  InstrItinData<IIC_fpMUL64 , [InstrStage<2, [FU_Pipe0]>], [9, 2, 2]>,
163  //
164  // Single-precision FP MAC
165  InstrItinData<IIC_fpMAC32 , [InstrStage<1, [FU_Pipe0]>], [9, 2, 2, 2]>,
166  //
167  // Double-precision FP MAC
168  InstrItinData<IIC_fpMAC64 , [InstrStage<2, [FU_Pipe0]>], [9, 2, 2, 2]>,
169  //
170  // Single-precision FP DIV
171  InstrItinData<IIC_fpDIV32 , [InstrStage<15, [FU_Pipe0]>], [20, 2, 2]>,
172  //
173  // Double-precision FP DIV
174  InstrItinData<IIC_fpDIV64 , [InstrStage<29, [FU_Pipe0]>], [34, 2, 2]>,
175  //
176  // Single-precision FP SQRT
177  InstrItinData<IIC_fpSQRT32 , [InstrStage<15, [FU_Pipe0]>], [20, 2, 2]>,
178  //
179  // Double-precision FP SQRT
180  InstrItinData<IIC_fpSQRT64 , [InstrStage<29, [FU_Pipe0]>], [34, 2, 2]>,
181  //
182  // Single-precision FP Load
183  InstrItinData<IIC_fpLoad32 , [InstrStage<1, [FU_Pipe0]>], [5, 2, 2]>,
184  //
185  // Double-precision FP Load
186  InstrItinData<IIC_fpLoad64 , [InstrStage<1, [FU_Pipe0]>], [5, 2, 2]>,
187  //
188  // FP Load Multiple
189  InstrItinData<IIC_fpLoadm , [InstrStage<3, [FU_Pipe0]>]>,
190  //
191  // Single-precision FP Store
192  InstrItinData<IIC_fpStore32 , [InstrStage<1, [FU_Pipe0]>], [2, 2, 2]>,
193  //
194  // Double-precision FP Store
195  // use FU_Issue to enforce the 1 load/store per cycle limit
196  InstrItinData<IIC_fpStore64 , [InstrStage<1, [FU_Pipe0]>], [2, 2, 2]>,
197  //
198  // FP Store Multiple
199  InstrItinData<IIC_fpStorem , [InstrStage<3, [FU_Pipe0]>]>
200]>;
201