blob: a8d75d6eebcce8168ec9c21ba43290efa220ff8c [file] [log] [blame]
Anton Korobeynikov090323a2010-04-07 18:22:11 +00001//=- ARMScheduleA9.td - ARM Cortex-A9 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 Cortex A9 processors.
11//
12//===----------------------------------------------------------------------===//
13
14//
15// Ad-hoc scheduling information derived from pretty vague "Cortex-A9 Technical
16// Reference Manual".
17//
Anton Korobeynikov7d62e332010-04-18 20:31:01 +000018// Functional units
19def A9_Issue : FuncUnit; // issue
20def A9_Pipe0 : FuncUnit; // pipeline 0
21def A9_Pipe1 : FuncUnit; // pipeline 1
22def A9_LSPipe : FuncUnit; // LS pipe
23def A9_NPipe : FuncUnit; // NEON ALU/MUL pipe
24def A9_DRegsVFP: FuncUnit; // FP register set, VFP side
25def A9_DRegsN : FuncUnit; // FP register set, NEON side
26
27// Dual issue pipeline represented by A9_Pipe0 | A9_Pipe1
Anton Korobeynikov090323a2010-04-07 18:22:11 +000028//
Anton Korobeynikov7d62e332010-04-18 20:31:01 +000029def CortexA9Itineraries : ProcessorItineraries<
30 [A9_NPipe, A9_DRegsN, A9_DRegsVFP, A9_LSPipe, A9_Pipe0, A9_Pipe1, A9_Issue], [
Anton Korobeynikov94d7fd82010-05-29 19:25:17 +000031 // Two fully-pipelined integer ALU pipelines
32 // FIXME: There are no operand latencies for these instructions at all!
33 //
34 // Move instructions, unconditional
35 InstrItinData<IIC_iMOVi , [InstrStage<1, [A9_Pipe0, A9_Pipe1]>], [1]>,
36 InstrItinData<IIC_iMOVr , [InstrStage<1, [A9_Pipe0, A9_Pipe1]>], [1, 1]>,
37 InstrItinData<IIC_iMOVsi , [InstrStage<1, [A9_Pipe0, A9_Pipe1]>], [1, 1]>,
38 InstrItinData<IIC_iMOVsr , [InstrStage<2, [A9_Pipe0, A9_Pipe1]>], [2, 2, 1]>,
39 //
40 // No operand cycles
41 InstrItinData<IIC_iALUx , [InstrStage<1, [A9_Pipe0, A9_Pipe1]>]>,
42 //
43 // Binary Instructions that produce a result
44 InstrItinData<IIC_iALUi , [InstrStage<1, [A9_Pipe0, A9_Pipe1]>], [2, 2]>,
45 InstrItinData<IIC_iALUr , [InstrStage<1, [A9_Pipe0, A9_Pipe1]>], [2, 2, 2]>,
46 InstrItinData<IIC_iALUsi , [InstrStage<2, [A9_Pipe0, A9_Pipe1]>], [2, 2, 1]>,
47 InstrItinData<IIC_iALUsr , [InstrStage<3, [A9_Pipe0, A9_Pipe1]>], [2, 2, 1, 1]>,
48 //
49 // Unary Instructions that produce a result
50 InstrItinData<IIC_iUNAr , [InstrStage<1, [A9_Pipe0, A9_Pipe1]>], [2, 2]>,
51 InstrItinData<IIC_iUNAsi , [InstrStage<2, [A9_Pipe0, A9_Pipe1]>], [2, 1]>,
52 InstrItinData<IIC_iUNAsr , [InstrStage<3, [A9_Pipe0, A9_Pipe1]>], [2, 1, 1]>,
53 //
54 // Compare instructions
55 InstrItinData<IIC_iCMPi , [InstrStage<1, [A9_Pipe0, A9_Pipe1]>], [2]>,
56 InstrItinData<IIC_iCMPr , [InstrStage<1, [A9_Pipe0, A9_Pipe1]>], [2, 2]>,
57 InstrItinData<IIC_iCMPsi , [InstrStage<2, [A9_Pipe0, A9_Pipe1]>], [2, 1]>,
58 InstrItinData<IIC_iCMPsr , [InstrStage<3, [A9_Pipe0, A9_Pipe1]>], [2, 1, 1]>,
59 //
60 // Move instructions, conditional
61 InstrItinData<IIC_iCMOVi , [InstrStage<1, [A9_Pipe0, A9_Pipe1]>], [2]>,
62 InstrItinData<IIC_iCMOVr , [InstrStage<1, [A9_Pipe0, A9_Pipe1]>], [2, 1]>,
63 InstrItinData<IIC_iCMOVsi , [InstrStage<1, [A9_Pipe0, A9_Pipe1]>], [2, 1]>,
64 InstrItinData<IIC_iCMOVsr , [InstrStage<2, [A9_Pipe0, A9_Pipe1]>], [2, 1, 1]>,
65
66 // Integer multiply pipeline
67 //
68 InstrItinData<IIC_iMUL16 , [InstrStage<1, [A9_Pipe1], 0>,
69 InstrStage<2, [A9_Pipe0]>], [4, 1, 1]>,
70 InstrItinData<IIC_iMAC16 , [InstrStage<1, [A9_Pipe1], 0>,
71 InstrStage<2, [A9_Pipe0]>], [4, 1, 1, 2]>,
72 InstrItinData<IIC_iMUL32 , [InstrStage<1, [A9_Pipe1], 0>,
73 InstrStage<2, [A9_Pipe0]>], [4, 1, 1]>,
74 InstrItinData<IIC_iMAC32 , [InstrStage<1, [A9_Pipe1], 0>,
75 InstrStage<2, [A9_Pipe0]>], [4, 1, 1, 2]>,
76 InstrItinData<IIC_iMUL64 , [InstrStage<2, [A9_Pipe1], 0>,
77 InstrStage<3, [A9_Pipe0]>], [4, 5, 1, 1]>,
78 InstrItinData<IIC_iMAC64 , [InstrStage<2, [A9_Pipe1], 0>,
79 InstrStage<3, [A9_Pipe0]>], [4, 5, 1, 1]>,
Anton Korobeynikov2a21aef2010-05-29 19:25:34 +000080 // Integer load pipeline
81 // FIXME: The timings are some rough approximations
82 //
83 // Immediate offset
84 InstrItinData<IIC_iLoadi , [InstrStage<1, [A9_Pipe1]>,
85 InstrStage<1, [A9_LSPipe]>], [3, 1]>,
86 //
87 // Register offset
88 InstrItinData<IIC_iLoadr , [InstrStage<1, [A9_Pipe1]>,
89 InstrStage<1, [A9_LSPipe]>], [3, 1, 1]>,
90 //
91 // Scaled register offset
92 InstrItinData<IIC_iLoadsi , [InstrStage<1, [A9_Pipe1]>,
93 InstrStage<2, [A9_LSPipe]>], [4, 1, 1]>,
94 //
95 // Immediate offset with update
96 InstrItinData<IIC_iLoadiu , [InstrStage<1, [A9_Pipe1]>,
97 InstrStage<2, [A9_LSPipe]>], [3, 2, 1]>,
98 //
99 // Register offset with update
100 InstrItinData<IIC_iLoadru , [InstrStage<1, [A9_Pipe1]>,
101 InstrStage<2, [A9_LSPipe]>], [3, 2, 1, 1]>,
102 //
103 // Scaled register offset with update
104 InstrItinData<IIC_iLoadsiu , [InstrStage<1, [A9_Pipe1]>,
105 InstrStage<2, [A9_LSPipe]>], [4, 3, 1, 1]>,
106 //
107 // Load multiple
108 InstrItinData<IIC_iLoadm , [InstrStage<1, [A9_Pipe1]>,
109 InstrStage<1, [A9_LSPipe]>]>,
Anton Korobeynikov94d7fd82010-05-29 19:25:17 +0000110
Anton Korobeynikov2a21aef2010-05-29 19:25:34 +0000111 // Integer store pipeline
112 ///
113 // Immediate offset
114 InstrItinData<IIC_iStorei , [InstrStage<1, [A9_Pipe1]>,
115 InstrStage<1, [A9_LSPipe]>], [3, 1]>,
116 //
117 // Register offset
118 InstrItinData<IIC_iStorer , [InstrStage<1, [ A9_Pipe1]>,
119 InstrStage<1, [A9_LSPipe]>], [3, 1, 1]>,
120 //
121 // Scaled register offset
122 InstrItinData<IIC_iStoresi , [InstrStage<1, [A9_Pipe1]>,
123 InstrStage<2, [A9_LSPipe]>], [3, 1, 1]>,
124 //
125 // Immediate offset with update
126 InstrItinData<IIC_iStoreiu , [InstrStage<1, [A9_Pipe1]>,
127 InstrStage<1, [A9_LSPipe]>], [2, 3, 1]>,
128 //
129 // Register offset with update
130 InstrItinData<IIC_iStoreru , [InstrStage<1, [A9_Pipe1]>,
131 InstrStage<1, [A9_LSPipe]>], [2, 3, 1, 1]>,
132 //
133 // Scaled register offset with update
134 InstrItinData<IIC_iStoresiu, [InstrStage<1, [A9_Pipe1]>,
135 InstrStage<2, [A9_LSPipe]>], [3, 3, 1, 1]>,
136 //
137 // Store multiple
138 InstrItinData<IIC_iStorem , [InstrStage<1, [A9_Pipe1]>,
139 InstrStage<1, [A9_LSPipe]>]>,
Anton Korobeynikov94d7fd82010-05-29 19:25:17 +0000140 // Branch
141 //
142 // no delay slots, so the latency of a branch is unimportant
143 InstrItinData<IIC_Br , [InstrStage<1, [A9_Pipe0, A9_Pipe1]>]>,
144
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000145 // VFP and NEON shares the same register file. This means that every VFP
146 // instruction should wait for full completion of the consecutive NEON
147 // instruction and vice-versa. We model this behavior with two artificial FUs:
148 // DRegsVFP and DRegsVFP.
149 //
150 // Every VFP instruction:
151 // - Acquires DRegsVFP resource for 1 cycle
152 // - Reserves DRegsN resource for the whole duration (including time to
153 // register file writeback!).
154 // Every NEON instruction does the same but with FUs swapped.
155 //
156 // Since the reserved FU cannot be acquired this models precisly "cross-domain"
157 // stalls.
158
159 // VFP
160 // Issue through integer pipeline, and execute in NEON unit.
161
162 // FP Special Register to Integer Register File Move
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000163 InstrItinData<IIC_fpSTAT , [InstrStage<1, [A9_DRegsVFP], 0, Required>,
164 InstrStage<2, [A9_DRegsN], 0, Reserved>,
Anton Korobeynikovd4c7cce2010-05-29 19:25:29 +0000165 InstrStage<1, [A9_Pipe1]>,
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000166 InstrStage<1, [A9_NPipe]>]>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000167 //
168 // Single-precision FP Unary
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000169 InstrItinData<IIC_fpUNA32 , [InstrStage<1, [A9_DRegsVFP], 0, Required>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000170 // Extra latency cycles since wbck is 2 cycles
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000171 InstrStage<3, [A9_DRegsN], 0, Reserved>,
Anton Korobeynikovd4c7cce2010-05-29 19:25:29 +0000172 InstrStage<1, [A9_Pipe1]>,
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000173 InstrStage<1, [A9_NPipe]>], [1, 1]>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000174 //
175 // Double-precision FP Unary
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000176 InstrItinData<IIC_fpUNA64 , [InstrStage<1, [A9_DRegsVFP], 0, Required>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000177 // Extra latency cycles since wbck is 2 cycles
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000178 InstrStage<3, [A9_DRegsN], 0, Reserved>,
Anton Korobeynikovd4c7cce2010-05-29 19:25:29 +0000179 InstrStage<1, [A9_Pipe1]>,
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000180 InstrStage<1, [A9_NPipe]>], [1, 1]>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000181
182 //
183 // Single-precision FP Compare
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000184 InstrItinData<IIC_fpCMP32 , [InstrStage<1, [A9_DRegsVFP], 0, Required>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000185 // Extra latency cycles since wbck is 4 cycles
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000186 InstrStage<5, [A9_DRegsN], 0, Reserved>,
Anton Korobeynikovd4c7cce2010-05-29 19:25:29 +0000187 InstrStage<1, [A9_Pipe1]>,
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000188 InstrStage<1, [A9_NPipe]>], [1, 1]>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000189 //
190 // Double-precision FP Compare
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000191 InstrItinData<IIC_fpCMP64 , [InstrStage<1, [A9_DRegsVFP], 0, Required>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000192 // Extra latency cycles since wbck is 4 cycles
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000193 InstrStage<5, [A9_DRegsN], 0, Reserved>,
Anton Korobeynikovd4c7cce2010-05-29 19:25:29 +0000194 InstrStage<1, [A9_Pipe1]>,
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000195 InstrStage<1, [A9_NPipe]>], [1, 1]>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000196 //
197 // Single to Double FP Convert
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000198 InstrItinData<IIC_fpCVTSD , [InstrStage<1, [A9_DRegsVFP], 0, Required>,
199 InstrStage<5, [A9_DRegsN], 0, Reserved>,
Anton Korobeynikovd4c7cce2010-05-29 19:25:29 +0000200 InstrStage<1, [A9_Pipe1]>,
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000201 InstrStage<1, [A9_NPipe]>], [4, 1]>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000202 //
203 // Double to Single FP Convert
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000204 InstrItinData<IIC_fpCVTDS , [InstrStage<1, [A9_DRegsVFP], 0, Required>,
205 InstrStage<5, [A9_DRegsN], 0, Reserved>,
Anton Korobeynikovd4c7cce2010-05-29 19:25:29 +0000206 InstrStage<1, [A9_Pipe1]>,
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000207 InstrStage<1, [A9_NPipe]>], [4, 1]>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000208
209 //
210 // Single to Half FP Convert
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000211 InstrItinData<IIC_fpCVTSH , [InstrStage<1, [A9_DRegsVFP], 0, Required>,
212 InstrStage<5, [A9_DRegsN], 0, Reserved>,
Anton Korobeynikovd4c7cce2010-05-29 19:25:29 +0000213 InstrStage<1, [A9_Pipe1]>,
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000214 InstrStage<1, [A9_NPipe]>], [4, 1]>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000215 //
216 // Half to Single FP Convert
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000217 InstrItinData<IIC_fpCVTHS , [InstrStage<1, [A9_DRegsVFP], 0, Required>,
218 InstrStage<3, [A9_DRegsN], 0, Reserved>,
Anton Korobeynikovd4c7cce2010-05-29 19:25:29 +0000219 InstrStage<1, [A9_Pipe1]>,
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000220 InstrStage<1, [A9_NPipe]>], [2, 1]>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000221
222 //
223 // Single-Precision FP to Integer Convert
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000224 InstrItinData<IIC_fpCVTSI , [InstrStage<1, [A9_DRegsVFP], 0, Required>,
225 InstrStage<5, [A9_DRegsN], 0, Reserved>,
Anton Korobeynikovd4c7cce2010-05-29 19:25:29 +0000226 InstrStage<1, [A9_Pipe1]>,
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000227 InstrStage<1, [A9_NPipe]>], [4, 1]>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000228 //
229 // Double-Precision FP to Integer Convert
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000230 InstrItinData<IIC_fpCVTDI , [InstrStage<1, [A9_DRegsVFP], 0, Required>,
231 InstrStage<5, [A9_DRegsN], 0, Reserved>,
Anton Korobeynikovd4c7cce2010-05-29 19:25:29 +0000232 InstrStage<1, [A9_Pipe1]>,
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000233 InstrStage<1, [A9_NPipe]>], [4, 1]>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000234 //
235 // Integer to Single-Precision FP Convert
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000236 InstrItinData<IIC_fpCVTIS , [InstrStage<1, [A9_DRegsVFP], 0, Required>,
237 InstrStage<5, [A9_DRegsN], 0, Reserved>,
Anton Korobeynikovd4c7cce2010-05-29 19:25:29 +0000238 InstrStage<1, [A9_Pipe1]>,
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000239 InstrStage<1, [A9_NPipe]>], [4, 1]>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000240 //
241 // Integer to Double-Precision FP Convert
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000242 InstrItinData<IIC_fpCVTID , [InstrStage<1, [A9_DRegsVFP], 0, Required>,
243 InstrStage<5, [A9_DRegsN], 0, Reserved>,
Anton Korobeynikovd4c7cce2010-05-29 19:25:29 +0000244 InstrStage<1, [A9_Pipe1]>,
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000245 InstrStage<1, [A9_NPipe]>], [4, 1]>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000246 //
247 // Single-precision FP ALU
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000248 InstrItinData<IIC_fpALU32 , [InstrStage<1, [A9_DRegsVFP], 0, Required>,
249 InstrStage<5, [A9_DRegsN], 0, Reserved>,
Anton Korobeynikovd4c7cce2010-05-29 19:25:29 +0000250 InstrStage<1, [A9_Pipe1]>,
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000251 InstrStage<1, [A9_NPipe]>], [4, 1, 1]>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000252 //
253 // Double-precision FP ALU
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000254 InstrItinData<IIC_fpALU64 , [InstrStage<1, [A9_DRegsVFP], 0, Required>,
255 InstrStage<5, [A9_DRegsN], 0, Reserved>,
Anton Korobeynikovd4c7cce2010-05-29 19:25:29 +0000256 InstrStage<1, [A9_Pipe1]>,
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000257 InstrStage<1, [A9_NPipe]>], [4, 1, 1]>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000258 //
259 // Single-precision FP Multiply
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000260 InstrItinData<IIC_fpMUL32 , [InstrStage<1, [A9_DRegsVFP], 0, Required>,
261 InstrStage<6, [A9_DRegsN], 0, Reserved>,
Anton Korobeynikovd4c7cce2010-05-29 19:25:29 +0000262 InstrStage<1, [A9_Pipe1]>,
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000263 InstrStage<1, [A9_NPipe]>], [5, 1, 1]>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000264 //
265 // Double-precision FP Multiply
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000266 InstrItinData<IIC_fpMUL64 , [InstrStage<1, [A9_DRegsVFP], 0, Required>,
267 InstrStage<7, [A9_DRegsN], 0, Reserved>,
Anton Korobeynikovd4c7cce2010-05-29 19:25:29 +0000268 InstrStage<1, [A9_Pipe1]>,
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000269 InstrStage<2, [A9_NPipe]>], [6, 1, 1]>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000270 //
271 // Single-precision FP MAC
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000272 InstrItinData<IIC_fpMAC32 , [InstrStage<1, [A9_DRegsVFP], 0, Required>,
273 InstrStage<9, [A9_DRegsN], 0, Reserved>,
Anton Korobeynikovd4c7cce2010-05-29 19:25:29 +0000274 InstrStage<1, [A9_Pipe1]>,
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000275 InstrStage<1, [A9_NPipe]>], [8, 0, 1, 1]>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000276 //
277 // Double-precision FP MAC
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000278 InstrItinData<IIC_fpMAC64 , [InstrStage<1, [A9_DRegsVFP], 0, Required>,
279 InstrStage<10, [A9_DRegsN], 0, Reserved>,
Anton Korobeynikovd4c7cce2010-05-29 19:25:29 +0000280 InstrStage<1, [A9_Pipe1]>,
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000281 InstrStage<2, [A9_NPipe]>], [9, 0, 1, 1]>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000282 //
283 // Single-precision FP DIV
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000284 InstrItinData<IIC_fpDIV32 , [InstrStage<1, [A9_DRegsVFP], 0, Required>,
285 InstrStage<16, [A9_DRegsN], 0, Reserved>,
Anton Korobeynikovd4c7cce2010-05-29 19:25:29 +0000286 InstrStage<1, [A9_Pipe1]>,
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000287 InstrStage<10, [A9_NPipe]>], [15, 1, 1]>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000288 //
289 // Double-precision FP DIV
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000290 InstrItinData<IIC_fpDIV64 , [InstrStage<1, [A9_DRegsVFP], 0, Required>,
291 InstrStage<26, [A9_DRegsN], 0, Reserved>,
Anton Korobeynikovd4c7cce2010-05-29 19:25:29 +0000292 InstrStage<1, [A9_Pipe1]>,
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000293 InstrStage<20, [A9_NPipe]>], [25, 1, 1]>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000294 //
295 // Single-precision FP SQRT
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000296 InstrItinData<IIC_fpSQRT32, [InstrStage<1, [A9_DRegsVFP], 0, Required>,
297 InstrStage<18, [A9_DRegsN], 0, Reserved>,
Anton Korobeynikovd4c7cce2010-05-29 19:25:29 +0000298 InstrStage<1, [A9_Pipe1]>,
299 InstrStage<13, [A9_NPipe]>], [17, 1]>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000300 //
301 // Double-precision FP SQRT
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000302 InstrItinData<IIC_fpSQRT64, [InstrStage<1, [A9_DRegsVFP], 0, Required>,
303 InstrStage<33, [A9_DRegsN], 0, Reserved>,
Anton Korobeynikovd4c7cce2010-05-29 19:25:29 +0000304 InstrStage<1, [A9_Pipe1]>,
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000305 InstrStage<28, [A9_NPipe]>], [32, 1]>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000306
307 //
308 // Integer to Single-precision Move
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000309 InstrItinData<IIC_fpMOVIS, [InstrStage<1, [A9_DRegsVFP], 0, Required>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000310 // Extra 1 latency cycle since wbck is 2 cycles
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000311 InstrStage<3, [A9_DRegsN], 0, Reserved>,
Anton Korobeynikovd4c7cce2010-05-29 19:25:29 +0000312 InstrStage<1, [A9_Pipe1]>,
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000313 InstrStage<1, [A9_NPipe]>], [1, 1]>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000314 //
315 // Integer to Double-precision Move
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000316 InstrItinData<IIC_fpMOVID, [InstrStage<1, [A9_DRegsVFP], 0, Required>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000317 // Extra 1 latency cycle since wbck is 2 cycles
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000318 InstrStage<3, [A9_DRegsN], 0, Reserved>,
Anton Korobeynikovd4c7cce2010-05-29 19:25:29 +0000319 InstrStage<1, [A9_Pipe1]>,
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000320 InstrStage<1, [A9_NPipe]>], [1, 1, 1]>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000321 //
322 // Single-precision to Integer Move
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000323 InstrItinData<IIC_fpMOVSI, [InstrStage<1, [A9_DRegsVFP], 0, Required>,
324 InstrStage<2, [A9_DRegsN], 0, Reserved>,
Anton Korobeynikovd4c7cce2010-05-29 19:25:29 +0000325 InstrStage<1, [A9_Pipe1]>,
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000326 InstrStage<1, [A9_NPipe]>], [1, 1]>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000327 //
328 // Double-precision to Integer Move
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000329 InstrItinData<IIC_fpMOVDI, [InstrStage<1, [A9_DRegsVFP], 0, Required>,
330 InstrStage<2, [A9_DRegsN], 0, Reserved>,
Anton Korobeynikovd4c7cce2010-05-29 19:25:29 +0000331 InstrStage<1, [A9_Pipe1]>,
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000332 InstrStage<1, [A9_NPipe]>], [1, 1, 1]>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000333 //
334 // Single-precision FP Load
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000335 // use A9_Issue to enforce the 1 load/store per cycle limit
336 InstrItinData<IIC_fpLoad32, [InstrStage<1, [A9_DRegsVFP], 0, Required>,
337 InstrStage<2, [A9_DRegsN], 0, Reserved>,
338 InstrStage<1, [A9_Issue], 0>,
339 InstrStage<1, [A9_Pipe0, A9_Pipe1]>,
340 InstrStage<1, [A9_LSPipe], 0>,
341 InstrStage<1, [A9_NPipe]>]>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000342 //
343 // Double-precision FP Load
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000344 // use A9_Issue to enforce the 1 load/store per cycle limit
345 InstrItinData<IIC_fpLoad64, [InstrStage<1, [A9_DRegsVFP], 0, Required>,
346 InstrStage<2, [A9_DRegsN], 0, Reserved>,
347 InstrStage<1, [A9_Issue], 0>,
348 InstrStage<1, [A9_Pipe0, A9_Pipe1]>,
349 InstrStage<1, [A9_LSPipe], 0>,
350 InstrStage<1, [A9_NPipe]>]>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000351 //
352 // FP Load Multiple
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000353 // use A9_Issue to enforce the 1 load/store per cycle limit
354 InstrItinData<IIC_fpLoadm, [InstrStage<1, [A9_DRegsVFP], 0, Required>,
355 InstrStage<2, [A9_DRegsN], 0, Reserved>,
356 InstrStage<1, [A9_Issue], 0>,
357 InstrStage<1, [A9_Pipe0, A9_Pipe1]>,
358 InstrStage<1, [A9_LSPipe], 0>,
359 InstrStage<1, [A9_NPipe]>]>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000360 //
361 // Single-precision FP Store
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000362 // use A9_Issue to enforce the 1 load/store per cycle limit
363 InstrItinData<IIC_fpStore32,[InstrStage<1, [A9_DRegsVFP], 0, Required>,
364 InstrStage<2, [A9_DRegsN], 0, Reserved>,
365 InstrStage<1, [A9_Issue], 0>,
366 InstrStage<1, [A9_Pipe0, A9_Pipe1]>,
367 InstrStage<1, [A9_LSPipe], 0>,
368 InstrStage<1, [A9_NPipe]>]>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000369 //
370 // Double-precision FP Store
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000371 // use A9_Issue to enforce the 1 load/store per cycle limit
372 InstrItinData<IIC_fpStore64,[InstrStage<1, [A9_DRegsVFP], 0, Required>,
373 InstrStage<2, [A9_DRegsN], 0, Reserved>,
374 InstrStage<1, [A9_Issue], 0>,
375 InstrStage<1, [A9_Pipe0, A9_Pipe1]>,
376 InstrStage<1, [A9_LSPipe], 0>,
377 InstrStage<1, [A9_NPipe]>]>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000378 //
379 // FP Store Multiple
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000380 // use A9_Issue to enforce the 1 load/store per cycle limit
381 InstrItinData<IIC_fpStorem, [InstrStage<1, [A9_DRegsVFP], 0, Required>,
382 InstrStage<2, [A9_DRegsN], 0, Reserved>,
383 InstrStage<1, [A9_Issue], 0>,
384 InstrStage<1, [A9_Pipe0, A9_Pipe1]>,
385 InstrStage<1, [A9_LSPipe], 0>,
386 InstrStage<1, [A9_NPipe]>]>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000387 // NEON
388 // Issue through integer pipeline, and execute in NEON unit.
389 // FIXME: Neon pipeline and LdSt unit are multiplexed.
390 // Add some syntactic sugar to model this!
391 // VLD1
392 // FIXME: We don't model this instruction properly
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000393 InstrItinData<IIC_VLD1, [InstrStage<1, [A9_DRegsN], 0, Required>,
394 InstrStage<7, [A9_DRegsVFP], 0, Reserved>,
395 InstrStage<1, [A9_Issue], 0>,
396 InstrStage<1, [A9_Pipe0, A9_Pipe1]>,
397 InstrStage<1, [A9_LSPipe], 0>,
398 InstrStage<1, [A9_NPipe]>]>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000399 //
400 // VLD2
401 // FIXME: We don't model this instruction properly
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000402 InstrItinData<IIC_VLD2, [InstrStage<1, [A9_DRegsN], 0, Required>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000403 // Extra latency cycles since wbck is 6 cycles
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000404 InstrStage<7, [A9_DRegsVFP], 0, Reserved>,
405 InstrStage<1, [A9_Issue], 0>,
406 InstrStage<1, [A9_Pipe0, A9_Pipe1]>,
407 InstrStage<1, [A9_LSPipe], 0>,
408 InstrStage<1, [A9_NPipe]>], [2, 2, 1]>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000409 //
410 // VLD3
411 // FIXME: We don't model this instruction properly
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000412 InstrItinData<IIC_VLD3, [InstrStage<1, [A9_DRegsN], 0, Required>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000413 // Extra latency cycles since wbck is 6 cycles
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000414 InstrStage<7, [A9_DRegsVFP], 0, Reserved>,
415 InstrStage<1, [A9_Issue], 0>,
416 InstrStage<1, [A9_Pipe0, A9_Pipe1]>,
417 InstrStage<1, [A9_LSPipe], 0>,
418 InstrStage<1, [A9_NPipe]>], [2, 2, 2, 1]>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000419 //
420 // VLD4
421 // FIXME: We don't model this instruction properly
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000422 InstrItinData<IIC_VLD4, [InstrStage<1, [A9_DRegsN], 0, Required>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000423 // Extra latency cycles since wbck is 6 cycles
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000424 InstrStage<7, [A9_DRegsVFP], 0, Reserved>,
425 InstrStage<1, [A9_Issue], 0>,
426 InstrStage<1, [A9_Pipe0, A9_Pipe1]>,
427 InstrStage<1, [A9_LSPipe], 0>,
428 InstrStage<1, [A9_NPipe]>], [2, 2, 2, 2, 1]>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000429 //
430 // VST
431 // FIXME: We don't model this instruction properly
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000432 InstrItinData<IIC_VST, [InstrStage<1, [A9_DRegsN], 0, Required>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000433 // Extra latency cycles since wbck is 6 cycles
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000434 InstrStage<7, [A9_DRegsVFP], 0, Reserved>,
435 InstrStage<1, [A9_Issue], 0>,
436 InstrStage<1, [A9_Pipe0, A9_Pipe1]>,
437 InstrStage<1, [A9_LSPipe], 0>,
438 InstrStage<1, [A9_NPipe]>]>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000439 //
440 // Double-register Integer Unary
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000441 InstrItinData<IIC_VUNAiD, [InstrStage<1, [A9_DRegsN], 0, Required>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000442 // Extra latency cycles since wbck is 6 cycles
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000443 InstrStage<7, [A9_DRegsVFP], 0, Reserved>,
Anton Korobeynikovd4c7cce2010-05-29 19:25:29 +0000444 InstrStage<1, [A9_Pipe1]>,
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000445 InstrStage<1, [A9_NPipe]>], [4, 2]>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000446 //
447 // Quad-register Integer Unary
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000448 InstrItinData<IIC_VUNAiQ, [InstrStage<1, [A9_DRegsN], 0, Required>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000449 // Extra latency cycles since wbck is 6 cycles
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000450 InstrStage<7, [A9_DRegsVFP], 0, Reserved>,
Anton Korobeynikovd4c7cce2010-05-29 19:25:29 +0000451 InstrStage<1, [A9_Pipe1]>,
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000452 InstrStage<1, [A9_NPipe]>], [4, 2]>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000453 //
454 // Double-register Integer Q-Unary
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000455 InstrItinData<IIC_VQUNAiD, [InstrStage<1, [A9_DRegsN], 0, Required>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000456 // Extra latency cycles since wbck is 6 cycles
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000457 InstrStage<7, [A9_DRegsVFP], 0, Reserved>,
Anton Korobeynikovd4c7cce2010-05-29 19:25:29 +0000458 InstrStage<1, [A9_Pipe1]>,
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000459 InstrStage<1, [A9_NPipe]>], [4, 1]>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000460 //
461 // Quad-register Integer CountQ-Unary
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000462 InstrItinData<IIC_VQUNAiQ, [InstrStage<1, [A9_DRegsN], 0, Required>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000463 // Extra latency cycles since wbck is 6 cycles
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000464 InstrStage<7, [A9_DRegsVFP], 0, Reserved>,
Anton Korobeynikovd4c7cce2010-05-29 19:25:29 +0000465 InstrStage<1, [A9_Pipe1]>,
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000466 InstrStage<1, [A9_NPipe]>], [4, 1]>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000467 //
468 // Double-register Integer Binary
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000469 InstrItinData<IIC_VBINiD, [InstrStage<1, [A9_DRegsN], 0, Required>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000470 // Extra latency cycles since wbck is 6 cycles
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000471 InstrStage<7, [A9_DRegsVFP], 0, Reserved>,
Anton Korobeynikovd4c7cce2010-05-29 19:25:29 +0000472 InstrStage<1, [A9_Pipe1]>,
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000473 InstrStage<1, [A9_NPipe]>], [3, 2, 2]>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000474 //
475 // Quad-register Integer Binary
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000476 InstrItinData<IIC_VBINiQ, [InstrStage<1, [A9_DRegsN], 0, Required>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000477 // Extra latency cycles since wbck is 6 cycles
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000478 InstrStage<7, [A9_DRegsVFP], 0, Reserved>,
Anton Korobeynikovd4c7cce2010-05-29 19:25:29 +0000479 InstrStage<1, [A9_Pipe1]>,
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000480 InstrStage<1, [A9_NPipe]>], [3, 2, 2]>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000481 //
482 // Double-register Integer Subtract
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000483 InstrItinData<IIC_VSUBiD, [InstrStage<1, [A9_DRegsN], 0, Required>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000484 // Extra latency cycles since wbck is 6 cycles
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000485 InstrStage<7, [A9_DRegsVFP], 0, Reserved>,
Anton Korobeynikovd4c7cce2010-05-29 19:25:29 +0000486 InstrStage<1, [A9_Pipe1]>,
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000487 InstrStage<1, [A9_NPipe]>], [3, 2, 1]>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000488 //
489 // Quad-register Integer Subtract
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000490 InstrItinData<IIC_VSUBiQ, [InstrStage<1, [A9_DRegsN], 0, Required>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000491 // Extra latency cycles since wbck is 6 cycles
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000492 InstrStage<7, [A9_DRegsVFP], 0, Reserved>,
Anton Korobeynikovd4c7cce2010-05-29 19:25:29 +0000493 InstrStage<1, [A9_Pipe1]>,
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000494 InstrStage<1, [A9_NPipe]>], [3, 2, 1]>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000495 //
496 // Double-register Integer Shift
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000497 InstrItinData<IIC_VSHLiD, [InstrStage<1, [A9_DRegsN], 0, Required>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000498 // Extra latency cycles since wbck is 6 cycles
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000499 InstrStage<7, [A9_DRegsVFP], 0, Reserved>,
Anton Korobeynikovd4c7cce2010-05-29 19:25:29 +0000500 InstrStage<1, [A9_Pipe1]>,
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000501 InstrStage<1, [A9_NPipe]>], [3, 1, 1]>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000502 //
503 // Quad-register Integer Shift
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000504 InstrItinData<IIC_VSHLiQ, [InstrStage<1, [A9_DRegsN], 0, Required>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000505 // Extra latency cycles since wbck is 6 cycles
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000506 InstrStage<7, [A9_DRegsVFP], 0, Reserved>,
Anton Korobeynikovd4c7cce2010-05-29 19:25:29 +0000507 InstrStage<1, [A9_Pipe1]>,
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000508 InstrStage<1, [A9_NPipe]>], [3, 1, 1]>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000509 //
510 // Double-register Integer Shift (4 cycle)
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000511 InstrItinData<IIC_VSHLi4D, [InstrStage<1, [A9_DRegsN], 0, Required>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000512 // Extra latency cycles since wbck is 6 cycles
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000513 InstrStage<7, [A9_DRegsVFP], 0, Reserved>,
Anton Korobeynikovd4c7cce2010-05-29 19:25:29 +0000514 InstrStage<1, [A9_Pipe1]>,
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000515 InstrStage<1, [A9_NPipe]>], [4, 1, 1]>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000516 //
517 // Quad-register Integer Shift (4 cycle)
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000518 InstrItinData<IIC_VSHLi4Q, [InstrStage<1, [A9_DRegsN], 0, Required>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000519 // Extra latency cycles since wbck is 6 cycles
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000520 InstrStage<7, [A9_DRegsVFP], 0, Reserved>,
Anton Korobeynikovd4c7cce2010-05-29 19:25:29 +0000521 InstrStage<1, [A9_Pipe1]>,
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000522 InstrStage<1, [A9_NPipe]>], [4, 1, 1]>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000523 //
524 // Double-register Integer Binary (4 cycle)
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000525 InstrItinData<IIC_VBINi4D, [InstrStage<1, [A9_DRegsN], 0, Required>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000526 // Extra latency cycles since wbck is 6 cycles
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000527 InstrStage<7, [A9_DRegsVFP], 0, Reserved>,
Anton Korobeynikovd4c7cce2010-05-29 19:25:29 +0000528 InstrStage<1, [A9_Pipe1]>,
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000529 InstrStage<1, [A9_NPipe]>], [4, 2, 2]>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000530 //
531 // Quad-register Integer Binary (4 cycle)
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000532 InstrItinData<IIC_VBINi4Q, [InstrStage<1, [A9_DRegsN], 0, Required>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000533 // Extra latency cycles since wbck is 6 cycles
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000534 InstrStage<7, [A9_DRegsVFP], 0, Reserved>,
Anton Korobeynikovd4c7cce2010-05-29 19:25:29 +0000535 InstrStage<1, [A9_Pipe1]>,
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000536 InstrStage<1, [A9_NPipe]>], [4, 2, 2]>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000537 //
538 // Double-register Integer Subtract (4 cycle)
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000539 InstrItinData<IIC_VSUBiD, [InstrStage<1, [A9_DRegsN], 0, Required>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000540 // Extra latency cycles since wbck is 6 cycles
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000541 InstrStage<7, [A9_DRegsVFP], 0, Reserved>,
Anton Korobeynikovd4c7cce2010-05-29 19:25:29 +0000542 InstrStage<1, [A9_Pipe1]>,
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000543 InstrStage<1, [A9_NPipe]>], [4, 2, 1]>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000544 //
545 // Quad-register Integer Subtract (4 cycle)
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000546 InstrItinData<IIC_VSUBiQ, [InstrStage<1, [A9_DRegsN], 0, Required>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000547 // Extra latency cycles since wbck is 6 cycles
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000548 InstrStage<7, [A9_DRegsVFP], 0, Reserved>,
Anton Korobeynikovd4c7cce2010-05-29 19:25:29 +0000549 InstrStage<1, [A9_Pipe1]>,
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000550 InstrStage<1, [A9_NPipe]>], [4, 2, 1]>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000551
552 //
553 // Double-register Integer Count
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000554 InstrItinData<IIC_VCNTiD, [InstrStage<1, [A9_DRegsN], 0, Required>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000555 // Extra latency cycles since wbck is 6 cycles
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000556 InstrStage<7, [A9_DRegsVFP], 0, Reserved>,
Anton Korobeynikovd4c7cce2010-05-29 19:25:29 +0000557 InstrStage<1, [A9_Pipe1]>,
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000558 InstrStage<1, [A9_NPipe]>], [3, 2, 2]>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000559 //
560 // Quad-register Integer Count
561 // Result written in N3, but that is relative to the last cycle of multicycle,
562 // so we use 4 for those cases
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000563 InstrItinData<IIC_VCNTiQ, [InstrStage<1, [A9_DRegsN], 0, Required>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000564 // Extra latency cycles since wbck is 7 cycles
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000565 InstrStage<8, [A9_DRegsVFP], 0, Reserved>,
Anton Korobeynikovd4c7cce2010-05-29 19:25:29 +0000566 InstrStage<1, [A9_Pipe1]>,
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000567 InstrStage<2, [A9_NPipe]>], [4, 2, 2]>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000568 //
569 // Double-register Absolute Difference and Accumulate
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000570 InstrItinData<IIC_VABAD, [InstrStage<1, [A9_DRegsN], 0, Required>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000571 // Extra latency cycles since wbck is 6 cycles
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000572 InstrStage<7, [A9_DRegsVFP], 0, Reserved>,
Anton Korobeynikovd4c7cce2010-05-29 19:25:29 +0000573 InstrStage<1, [A9_Pipe1]>,
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000574 InstrStage<1, [A9_NPipe]>], [6, 3, 2, 1]>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000575 //
576 // Quad-register Absolute Difference and Accumulate
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000577 InstrItinData<IIC_VABAQ, [InstrStage<1, [A9_DRegsN], 0, Required>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000578 // Extra latency cycles since wbck is 6 cycles
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000579 InstrStage<7, [A9_DRegsVFP], 0, Reserved>,
Anton Korobeynikovd4c7cce2010-05-29 19:25:29 +0000580 InstrStage<1, [A9_Pipe1]>,
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000581 InstrStage<2, [A9_NPipe]>], [6, 3, 2, 1]>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000582 //
583 // Double-register Integer Pair Add Long
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000584 InstrItinData<IIC_VPALiD, [InstrStage<1, [A9_DRegsN], 0, Required>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000585 // Extra latency cycles since wbck is 6 cycles
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000586 InstrStage<7, [A9_DRegsVFP], 0, Reserved>,
Anton Korobeynikovd4c7cce2010-05-29 19:25:29 +0000587 InstrStage<1, [A9_Pipe1]>,
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000588 InstrStage<1, [A9_NPipe]>], [6, 3, 1]>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000589 //
590 // Quad-register Integer Pair Add Long
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000591 InstrItinData<IIC_VPALiQ, [InstrStage<1, [A9_DRegsN], 0, Required>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000592 // Extra latency cycles since wbck is 6 cycles
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000593 InstrStage<7, [A9_DRegsVFP], 0, Reserved>,
Anton Korobeynikovd4c7cce2010-05-29 19:25:29 +0000594 InstrStage<1, [A9_Pipe1]>,
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000595 InstrStage<2, [A9_NPipe]>], [6, 3, 1]>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000596
597 //
598 // Double-register Integer Multiply (.8, .16)
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000599 InstrItinData<IIC_VMULi16D, [InstrStage<1, [A9_DRegsN], 0, Required>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000600 // Extra latency cycles since wbck is 6 cycles
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000601 InstrStage<7, [A9_DRegsVFP], 0, Reserved>,
Anton Korobeynikovd4c7cce2010-05-29 19:25:29 +0000602 InstrStage<1, [A9_Pipe1]>,
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000603 InstrStage<1, [A9_NPipe]>], [6, 2, 2]>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000604 //
605 // Quad-register Integer Multiply (.8, .16)
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000606 InstrItinData<IIC_VMULi16Q, [InstrStage<1, [A9_DRegsN], 0, Required>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000607 // Extra latency cycles since wbck is 7 cycles
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000608 InstrStage<8, [A9_DRegsVFP], 0, Reserved>,
Anton Korobeynikovd4c7cce2010-05-29 19:25:29 +0000609 InstrStage<1, [A9_Pipe1]>,
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000610 InstrStage<2, [A9_NPipe]>], [7, 2, 2]>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000611
612 //
613 // Double-register Integer Multiply (.32)
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000614 InstrItinData<IIC_VMULi32D, [InstrStage<1, [A9_DRegsN], 0, Required>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000615 // Extra latency cycles since wbck is 7 cycles
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000616 InstrStage<8, [A9_DRegsVFP], 0, Reserved>,
Anton Korobeynikovd4c7cce2010-05-29 19:25:29 +0000617 InstrStage<1, [A9_Pipe1]>,
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000618 InstrStage<2, [A9_NPipe]>], [7, 2, 1]>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000619 //
620 // Quad-register Integer Multiply (.32)
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000621 InstrItinData<IIC_VMULi32Q, [InstrStage<1, [A9_DRegsN], 0, Required>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000622 // Extra latency cycles since wbck is 9 cycles
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000623 InstrStage<10, [A9_DRegsVFP], 0, Reserved>,
Anton Korobeynikovd4c7cce2010-05-29 19:25:29 +0000624 InstrStage<1, [A9_Pipe1]>,
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000625 InstrStage<4, [A9_NPipe]>], [9, 2, 1]>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000626 //
627 // Double-register Integer Multiply-Accumulate (.8, .16)
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000628 InstrItinData<IIC_VMACi16D, [InstrStage<1, [A9_DRegsN], 0, Required>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000629 // Extra latency cycles since wbck is 6 cycles
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000630 InstrStage<7, [A9_DRegsVFP], 0, Reserved>,
Anton Korobeynikovd4c7cce2010-05-29 19:25:29 +0000631 InstrStage<1, [A9_Pipe1]>,
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000632 InstrStage<1, [A9_NPipe]>], [6, 3, 2, 2]>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000633 //
634 // Double-register Integer Multiply-Accumulate (.32)
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000635 InstrItinData<IIC_VMACi32D, [InstrStage<1, [A9_DRegsN], 0, Required>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000636 // Extra latency cycles since wbck is 7 cycles
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000637 InstrStage<8, [A9_DRegsVFP], 0, Reserved>,
Anton Korobeynikovd4c7cce2010-05-29 19:25:29 +0000638 InstrStage<1, [A9_Pipe1]>,
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000639 InstrStage<2, [A9_NPipe]>], [7, 3, 2, 1]>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000640 //
641 // Quad-register Integer Multiply-Accumulate (.8, .16)
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000642 InstrItinData<IIC_VMACi16Q, [InstrStage<1, [A9_DRegsN], 0, Required>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000643 // Extra latency cycles since wbck is 7 cycles
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000644 InstrStage<8, [A9_DRegsVFP], 0, Reserved>,
Anton Korobeynikovd4c7cce2010-05-29 19:25:29 +0000645 InstrStage<1, [A9_Pipe1]>,
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000646 InstrStage<2, [A9_NPipe]>], [7, 3, 2, 2]>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000647 //
648 // Quad-register Integer Multiply-Accumulate (.32)
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000649 InstrItinData<IIC_VMACi32Q, [InstrStage<1, [A9_DRegsN], 0, Required>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000650 // Extra latency cycles since wbck is 9 cycles
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000651 InstrStage<10, [A9_DRegsVFP], 0, Reserved>,
Anton Korobeynikovd4c7cce2010-05-29 19:25:29 +0000652 InstrStage<1, [A9_Pipe1]>,
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000653 InstrStage<4, [A9_NPipe]>], [9, 3, 2, 1]>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000654 //
655 // Move Immediate
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000656 InstrItinData<IIC_VMOVImm, [InstrStage<1, [A9_DRegsN], 0, Required>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000657 // Extra latency cycles since wbck is 6 cycles
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000658 InstrStage<7, [A9_DRegsVFP], 0, Reserved>,
Anton Korobeynikovd4c7cce2010-05-29 19:25:29 +0000659 InstrStage<1, [A9_Pipe1]>,
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000660 InstrStage<1, [A9_NPipe]>], [3]>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000661 //
662 // Double-register Permute Move
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000663 InstrItinData<IIC_VMOVD, [InstrStage<1, [A9_DRegsN], 0, Required>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000664 // FIXME: all latencies are arbitrary, no information is available
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000665 InstrStage<3, [A9_DRegsVFP], 0, Reserved>,
Anton Korobeynikovd4c7cce2010-05-29 19:25:29 +0000666 InstrStage<1, [A9_Pipe1]>,
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000667 InstrStage<1, [A9_LSPipe]>], [2, 1]>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000668 //
669 // Quad-register Permute Move
670 // Result written in N2, but that is relative to the last cycle of multicycle,
671 // so we use 3 for those cases
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000672 InstrItinData<IIC_VMOVQ, [InstrStage<1, [A9_DRegsN], 0, Required>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000673 // FIXME: all latencies are arbitrary, no information is available
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000674 InstrStage<4, [A9_DRegsVFP], 0, Reserved>,
Anton Korobeynikovd4c7cce2010-05-29 19:25:29 +0000675 InstrStage<1, [A9_Pipe1]>,
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000676 InstrStage<2, [A9_NPipe]>], [3, 1]>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000677 //
678 // Integer to Single-precision Move
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000679 InstrItinData<IIC_VMOVIS , [InstrStage<1, [A9_DRegsN], 0, Required>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000680 // FIXME: all latencies are arbitrary, no information is available
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000681 InstrStage<3, [A9_DRegsVFP], 0, Reserved>,
Anton Korobeynikovd4c7cce2010-05-29 19:25:29 +0000682 InstrStage<1, [A9_Pipe1]>,
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000683 InstrStage<1, [A9_NPipe]>], [2, 1]>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000684 //
685 // Integer to Double-precision Move
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000686 InstrItinData<IIC_VMOVID , [InstrStage<1, [A9_DRegsN], 0, Required>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000687 // FIXME: all latencies are arbitrary, no information is available
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000688 InstrStage<3, [A9_DRegsVFP], 0, Reserved>,
Anton Korobeynikovd4c7cce2010-05-29 19:25:29 +0000689 InstrStage<1, [A9_Pipe1]>,
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000690 InstrStage<1, [A9_NPipe]>], [2, 1, 1]>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000691 //
692 // Single-precision to Integer Move
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000693 InstrItinData<IIC_VMOVSI , [InstrStage<1, [A9_DRegsN], 0, Required>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000694 // FIXME: all latencies are arbitrary, no information is available
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000695 InstrStage<3, [A9_DRegsVFP], 0, Reserved>,
Anton Korobeynikovd4c7cce2010-05-29 19:25:29 +0000696 InstrStage<1, [A9_Pipe1]>,
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000697 InstrStage<1, [A9_NPipe]>], [2, 1]>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000698 //
699 // Double-precision to Integer Move
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000700 InstrItinData<IIC_VMOVDI , [InstrStage<1, [A9_DRegsN], 0, Required>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000701 // FIXME: all latencies are arbitrary, no information is available
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000702 InstrStage<3, [A9_DRegsVFP], 0, Reserved>,
Anton Korobeynikovd4c7cce2010-05-29 19:25:29 +0000703 InstrStage<1, [A9_Pipe1]>,
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000704 InstrStage<1, [A9_NPipe]>], [2, 2, 1]>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000705 //
706 // Integer to Lane Move
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000707 InstrItinData<IIC_VMOVISL , [InstrStage<1, [A9_DRegsN], 0, Required>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000708 // FIXME: all latencies are arbitrary, no information is available
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000709 InstrStage<4, [A9_DRegsVFP], 0, Reserved>,
Anton Korobeynikovd4c7cce2010-05-29 19:25:29 +0000710 InstrStage<1, [A9_Pipe1]>,
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000711 InstrStage<2, [A9_NPipe]>], [3, 1, 1]>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000712
713 //
714 // Double-register FP Unary
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000715 InstrItinData<IIC_VUNAD, [InstrStage<1, [A9_DRegsN], 0, Required>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000716 // Extra latency cycles since wbck is 6 cycles
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000717 InstrStage<7, [A9_DRegsVFP], 0, Reserved>,
Anton Korobeynikovd4c7cce2010-05-29 19:25:29 +0000718 InstrStage<1, [A9_Pipe1]>,
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000719 InstrStage<1, [A9_NPipe]>], [5, 2]>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000720 //
721 // Quad-register FP Unary
722 // Result written in N5, but that is relative to the last cycle of multicycle,
723 // so we use 6 for those cases
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000724 InstrItinData<IIC_VUNAQ, [InstrStage<1, [A9_DRegsN], 0, Required>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000725 // Extra latency cycles since wbck is 7 cycles
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000726 InstrStage<8, [A9_DRegsVFP], 0, Reserved>,
Anton Korobeynikovd4c7cce2010-05-29 19:25:29 +0000727 InstrStage<1, [A9_Pipe1]>,
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000728 InstrStage<2, [A9_NPipe]>], [6, 2]>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000729 //
730 // Double-register FP Binary
731 // FIXME: We're using this itin for many instructions and [2, 2] here is too
732 // optimistic.
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000733 InstrItinData<IIC_VBIND, [InstrStage<1, [A9_DRegsN], 0, Required>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000734 // Extra latency cycles since wbck is 7 cycles
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000735 InstrStage<7, [A9_DRegsVFP], 0, Reserved>,
Anton Korobeynikovd4c7cce2010-05-29 19:25:29 +0000736 InstrStage<1, [A9_Pipe1]>,
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000737 InstrStage<1, [A9_NPipe]>], [5, 2, 2]>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000738 //
739 // Quad-register FP Binary
740 // Result written in N5, but that is relative to the last cycle of multicycle,
741 // so we use 6 for those cases
742 // FIXME: We're using this itin for many instructions and [2, 2] here is too
743 // optimistic.
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000744 InstrItinData<IIC_VBINQ, [InstrStage<1, [A9_DRegsN], 0, Required>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000745 // Extra latency cycles since wbck is 8 cycles
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000746 InstrStage<8, [A9_DRegsVFP], 0, Reserved>,
Anton Korobeynikovd4c7cce2010-05-29 19:25:29 +0000747 InstrStage<1, [A9_Pipe1]>,
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000748 InstrStage<2, [A9_NPipe]>], [6, 2, 2]>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000749 //
750 // Double-register FP Multiple-Accumulate
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000751 InstrItinData<IIC_VMACD, [InstrStage<1, [A9_DRegsN], 0, Required>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000752 // Extra latency cycles since wbck is 7 cycles
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000753 InstrStage<8, [A9_DRegsVFP], 0, Reserved>,
Anton Korobeynikovd4c7cce2010-05-29 19:25:29 +0000754 InstrStage<1, [A9_Pipe1]>,
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000755 InstrStage<2, [A9_NPipe]>], [6, 3, 2, 1]>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000756 //
757 // Quad-register FP Multiple-Accumulate
758 // Result written in N9, but that is relative to the last cycle of multicycle,
759 // so we use 10 for those cases
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000760 InstrItinData<IIC_VMACQ, [InstrStage<1, [A9_DRegsN], 0, Required>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000761 // Extra latency cycles since wbck is 9 cycles
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000762 InstrStage<10, [A9_DRegsVFP], 0, Reserved>,
Anton Korobeynikovd4c7cce2010-05-29 19:25:29 +0000763 InstrStage<1, [A9_Pipe1]>,
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000764 InstrStage<4, [A9_NPipe]>], [8, 4, 2, 1]>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000765 //
766 // Double-register Reciprical Step
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000767 InstrItinData<IIC_VRECSD, [InstrStage<1, [A9_DRegsN], 0, Required>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000768 // Extra latency cycles since wbck is 7 cycles
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000769 InstrStage<8, [A9_DRegsVFP], 0, Reserved>,
Anton Korobeynikovd4c7cce2010-05-29 19:25:29 +0000770 InstrStage<1, [A9_Pipe1]>,
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000771 InstrStage<2, [A9_NPipe]>], [6, 2, 2]>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000772 //
773 // Quad-register Reciprical Step
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000774 InstrItinData<IIC_VRECSQ, [InstrStage<1, [A9_DRegsN], 0, Required>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000775 // Extra latency cycles since wbck is 9 cycles
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000776 InstrStage<10, [A9_DRegsVFP], 0, Reserved>,
Anton Korobeynikovd4c7cce2010-05-29 19:25:29 +0000777 InstrStage<1, [A9_Pipe1]>,
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000778 InstrStage<4, [A9_NPipe]>], [8, 2, 2]>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000779 //
780 // Double-register Permute
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000781 InstrItinData<IIC_VPERMD, [InstrStage<1, [A9_DRegsN], 0, Required>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000782 // Extra latency cycles since wbck is 6 cycles
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000783 InstrStage<7, [A9_DRegsVFP], 0, Reserved>,
Anton Korobeynikovd4c7cce2010-05-29 19:25:29 +0000784 InstrStage<1, [A9_Pipe1]>,
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000785 InstrStage<1, [A9_NPipe]>], [2, 2, 1, 1]>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000786 //
787 // Quad-register Permute
788 // Result written in N2, but that is relative to the last cycle of multicycle,
789 // so we use 3 for those cases
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000790 InstrItinData<IIC_VPERMQ, [InstrStage<1, [A9_DRegsN], 0, Required>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000791 // Extra latency cycles since wbck is 7 cycles
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000792 InstrStage<8, [A9_DRegsVFP], 0, Reserved>,
Anton Korobeynikovd4c7cce2010-05-29 19:25:29 +0000793 InstrStage<1, [A9_Pipe1]>,
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000794 InstrStage<2, [A9_NPipe]>], [3, 3, 1, 1]>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000795 //
796 // Quad-register Permute (3 cycle issue)
797 // Result written in N2, but that is relative to the last cycle of multicycle,
798 // so we use 4 for those cases
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000799 InstrItinData<IIC_VPERMQ3, [InstrStage<1, [A9_DRegsN], 0, Required>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000800 // Extra latency cycles since wbck is 8 cycles
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000801 InstrStage<9, [A9_DRegsVFP], 0, Reserved>,
Anton Korobeynikovd4c7cce2010-05-29 19:25:29 +0000802 InstrStage<1, [A9_Pipe1]>,
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000803 InstrStage<3, [A9_LSPipe]>], [4, 4, 1, 1]>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000804
805 //
806 // Double-register VEXT
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000807 InstrItinData<IIC_VEXTD, [InstrStage<1, [A9_DRegsN], 0, Required>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000808 // Extra latency cycles since wbck is 7 cycles
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000809 InstrStage<7, [A9_DRegsVFP], 0, Reserved>,
Anton Korobeynikovd4c7cce2010-05-29 19:25:29 +0000810 InstrStage<1, [A9_Pipe1]>,
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000811 InstrStage<1, [A9_NPipe]>], [2, 1, 1]>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000812 //
813 // Quad-register VEXT
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000814 InstrItinData<IIC_VEXTQ, [InstrStage<1, [A9_DRegsN], 0, Required>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000815 // Extra latency cycles since wbck is 9 cycles
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000816 InstrStage<8, [A9_DRegsVFP], 0, Reserved>,
Anton Korobeynikovd4c7cce2010-05-29 19:25:29 +0000817 InstrStage<1, [A9_Pipe1]>,
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000818 InstrStage<2, [A9_NPipe]>], [3, 1, 1]>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000819 //
820 // VTB
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000821 InstrItinData<IIC_VTB1, [InstrStage<1, [A9_DRegsN], 0, Required>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000822 // Extra latency cycles since wbck is 7 cycles
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000823 InstrStage<8, [A9_DRegsVFP], 0, Reserved>,
Anton Korobeynikovd4c7cce2010-05-29 19:25:29 +0000824 InstrStage<1, [A9_Pipe1]>,
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000825 InstrStage<2, [A9_NPipe]>], [3, 2, 1]>,
826 InstrItinData<IIC_VTB2, [InstrStage<2, [A9_DRegsN], 0, Required>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000827 // Extra latency cycles since wbck is 7 cycles
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000828 InstrStage<8, [A9_DRegsVFP], 0, Reserved>,
Anton Korobeynikovd4c7cce2010-05-29 19:25:29 +0000829 InstrStage<1, [A9_Pipe1]>,
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000830 InstrStage<2, [A9_NPipe]>], [3, 2, 2, 1]>,
831 InstrItinData<IIC_VTB3, [InstrStage<2, [A9_DRegsN], 0, Required>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000832 // Extra latency cycles since wbck is 8 cycles
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000833 InstrStage<9, [A9_DRegsVFP], 0, Reserved>,
Anton Korobeynikovd4c7cce2010-05-29 19:25:29 +0000834 InstrStage<1, [A9_Pipe1]>,
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000835 InstrStage<3, [A9_NPipe]>], [4, 2, 2, 3, 1]>,
836 InstrItinData<IIC_VTB4, [InstrStage<1, [A9_DRegsN], 0, Required>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000837 // Extra latency cycles since wbck is 8 cycles
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000838 InstrStage<9, [A9_DRegsVFP], 0, Reserved>,
Anton Korobeynikovd4c7cce2010-05-29 19:25:29 +0000839 InstrStage<1, [A9_Pipe1]>,
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000840 InstrStage<3, [A9_NPipe]>], [4, 2, 2, 3, 3, 1]>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000841 //
842 // VTBX
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000843 InstrItinData<IIC_VTBX1, [InstrStage<1, [A9_DRegsN], 0, Required>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000844 // Extra latency cycles since wbck is 7 cycles
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000845 InstrStage<8, [A9_DRegsVFP], 0, Reserved>,
Anton Korobeynikovd4c7cce2010-05-29 19:25:29 +0000846 InstrStage<1, [A9_Pipe1]>,
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000847 InstrStage<2, [A9_NPipe]>], [3, 1, 2, 1]>,
848 InstrItinData<IIC_VTBX2, [InstrStage<1, [A9_DRegsN], 0, Required>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000849 // Extra latency cycles since wbck is 7 cycles
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000850 InstrStage<8, [A9_DRegsVFP], 0, Reserved>,
Anton Korobeynikovd4c7cce2010-05-29 19:25:29 +0000851 InstrStage<1, [A9_Pipe1]>,
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000852 InstrStage<2, [A9_NPipe]>], [3, 1, 2, 2, 1]>,
853 InstrItinData<IIC_VTBX3, [InstrStage<1, [A9_DRegsN], 0, Required>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000854 // Extra latency cycles since wbck is 8 cycles
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000855 InstrStage<9, [A9_DRegsVFP], 0, Reserved>,
Anton Korobeynikovd4c7cce2010-05-29 19:25:29 +0000856 InstrStage<1, [A9_Pipe1]>,
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000857 InstrStage<3, [A9_NPipe]>], [4, 1, 2, 2, 3, 1]>,
858 InstrItinData<IIC_VTBX4, [InstrStage<1, [A9_DRegsN], 0, Required>,
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000859 // Extra latency cycles since wbck is 8 cycles
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000860 InstrStage<9, [A9_DRegsVFP], 0, Reserved>,
Anton Korobeynikovd4c7cce2010-05-29 19:25:29 +0000861 InstrStage<1, [A9_Pipe1]>,
Anton Korobeynikov7d62e332010-04-18 20:31:01 +0000862 InstrStage<2, [A9_NPipe]>], [4, 1, 2, 2, 3, 3, 1]>
Anton Korobeynikov090323a2010-04-07 18:22:11 +0000863]>;