1//=- ARMScheduleA9.td - ARM Cortex-A9 Scheduling Definitions -*- tablegen -*-=// 2// 3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4// See https://llvm.org/LICENSE.txt for license information. 5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6// 7//===----------------------------------------------------------------------===// 8// 9// This file defines the itinerary class data for the ARM Cortex A9 processors. 10// 11//===----------------------------------------------------------------------===// 12 13// ===---------------------------------------------------------------------===// 14// This section contains legacy support for itineraries. This is 15// required until SD and PostRA schedulers are replaced by MachineScheduler. 16 17// 18// Ad-hoc scheduling information derived from pretty vague "Cortex-A9 Technical 19// Reference Manual". 20// 21// Functional units 22def A9_Issue0 : FuncUnit; // Issue 0 23def A9_Issue1 : FuncUnit; // Issue 1 24def A9_Branch : FuncUnit; // Branch 25def A9_ALU0 : FuncUnit; // ALU / MUL pipeline 0 26def A9_ALU1 : FuncUnit; // ALU pipeline 1 27def A9_AGU : FuncUnit; // Address generation unit for ld / st 28def A9_NPipe : FuncUnit; // NEON pipeline 29def A9_MUX0 : FuncUnit; // AGU + NEON/FPU multiplexer 30def A9_LSUnit : FuncUnit; // L/S Unit 31def A9_DRegsVFP: FuncUnit; // FP register set, VFP side 32def A9_DRegsN : FuncUnit; // FP register set, NEON side 33 34// Bypasses 35def A9_LdBypass : Bypass; 36 37def CortexA9Itineraries : ProcessorItineraries< 38 [A9_Issue0, A9_Issue1, A9_Branch, A9_ALU0, A9_ALU1, A9_AGU, A9_NPipe, A9_MUX0, 39 A9_LSUnit, A9_DRegsVFP, A9_DRegsN], 40 [A9_LdBypass], [ 41 // Two fully-pipelined integer ALU pipelines 42 43 // 44 // Move instructions, unconditional 45 InstrItinData<IIC_iMOVi , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 46 InstrStage<1, [A9_ALU0, A9_ALU1]>], [1]>, 47 InstrItinData<IIC_iMOVr , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 48 InstrStage<1, [A9_ALU0, A9_ALU1]>], [1, 1]>, 49 InstrItinData<IIC_iMOVsi , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 50 InstrStage<1, [A9_ALU0, A9_ALU1]>], [1, 1]>, 51 InstrItinData<IIC_iMOVsr , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 52 InstrStage<2, [A9_ALU0, A9_ALU1]>], [2, 1, 1]>, 53 InstrItinData<IIC_iMOVix2 , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 54 InstrStage<1, [A9_ALU0, A9_ALU1]>, 55 InstrStage<1, [A9_ALU0, A9_ALU1]>], [2]>, 56 InstrItinData<IIC_iMOVix2addpc,[InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 57 InstrStage<1, [A9_ALU0, A9_ALU1]>, 58 InstrStage<1, [A9_ALU0, A9_ALU1]>, 59 InstrStage<1, [A9_ALU0, A9_ALU1]>], [3]>, 60 InstrItinData<IIC_iMOVix2ld,[InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 61 InstrStage<1, [A9_ALU0, A9_ALU1]>, 62 InstrStage<1, [A9_ALU0, A9_ALU1]>, 63 InstrStage<1, [A9_MUX0], 0>, 64 InstrStage<1, [A9_AGU], 0>, 65 InstrStage<1, [A9_LSUnit]>], [5]>, 66 // 67 // MVN instructions 68 InstrItinData<IIC_iMVNi , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 69 InstrStage<1, [A9_ALU0, A9_ALU1]>], 70 [1]>, 71 InstrItinData<IIC_iMVNr , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 72 InstrStage<1, [A9_ALU0, A9_ALU1]>], 73 [1, 1], [NoBypass, A9_LdBypass]>, 74 InstrItinData<IIC_iMVNsi , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 75 InstrStage<2, [A9_ALU0, A9_ALU1]>], 76 [2, 1]>, 77 InstrItinData<IIC_iMVNsr , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 78 InstrStage<3, [A9_ALU0, A9_ALU1]>], 79 [3, 1, 1]>, 80 // 81 // No operand cycles 82 InstrItinData<IIC_iALUx , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 83 InstrStage<1, [A9_ALU0, A9_ALU1]>]>, 84 // 85 // Binary Instructions that produce a result 86 InstrItinData<IIC_iALUi , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 87 InstrStage<1, [A9_ALU0, A9_ALU1]>], 88 [1, 1], [NoBypass, A9_LdBypass]>, 89 InstrItinData<IIC_iALUr , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 90 InstrStage<1, [A9_ALU0, A9_ALU1]>], 91 [1, 1, 1], [NoBypass, A9_LdBypass, A9_LdBypass]>, 92 InstrItinData<IIC_iALUsi, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 93 InstrStage<2, [A9_ALU0, A9_ALU1]>], 94 [2, 1, 1], [NoBypass, A9_LdBypass, NoBypass]>, 95 InstrItinData<IIC_iALUsir,[InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 96 InstrStage<2, [A9_ALU0, A9_ALU1]>], 97 [2, 1, 1], [NoBypass, NoBypass, A9_LdBypass]>, 98 InstrItinData<IIC_iALUsr, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 99 InstrStage<3, [A9_ALU0, A9_ALU1]>], 100 [3, 1, 1, 1], 101 [NoBypass, A9_LdBypass, NoBypass, NoBypass]>, 102 // 103 // Bitwise Instructions that produce a result 104 InstrItinData<IIC_iBITi , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 105 InstrStage<1, [A9_ALU0, A9_ALU1]>], [1, 1]>, 106 InstrItinData<IIC_iBITr , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 107 InstrStage<1, [A9_ALU0, A9_ALU1]>], [1, 1, 1]>, 108 InstrItinData<IIC_iBITsi, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 109 InstrStage<2, [A9_ALU0, A9_ALU1]>], [2, 1, 1]>, 110 InstrItinData<IIC_iBITsr, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 111 InstrStage<3, [A9_ALU0, A9_ALU1]>], [3, 1, 1, 1]>, 112 // 113 // Unary Instructions that produce a result 114 115 // CLZ, RBIT, etc. 116 InstrItinData<IIC_iUNAr , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 117 InstrStage<1, [A9_ALU0, A9_ALU1]>], [1, 1]>, 118 119 // BFC, BFI, UBFX, SBFX 120 InstrItinData<IIC_iUNAsi, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 121 InstrStage<2, [A9_ALU0, A9_ALU1]>], [2, 1]>, 122 123 // 124 // Zero and sign extension instructions 125 InstrItinData<IIC_iEXTr , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 126 InstrStage<1, [A9_ALU0, A9_ALU1]>], [2, 1]>, 127 InstrItinData<IIC_iEXTAr, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 128 InstrStage<2, [A9_ALU0, A9_ALU1]>], [3, 1, 1]>, 129 InstrItinData<IIC_iEXTAsr,[InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 130 InstrStage<3, [A9_ALU0, A9_ALU1]>], [3, 1, 1, 1]>, 131 // 132 // Compare instructions 133 InstrItinData<IIC_iCMPi , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 134 InstrStage<1, [A9_ALU0, A9_ALU1]>], 135 [1], [A9_LdBypass]>, 136 InstrItinData<IIC_iCMPr , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 137 InstrStage<1, [A9_ALU0, A9_ALU1]>], 138 [1, 1], [A9_LdBypass, A9_LdBypass]>, 139 InstrItinData<IIC_iCMPsi , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 140 InstrStage<2, [A9_ALU0, A9_ALU1]>], 141 [1, 1], [A9_LdBypass, NoBypass]>, 142 InstrItinData<IIC_iCMPsr , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 143 InstrStage<3, [A9_ALU0, A9_ALU1]>], 144 [1, 1, 1], [A9_LdBypass, NoBypass, NoBypass]>, 145 // 146 // Test instructions 147 InstrItinData<IIC_iTSTi , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 148 InstrStage<1, [A9_ALU0, A9_ALU1]>], [1]>, 149 InstrItinData<IIC_iTSTr , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 150 InstrStage<1, [A9_ALU0, A9_ALU1]>], [1, 1]>, 151 InstrItinData<IIC_iTSTsi , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 152 InstrStage<2, [A9_ALU0, A9_ALU1]>], [1, 1]>, 153 InstrItinData<IIC_iTSTsr , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 154 InstrStage<3, [A9_ALU0, A9_ALU1]>], [1, 1, 1]>, 155 // 156 // Move instructions, conditional 157 // FIXME: Correctly model the extra input dep on the destination. 158 InstrItinData<IIC_iCMOVi , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 159 InstrStage<1, [A9_ALU0, A9_ALU1]>], [1]>, 160 InstrItinData<IIC_iCMOVr , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 161 InstrStage<1, [A9_ALU0, A9_ALU1]>], [1, 1]>, 162 InstrItinData<IIC_iCMOVsi , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 163 InstrStage<1, [A9_ALU0, A9_ALU1]>], [1, 1]>, 164 InstrItinData<IIC_iCMOVsr , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 165 InstrStage<2, [A9_ALU0, A9_ALU1]>], [2, 1, 1]>, 166 InstrItinData<IIC_iCMOVix2, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 167 InstrStage<1, [A9_ALU0, A9_ALU1]>, 168 InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 169 InstrStage<1, [A9_ALU0, A9_ALU1]>], [2]>, 170 171 // Integer multiply pipeline 172 // 173 InstrItinData<IIC_iMUL16 , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 174 InstrStage<2, [A9_ALU0]>], [3, 1, 1]>, 175 InstrItinData<IIC_iMAC16 , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 176 InstrStage<2, [A9_ALU0]>], 177 [3, 1, 1, 1]>, 178 InstrItinData<IIC_iMUL32 , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 179 InstrStage<2, [A9_ALU0]>], [4, 1, 1]>, 180 InstrItinData<IIC_iMAC32 , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 181 InstrStage<2, [A9_ALU0]>], 182 [4, 1, 1, 1]>, 183 InstrItinData<IIC_iMUL64 , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 184 InstrStage<3, [A9_ALU0]>], [4, 5, 1, 1]>, 185 InstrItinData<IIC_iMAC64 , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 186 InstrStage<3, [A9_ALU0]>], 187 [4, 5, 1, 1]>, 188 // Integer load pipeline 189 // FIXME: The timings are some rough approximations 190 // 191 // Immediate offset 192 InstrItinData<IIC_iLoad_i , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 193 InstrStage<1, [A9_MUX0], 0>, 194 InstrStage<1, [A9_AGU], 0>, 195 InstrStage<1, [A9_LSUnit]>], 196 [3, 1], [A9_LdBypass]>, 197 InstrItinData<IIC_iLoad_bh_i, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 198 InstrStage<1, [A9_MUX0], 0>, 199 InstrStage<2, [A9_AGU], 0>, 200 InstrStage<1, [A9_LSUnit]>], 201 [4, 1], [A9_LdBypass]>, 202 // FIXME: If address is 64-bit aligned, AGU cycles is 1. 203 InstrItinData<IIC_iLoad_d_i , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 204 InstrStage<1, [A9_MUX0], 0>, 205 InstrStage<2, [A9_AGU], 0>, 206 InstrStage<1, [A9_LSUnit]>], 207 [3, 3, 1], [A9_LdBypass]>, 208 // 209 // Register offset 210 InstrItinData<IIC_iLoad_r , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 211 InstrStage<1, [A9_MUX0], 0>, 212 InstrStage<1, [A9_AGU], 0>, 213 InstrStage<1, [A9_LSUnit]>], 214 [3, 1, 1], [A9_LdBypass]>, 215 InstrItinData<IIC_iLoad_bh_r, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 216 InstrStage<1, [A9_MUX0], 0>, 217 InstrStage<2, [A9_AGU], 0>, 218 InstrStage<1, [A9_LSUnit]>], 219 [4, 1, 1], [A9_LdBypass]>, 220 InstrItinData<IIC_iLoad_d_r , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 221 InstrStage<1, [A9_MUX0], 0>, 222 InstrStage<2, [A9_AGU], 0>, 223 InstrStage<1, [A9_LSUnit]>], 224 [3, 3, 1, 1], [A9_LdBypass]>, 225 // 226 // Scaled register offset 227 InstrItinData<IIC_iLoad_si , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 228 InstrStage<1, [A9_MUX0], 0>, 229 InstrStage<1, [A9_AGU], 0>, 230 InstrStage<1, [A9_LSUnit], 0>], 231 [4, 1, 1], [A9_LdBypass]>, 232 InstrItinData<IIC_iLoad_bh_si,[InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 233 InstrStage<1, [A9_MUX0], 0>, 234 InstrStage<2, [A9_AGU], 0>, 235 InstrStage<1, [A9_LSUnit]>], 236 [5, 1, 1], [A9_LdBypass]>, 237 // 238 // Immediate offset with update 239 InstrItinData<IIC_iLoad_iu , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 240 InstrStage<1, [A9_MUX0], 0>, 241 InstrStage<1, [A9_AGU], 0>, 242 InstrStage<1, [A9_LSUnit]>], 243 [3, 2, 1], [A9_LdBypass]>, 244 InstrItinData<IIC_iLoad_bh_iu,[InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 245 InstrStage<1, [A9_MUX0], 0>, 246 InstrStage<2, [A9_AGU], 0>, 247 InstrStage<1, [A9_LSUnit]>], 248 [4, 3, 1], [A9_LdBypass]>, 249 // 250 // Register offset with update 251 InstrItinData<IIC_iLoad_ru , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 252 InstrStage<1, [A9_MUX0], 0>, 253 InstrStage<1, [A9_AGU], 0>, 254 InstrStage<1, [A9_LSUnit]>], 255 [3, 2, 1, 1], [A9_LdBypass]>, 256 InstrItinData<IIC_iLoad_bh_ru,[InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 257 InstrStage<1, [A9_MUX0], 0>, 258 InstrStage<2, [A9_AGU], 0>, 259 InstrStage<1, [A9_LSUnit]>], 260 [4, 3, 1, 1], [A9_LdBypass]>, 261 InstrItinData<IIC_iLoad_d_ru, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 262 InstrStage<1, [A9_MUX0], 0>, 263 InstrStage<2, [A9_AGU], 0>, 264 InstrStage<1, [A9_LSUnit]>], 265 [3, 3, 1, 1], [A9_LdBypass]>, 266 // 267 // Scaled register offset with update 268 InstrItinData<IIC_iLoad_siu , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 269 InstrStage<1, [A9_MUX0], 0>, 270 InstrStage<1, [A9_AGU], 0>, 271 InstrStage<1, [A9_LSUnit]>], 272 [4, 3, 1, 1], [A9_LdBypass]>, 273 InstrItinData<IIC_iLoad_bh_siu,[InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 274 InstrStage<1, [A9_MUX0], 0>, 275 InstrStage<2, [A9_AGU], 0>, 276 InstrStage<1, [A9_LSUnit]>], 277 [5, 4, 1, 1], [A9_LdBypass]>, 278 // 279 // Load multiple, def is the 5th operand. 280 // FIXME: This assumes 3 to 4 registers. 281 InstrItinData<IIC_iLoad_m , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 282 InstrStage<1, [A9_MUX0], 0>, 283 InstrStage<2, [A9_AGU], 1>, 284 InstrStage<2, [A9_LSUnit]>], 285 [1, 1, 1, 1, 3], 286 [NoBypass, NoBypass, NoBypass, NoBypass, A9_LdBypass], 287 -1>, // dynamic uops 288 // 289 // Load multiple + update, defs are the 1st and 5th operands. 290 InstrItinData<IIC_iLoad_mu , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 291 InstrStage<1, [A9_MUX0], 0>, 292 InstrStage<2, [A9_AGU], 1>, 293 InstrStage<2, [A9_LSUnit]>], 294 [2, 1, 1, 1, 3], 295 [NoBypass, NoBypass, NoBypass, NoBypass, A9_LdBypass], 296 -1>, // dynamic uops 297 // 298 // Load multiple plus branch 299 InstrItinData<IIC_iLoad_mBr, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 300 InstrStage<1, [A9_MUX0], 0>, 301 InstrStage<1, [A9_AGU], 1>, 302 InstrStage<2, [A9_LSUnit]>, 303 InstrStage<1, [A9_Branch]>], 304 [1, 2, 1, 1, 3], 305 [NoBypass, NoBypass, NoBypass, NoBypass, A9_LdBypass], 306 -1>, // dynamic uops 307 // 308 // Pop, def is the 3rd operand. 309 InstrItinData<IIC_iPop , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 310 InstrStage<1, [A9_MUX0], 0>, 311 InstrStage<2, [A9_AGU], 1>, 312 InstrStage<2, [A9_LSUnit]>], 313 [1, 1, 3], 314 [NoBypass, NoBypass, A9_LdBypass], 315 -1>, // dynamic uops 316 // 317 // Pop + branch, def is the 3rd operand. 318 InstrItinData<IIC_iPop_Br, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 319 InstrStage<1, [A9_MUX0], 0>, 320 InstrStage<2, [A9_AGU], 1>, 321 InstrStage<2, [A9_LSUnit]>, 322 InstrStage<1, [A9_Branch]>], 323 [1, 1, 3], 324 [NoBypass, NoBypass, A9_LdBypass], 325 -1>, // dynamic uops 326 // 327 // iLoadi + iALUr for t2LDRpci_pic. 328 InstrItinData<IIC_iLoadiALU, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 329 InstrStage<1, [A9_MUX0], 0>, 330 InstrStage<1, [A9_AGU], 0>, 331 InstrStage<1, [A9_LSUnit]>, 332 InstrStage<1, [A9_ALU0, A9_ALU1]>], 333 [2, 1]>, 334 335 // Integer store pipeline 336 /// 337 // Immediate offset 338 InstrItinData<IIC_iStore_i , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 339 InstrStage<1, [A9_MUX0], 0>, 340 InstrStage<1, [A9_AGU], 0>, 341 InstrStage<1, [A9_LSUnit]>], [1, 1]>, 342 InstrItinData<IIC_iStore_bh_i,[InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 343 InstrStage<1, [A9_MUX0], 0>, 344 InstrStage<2, [A9_AGU], 1>, 345 InstrStage<1, [A9_LSUnit]>], [1, 1]>, 346 // FIXME: If address is 64-bit aligned, AGU cycles is 1. 347 InstrItinData<IIC_iStore_d_i, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 348 InstrStage<1, [A9_MUX0], 0>, 349 InstrStage<2, [A9_AGU], 1>, 350 InstrStage<1, [A9_LSUnit]>], [1, 1]>, 351 // 352 // Register offset 353 InstrItinData<IIC_iStore_r , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 354 InstrStage<1, [A9_MUX0], 0>, 355 InstrStage<1, [A9_AGU], 0>, 356 InstrStage<1, [A9_LSUnit]>], [1, 1, 1]>, 357 InstrItinData<IIC_iStore_bh_r,[InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 358 InstrStage<1, [A9_MUX0], 0>, 359 InstrStage<2, [A9_AGU], 1>, 360 InstrStage<1, [A9_LSUnit]>], [1, 1, 1]>, 361 InstrItinData<IIC_iStore_d_r, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 362 InstrStage<1, [A9_MUX0], 0>, 363 InstrStage<2, [A9_AGU], 1>, 364 InstrStage<1, [A9_LSUnit]>], [1, 1, 1]>, 365 // 366 // Scaled register offset 367 InstrItinData<IIC_iStore_si , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 368 InstrStage<1, [A9_MUX0], 0>, 369 InstrStage<1, [A9_AGU], 0>, 370 InstrStage<1, [A9_LSUnit]>], [1, 1, 1]>, 371 InstrItinData<IIC_iStore_bh_si,[InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 372 InstrStage<1, [A9_MUX0], 0>, 373 InstrStage<2, [A9_AGU], 1>, 374 InstrStage<1, [A9_LSUnit]>], [1, 1, 1]>, 375 // 376 // Immediate offset with update 377 InstrItinData<IIC_iStore_iu , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 378 InstrStage<1, [A9_MUX0], 0>, 379 InstrStage<1, [A9_AGU], 0>, 380 InstrStage<1, [A9_LSUnit]>], [2, 1, 1]>, 381 InstrItinData<IIC_iStore_bh_iu,[InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 382 InstrStage<1, [A9_MUX0], 0>, 383 InstrStage<2, [A9_AGU], 1>, 384 InstrStage<1, [A9_LSUnit]>], [3, 1, 1]>, 385 // 386 // Register offset with update 387 InstrItinData<IIC_iStore_ru , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 388 InstrStage<1, [A9_MUX0], 0>, 389 InstrStage<1, [A9_AGU], 0>, 390 InstrStage<1, [A9_LSUnit]>], 391 [2, 1, 1, 1]>, 392 InstrItinData<IIC_iStore_bh_ru,[InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 393 InstrStage<1, [A9_MUX0], 0>, 394 InstrStage<2, [A9_AGU], 1>, 395 InstrStage<1, [A9_LSUnit]>], 396 [3, 1, 1, 1]>, 397 InstrItinData<IIC_iStore_d_ru, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 398 InstrStage<1, [A9_MUX0], 0>, 399 InstrStage<2, [A9_AGU], 1>, 400 InstrStage<1, [A9_LSUnit]>], 401 [3, 1, 1, 1]>, 402 // 403 // Scaled register offset with update 404 InstrItinData<IIC_iStore_siu, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 405 InstrStage<1, [A9_MUX0], 0>, 406 InstrStage<1, [A9_AGU], 0>, 407 InstrStage<1, [A9_LSUnit]>], 408 [2, 1, 1, 1]>, 409 InstrItinData<IIC_iStore_bh_siu, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 410 InstrStage<1, [A9_MUX0], 0>, 411 InstrStage<2, [A9_AGU], 1>, 412 InstrStage<1, [A9_LSUnit]>], 413 [3, 1, 1, 1]>, 414 // 415 // Store multiple 416 InstrItinData<IIC_iStore_m , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 417 InstrStage<1, [A9_MUX0], 0>, 418 InstrStage<1, [A9_AGU], 0>, 419 InstrStage<2, [A9_LSUnit]>], 420 [], [], -1>, // dynamic uops 421 // 422 // Store multiple + update 423 InstrItinData<IIC_iStore_mu, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 424 InstrStage<1, [A9_MUX0], 0>, 425 InstrStage<1, [A9_AGU], 0>, 426 InstrStage<2, [A9_LSUnit]>], 427 [2], [], -1>, // dynamic uops 428 // 429 // Preload 430 InstrItinData<IIC_Preload, [InstrStage<1, [A9_Issue0, A9_Issue1]>], [1, 1]>, 431 432 // Branch 433 // 434 // no delay slots, so the latency of a branch is unimportant 435 InstrItinData<IIC_Br , [InstrStage<1, [A9_Issue0], 0>, 436 InstrStage<1, [A9_Issue1], 0>, 437 InstrStage<1, [A9_Branch]>]>, 438 439 // VFP and NEON shares the same register file. This means that every VFP 440 // instruction should wait for full completion of the consecutive NEON 441 // instruction and vice-versa. We model this behavior with two artificial FUs: 442 // DRegsVFP and DRegsVFP. 443 // 444 // Every VFP instruction: 445 // - Acquires DRegsVFP resource for 1 cycle 446 // - Reserves DRegsN resource for the whole duration (including time to 447 // register file writeback!). 448 // Every NEON instruction does the same but with FUs swapped. 449 // 450 // Since the reserved FU cannot be acquired, this models precisely 451 // "cross-domain" stalls. 452 453 // VFP 454 // Issue through integer pipeline, and execute in NEON unit. 455 456 // FP Special Register to Integer Register File Move 457 InstrItinData<IIC_fpSTAT , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 458 InstrStage<1, [A9_MUX0], 0>, 459 InstrStage<1, [A9_DRegsVFP], 0, Required>, 460 InstrStage<2, [A9_DRegsN], 0, Reserved>, 461 InstrStage<1, [A9_NPipe]>], 462 [1]>, 463 // 464 // Single-precision FP Unary 465 InstrItinData<IIC_fpUNA32 , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 466 InstrStage<1, [A9_MUX0], 0>, 467 InstrStage<1, [A9_DRegsVFP], 0, Required>, 468 // Extra latency cycles since wbck is 2 cycles 469 InstrStage<3, [A9_DRegsN], 0, Reserved>, 470 InstrStage<1, [A9_NPipe]>], 471 [1, 1]>, 472 // 473 // Double-precision FP Unary 474 InstrItinData<IIC_fpUNA64 , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 475 InstrStage<1, [A9_MUX0], 0>, 476 InstrStage<1, [A9_DRegsVFP], 0, Required>, 477 // Extra latency cycles since wbck is 2 cycles 478 InstrStage<3, [A9_DRegsN], 0, Reserved>, 479 InstrStage<1, [A9_NPipe]>], 480 [1, 1]>, 481 482 // 483 // Single-precision FP Compare 484 InstrItinData<IIC_fpCMP32 , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 485 InstrStage<1, [A9_MUX0], 0>, 486 InstrStage<1, [A9_DRegsVFP], 0, Required>, 487 // Extra latency cycles since wbck is 4 cycles 488 InstrStage<5, [A9_DRegsN], 0, Reserved>, 489 InstrStage<1, [A9_NPipe]>], 490 [1, 1]>, 491 // 492 // Double-precision FP Compare 493 InstrItinData<IIC_fpCMP64 , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 494 InstrStage<1, [A9_MUX0], 0>, 495 InstrStage<1, [A9_DRegsVFP], 0, Required>, 496 // Extra latency cycles since wbck is 4 cycles 497 InstrStage<5, [A9_DRegsN], 0, Reserved>, 498 InstrStage<1, [A9_NPipe]>], 499 [1, 1]>, 500 // 501 // Single to Double FP Convert 502 InstrItinData<IIC_fpCVTSD , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 503 InstrStage<1, [A9_MUX0], 0>, 504 InstrStage<1, [A9_DRegsVFP], 0, Required>, 505 InstrStage<5, [A9_DRegsN], 0, Reserved>, 506 InstrStage<1, [A9_NPipe]>], 507 [4, 1]>, 508 // 509 // Double to Single FP Convert 510 InstrItinData<IIC_fpCVTDS , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 511 InstrStage<1, [A9_MUX0], 0>, 512 InstrStage<1, [A9_DRegsVFP], 0, Required>, 513 InstrStage<5, [A9_DRegsN], 0, Reserved>, 514 InstrStage<1, [A9_NPipe]>], 515 [4, 1]>, 516 517 // 518 // Single to Half FP Convert 519 InstrItinData<IIC_fpCVTSH , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 520 InstrStage<1, [A9_MUX0], 0>, 521 InstrStage<1, [A9_DRegsVFP], 0, Required>, 522 InstrStage<5, [A9_DRegsN], 0, Reserved>, 523 InstrStage<1, [A9_NPipe]>], 524 [4, 1]>, 525 // 526 // Half to Single FP Convert 527 InstrItinData<IIC_fpCVTHS , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 528 InstrStage<1, [A9_MUX0], 0>, 529 InstrStage<1, [A9_DRegsVFP], 0, Required>, 530 InstrStage<3, [A9_DRegsN], 0, Reserved>, 531 InstrStage<1, [A9_NPipe]>], 532 [2, 1]>, 533 534 // 535 // Single-Precision FP to Integer Convert 536 InstrItinData<IIC_fpCVTSI , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 537 InstrStage<1, [A9_MUX0], 0>, 538 InstrStage<1, [A9_DRegsVFP], 0, Required>, 539 InstrStage<5, [A9_DRegsN], 0, Reserved>, 540 InstrStage<1, [A9_NPipe]>], 541 [4, 1]>, 542 // 543 // Double-Precision FP to Integer Convert 544 InstrItinData<IIC_fpCVTDI , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 545 InstrStage<1, [A9_MUX0], 0>, 546 InstrStage<1, [A9_DRegsVFP], 0, Required>, 547 InstrStage<5, [A9_DRegsN], 0, Reserved>, 548 InstrStage<1, [A9_NPipe]>], 549 [4, 1]>, 550 // 551 // Integer to Single-Precision FP Convert 552 InstrItinData<IIC_fpCVTIS , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 553 InstrStage<1, [A9_MUX0], 0>, 554 InstrStage<1, [A9_DRegsVFP], 0, Required>, 555 InstrStage<5, [A9_DRegsN], 0, Reserved>, 556 InstrStage<1, [A9_NPipe]>], 557 [4, 1]>, 558 // 559 // Integer to Double-Precision FP Convert 560 InstrItinData<IIC_fpCVTID , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 561 InstrStage<1, [A9_MUX0], 0>, 562 InstrStage<1, [A9_DRegsVFP], 0, Required>, 563 InstrStage<5, [A9_DRegsN], 0, Reserved>, 564 InstrStage<1, [A9_NPipe]>], 565 [4, 1]>, 566 // 567 // Single-precision FP ALU 568 InstrItinData<IIC_fpALU32 , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 569 InstrStage<1, [A9_MUX0], 0>, 570 InstrStage<1, [A9_DRegsVFP], 0, Required>, 571 InstrStage<5, [A9_DRegsN], 0, Reserved>, 572 InstrStage<1, [A9_NPipe]>], 573 [4, 1, 1]>, 574 // 575 // Double-precision FP ALU 576 InstrItinData<IIC_fpALU64 , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 577 InstrStage<1, [A9_MUX0], 0>, 578 InstrStage<1, [A9_DRegsVFP], 0, Required>, 579 InstrStage<5, [A9_DRegsN], 0, Reserved>, 580 InstrStage<1, [A9_NPipe]>], 581 [4, 1, 1]>, 582 // 583 // Single-precision FP Multiply 584 InstrItinData<IIC_fpMUL32 , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 585 InstrStage<1, [A9_MUX0], 0>, 586 InstrStage<1, [A9_DRegsVFP], 0, Required>, 587 InstrStage<6, [A9_DRegsN], 0, Reserved>, 588 InstrStage<1, [A9_NPipe]>], 589 [5, 1, 1]>, 590 // 591 // Double-precision FP Multiply 592 InstrItinData<IIC_fpMUL64 , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 593 InstrStage<1, [A9_MUX0], 0>, 594 InstrStage<1, [A9_DRegsVFP], 0, Required>, 595 InstrStage<7, [A9_DRegsN], 0, Reserved>, 596 InstrStage<2, [A9_NPipe]>], 597 [6, 1, 1]>, 598 // 599 // Single-precision FP MAC 600 InstrItinData<IIC_fpMAC32 , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 601 InstrStage<1, [A9_MUX0], 0>, 602 InstrStage<1, [A9_DRegsVFP], 0, Required>, 603 InstrStage<9, [A9_DRegsN], 0, Reserved>, 604 InstrStage<1, [A9_NPipe]>], 605 [8, 1, 1, 1]>, 606 // 607 // Double-precision FP MAC 608 InstrItinData<IIC_fpMAC64 , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 609 InstrStage<1, [A9_MUX0], 0>, 610 InstrStage<1, [A9_DRegsVFP], 0, Required>, 611 InstrStage<10, [A9_DRegsN], 0, Reserved>, 612 InstrStage<2, [A9_NPipe]>], 613 [9, 1, 1, 1]>, 614 // 615 // Single-precision Fused FP MAC 616 InstrItinData<IIC_fpFMAC32, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 617 InstrStage<1, [A9_MUX0], 0>, 618 InstrStage<1, [A9_DRegsVFP], 0, Required>, 619 InstrStage<9, [A9_DRegsN], 0, Reserved>, 620 InstrStage<1, [A9_NPipe]>], 621 [8, 1, 1, 1]>, 622 // 623 // Double-precision Fused FP MAC 624 InstrItinData<IIC_fpFMAC64, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 625 InstrStage<1, [A9_MUX0], 0>, 626 InstrStage<1, [A9_DRegsVFP], 0, Required>, 627 InstrStage<10, [A9_DRegsN], 0, Reserved>, 628 InstrStage<2, [A9_NPipe]>], 629 [9, 1, 1, 1]>, 630 // 631 // Single-precision FP DIV 632 InstrItinData<IIC_fpDIV32 , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 633 InstrStage<1, [A9_MUX0], 0>, 634 InstrStage<1, [A9_DRegsVFP], 0, Required>, 635 InstrStage<16, [A9_DRegsN], 0, Reserved>, 636 InstrStage<10, [A9_NPipe]>], 637 [15, 1, 1]>, 638 // 639 // Double-precision FP DIV 640 InstrItinData<IIC_fpDIV64 , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 641 InstrStage<1, [A9_MUX0], 0>, 642 InstrStage<1, [A9_DRegsVFP], 0, Required>, 643 InstrStage<26, [A9_DRegsN], 0, Reserved>, 644 InstrStage<20, [A9_NPipe]>], 645 [25, 1, 1]>, 646 // 647 // Single-precision FP SQRT 648 InstrItinData<IIC_fpSQRT32, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 649 InstrStage<1, [A9_MUX0], 0>, 650 InstrStage<1, [A9_DRegsVFP], 0, Required>, 651 InstrStage<18, [A9_DRegsN], 0, Reserved>, 652 InstrStage<13, [A9_NPipe]>], 653 [17, 1]>, 654 // 655 // Double-precision FP SQRT 656 InstrItinData<IIC_fpSQRT64, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 657 InstrStage<1, [A9_MUX0], 0>, 658 InstrStage<1, [A9_DRegsVFP], 0, Required>, 659 InstrStage<33, [A9_DRegsN], 0, Reserved>, 660 InstrStage<28, [A9_NPipe]>], 661 [32, 1]>, 662 663 // 664 // Integer to Single-precision Move 665 InstrItinData<IIC_fpMOVIS, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 666 InstrStage<1, [A9_MUX0], 0>, 667 InstrStage<1, [A9_DRegsVFP], 0, Required>, 668 // Extra 1 latency cycle since wbck is 2 cycles 669 InstrStage<3, [A9_DRegsN], 0, Reserved>, 670 InstrStage<1, [A9_NPipe]>], 671 [1, 1]>, 672 // 673 // Integer to Double-precision Move 674 InstrItinData<IIC_fpMOVID, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 675 InstrStage<1, [A9_MUX0], 0>, 676 InstrStage<1, [A9_DRegsVFP], 0, Required>, 677 // Extra 1 latency cycle since wbck is 2 cycles 678 InstrStage<3, [A9_DRegsN], 0, Reserved>, 679 InstrStage<1, [A9_NPipe]>], 680 [1, 1, 1]>, 681 // 682 // Single-precision to Integer Move 683 // 684 // On A9 move-from-VFP is free to issue with no stall if other VFP 685 // operations are in flight. I assume it still can't dual-issue though. 686 InstrItinData<IIC_fpMOVSI, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 687 InstrStage<1, [A9_MUX0], 0>], 688 [2, 1]>, 689 // 690 // Double-precision to Integer Move 691 // 692 // On A9 move-from-VFP is free to issue with no stall if other VFP 693 // operations are in flight. I assume it still can't dual-issue though. 694 InstrItinData<IIC_fpMOVDI, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 695 InstrStage<1, [A9_MUX0], 0>], 696 [2, 1, 1]>, 697 // 698 // Single-precision FP Load 699 InstrItinData<IIC_fpLoad32, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 700 InstrStage<1, [A9_MUX0], 0>, 701 InstrStage<1, [A9_DRegsVFP], 0, Required>, 702 InstrStage<2, [A9_DRegsN], 0, Reserved>, 703 InstrStage<1, [A9_NPipe], 0>, 704 InstrStage<1, [A9_LSUnit]>], 705 [1, 1]>, 706 // 707 // Double-precision FP Load 708 // FIXME: Result latency is 1 if address is 64-bit aligned. 709 InstrItinData<IIC_fpLoad64, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 710 InstrStage<1, [A9_MUX0], 0>, 711 InstrStage<1, [A9_DRegsVFP], 0, Required>, 712 InstrStage<2, [A9_DRegsN], 0, Reserved>, 713 InstrStage<1, [A9_NPipe], 0>, 714 InstrStage<1, [A9_LSUnit]>], 715 [2, 1]>, 716 // 717 // FP Load Multiple 718 // FIXME: assumes 2 doubles which requires 2 LS cycles. 719 InstrItinData<IIC_fpLoad_m, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 720 InstrStage<1, [A9_MUX0], 0>, 721 InstrStage<1, [A9_DRegsVFP], 0, Required>, 722 InstrStage<2, [A9_DRegsN], 0, Reserved>, 723 InstrStage<1, [A9_NPipe], 0>, 724 InstrStage<2, [A9_LSUnit]>], 725 [1, 1, 1, 1], [], -1>, // dynamic uops 726 // 727 // FP Load Multiple + update 728 // FIXME: assumes 2 doubles which requires 2 LS cycles. 729 InstrItinData<IIC_fpLoad_mu,[InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 730 InstrStage<1, [A9_MUX0], 0>, 731 InstrStage<1, [A9_DRegsVFP], 0, Required>, 732 InstrStage<2, [A9_DRegsN], 0, Reserved>, 733 InstrStage<1, [A9_NPipe], 0>, 734 InstrStage<2, [A9_LSUnit]>], 735 [2, 1, 1, 1], [], -1>, // dynamic uops 736 // 737 // Single-precision FP Store 738 InstrItinData<IIC_fpStore32,[InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 739 InstrStage<1, [A9_MUX0], 0>, 740 InstrStage<1, [A9_DRegsVFP], 0, Required>, 741 InstrStage<2, [A9_DRegsN], 0, Reserved>, 742 InstrStage<1, [A9_NPipe], 0>, 743 InstrStage<1, [A9_LSUnit]>], 744 [1, 1]>, 745 // 746 // Double-precision FP Store 747 InstrItinData<IIC_fpStore64,[InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 748 InstrStage<1, [A9_MUX0], 0>, 749 InstrStage<1, [A9_DRegsVFP], 0, Required>, 750 InstrStage<2, [A9_DRegsN], 0, Reserved>, 751 InstrStage<1, [A9_NPipe], 0>, 752 InstrStage<1, [A9_LSUnit]>], 753 [1, 1]>, 754 // 755 // FP Store Multiple 756 // FIXME: assumes 2 doubles which requires 2 LS cycles. 757 InstrItinData<IIC_fpStore_m,[InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 758 InstrStage<1, [A9_MUX0], 0>, 759 InstrStage<1, [A9_DRegsVFP], 0, Required>, 760 InstrStage<2, [A9_DRegsN], 0, Reserved>, 761 InstrStage<1, [A9_NPipe], 0>, 762 InstrStage<2, [A9_LSUnit]>], 763 [1, 1, 1, 1], [], -1>, // dynamic uops 764 // 765 // FP Store Multiple + update 766 // FIXME: assumes 2 doubles which requires 2 LS cycles. 767 InstrItinData<IIC_fpStore_mu,[InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 768 InstrStage<1, [A9_MUX0], 0>, 769 InstrStage<1, [A9_DRegsVFP], 0, Required>, 770 InstrStage<2, [A9_DRegsN], 0, Reserved>, 771 InstrStage<1, [A9_NPipe], 0>, 772 InstrStage<2, [A9_LSUnit]>], 773 [2, 1, 1, 1], [], -1>, // dynamic uops 774 // NEON 775 // VLD1 776 InstrItinData<IIC_VLD1, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 777 InstrStage<1, [A9_MUX0], 0>, 778 InstrStage<1, [A9_DRegsN], 0, Required>, 779 InstrStage<7, [A9_DRegsVFP], 0, Reserved>, 780 InstrStage<1, [A9_NPipe], 0>, 781 InstrStage<1, [A9_LSUnit]>], 782 [1, 1]>, 783 // VLD1x2 784 InstrItinData<IIC_VLD1x2, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 785 InstrStage<1, [A9_MUX0], 0>, 786 InstrStage<1, [A9_DRegsN], 0, Required>, 787 InstrStage<7, [A9_DRegsVFP], 0, Reserved>, 788 InstrStage<1, [A9_NPipe], 0>, 789 InstrStage<1, [A9_LSUnit]>], 790 [1, 1, 1]>, 791 // VLD1x3 792 InstrItinData<IIC_VLD1x3, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 793 InstrStage<1, [A9_MUX0], 0>, 794 InstrStage<1, [A9_DRegsN], 0, Required>, 795 InstrStage<8, [A9_DRegsVFP], 0, Reserved>, 796 InstrStage<2, [A9_NPipe], 0>, 797 InstrStage<2, [A9_LSUnit]>], 798 [1, 1, 2, 1]>, 799 // VLD1x4 800 InstrItinData<IIC_VLD1x4, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 801 InstrStage<1, [A9_MUX0], 0>, 802 InstrStage<1, [A9_DRegsN], 0, Required>, 803 InstrStage<8, [A9_DRegsVFP], 0, Reserved>, 804 InstrStage<2, [A9_NPipe], 0>, 805 InstrStage<2, [A9_LSUnit]>], 806 [1, 1, 2, 2, 1]>, 807 // VLD1u 808 InstrItinData<IIC_VLD1u, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 809 InstrStage<1, [A9_MUX0], 0>, 810 InstrStage<1, [A9_DRegsN], 0, Required>, 811 InstrStage<7, [A9_DRegsVFP], 0, Reserved>, 812 InstrStage<1, [A9_NPipe], 0>, 813 InstrStage<1, [A9_LSUnit]>], 814 [1, 2, 1]>, 815 // VLD1x2u 816 InstrItinData<IIC_VLD1x2u, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 817 InstrStage<1, [A9_MUX0], 0>, 818 InstrStage<1, [A9_DRegsN], 0, Required>, 819 InstrStage<7, [A9_DRegsVFP], 0, Reserved>, 820 InstrStage<1, [A9_NPipe], 0>, 821 InstrStage<1, [A9_LSUnit]>], 822 [1, 1, 2, 1]>, 823 // VLD1x3u 824 InstrItinData<IIC_VLD1x3u, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 825 InstrStage<1, [A9_MUX0], 0>, 826 InstrStage<1, [A9_DRegsN], 0, Required>, 827 InstrStage<8, [A9_DRegsVFP], 0, Reserved>, 828 InstrStage<2, [A9_NPipe], 0>, 829 InstrStage<2, [A9_LSUnit]>], 830 [1, 1, 2, 2, 1]>, 831 // VLD1x4u 832 InstrItinData<IIC_VLD1x4u, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 833 InstrStage<1, [A9_MUX0], 0>, 834 InstrStage<1, [A9_DRegsN], 0, Required>, 835 InstrStage<8, [A9_DRegsVFP], 0, Reserved>, 836 InstrStage<2, [A9_NPipe], 0>, 837 InstrStage<2, [A9_LSUnit]>], 838 [1, 1, 2, 2, 2, 1]>, 839 // 840 // VLD1ln 841 InstrItinData<IIC_VLD1ln, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 842 InstrStage<1, [A9_MUX0], 0>, 843 InstrStage<1, [A9_DRegsN], 0, Required>, 844 InstrStage<8, [A9_DRegsVFP], 0, Reserved>, 845 InstrStage<2, [A9_NPipe], 0>, 846 InstrStage<2, [A9_LSUnit]>], 847 [3, 1, 1, 1]>, 848 // 849 // VLD1lnu 850 InstrItinData<IIC_VLD1lnu, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 851 InstrStage<1, [A9_MUX0], 0>, 852 InstrStage<1, [A9_DRegsN], 0, Required>, 853 InstrStage<8, [A9_DRegsVFP], 0, Reserved>, 854 InstrStage<2, [A9_NPipe], 0>, 855 InstrStage<2, [A9_LSUnit]>], 856 [3, 2, 1, 1, 1, 1]>, 857 // 858 // VLD1dup 859 InstrItinData<IIC_VLD1dup, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 860 InstrStage<1, [A9_MUX0], 0>, 861 InstrStage<1, [A9_DRegsN], 0, Required>, 862 InstrStage<7, [A9_DRegsVFP], 0, Reserved>, 863 InstrStage<1, [A9_NPipe], 0>, 864 InstrStage<1, [A9_LSUnit]>], 865 [2, 1]>, 866 // 867 // VLD1dupu 868 InstrItinData<IIC_VLD1dupu, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 869 InstrStage<1, [A9_MUX0], 0>, 870 InstrStage<1, [A9_DRegsN], 0, Required>, 871 InstrStage<7, [A9_DRegsVFP], 0, Reserved>, 872 InstrStage<1, [A9_NPipe], 0>, 873 InstrStage<1, [A9_LSUnit]>], 874 [2, 2, 1, 1]>, 875 // 876 // VLD2 877 InstrItinData<IIC_VLD2, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 878 InstrStage<1, [A9_MUX0], 0>, 879 InstrStage<1, [A9_DRegsN], 0, Required>, 880 // Extra latency cycles since wbck is 7 cycles 881 InstrStage<7, [A9_DRegsVFP], 0, Reserved>, 882 InstrStage<1, [A9_NPipe], 0>, 883 InstrStage<1, [A9_LSUnit]>], 884 [2, 2, 1]>, 885 // 886 // VLD2x2 887 InstrItinData<IIC_VLD2x2, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 888 InstrStage<1, [A9_MUX0], 0>, 889 InstrStage<1, [A9_DRegsN], 0, Required>, 890 InstrStage<8, [A9_DRegsVFP], 0, Reserved>, 891 InstrStage<2, [A9_NPipe], 0>, 892 InstrStage<2, [A9_LSUnit]>], 893 [2, 3, 2, 3, 1]>, 894 // 895 // VLD2ln 896 InstrItinData<IIC_VLD2ln, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 897 InstrStage<1, [A9_MUX0], 0>, 898 InstrStage<1, [A9_DRegsN], 0, Required>, 899 InstrStage<8, [A9_DRegsVFP], 0, Reserved>, 900 InstrStage<2, [A9_NPipe], 0>, 901 InstrStage<2, [A9_LSUnit]>], 902 [3, 3, 1, 1, 1, 1]>, 903 // 904 // VLD2u 905 InstrItinData<IIC_VLD2u, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 906 InstrStage<1, [A9_MUX0], 0>, 907 InstrStage<1, [A9_DRegsN], 0, Required>, 908 // Extra latency cycles since wbck is 7 cycles 909 InstrStage<7, [A9_DRegsVFP], 0, Reserved>, 910 InstrStage<1, [A9_NPipe], 0>, 911 InstrStage<1, [A9_LSUnit]>], 912 [2, 2, 2, 1, 1, 1]>, 913 // 914 // VLD2x2u 915 InstrItinData<IIC_VLD2x2u, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 916 InstrStage<1, [A9_MUX0], 0>, 917 InstrStage<1, [A9_DRegsN], 0, Required>, 918 InstrStage<8, [A9_DRegsVFP], 0, Reserved>, 919 InstrStage<2, [A9_NPipe], 0>, 920 InstrStage<2, [A9_LSUnit]>], 921 [2, 3, 2, 3, 2, 1]>, 922 // 923 // VLD2lnu 924 InstrItinData<IIC_VLD2lnu, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 925 InstrStage<1, [A9_MUX0], 0>, 926 InstrStage<1, [A9_DRegsN], 0, Required>, 927 InstrStage<8, [A9_DRegsVFP], 0, Reserved>, 928 InstrStage<2, [A9_NPipe], 0>, 929 InstrStage<2, [A9_LSUnit]>], 930 [3, 3, 2, 1, 1, 1, 1, 1]>, 931 // 932 // VLD2dup 933 InstrItinData<IIC_VLD2dup, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 934 InstrStage<1, [A9_MUX0], 0>, 935 InstrStage<1, [A9_DRegsN], 0, Required>, 936 InstrStage<7, [A9_DRegsVFP], 0, Reserved>, 937 InstrStage<1, [A9_NPipe], 0>, 938 InstrStage<1, [A9_LSUnit]>], 939 [2, 2, 1]>, 940 // 941 // VLD2dupu 942 InstrItinData<IIC_VLD2dupu, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 943 InstrStage<1, [A9_MUX0], 0>, 944 InstrStage<1, [A9_DRegsN], 0, Required>, 945 InstrStage<7, [A9_DRegsVFP], 0, Reserved>, 946 InstrStage<1, [A9_NPipe], 0>, 947 InstrStage<1, [A9_LSUnit]>], 948 [2, 2, 2, 1, 1]>, 949 // 950 // VLD3 951 InstrItinData<IIC_VLD3, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 952 InstrStage<1, [A9_MUX0], 0>, 953 InstrStage<1, [A9_DRegsN], 0, Required>, 954 InstrStage<9,[A9_DRegsVFP], 0, Reserved>, 955 InstrStage<3, [A9_NPipe], 0>, 956 InstrStage<3, [A9_LSUnit]>], 957 [3, 3, 4, 1]>, 958 // 959 // VLD3ln 960 InstrItinData<IIC_VLD3ln, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 961 InstrStage<1, [A9_MUX0], 0>, 962 InstrStage<1, [A9_DRegsN], 0, Required>, 963 InstrStage<11,[A9_DRegsVFP], 0, Reserved>, 964 InstrStage<5, [A9_NPipe], 0>, 965 InstrStage<5, [A9_LSUnit]>], 966 [5, 5, 6, 1, 1, 1, 1, 2]>, 967 // 968 // VLD3u 969 InstrItinData<IIC_VLD3u, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 970 InstrStage<1, [A9_MUX0], 0>, 971 InstrStage<1, [A9_DRegsN], 0, Required>, 972 InstrStage<9,[A9_DRegsVFP], 0, Reserved>, 973 InstrStage<3, [A9_NPipe], 0>, 974 InstrStage<3, [A9_LSUnit]>], 975 [3, 3, 4, 2, 1]>, 976 // 977 // VLD3lnu 978 InstrItinData<IIC_VLD3lnu, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 979 InstrStage<1, [A9_MUX0], 0>, 980 InstrStage<1, [A9_DRegsN], 0, Required>, 981 InstrStage<11,[A9_DRegsVFP], 0, Reserved>, 982 InstrStage<5, [A9_NPipe], 0>, 983 InstrStage<5, [A9_LSUnit]>], 984 [5, 5, 6, 2, 1, 1, 1, 1, 1, 2]>, 985 // 986 // VLD3dup 987 InstrItinData<IIC_VLD3dup, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 988 InstrStage<1, [A9_MUX0], 0>, 989 InstrStage<1, [A9_DRegsN], 0, Required>, 990 InstrStage<9, [A9_DRegsVFP], 0, Reserved>, 991 InstrStage<3, [A9_NPipe], 0>, 992 InstrStage<3, [A9_LSUnit]>], 993 [3, 3, 4, 1]>, 994 // 995 // VLD3dupu 996 InstrItinData<IIC_VLD3dupu, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 997 InstrStage<1, [A9_MUX0], 0>, 998 InstrStage<1, [A9_DRegsN], 0, Required>, 999 InstrStage<9, [A9_DRegsVFP], 0, Reserved>, 1000 InstrStage<3, [A9_NPipe], 0>, 1001 InstrStage<3, [A9_LSUnit]>], 1002 [3, 3, 4, 2, 1, 1]>, 1003 // 1004 // VLD4 1005 InstrItinData<IIC_VLD4, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 1006 InstrStage<1, [A9_MUX0], 0>, 1007 InstrStage<1, [A9_DRegsN], 0, Required>, 1008 InstrStage<9,[A9_DRegsVFP], 0, Reserved>, 1009 InstrStage<3, [A9_NPipe], 0>, 1010 InstrStage<3, [A9_LSUnit]>], 1011 [3, 3, 4, 4, 1]>, 1012 // 1013 // VLD4ln 1014 InstrItinData<IIC_VLD4ln, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 1015 InstrStage<1, [A9_MUX0], 0>, 1016 InstrStage<1, [A9_DRegsN], 0, Required>, 1017 InstrStage<10,[A9_DRegsVFP], 0, Reserved>, 1018 InstrStage<4, [A9_NPipe], 0>, 1019 InstrStage<4, [A9_LSUnit]>], 1020 [4, 4, 5, 5, 1, 1, 1, 1, 2, 2]>, 1021 // 1022 // VLD4u 1023 InstrItinData<IIC_VLD4u, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 1024 InstrStage<1, [A9_MUX0], 0>, 1025 InstrStage<1, [A9_DRegsN], 0, Required>, 1026 InstrStage<9,[A9_DRegsVFP], 0, Reserved>, 1027 InstrStage<3, [A9_NPipe], 0>, 1028 InstrStage<3, [A9_LSUnit]>], 1029 [3, 3, 4, 4, 2, 1]>, 1030 // 1031 // VLD4lnu 1032 InstrItinData<IIC_VLD4lnu, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 1033 InstrStage<1, [A9_MUX0], 0>, 1034 InstrStage<1, [A9_DRegsN], 0, Required>, 1035 InstrStage<10,[A9_DRegsVFP], 0, Reserved>, 1036 InstrStage<4, [A9_NPipe], 0>, 1037 InstrStage<4, [A9_LSUnit]>], 1038 [4, 4, 5, 5, 2, 1, 1, 1, 1, 1, 2, 2]>, 1039 // 1040 // VLD4dup 1041 InstrItinData<IIC_VLD4dup, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 1042 InstrStage<1, [A9_MUX0], 0>, 1043 InstrStage<1, [A9_DRegsN], 0, Required>, 1044 InstrStage<8, [A9_DRegsVFP], 0, Reserved>, 1045 InstrStage<2, [A9_NPipe], 0>, 1046 InstrStage<2, [A9_LSUnit]>], 1047 [2, 2, 3, 3, 1]>, 1048 // 1049 // VLD4dupu 1050 InstrItinData<IIC_VLD4dupu, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 1051 InstrStage<1, [A9_MUX0], 0>, 1052 InstrStage<1, [A9_DRegsN], 0, Required>, 1053 InstrStage<8, [A9_DRegsVFP], 0, Reserved>, 1054 InstrStage<2, [A9_NPipe], 0>, 1055 InstrStage<2, [A9_LSUnit]>], 1056 [2, 2, 3, 3, 2, 1, 1]>, 1057 // 1058 // VST1 1059 InstrItinData<IIC_VST1, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 1060 InstrStage<1, [A9_MUX0], 0>, 1061 InstrStage<1, [A9_DRegsN], 0, Required>, 1062 InstrStage<1, [A9_DRegsVFP], 0, Reserved>, 1063 InstrStage<1, [A9_NPipe], 0>, 1064 InstrStage<1, [A9_LSUnit]>], 1065 [1, 1, 1]>, 1066 // 1067 // VST1x2 1068 InstrItinData<IIC_VST1x2, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 1069 InstrStage<1, [A9_MUX0], 0>, 1070 InstrStage<1, [A9_DRegsN], 0, Required>, 1071 InstrStage<1, [A9_DRegsVFP], 0, Reserved>, 1072 InstrStage<1, [A9_NPipe], 0>, 1073 InstrStage<1, [A9_LSUnit]>], 1074 [1, 1, 1, 1]>, 1075 // 1076 // VST1x3 1077 InstrItinData<IIC_VST1x3, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 1078 InstrStage<1, [A9_MUX0], 0>, 1079 InstrStage<1, [A9_DRegsN], 0, Required>, 1080 InstrStage<2, [A9_DRegsVFP], 0, Reserved>, 1081 InstrStage<2, [A9_NPipe], 0>, 1082 InstrStage<2, [A9_LSUnit]>], 1083 [1, 1, 1, 1, 2]>, 1084 // 1085 // VST1x4 1086 InstrItinData<IIC_VST1x4, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 1087 InstrStage<1, [A9_MUX0], 0>, 1088 InstrStage<1, [A9_DRegsN], 0, Required>, 1089 InstrStage<2, [A9_DRegsVFP], 0, Reserved>, 1090 InstrStage<2, [A9_NPipe], 0>, 1091 InstrStage<2, [A9_LSUnit]>], 1092 [1, 1, 1, 1, 2, 2]>, 1093 // 1094 // VST1u 1095 InstrItinData<IIC_VST1u, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 1096 InstrStage<1, [A9_MUX0], 0>, 1097 InstrStage<1, [A9_DRegsN], 0, Required>, 1098 InstrStage<1, [A9_DRegsVFP], 0, Reserved>, 1099 InstrStage<1, [A9_NPipe], 0>, 1100 InstrStage<1, [A9_LSUnit]>], 1101 [2, 1, 1, 1, 1]>, 1102 // 1103 // VST1x2u 1104 InstrItinData<IIC_VST1x2u, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 1105 InstrStage<1, [A9_MUX0], 0>, 1106 InstrStage<1, [A9_DRegsN], 0, Required>, 1107 InstrStage<1, [A9_DRegsVFP], 0, Reserved>, 1108 InstrStage<1, [A9_NPipe], 0>, 1109 InstrStage<1, [A9_LSUnit]>], 1110 [2, 1, 1, 1, 1, 1]>, 1111 // 1112 // VST1x3u 1113 InstrItinData<IIC_VST1x3u, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 1114 InstrStage<1, [A9_MUX0], 0>, 1115 InstrStage<1, [A9_DRegsN], 0, Required>, 1116 InstrStage<2, [A9_DRegsVFP], 0, Reserved>, 1117 InstrStage<2, [A9_NPipe], 0>, 1118 InstrStage<2, [A9_LSUnit]>], 1119 [2, 1, 1, 1, 1, 1, 2]>, 1120 // 1121 // VST1x4u 1122 InstrItinData<IIC_VST1x4u, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 1123 InstrStage<1, [A9_MUX0], 0>, 1124 InstrStage<1, [A9_DRegsN], 0, Required>, 1125 InstrStage<2, [A9_DRegsVFP], 0, Reserved>, 1126 InstrStage<2, [A9_NPipe], 0>, 1127 InstrStage<2, [A9_LSUnit]>], 1128 [2, 1, 1, 1, 1, 1, 2, 2]>, 1129 // 1130 // VST1ln 1131 InstrItinData<IIC_VST1ln, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 1132 InstrStage<1, [A9_MUX0], 0>, 1133 InstrStage<1, [A9_DRegsN], 0, Required>, 1134 InstrStage<1, [A9_DRegsVFP], 0, Reserved>, 1135 InstrStage<1, [A9_NPipe], 0>, 1136 InstrStage<1, [A9_LSUnit]>], 1137 [1, 1, 1]>, 1138 // 1139 // VST1lnu 1140 InstrItinData<IIC_VST1lnu, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 1141 InstrStage<1, [A9_MUX0], 0>, 1142 InstrStage<1, [A9_DRegsN], 0, Required>, 1143 InstrStage<1, [A9_DRegsVFP], 0, Reserved>, 1144 InstrStage<1, [A9_NPipe], 0>, 1145 InstrStage<1, [A9_LSUnit]>], 1146 [2, 1, 1, 1, 1]>, 1147 // 1148 // VST2 1149 InstrItinData<IIC_VST2, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 1150 InstrStage<1, [A9_MUX0], 0>, 1151 InstrStage<1, [A9_DRegsN], 0, Required>, 1152 InstrStage<1, [A9_DRegsVFP], 0, Reserved>, 1153 InstrStage<1, [A9_NPipe], 0>, 1154 InstrStage<1, [A9_LSUnit]>], 1155 [1, 1, 1, 1]>, 1156 // 1157 // VST2x2 1158 InstrItinData<IIC_VST2x2, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 1159 InstrStage<1, [A9_MUX0], 0>, 1160 InstrStage<1, [A9_DRegsN], 0, Required>, 1161 InstrStage<3, [A9_DRegsVFP], 0, Reserved>, 1162 InstrStage<3, [A9_NPipe], 0>, 1163 InstrStage<3, [A9_LSUnit]>], 1164 [1, 1, 1, 1, 2, 2]>, 1165 // 1166 // VST2u 1167 InstrItinData<IIC_VST2u, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 1168 InstrStage<1, [A9_MUX0], 0>, 1169 InstrStage<1, [A9_DRegsN], 0, Required>, 1170 InstrStage<1, [A9_DRegsVFP], 0, Reserved>, 1171 InstrStage<1, [A9_NPipe], 0>, 1172 InstrStage<1, [A9_LSUnit]>], 1173 [2, 1, 1, 1, 1, 1]>, 1174 // 1175 // VST2x2u 1176 InstrItinData<IIC_VST2x2u, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 1177 InstrStage<1, [A9_MUX0], 0>, 1178 InstrStage<1, [A9_DRegsN], 0, Required>, 1179 InstrStage<3, [A9_DRegsVFP], 0, Reserved>, 1180 InstrStage<3, [A9_NPipe], 0>, 1181 InstrStage<3, [A9_LSUnit]>], 1182 [2, 1, 1, 1, 1, 1, 2, 2]>, 1183 // 1184 // VST2ln 1185 InstrItinData<IIC_VST2ln, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 1186 InstrStage<1, [A9_MUX0], 0>, 1187 InstrStage<1, [A9_DRegsN], 0, Required>, 1188 InstrStage<1, [A9_DRegsVFP], 0, Reserved>, 1189 InstrStage<1, [A9_NPipe], 0>, 1190 InstrStage<1, [A9_LSUnit]>], 1191 [1, 1, 1, 1]>, 1192 // 1193 // VST2lnu 1194 InstrItinData<IIC_VST2lnu, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 1195 InstrStage<1, [A9_MUX0], 0>, 1196 InstrStage<1, [A9_DRegsN], 0, Required>, 1197 InstrStage<1, [A9_DRegsVFP], 0, Reserved>, 1198 InstrStage<1, [A9_NPipe], 0>, 1199 InstrStage<1, [A9_LSUnit]>], 1200 [2, 1, 1, 1, 1, 1]>, 1201 // 1202 // VST3 1203 InstrItinData<IIC_VST3, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 1204 InstrStage<1, [A9_MUX0], 0>, 1205 InstrStage<1, [A9_DRegsN], 0, Required>, 1206 InstrStage<2, [A9_DRegsVFP], 0, Reserved>, 1207 InstrStage<2, [A9_NPipe], 0>, 1208 InstrStage<2, [A9_LSUnit]>], 1209 [1, 1, 1, 1, 2]>, 1210 // 1211 // VST3u 1212 InstrItinData<IIC_VST3u, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 1213 InstrStage<1, [A9_MUX0], 0>, 1214 InstrStage<1, [A9_DRegsN], 0, Required>, 1215 InstrStage<2, [A9_DRegsVFP], 0, Reserved>, 1216 InstrStage<2, [A9_NPipe], 0>, 1217 InstrStage<2, [A9_LSUnit]>], 1218 [2, 1, 1, 1, 1, 1, 2]>, 1219 // 1220 // VST3ln 1221 InstrItinData<IIC_VST3ln, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 1222 InstrStage<1, [A9_MUX0], 0>, 1223 InstrStage<1, [A9_DRegsN], 0, Required>, 1224 InstrStage<3, [A9_DRegsVFP], 0, Reserved>, 1225 InstrStage<3, [A9_NPipe], 0>, 1226 InstrStage<3, [A9_LSUnit]>], 1227 [1, 1, 1, 1, 2]>, 1228 // 1229 // VST3lnu 1230 InstrItinData<IIC_VST3lnu, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 1231 InstrStage<1, [A9_MUX0], 0>, 1232 InstrStage<1, [A9_DRegsN], 0, Required>, 1233 InstrStage<3, [A9_DRegsVFP], 0, Reserved>, 1234 InstrStage<3, [A9_NPipe], 0>, 1235 InstrStage<3, [A9_LSUnit]>], 1236 [2, 1, 1, 1, 1, 1, 2]>, 1237 // 1238 // VST4 1239 InstrItinData<IIC_VST4, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 1240 InstrStage<1, [A9_MUX0], 0>, 1241 InstrStage<1, [A9_DRegsN], 0, Required>, 1242 InstrStage<2, [A9_DRegsVFP], 0, Reserved>, 1243 InstrStage<2, [A9_NPipe], 0>, 1244 InstrStage<2, [A9_LSUnit]>], 1245 [1, 1, 1, 1, 2, 2]>, 1246 // 1247 // VST4u 1248 InstrItinData<IIC_VST4u, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 1249 InstrStage<1, [A9_MUX0], 0>, 1250 InstrStage<1, [A9_DRegsN], 0, Required>, 1251 InstrStage<2, [A9_DRegsVFP], 0, Reserved>, 1252 InstrStage<2, [A9_NPipe], 0>, 1253 InstrStage<2, [A9_LSUnit]>], 1254 [2, 1, 1, 1, 1, 1, 2, 2]>, 1255 // 1256 // VST4ln 1257 InstrItinData<IIC_VST4ln, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 1258 InstrStage<1, [A9_MUX0], 0>, 1259 InstrStage<1, [A9_DRegsN], 0, Required>, 1260 InstrStage<2, [A9_DRegsVFP], 0, Reserved>, 1261 InstrStage<2, [A9_NPipe], 0>, 1262 InstrStage<2, [A9_LSUnit]>], 1263 [1, 1, 1, 1, 2, 2]>, 1264 // 1265 // VST4lnu 1266 InstrItinData<IIC_VST4lnu, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 1267 InstrStage<1, [A9_MUX0], 0>, 1268 InstrStage<1, [A9_DRegsN], 0, Required>, 1269 InstrStage<2, [A9_DRegsVFP], 0, Reserved>, 1270 InstrStage<2, [A9_NPipe], 0>, 1271 InstrStage<2, [A9_LSUnit]>], 1272 [2, 1, 1, 1, 1, 1, 2, 2]>, 1273 1274 // 1275 // Double-register Integer Unary 1276 InstrItinData<IIC_VUNAiD, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 1277 InstrStage<1, [A9_MUX0], 0>, 1278 InstrStage<1, [A9_DRegsN], 0, Required>, 1279 // Extra latency cycles since wbck is 6 cycles 1280 InstrStage<7, [A9_DRegsVFP], 0, Reserved>, 1281 InstrStage<1, [A9_NPipe]>], 1282 [4, 2]>, 1283 // 1284 // Quad-register Integer Unary 1285 InstrItinData<IIC_VUNAiQ, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 1286 InstrStage<1, [A9_MUX0], 0>, 1287 InstrStage<1, [A9_DRegsN], 0, Required>, 1288 // Extra latency cycles since wbck is 6 cycles 1289 InstrStage<7, [A9_DRegsVFP], 0, Reserved>, 1290 InstrStage<1, [A9_NPipe]>], 1291 [4, 2]>, 1292 // 1293 // Double-register Integer Q-Unary 1294 InstrItinData<IIC_VQUNAiD, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 1295 InstrStage<1, [A9_MUX0], 0>, 1296 InstrStage<1, [A9_DRegsN], 0, Required>, 1297 // Extra latency cycles since wbck is 6 cycles 1298 InstrStage<7, [A9_DRegsVFP], 0, Reserved>, 1299 InstrStage<1, [A9_NPipe]>], 1300 [4, 1]>, 1301 // 1302 // Quad-register Integer CountQ-Unary 1303 InstrItinData<IIC_VQUNAiQ, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 1304 InstrStage<1, [A9_MUX0], 0>, 1305 InstrStage<1, [A9_DRegsN], 0, Required>, 1306 // Extra latency cycles since wbck is 6 cycles 1307 InstrStage<7, [A9_DRegsVFP], 0, Reserved>, 1308 InstrStage<1, [A9_NPipe]>], 1309 [4, 1]>, 1310 // 1311 // Double-register Integer Binary 1312 InstrItinData<IIC_VBINiD, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 1313 InstrStage<1, [A9_MUX0], 0>, 1314 InstrStage<1, [A9_DRegsN], 0, Required>, 1315 // Extra latency cycles since wbck is 6 cycles 1316 InstrStage<7, [A9_DRegsVFP], 0, Reserved>, 1317 InstrStage<1, [A9_NPipe]>], 1318 [3, 2, 2]>, 1319 // 1320 // Quad-register Integer Binary 1321 InstrItinData<IIC_VBINiQ, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 1322 InstrStage<1, [A9_MUX0], 0>, 1323 InstrStage<1, [A9_DRegsN], 0, Required>, 1324 // Extra latency cycles since wbck is 6 cycles 1325 InstrStage<7, [A9_DRegsVFP], 0, Reserved>, 1326 InstrStage<1, [A9_NPipe]>], 1327 [3, 2, 2]>, 1328 // 1329 // Double-register Integer Subtract 1330 InstrItinData<IIC_VSUBiD, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 1331 InstrStage<1, [A9_MUX0], 0>, 1332 InstrStage<1, [A9_DRegsN], 0, Required>, 1333 // Extra latency cycles since wbck is 6 cycles 1334 InstrStage<7, [A9_DRegsVFP], 0, Reserved>, 1335 InstrStage<1, [A9_NPipe]>], 1336 [3, 2, 1]>, 1337 // 1338 // Quad-register Integer Subtract 1339 InstrItinData<IIC_VSUBiQ, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 1340 InstrStage<1, [A9_MUX0], 0>, 1341 InstrStage<1, [A9_DRegsN], 0, Required>, 1342 // Extra latency cycles since wbck is 6 cycles 1343 InstrStage<7, [A9_DRegsVFP], 0, Reserved>, 1344 InstrStage<1, [A9_NPipe]>], 1345 [3, 2, 1]>, 1346 // 1347 // Double-register Integer Shift 1348 InstrItinData<IIC_VSHLiD, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 1349 InstrStage<1, [A9_MUX0], 0>, 1350 InstrStage<1, [A9_DRegsN], 0, Required>, 1351 // Extra latency cycles since wbck is 6 cycles 1352 InstrStage<7, [A9_DRegsVFP], 0, Reserved>, 1353 InstrStage<1, [A9_NPipe]>], 1354 [3, 1, 1]>, 1355 // 1356 // Quad-register Integer Shift 1357 InstrItinData<IIC_VSHLiQ, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 1358 InstrStage<1, [A9_MUX0], 0>, 1359 InstrStage<1, [A9_DRegsN], 0, Required>, 1360 // Extra latency cycles since wbck is 6 cycles 1361 InstrStage<7, [A9_DRegsVFP], 0, Reserved>, 1362 InstrStage<1, [A9_NPipe]>], 1363 [3, 1, 1]>, 1364 // 1365 // Double-register Integer Shift (4 cycle) 1366 InstrItinData<IIC_VSHLi4D, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 1367 InstrStage<1, [A9_MUX0], 0>, 1368 InstrStage<1, [A9_DRegsN], 0, Required>, 1369 // Extra latency cycles since wbck is 6 cycles 1370 InstrStage<7, [A9_DRegsVFP], 0, Reserved>, 1371 InstrStage<1, [A9_NPipe]>], 1372 [4, 1, 1]>, 1373 // 1374 // Quad-register Integer Shift (4 cycle) 1375 InstrItinData<IIC_VSHLi4Q, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 1376 InstrStage<1, [A9_MUX0], 0>, 1377 InstrStage<1, [A9_DRegsN], 0, Required>, 1378 // Extra latency cycles since wbck is 6 cycles 1379 InstrStage<7, [A9_DRegsVFP], 0, Reserved>, 1380 InstrStage<1, [A9_NPipe]>], 1381 [4, 1, 1]>, 1382 // 1383 // Double-register Integer Binary (4 cycle) 1384 InstrItinData<IIC_VBINi4D, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 1385 InstrStage<1, [A9_MUX0], 0>, 1386 InstrStage<1, [A9_DRegsN], 0, Required>, 1387 // Extra latency cycles since wbck is 6 cycles 1388 InstrStage<7, [A9_DRegsVFP], 0, Reserved>, 1389 InstrStage<1, [A9_NPipe]>], 1390 [4, 2, 2]>, 1391 // 1392 // Quad-register Integer Binary (4 cycle) 1393 InstrItinData<IIC_VBINi4Q, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 1394 InstrStage<1, [A9_MUX0], 0>, 1395 InstrStage<1, [A9_DRegsN], 0, Required>, 1396 // Extra latency cycles since wbck is 6 cycles 1397 InstrStage<7, [A9_DRegsVFP], 0, Reserved>, 1398 InstrStage<1, [A9_NPipe]>], 1399 [4, 2, 2]>, 1400 // 1401 // Double-register Integer Subtract (4 cycle) 1402 InstrItinData<IIC_VSUBi4D, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 1403 InstrStage<1, [A9_MUX0], 0>, 1404 InstrStage<1, [A9_DRegsN], 0, Required>, 1405 // Extra latency cycles since wbck is 6 cycles 1406 InstrStage<7, [A9_DRegsVFP], 0, Reserved>, 1407 InstrStage<1, [A9_NPipe]>], 1408 [4, 2, 1]>, 1409 // 1410 // Quad-register Integer Subtract (4 cycle) 1411 InstrItinData<IIC_VSUBi4Q, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 1412 InstrStage<1, [A9_MUX0], 0>, 1413 InstrStage<1, [A9_DRegsN], 0, Required>, 1414 // Extra latency cycles since wbck is 6 cycles 1415 InstrStage<7, [A9_DRegsVFP], 0, Reserved>, 1416 InstrStage<1, [A9_NPipe]>], 1417 [4, 2, 1]>, 1418 1419 // 1420 // Double-register Integer Count 1421 InstrItinData<IIC_VCNTiD, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 1422 InstrStage<1, [A9_MUX0], 0>, 1423 InstrStage<1, [A9_DRegsN], 0, Required>, 1424 // Extra latency cycles since wbck is 6 cycles 1425 InstrStage<7, [A9_DRegsVFP], 0, Reserved>, 1426 InstrStage<1, [A9_NPipe]>], 1427 [3, 2, 2]>, 1428 // 1429 // Quad-register Integer Count 1430 // Result written in N3, but that is relative to the last cycle of multicycle, 1431 // so we use 4 for those cases 1432 InstrItinData<IIC_VCNTiQ, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 1433 InstrStage<1, [A9_MUX0], 0>, 1434 InstrStage<1, [A9_DRegsN], 0, Required>, 1435 // Extra latency cycles since wbck is 7 cycles 1436 InstrStage<8, [A9_DRegsVFP], 0, Reserved>, 1437 InstrStage<2, [A9_NPipe]>], 1438 [4, 2, 2]>, 1439 // 1440 // Double-register Absolute Difference and Accumulate 1441 InstrItinData<IIC_VABAD, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 1442 InstrStage<1, [A9_MUX0], 0>, 1443 InstrStage<1, [A9_DRegsN], 0, Required>, 1444 // Extra latency cycles since wbck is 6 cycles 1445 InstrStage<7, [A9_DRegsVFP], 0, Reserved>, 1446 InstrStage<1, [A9_NPipe]>], 1447 [6, 3, 2, 1]>, 1448 // 1449 // Quad-register Absolute Difference and Accumulate 1450 InstrItinData<IIC_VABAQ, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 1451 InstrStage<1, [A9_MUX0], 0>, 1452 InstrStage<1, [A9_DRegsN], 0, Required>, 1453 // Extra latency cycles since wbck is 6 cycles 1454 InstrStage<7, [A9_DRegsVFP], 0, Reserved>, 1455 InstrStage<2, [A9_NPipe]>], 1456 [6, 3, 2, 1]>, 1457 // 1458 // Double-register Integer Pair Add Long 1459 InstrItinData<IIC_VPALiD, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 1460 InstrStage<1, [A9_MUX0], 0>, 1461 InstrStage<1, [A9_DRegsN], 0, Required>, 1462 // Extra latency cycles since wbck is 6 cycles 1463 InstrStage<7, [A9_DRegsVFP], 0, Reserved>, 1464 InstrStage<1, [A9_NPipe]>], 1465 [6, 3, 1]>, 1466 // 1467 // Quad-register Integer Pair Add Long 1468 InstrItinData<IIC_VPALiQ, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 1469 InstrStage<1, [A9_MUX0], 0>, 1470 InstrStage<1, [A9_DRegsN], 0, Required>, 1471 // Extra latency cycles since wbck is 6 cycles 1472 InstrStage<7, [A9_DRegsVFP], 0, Reserved>, 1473 InstrStage<2, [A9_NPipe]>], 1474 [6, 3, 1]>, 1475 1476 // 1477 // Double-register Integer Multiply (.8, .16) 1478 InstrItinData<IIC_VMULi16D, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 1479 InstrStage<1, [A9_MUX0], 0>, 1480 InstrStage<1, [A9_DRegsN], 0, Required>, 1481 // Extra latency cycles since wbck is 6 cycles 1482 InstrStage<7, [A9_DRegsVFP], 0, Reserved>, 1483 InstrStage<1, [A9_NPipe]>], 1484 [6, 2, 2]>, 1485 // 1486 // Quad-register Integer Multiply (.8, .16) 1487 InstrItinData<IIC_VMULi16Q, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 1488 InstrStage<1, [A9_MUX0], 0>, 1489 InstrStage<1, [A9_DRegsN], 0, Required>, 1490 // Extra latency cycles since wbck is 7 cycles 1491 InstrStage<8, [A9_DRegsVFP], 0, Reserved>, 1492 InstrStage<2, [A9_NPipe]>], 1493 [7, 2, 2]>, 1494 1495 // 1496 // Double-register Integer Multiply (.32) 1497 InstrItinData<IIC_VMULi32D, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 1498 InstrStage<1, [A9_MUX0], 0>, 1499 InstrStage<1, [A9_DRegsN], 0, Required>, 1500 // Extra latency cycles since wbck is 7 cycles 1501 InstrStage<8, [A9_DRegsVFP], 0, Reserved>, 1502 InstrStage<2, [A9_NPipe]>], 1503 [7, 2, 1]>, 1504 // 1505 // Quad-register Integer Multiply (.32) 1506 InstrItinData<IIC_VMULi32Q, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 1507 InstrStage<1, [A9_MUX0], 0>, 1508 InstrStage<1, [A9_DRegsN], 0, Required>, 1509 // Extra latency cycles since wbck is 9 cycles 1510 InstrStage<10, [A9_DRegsVFP], 0, Reserved>, 1511 InstrStage<4, [A9_NPipe]>], 1512 [9, 2, 1]>, 1513 // 1514 // Double-register Integer Multiply-Accumulate (.8, .16) 1515 InstrItinData<IIC_VMACi16D, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 1516 InstrStage<1, [A9_MUX0], 0>, 1517 InstrStage<1, [A9_DRegsN], 0, Required>, 1518 // Extra latency cycles since wbck is 6 cycles 1519 InstrStage<7, [A9_DRegsVFP], 0, Reserved>, 1520 InstrStage<1, [A9_NPipe]>], 1521 [6, 3, 2, 2]>, 1522 // 1523 // Double-register Integer Multiply-Accumulate (.32) 1524 InstrItinData<IIC_VMACi32D, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 1525 InstrStage<1, [A9_MUX0], 0>, 1526 InstrStage<1, [A9_DRegsN], 0, Required>, 1527 // Extra latency cycles since wbck is 7 cycles 1528 InstrStage<8, [A9_DRegsVFP], 0, Reserved>, 1529 InstrStage<2, [A9_NPipe]>], 1530 [7, 3, 2, 1]>, 1531 // 1532 // Quad-register Integer Multiply-Accumulate (.8, .16) 1533 InstrItinData<IIC_VMACi16Q, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 1534 InstrStage<1, [A9_MUX0], 0>, 1535 InstrStage<1, [A9_DRegsN], 0, Required>, 1536 // Extra latency cycles since wbck is 7 cycles 1537 InstrStage<8, [A9_DRegsVFP], 0, Reserved>, 1538 InstrStage<2, [A9_NPipe]>], 1539 [7, 3, 2, 2]>, 1540 // 1541 // Quad-register Integer Multiply-Accumulate (.32) 1542 InstrItinData<IIC_VMACi32Q, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 1543 InstrStage<1, [A9_MUX0], 0>, 1544 InstrStage<1, [A9_DRegsN], 0, Required>, 1545 // Extra latency cycles since wbck is 9 cycles 1546 InstrStage<10, [A9_DRegsVFP], 0, Reserved>, 1547 InstrStage<4, [A9_NPipe]>], 1548 [9, 3, 2, 1]>, 1549 1550 // 1551 // Move 1552 InstrItinData<IIC_VMOV, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 1553 InstrStage<1, [A9_MUX0], 0>, 1554 InstrStage<1, [A9_DRegsN], 0, Required>, 1555 InstrStage<1, [A9_DRegsVFP], 0, Reserved>, 1556 InstrStage<1, [A9_NPipe]>], 1557 [1,1]>, 1558 // 1559 // Move Immediate 1560 InstrItinData<IIC_VMOVImm, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 1561 InstrStage<1, [A9_MUX0], 0>, 1562 InstrStage<1, [A9_DRegsN], 0, Required>, 1563 // Extra latency cycles since wbck is 6 cycles 1564 InstrStage<7, [A9_DRegsVFP], 0, Reserved>, 1565 InstrStage<1, [A9_NPipe]>], 1566 [3]>, 1567 // 1568 // Double-register Permute Move 1569 InstrItinData<IIC_VMOVD, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 1570 InstrStage<1, [A9_MUX0], 0>, 1571 InstrStage<1, [A9_DRegsN], 0, Required>, 1572 // Extra latency cycles since wbck is 6 cycles 1573 InstrStage<7, [A9_DRegsVFP], 0, Reserved>, 1574 InstrStage<1, [A9_NPipe]>], 1575 [2, 1]>, 1576 // 1577 // Quad-register Permute Move 1578 InstrItinData<IIC_VMOVQ, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 1579 InstrStage<1, [A9_MUX0], 0>, 1580 InstrStage<1, [A9_DRegsN], 0, Required>, 1581 // Extra latency cycles since wbck is 6 cycles 1582 InstrStage<7, [A9_DRegsVFP], 0, Reserved>, 1583 InstrStage<1, [A9_NPipe]>], 1584 [2, 1]>, 1585 // 1586 // Integer to Single-precision Move 1587 InstrItinData<IIC_VMOVIS , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 1588 InstrStage<1, [A9_MUX0], 0>, 1589 InstrStage<1, [A9_DRegsN], 0, Required>, 1590 InstrStage<3, [A9_DRegsVFP], 0, Reserved>, 1591 InstrStage<1, [A9_NPipe]>], 1592 [1, 1]>, 1593 // 1594 // Integer to Double-precision Move 1595 InstrItinData<IIC_VMOVID , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 1596 InstrStage<1, [A9_MUX0], 0>, 1597 InstrStage<1, [A9_DRegsN], 0, Required>, 1598 InstrStage<3, [A9_DRegsVFP], 0, Reserved>, 1599 InstrStage<1, [A9_NPipe]>], 1600 [1, 1, 1]>, 1601 // 1602 // Single-precision to Integer Move 1603 InstrItinData<IIC_VMOVSI , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 1604 InstrStage<1, [A9_MUX0], 0>, 1605 InstrStage<1, [A9_DRegsN], 0, Required>, 1606 InstrStage<3, [A9_DRegsVFP], 0, Reserved>, 1607 InstrStage<1, [A9_NPipe]>], 1608 [2, 1]>, 1609 // 1610 // Double-precision to Integer Move 1611 InstrItinData<IIC_VMOVDI , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 1612 InstrStage<1, [A9_MUX0], 0>, 1613 InstrStage<1, [A9_DRegsN], 0, Required>, 1614 InstrStage<3, [A9_DRegsVFP], 0, Reserved>, 1615 InstrStage<1, [A9_NPipe]>], 1616 [2, 2, 1]>, 1617 // 1618 // Integer to Lane Move 1619 InstrItinData<IIC_VMOVISL , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 1620 InstrStage<1, [A9_MUX0], 0>, 1621 InstrStage<1, [A9_DRegsN], 0, Required>, 1622 InstrStage<4, [A9_DRegsVFP], 0, Reserved>, 1623 InstrStage<2, [A9_NPipe]>], 1624 [3, 1, 1]>, 1625 1626 // 1627 // Vector narrow move 1628 InstrItinData<IIC_VMOVN, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 1629 InstrStage<1, [A9_MUX0], 0>, 1630 InstrStage<1, [A9_DRegsN], 0, Required>, 1631 // Extra latency cycles since wbck is 6 cycles 1632 InstrStage<7, [A9_DRegsVFP], 0, Reserved>, 1633 InstrStage<1, [A9_NPipe]>], 1634 [3, 1]>, 1635 // 1636 // Double-register FP Unary 1637 InstrItinData<IIC_VUNAD, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 1638 InstrStage<1, [A9_MUX0], 0>, 1639 InstrStage<1, [A9_DRegsN], 0, Required>, 1640 // Extra latency cycles since wbck is 6 cycles 1641 InstrStage<7, [A9_DRegsVFP], 0, Reserved>, 1642 InstrStage<1, [A9_NPipe]>], 1643 [5, 2]>, 1644 // 1645 // Quad-register FP Unary 1646 // Result written in N5, but that is relative to the last cycle of multicycle, 1647 // so we use 6 for those cases 1648 InstrItinData<IIC_VUNAQ, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 1649 InstrStage<1, [A9_MUX0], 0>, 1650 InstrStage<1, [A9_DRegsN], 0, Required>, 1651 // Extra latency cycles since wbck is 7 cycles 1652 InstrStage<8, [A9_DRegsVFP], 0, Reserved>, 1653 InstrStage<2, [A9_NPipe]>], 1654 [6, 2]>, 1655 // 1656 // Double-register FP Binary 1657 // FIXME: We're using this itin for many instructions and [2, 2] here is too 1658 // optimistic. 1659 InstrItinData<IIC_VBIND, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 1660 InstrStage<1, [A9_MUX0], 0>, 1661 InstrStage<1, [A9_DRegsN], 0, Required>, 1662 // Extra latency cycles since wbck is 6 cycles 1663 InstrStage<7, [A9_DRegsVFP], 0, Reserved>, 1664 InstrStage<1, [A9_NPipe]>], 1665 [5, 2, 2]>, 1666 1667 // 1668 // VPADD, etc. 1669 InstrItinData<IIC_VPBIND, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 1670 InstrStage<1, [A9_MUX0], 0>, 1671 InstrStage<1, [A9_DRegsN], 0, Required>, 1672 // Extra latency cycles since wbck is 6 cycles 1673 InstrStage<7, [A9_DRegsVFP], 0, Reserved>, 1674 InstrStage<1, [A9_NPipe]>], 1675 [5, 1, 1]>, 1676 // 1677 // Double-register FP VMUL 1678 InstrItinData<IIC_VFMULD, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 1679 InstrStage<1, [A9_MUX0], 0>, 1680 InstrStage<1, [A9_DRegsN], 0, Required>, 1681 // Extra latency cycles since wbck is 6 cycles 1682 InstrStage<7, [A9_DRegsVFP], 0, Reserved>, 1683 InstrStage<1, [A9_NPipe]>], 1684 [5, 2, 1]>, 1685 // 1686 // Quad-register FP Binary 1687 // Result written in N5, but that is relative to the last cycle of multicycle, 1688 // so we use 6 for those cases 1689 // FIXME: We're using this itin for many instructions and [2, 2] here is too 1690 // optimistic. 1691 InstrItinData<IIC_VBINQ, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 1692 InstrStage<1, [A9_MUX0], 0>, 1693 InstrStage<1, [A9_DRegsN], 0, Required>, 1694 // Extra latency cycles since wbck is 7 cycles 1695 InstrStage<8, [A9_DRegsVFP], 0, Reserved>, 1696 InstrStage<2, [A9_NPipe]>], 1697 [6, 2, 2]>, 1698 // 1699 // Quad-register FP VMUL 1700 InstrItinData<IIC_VFMULQ, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 1701 InstrStage<1, [A9_MUX0], 0>, 1702 InstrStage<1, [A9_DRegsN], 0, Required>, 1703 // Extra latency cycles since wbck is 7 cycles 1704 InstrStage<8, [A9_DRegsVFP], 0, Reserved>, 1705 InstrStage<1, [A9_NPipe]>], 1706 [6, 2, 1]>, 1707 // 1708 // Double-register FP Multiple-Accumulate 1709 InstrItinData<IIC_VMACD, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 1710 InstrStage<1, [A9_MUX0], 0>, 1711 InstrStage<1, [A9_DRegsN], 0, Required>, 1712 // Extra latency cycles since wbck is 7 cycles 1713 InstrStage<8, [A9_DRegsVFP], 0, Reserved>, 1714 InstrStage<2, [A9_NPipe]>], 1715 [6, 3, 2, 1]>, 1716 // 1717 // Quad-register FP Multiple-Accumulate 1718 // Result written in N9, but that is relative to the last cycle of multicycle, 1719 // so we use 10 for those cases 1720 InstrItinData<IIC_VMACQ, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 1721 InstrStage<1, [A9_MUX0], 0>, 1722 InstrStage<1, [A9_DRegsN], 0, Required>, 1723 // Extra latency cycles since wbck is 9 cycles 1724 InstrStage<10, [A9_DRegsVFP], 0, Reserved>, 1725 InstrStage<4, [A9_NPipe]>], 1726 [8, 4, 2, 1]>, 1727 // 1728 // Double-register Fused FP Multiple-Accumulate 1729 InstrItinData<IIC_VFMACD, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 1730 InstrStage<1, [A9_MUX0], 0>, 1731 InstrStage<1, [A9_DRegsN], 0, Required>, 1732 // Extra latency cycles since wbck is 7 cycles 1733 InstrStage<8, [A9_DRegsVFP], 0, Reserved>, 1734 InstrStage<2, [A9_NPipe]>], 1735 [6, 3, 2, 1]>, 1736 // 1737 // Quad-register Fused FP Multiple-Accumulate 1738 // Result written in N9, but that is relative to the last cycle of multicycle, 1739 // so we use 10 for those cases 1740 InstrItinData<IIC_VFMACQ, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 1741 InstrStage<1, [A9_MUX0], 0>, 1742 InstrStage<1, [A9_DRegsN], 0, Required>, 1743 // Extra latency cycles since wbck is 9 cycles 1744 InstrStage<10, [A9_DRegsVFP], 0, Reserved>, 1745 InstrStage<4, [A9_NPipe]>], 1746 [8, 4, 2, 1]>, 1747 // 1748 // Double-register Reciprical Step 1749 InstrItinData<IIC_VRECSD, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 1750 InstrStage<1, [A9_MUX0], 0>, 1751 InstrStage<1, [A9_DRegsN], 0, Required>, 1752 // Extra latency cycles since wbck is 10 cycles 1753 InstrStage<11, [A9_DRegsVFP], 0, Reserved>, 1754 InstrStage<1, [A9_NPipe]>], 1755 [9, 2, 2]>, 1756 // 1757 // Quad-register Reciprical Step 1758 InstrItinData<IIC_VRECSQ, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 1759 InstrStage<1, [A9_MUX0], 0>, 1760 InstrStage<1, [A9_DRegsN], 0, Required>, 1761 // Extra latency cycles since wbck is 11 cycles 1762 InstrStage<12, [A9_DRegsVFP], 0, Reserved>, 1763 InstrStage<2, [A9_NPipe]>], 1764 [10, 2, 2]>, 1765 // 1766 // Double-register Permute 1767 InstrItinData<IIC_VPERMD, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 1768 InstrStage<1, [A9_MUX0], 0>, 1769 InstrStage<1, [A9_DRegsN], 0, Required>, 1770 // Extra latency cycles since wbck is 6 cycles 1771 InstrStage<7, [A9_DRegsVFP], 0, Reserved>, 1772 InstrStage<1, [A9_NPipe]>], 1773 [2, 2, 1, 1]>, 1774 // 1775 // Quad-register Permute 1776 // Result written in N2, but that is relative to the last cycle of multicycle, 1777 // so we use 3 for those cases 1778 InstrItinData<IIC_VPERMQ, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 1779 InstrStage<1, [A9_MUX0], 0>, 1780 InstrStage<1, [A9_DRegsN], 0, Required>, 1781 // Extra latency cycles since wbck is 7 cycles 1782 InstrStage<8, [A9_DRegsVFP], 0, Reserved>, 1783 InstrStage<2, [A9_NPipe]>], 1784 [3, 3, 1, 1]>, 1785 // 1786 // Quad-register Permute (3 cycle issue) 1787 // Result written in N2, but that is relative to the last cycle of multicycle, 1788 // so we use 4 for those cases 1789 InstrItinData<IIC_VPERMQ3, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 1790 InstrStage<1, [A9_MUX0], 0>, 1791 InstrStage<1, [A9_DRegsN], 0, Required>, 1792 // Extra latency cycles since wbck is 8 cycles 1793 InstrStage<9, [A9_DRegsVFP], 0, Reserved>, 1794 InstrStage<3, [A9_NPipe]>], 1795 [4, 4, 1, 1]>, 1796 1797 // 1798 // Double-register VEXT 1799 InstrItinData<IIC_VEXTD, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 1800 InstrStage<1, [A9_MUX0], 0>, 1801 InstrStage<1, [A9_DRegsN], 0, Required>, 1802 // Extra latency cycles since wbck is 6 cycles 1803 InstrStage<7, [A9_DRegsVFP], 0, Reserved>, 1804 InstrStage<1, [A9_NPipe]>], 1805 [2, 1, 1]>, 1806 // 1807 // Quad-register VEXT 1808 InstrItinData<IIC_VEXTQ, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 1809 InstrStage<1, [A9_MUX0], 0>, 1810 InstrStage<1, [A9_DRegsN], 0, Required>, 1811 // Extra latency cycles since wbck is 7 cycles 1812 InstrStage<8, [A9_DRegsVFP], 0, Reserved>, 1813 InstrStage<2, [A9_NPipe]>], 1814 [3, 1, 2]>, 1815 // 1816 // VTB 1817 InstrItinData<IIC_VTB1, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 1818 InstrStage<1, [A9_MUX0], 0>, 1819 InstrStage<1, [A9_DRegsN], 0, Required>, 1820 // Extra latency cycles since wbck is 7 cycles 1821 InstrStage<8, [A9_DRegsVFP], 0, Reserved>, 1822 InstrStage<2, [A9_NPipe]>], 1823 [3, 2, 1]>, 1824 InstrItinData<IIC_VTB2, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 1825 InstrStage<1, [A9_MUX0], 0>, 1826 InstrStage<2, [A9_DRegsN], 0, Required>, 1827 // Extra latency cycles since wbck is 7 cycles 1828 InstrStage<8, [A9_DRegsVFP], 0, Reserved>, 1829 InstrStage<2, [A9_NPipe]>], 1830 [3, 2, 2, 1]>, 1831 InstrItinData<IIC_VTB3, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 1832 InstrStage<1, [A9_MUX0], 0>, 1833 InstrStage<2, [A9_DRegsN], 0, Required>, 1834 // Extra latency cycles since wbck is 8 cycles 1835 InstrStage<9, [A9_DRegsVFP], 0, Reserved>, 1836 InstrStage<3, [A9_NPipe]>], 1837 [4, 2, 2, 3, 1]>, 1838 InstrItinData<IIC_VTB4, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 1839 InstrStage<1, [A9_MUX0], 0>, 1840 InstrStage<1, [A9_DRegsN], 0, Required>, 1841 // Extra latency cycles since wbck is 8 cycles 1842 InstrStage<9, [A9_DRegsVFP], 0, Reserved>, 1843 InstrStage<3, [A9_NPipe]>], 1844 [4, 2, 2, 3, 3, 1]>, 1845 // 1846 // VTBX 1847 InstrItinData<IIC_VTBX1, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 1848 InstrStage<1, [A9_MUX0], 0>, 1849 InstrStage<1, [A9_DRegsN], 0, Required>, 1850 // Extra latency cycles since wbck is 7 cycles 1851 InstrStage<8, [A9_DRegsVFP], 0, Reserved>, 1852 InstrStage<2, [A9_NPipe]>], 1853 [3, 1, 2, 1]>, 1854 InstrItinData<IIC_VTBX2, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 1855 InstrStage<1, [A9_MUX0], 0>, 1856 InstrStage<1, [A9_DRegsN], 0, Required>, 1857 // Extra latency cycles since wbck is 7 cycles 1858 InstrStage<8, [A9_DRegsVFP], 0, Reserved>, 1859 InstrStage<2, [A9_NPipe]>], 1860 [3, 1, 2, 2, 1]>, 1861 InstrItinData<IIC_VTBX3, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 1862 InstrStage<1, [A9_MUX0], 0>, 1863 InstrStage<1, [A9_DRegsN], 0, Required>, 1864 // Extra latency cycles since wbck is 8 cycles 1865 InstrStage<9, [A9_DRegsVFP], 0, Reserved>, 1866 InstrStage<3, [A9_NPipe]>], 1867 [4, 1, 2, 2, 3, 1]>, 1868 InstrItinData<IIC_VTBX4, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>, 1869 InstrStage<1, [A9_MUX0], 0>, 1870 InstrStage<1, [A9_DRegsN], 0, Required>, 1871 // Extra latency cycles since wbck is 8 cycles 1872 InstrStage<9, [A9_DRegsVFP], 0, Reserved>, 1873 InstrStage<2, [A9_NPipe]>], 1874 [4, 1, 2, 2, 3, 3, 1]> 1875]>; 1876 1877// ===---------------------------------------------------------------------===// 1878// The following definitions describe the simpler per-operand machine model. 1879// This works with MachineScheduler and will eventually replace itineraries. 1880 1881class A9WriteLMOpsListType<list<WriteSequence> writes> { 1882 list <WriteSequence> Writes = writes; 1883 SchedMachineModel SchedModel = ?; 1884} 1885 1886// Cortex-A9 machine model for scheduling and other instruction cost heuristics. 1887def CortexA9Model : SchedMachineModel { 1888 let IssueWidth = 2; // 2 micro-ops are dispatched per cycle. 1889 let MicroOpBufferSize = 56; // Based on available renamed registers. 1890 let LoadLatency = 2; // Optimistic load latency assuming bypass. 1891 // This is overriden by OperandCycles if the 1892 // Itineraries are queried instead. 1893 let MispredictPenalty = 8; // Based on estimate of pipeline depth. 1894 1895 let Itineraries = CortexA9Itineraries; 1896 1897 // FIXME: Many vector operations were never given an itinerary. We 1898 // haven't mapped these to the new model either. 1899 let CompleteModel = 0; 1900 1901 // FIXME: Remove when all errors have been fixed. 1902 let FullInstRWOverlapCheck = 0; 1903} 1904 1905//===----------------------------------------------------------------------===// 1906// Define each kind of processor resource and number available. 1907// 1908// The AGU unit has BufferSize=1 so that the latency between operations 1909// that use it are considered to stall other operations. 1910// 1911// The FP unit has BufferSize=0 so that it is a hard dispatch 1912// hazard. No instruction may be dispatched while the unit is reserved. 1913 1914let SchedModel = CortexA9Model in { 1915 1916def A9UnitALU : ProcResource<2>; 1917def A9UnitMul : ProcResource<1> { let Super = A9UnitALU; } 1918def A9UnitAGU : ProcResource<1> { let BufferSize = 1; } 1919def A9UnitLS : ProcResource<1>; 1920def A9UnitFP : ProcResource<1> { let BufferSize = 0; } 1921def A9UnitB : ProcResource<1>; 1922 1923//===----------------------------------------------------------------------===// 1924// Define scheduler read/write types with their resources and latency on A9. 1925 1926// Consume an issue slot, but no processor resources. This is useful when all 1927// other writes associated with the operand have NumMicroOps = 0. 1928def A9WriteIssue : SchedWriteRes<[]> { let Latency = 0; } 1929 1930// Write an integer register. 1931def A9WriteI : SchedWriteRes<[A9UnitALU]>; 1932// Write an integer shifted-by register 1933def A9WriteIsr : SchedWriteRes<[A9UnitALU]> { let Latency = 2; } 1934 1935// Basic ALU. 1936def A9WriteALU : SchedWriteRes<[A9UnitALU]>; 1937// ALU with operand shifted by immediate. 1938def : WriteRes<WriteALUsi, [A9UnitALU]> { let Latency = 2; } 1939// ALU with operand shifted by register. 1940def A9WriteALUsr : SchedWriteRes<[A9UnitALU]> { let Latency = 3; } 1941 1942// Multiplication 1943def A9WriteM : SchedWriteRes<[A9UnitMul, A9UnitMul]> { let Latency = 4; } 1944def A9WriteMHi : SchedWriteRes<[A9UnitMul]> { let Latency = 5; 1945 let NumMicroOps = 0; } 1946def A9WriteM16 : SchedWriteRes<[A9UnitMul]> { let Latency = 3; } 1947def A9WriteM16Hi : SchedWriteRes<[A9UnitMul]> { let Latency = 4; 1948 let NumMicroOps = 0; } 1949def : SchedAlias<WriteMUL16, A9WriteM16>; 1950def : SchedAlias<WriteMUL32, A9WriteM>; 1951def : SchedAlias<WriteMUL64Lo, A9WriteM>; 1952def : SchedAlias<WriteMUL64Hi, A9WriteMHi>; 1953def : SchedAlias<WriteMAC16, A9WriteM16>; 1954def : SchedAlias<WriteMAC32, A9WriteM>; 1955def : SchedAlias<WriteMAC64Lo, A9WriteM>; 1956def : SchedAlias<WriteMAC64Hi, A9WriteMHi>; 1957def : ReadAdvance<ReadMUL, 0>; 1958def : ReadAdvance<ReadMAC, 0>; 1959 1960// Floating-point 1961// Only one FP or AGU instruction may issue per cycle. We model this 1962// by having FP instructions consume the AGU resource. 1963def A9WriteF : SchedWriteRes<[A9UnitFP, A9UnitAGU]> { let Latency = 4; } 1964def A9WriteFMov : SchedWriteRes<[A9UnitFP, A9UnitAGU]> { let Latency = 1; } 1965def A9WriteFMulS : SchedWriteRes<[A9UnitFP, A9UnitAGU]> { let Latency = 5; } 1966def A9WriteFMulD : SchedWriteRes<[A9UnitFP, A9UnitAGU]> { let Latency = 6; } 1967def A9WriteFMAS : SchedWriteRes<[A9UnitFP, A9UnitAGU]> { let Latency = 8; } 1968 1969def A9WriteFMAD : SchedWriteRes<[A9UnitFP, A9UnitAGU]> { let Latency = 9; } 1970def A9WriteFDivS : SchedWriteRes<[A9UnitFP, A9UnitAGU]> { let Latency = 15; } 1971def A9WriteFDivD : SchedWriteRes<[A9UnitFP, A9UnitAGU]> { let Latency = 25; } 1972def A9WriteFSqrtS : SchedWriteRes<[A9UnitFP, A9UnitAGU]> { let Latency = 17; } 1973def A9WriteFSqrtD : SchedWriteRes<[A9UnitFP, A9UnitAGU]> { let Latency = 32; } 1974 1975// NEON has an odd mix of latencies. Simply name the write types by latency. 1976def A9WriteV1 : SchedWriteRes<[A9UnitFP, A9UnitAGU]> { let Latency = 1; } 1977def A9WriteV2 : SchedWriteRes<[A9UnitFP, A9UnitAGU]> { let Latency = 2; } 1978def A9WriteV3 : SchedWriteRes<[A9UnitFP, A9UnitAGU]> { let Latency = 3; } 1979def A9WriteV4 : SchedWriteRes<[A9UnitFP, A9UnitAGU]> { let Latency = 4; } 1980def A9WriteV5 : SchedWriteRes<[A9UnitFP, A9UnitAGU]> { let Latency = 5; } 1981def A9WriteV6 : SchedWriteRes<[A9UnitFP, A9UnitAGU]> { let Latency = 6; } 1982def A9WriteV7 : SchedWriteRes<[A9UnitFP, A9UnitAGU]> { let Latency = 7; } 1983def A9WriteV9 : SchedWriteRes<[A9UnitFP, A9UnitAGU]> { let Latency = 9; } 1984def A9WriteV10 : SchedWriteRes<[A9UnitFP, A9UnitAGU]> { let Latency = 10; } 1985 1986def : WriteRes<WriteVLD1, []>; 1987def : WriteRes<WriteVLD2, []>; 1988def : WriteRes<WriteVLD3, []>; 1989def : WriteRes<WriteVLD4, []>; 1990def : WriteRes<WriteVST1, []>; 1991def : WriteRes<WriteVST2, []>; 1992def : WriteRes<WriteVST3, []>; 1993def : WriteRes<WriteVST4, []>; 1994 1995// Reserve A9UnitFP for 2 consecutive cycles. 1996def A9Write2V4 : SchedWriteRes<[A9UnitFP, A9UnitAGU]> { 1997 let Latency = 4; 1998 let ResourceCycles = [2, 1]; 1999} 2000def A9Write2V7 : SchedWriteRes<[A9UnitFP, A9UnitAGU]> { 2001 let Latency = 7; 2002 let ResourceCycles = [2, 1]; 2003} 2004def A9Write2V9 : SchedWriteRes<[A9UnitFP, A9UnitAGU]> { 2005 let Latency = 9; 2006 let ResourceCycles = [2, 1]; 2007} 2008 2009// Branches don't have a def operand but still consume resources. 2010def A9WriteB : SchedWriteRes<[A9UnitB]>; 2011 2012// Address generation. 2013def A9WriteAdr : SchedWriteRes<[A9UnitAGU]> { let NumMicroOps = 0; } 2014 2015// Load Integer. 2016def A9WriteL : SchedWriteRes<[A9UnitLS]> { let Latency = 3; } 2017def : SchedAlias<WriteLd, A9WriteL>; 2018// Load the upper 32-bits using the same micro-op. 2019def A9WriteLHi : SchedWriteRes<[]> { let Latency = 3; 2020 let NumMicroOps = 0; } 2021// Offset shifted by register. 2022def A9WriteLsi : SchedWriteRes<[A9UnitLS]> { let Latency = 4; } 2023// Load (and zero extend) a byte. 2024def A9WriteLb : SchedWriteRes<[A9UnitLS]> { let Latency = 4; } 2025def A9WriteLbsi : SchedWriteRes<[A9UnitLS]> { let Latency = 5; } 2026 2027// Load or Store Float, aligned. 2028def A9WriteLSfp : SchedWriteRes<[A9UnitLS, A9UnitFP]> { let Latency = 1; } 2029 2030// Store Integer. 2031def A9WriteS : SchedWriteRes<[A9UnitLS]>; 2032 2033//===----------------------------------------------------------------------===// 2034// Define resources dynamically for load multiple variants. 2035 2036// Define helpers for extra latency without consuming resources. 2037def A9WriteCycle1 : SchedWriteRes<[]> { let Latency = 1; let NumMicroOps = 0; } 2038foreach NumCycles = 2-8 in { 2039def A9WriteCycle#NumCycles : WriteSequence<[A9WriteCycle1], NumCycles>; 2040} // foreach NumCycles 2041 2042// Define address generation sequences and predicates for 8 flavors of LDMs. 2043foreach NumAddr = 1-8 in { 2044 2045// Define A9WriteAdr1-8 as a sequence of A9WriteAdr with additive 2046// latency for instructions that generate multiple loads or stores. 2047def A9WriteAdr#NumAddr : WriteSequence<[A9WriteAdr], NumAddr>; 2048 2049// Define a predicate to select the LDM based on number of memory addresses. 2050def A9LMAdr#NumAddr#Pred : 2051 SchedPredicate<"(TII->getNumLDMAddresses(*MI)+1)/2 == "#NumAddr>; 2052 2053} // foreach NumAddr 2054 2055// Fall-back for unknown LDMs. 2056def A9LMUnknownPred : SchedPredicate<"TII->getNumLDMAddresses(*MI) == 0">; 2057 2058// LDM/VLDM/VLDn address generation latency & resources. 2059// Dynamically select the A9WriteAdrN sequence using a predicate. 2060def A9WriteLMAdr : SchedWriteVariant<[ 2061 SchedVar<A9LMAdr1Pred, [A9WriteAdr1]>, 2062 SchedVar<A9LMAdr2Pred, [A9WriteAdr2]>, 2063 SchedVar<A9LMAdr3Pred, [A9WriteAdr3]>, 2064 SchedVar<A9LMAdr4Pred, [A9WriteAdr4]>, 2065 SchedVar<A9LMAdr5Pred, [A9WriteAdr5]>, 2066 SchedVar<A9LMAdr6Pred, [A9WriteAdr6]>, 2067 SchedVar<A9LMAdr7Pred, [A9WriteAdr7]>, 2068 SchedVar<A9LMAdr8Pred, [A9WriteAdr8]>, 2069 // For unknown LDM/VLDM/VSTM, assume 2 32-bit registers. 2070 SchedVar<A9LMUnknownPred, [A9WriteAdr2]>]>; 2071 2072// Define LDM Resources. 2073// These take no issue resource, so they can be combined with other 2074// writes like WriteB. 2075// A9WriteLMLo takes a single LS resource and 2 cycles. 2076def A9WriteLMLo : SchedWriteRes<[A9UnitLS]> { let Latency = 2; 2077 let NumMicroOps = 0; } 2078// Assuming aligned access, the upper half of each pair is free with 2079// the same latency. 2080def A9WriteLMHi : SchedWriteRes<[]> { let Latency = 2; 2081 let NumMicroOps = 0; } 2082// Each A9WriteL#N variant adds N cycles of latency without consuming 2083// additional resources. 2084foreach NumAddr = 1-8 in { 2085def A9WriteL#NumAddr : WriteSequence< 2086 [A9WriteLMLo, !cast<SchedWrite>("A9WriteCycle"#NumAddr)]>; 2087def A9WriteL#NumAddr#Hi : WriteSequence< 2088 [A9WriteLMHi, !cast<SchedWrite>("A9WriteCycle"#NumAddr)]>; 2089} 2090 2091//===----------------------------------------------------------------------===// 2092// LDM: Load multiple into 32-bit integer registers. 2093 2094def A9WriteLMOpsList : A9WriteLMOpsListType< 2095 [A9WriteL1, A9WriteL1Hi, 2096 A9WriteL2, A9WriteL2Hi, 2097 A9WriteL3, A9WriteL3Hi, 2098 A9WriteL4, A9WriteL4Hi, 2099 A9WriteL5, A9WriteL5Hi, 2100 A9WriteL6, A9WriteL6Hi, 2101 A9WriteL7, A9WriteL7Hi, 2102 A9WriteL8, A9WriteL8Hi]>; 2103 2104// A9WriteLM variants expand into a pair of writes for each 64-bit 2105// value loaded. When the number of registers is odd, the last 2106// A9WriteLnHi is naturally ignored because the instruction has no 2107// following def operands. These variants take no issue resource, so 2108// they may need to be part of a WriteSequence that includes A9WriteIssue. 2109def A9WriteLM : SchedWriteVariant<[ 2110 SchedVar<A9LMAdr1Pred, A9WriteLMOpsList.Writes[0-1]>, 2111 SchedVar<A9LMAdr2Pred, A9WriteLMOpsList.Writes[0-3]>, 2112 SchedVar<A9LMAdr3Pred, A9WriteLMOpsList.Writes[0-5]>, 2113 SchedVar<A9LMAdr4Pred, A9WriteLMOpsList.Writes[0-7]>, 2114 SchedVar<A9LMAdr5Pred, A9WriteLMOpsList.Writes[0-9]>, 2115 SchedVar<A9LMAdr6Pred, A9WriteLMOpsList.Writes[0-11]>, 2116 SchedVar<A9LMAdr7Pred, A9WriteLMOpsList.Writes[0-13]>, 2117 SchedVar<A9LMAdr8Pred, A9WriteLMOpsList.Writes[0-15]>, 2118 // For unknown LDMs, define the maximum number of writes, but only 2119 // make the first two consume resources. 2120 SchedVar<A9LMUnknownPred, [A9WriteL1, A9WriteL1Hi, 2121 A9WriteL2, A9WriteL2Hi, 2122 A9WriteL3Hi, A9WriteL3Hi, 2123 A9WriteL4Hi, A9WriteL4Hi, 2124 A9WriteL5Hi, A9WriteL5Hi, 2125 A9WriteL6Hi, A9WriteL6Hi, 2126 A9WriteL7Hi, A9WriteL7Hi, 2127 A9WriteL8Hi, A9WriteL8Hi]>]> { 2128 let Variadic = 1; 2129} 2130 2131//===----------------------------------------------------------------------===// 2132// VFP Load/Store Multiple Variants, and NEON VLDn/VSTn support. 2133 2134// A9WriteLfpOp is the same as A9WriteLSfp but takes no issue resources 2135// so can be used in WriteSequences for in single-issue instructions that 2136// encapsulate multiple loads. 2137def A9WriteLfpOp : SchedWriteRes<[A9UnitLS, A9UnitFP]> { 2138 let Latency = 1; 2139 let NumMicroOps = 0; 2140} 2141 2142foreach NumAddr = 1-8 in { 2143 2144// Helper for A9WriteLfp1-8: A sequence of fp loads with no micro-ops. 2145def A9WriteLfp#NumAddr#Seq : WriteSequence<[A9WriteLfpOp], NumAddr>; 2146 2147// A9WriteLfp1-8 definitions are statically expanded into a sequence of 2148// A9WriteLfpOps with additive latency that takes a single issue slot. 2149// Used directly to describe NEON VLDn. 2150def A9WriteLfp#NumAddr : WriteSequence< 2151 [A9WriteIssue, !cast<SchedWrite>("A9WriteLfp"#NumAddr#Seq)]>; 2152 2153// A9WriteLfp1-8Mov adds a cycle of latency and FP resource for 2154// permuting loaded values. 2155def A9WriteLfp#NumAddr#Mov : WriteSequence< 2156 [A9WriteF, !cast<SchedWrite>("A9WriteLfp"#NumAddr#Seq)]>; 2157 2158} // foreach NumAddr 2159 2160// Define VLDM/VSTM PreRA resources. 2161// A9WriteLMfpPreRA are dynamically expanded into the correct 2162// A9WriteLfp1-8 sequence based on a predicate. This supports the 2163// preRA VLDM variants in which all 64-bit loads are written to the 2164// same tuple of either single or double precision registers. 2165def A9WriteLMfpPreRA : SchedWriteVariant<[ 2166 SchedVar<A9LMAdr1Pred, [A9WriteLfp1]>, 2167 SchedVar<A9LMAdr2Pred, [A9WriteLfp2]>, 2168 SchedVar<A9LMAdr3Pred, [A9WriteLfp3]>, 2169 SchedVar<A9LMAdr4Pred, [A9WriteLfp4]>, 2170 SchedVar<A9LMAdr5Pred, [A9WriteLfp5]>, 2171 SchedVar<A9LMAdr6Pred, [A9WriteLfp6]>, 2172 SchedVar<A9LMAdr7Pred, [A9WriteLfp7]>, 2173 SchedVar<A9LMAdr8Pred, [A9WriteLfp8]>, 2174 // For unknown VLDM/VSTM PreRA, assume 2xS registers. 2175 SchedVar<A9LMUnknownPred, [A9WriteLfp2]>]>; 2176 2177// Define VLDM/VSTM PostRA Resources. 2178// A9WriteLMfpLo takes a LS and FP resource and one issue slot but no latency. 2179def A9WriteLMfpLo : SchedWriteRes<[A9UnitLS, A9UnitFP]> { let Latency = 0; } 2180 2181foreach NumAddr = 1-8 in { 2182 2183// Each A9WriteL#N variant adds N cycles of latency without consuming 2184// additional resources. 2185def A9WriteLMfp#NumAddr : WriteSequence< 2186 [A9WriteLMfpLo, !cast<SchedWrite>("A9WriteCycle"#NumAddr)]>; 2187 2188// Assuming aligned access, the upper half of each pair is free with 2189// the same latency. 2190def A9WriteLMfp#NumAddr#Hi : WriteSequence< 2191 [A9WriteLMHi, !cast<SchedWrite>("A9WriteCycle"#NumAddr)]>; 2192 2193} // foreach NumAddr 2194 2195// VLDM PostRA Variants. These variants expand A9WriteLMfpPostRA into a 2196// pair of writes for each 64-bit data loaded. When the number of 2197// registers is odd, the last WriteLMfpnHi is naturally ignored because 2198// the instruction has no following def operands. 2199 2200def A9WriteLMfpPostRAOpsList : A9WriteLMOpsListType< 2201 [A9WriteLMfp1, A9WriteLMfp2, // 0-1 2202 A9WriteLMfp3, A9WriteLMfp4, // 2-3 2203 A9WriteLMfp5, A9WriteLMfp6, // 4-5 2204 A9WriteLMfp7, A9WriteLMfp8, // 6-7 2205 A9WriteLMfp1Hi, // 8-8 2206 A9WriteLMfp2Hi, A9WriteLMfp2Hi, // 9-10 2207 A9WriteLMfp3Hi, A9WriteLMfp3Hi, // 11-12 2208 A9WriteLMfp4Hi, A9WriteLMfp4Hi, // 13-14 2209 A9WriteLMfp5Hi, A9WriteLMfp5Hi, // 15-16 2210 A9WriteLMfp6Hi, A9WriteLMfp6Hi, // 17-18 2211 A9WriteLMfp7Hi, A9WriteLMfp7Hi, // 19-20 2212 A9WriteLMfp8Hi, A9WriteLMfp8Hi]>; // 21-22 2213 2214def A9WriteLMfpPostRA : SchedWriteVariant<[ 2215 SchedVar<A9LMAdr1Pred, A9WriteLMfpPostRAOpsList.Writes[0-0, 8-8]>, 2216 SchedVar<A9LMAdr2Pred, A9WriteLMfpPostRAOpsList.Writes[0-1, 9-10]>, 2217 SchedVar<A9LMAdr3Pred, A9WriteLMfpPostRAOpsList.Writes[0-2, 10-12]>, 2218 SchedVar<A9LMAdr4Pred, A9WriteLMfpPostRAOpsList.Writes[0-3, 11-14]>, 2219 SchedVar<A9LMAdr5Pred, A9WriteLMfpPostRAOpsList.Writes[0-4, 12-16]>, 2220 SchedVar<A9LMAdr6Pred, A9WriteLMfpPostRAOpsList.Writes[0-5, 13-18]>, 2221 SchedVar<A9LMAdr7Pred, A9WriteLMfpPostRAOpsList.Writes[0-6, 14-20]>, 2222 SchedVar<A9LMAdr8Pred, A9WriteLMfpPostRAOpsList.Writes[0-7, 15-22]>, 2223 // For unknown LDMs, define the maximum number of writes, but only 2224 // make the first two consume resources. We are optimizing for the case 2225 // where the operands are DPRs, and this determines the first eight 2226 // types. The remaining eight types are filled to cover the case 2227 // where the operands are SPRs. 2228 SchedVar<A9LMUnknownPred, [A9WriteLMfp1, A9WriteLMfp2, 2229 A9WriteLMfp3Hi, A9WriteLMfp4Hi, 2230 A9WriteLMfp5Hi, A9WriteLMfp6Hi, 2231 A9WriteLMfp7Hi, A9WriteLMfp8Hi, 2232 A9WriteLMfp5Hi, A9WriteLMfp5Hi, 2233 A9WriteLMfp6Hi, A9WriteLMfp6Hi, 2234 A9WriteLMfp7Hi, A9WriteLMfp7Hi, 2235 A9WriteLMfp8Hi, A9WriteLMfp8Hi]>]> { 2236 let Variadic = 1; 2237} 2238 2239// Distinguish between our multiple MI-level forms of the same 2240// VLDM/VSTM instructions. 2241def A9PreRA : SchedPredicate< 2242 "Register::isVirtualRegister(MI->getOperand(0).getReg())">; 2243def A9PostRA : SchedPredicate< 2244 "Register::isPhysicalRegister(MI->getOperand(0).getReg())">; 2245 2246// VLDM represents all destination registers as a single register 2247// tuple, unlike LDM. So the number of write operands is not variadic. 2248def A9WriteLMfp : SchedWriteVariant<[ 2249 SchedVar<A9PreRA, [A9WriteLMfpPreRA]>, 2250 SchedVar<A9PostRA, [A9WriteLMfpPostRA]>]>; 2251 2252//===----------------------------------------------------------------------===// 2253// Resources for other (non-LDM/VLDM) Variants. 2254 2255// These mov immediate writers are unconditionally expanded with 2256// additive latency. 2257def A9WriteI2 : WriteSequence<[A9WriteI, A9WriteI]>; 2258def A9WriteI2pc : WriteSequence<[A9WriteI, A9WriteI, WriteALU]>; 2259def A9WriteI2ld : WriteSequence<[A9WriteI, A9WriteI, A9WriteL]>; 2260 2261// Some ALU operations can read loaded integer values one cycle early. 2262def A9ReadALU : SchedReadAdvance<1, 2263 [A9WriteL, A9WriteLHi, A9WriteLsi, A9WriteLb, A9WriteLbsi, 2264 A9WriteL1, A9WriteL2, A9WriteL3, A9WriteL4, 2265 A9WriteL5, A9WriteL6, A9WriteL7, A9WriteL8, 2266 A9WriteL1Hi, A9WriteL2Hi, A9WriteL3Hi, A9WriteL4Hi, 2267 A9WriteL5Hi, A9WriteL6Hi, A9WriteL7Hi, A9WriteL8Hi]>; 2268 2269// Read types for operands that are unconditionally read in cycle N 2270// after the instruction issues, decreases producer latency by N-1. 2271def A9Read2 : SchedReadAdvance<1>; 2272def A9Read3 : SchedReadAdvance<2>; 2273def A9Read4 : SchedReadAdvance<3>; 2274 2275//===----------------------------------------------------------------------===// 2276// Map itinerary classes to scheduler read/write resources per operand. 2277// 2278// For ARM, we piggyback scheduler resources on the Itinerary classes 2279// to avoid perturbing the existing instruction definitions. 2280 2281// This table follows the ARM Cortex-A9 Technical Reference Manuals, 2282// mostly in order. 2283 2284def :ItinRW<[WriteALU], [IIC_iMOVi,IIC_iMOVr,IIC_iMOVsi, 2285 IIC_iMVNi,IIC_iMVNsi, 2286 IIC_iCMOVi,IIC_iCMOVr,IIC_iCMOVsi]>; 2287def :ItinRW<[WriteALU, A9ReadALU],[IIC_iMVNr]>; 2288def :ItinRW<[A9WriteIsr], [IIC_iMOVsr,IIC_iMVNsr,IIC_iCMOVsr]>; 2289 2290def :ItinRW<[A9WriteI2], [IIC_iMOVix2,IIC_iCMOVix2]>; 2291def :ItinRW<[A9WriteI2pc], [IIC_iMOVix2addpc]>; 2292def :ItinRW<[A9WriteI2ld], [IIC_iMOVix2ld]>; 2293 2294def :ItinRW<[WriteALU], [IIC_iBITi,IIC_iBITr,IIC_iUNAr,IIC_iTSTi,IIC_iTSTr]>; 2295def :ItinRW<[WriteALU, A9ReadALU], [IIC_iALUi, IIC_iCMPi, IIC_iCMPsi]>; 2296def :ItinRW<[WriteALU, A9ReadALU, A9ReadALU],[IIC_iALUr,IIC_iCMPr]>; 2297def :ItinRW<[WriteALUsi], [IIC_iBITsi,IIC_iUNAsi,IIC_iEXTr,IIC_iTSTsi]>; 2298def :ItinRW<[WriteALUsi, A9ReadALU], [IIC_iALUsi]>; 2299def :ItinRW<[WriteALUsi, ReadDefault, A9ReadALU], [IIC_iALUsir]>; // RSB 2300def :ItinRW<[A9WriteALUsr], [IIC_iBITsr,IIC_iTSTsr,IIC_iEXTAr,IIC_iEXTAsr]>; 2301def :ItinRW<[A9WriteALUsr, A9ReadALU], [IIC_iALUsr,IIC_iCMPsr]>; 2302 2303// A9WriteHi ignored for MUL32. 2304def :ItinRW<[A9WriteM, A9WriteMHi], [IIC_iMUL32,IIC_iMAC32, 2305 IIC_iMUL64,IIC_iMAC64]>; 2306// FIXME: SMLALxx needs itin classes 2307def :ItinRW<[A9WriteM16, A9WriteM16Hi], [IIC_iMUL16,IIC_iMAC16]>; 2308 2309// TODO: For floating-point ops, we model the pipeline forwarding 2310// latencies here. WAW latencies are sometimes longer. 2311 2312def :ItinRW<[A9WriteFMov], [IIC_fpSTAT, IIC_fpMOVIS, IIC_fpMOVID, IIC_fpMOVSI, 2313 IIC_fpUNA32, IIC_fpUNA64, 2314 IIC_fpCMP32, IIC_fpCMP64]>; 2315def :ItinRW<[A9WriteFMov, A9WriteFMov], [IIC_fpMOVDI]>; 2316def :ItinRW<[A9WriteF], [IIC_fpCVTSD, IIC_fpCVTDS, IIC_fpCVTSH, IIC_fpCVTHS, 2317 IIC_fpCVTIS, IIC_fpCVTID, IIC_fpCVTSI, IIC_fpCVTDI, 2318 IIC_fpALU32, IIC_fpALU64]>; 2319def :ItinRW<[A9WriteFMulS], [IIC_fpMUL32]>; 2320def :ItinRW<[A9WriteFMulD], [IIC_fpMUL64]>; 2321def :ItinRW<[A9WriteFMAS], [IIC_fpMAC32]>; 2322def :ItinRW<[A9WriteFMAD], [IIC_fpMAC64]>; 2323def :ItinRW<[A9WriteFDivS], [IIC_fpDIV32]>; 2324def :ItinRW<[A9WriteFDivD], [IIC_fpDIV64]>; 2325def :ItinRW<[A9WriteFSqrtS], [IIC_fpSQRT32]>; 2326def :ItinRW<[A9WriteFSqrtD], [IIC_fpSQRT64]>; 2327 2328def :ItinRW<[A9WriteB], [IIC_Br]>; 2329 2330// A9 PLD is processed in a dedicated unit. 2331def :ItinRW<[], [IIC_Preload]>; 2332 2333// Note: We must assume that loads are aligned, since the machine 2334// model cannot know this statically and A9 ignores alignment hints. 2335 2336// A9WriteAdr consumes AGU regardless address writeback. But it's 2337// latency is only relevant for users of an updated address. 2338def :ItinRW<[A9WriteL, A9WriteAdr], [IIC_iLoad_i,IIC_iLoad_r, 2339 IIC_iLoad_iu,IIC_iLoad_ru]>; 2340def :ItinRW<[A9WriteLsi, A9WriteAdr], [IIC_iLoad_si,IIC_iLoad_siu]>; 2341def :ItinRW<[A9WriteLb, A9WriteAdr2], [IIC_iLoad_bh_i,IIC_iLoad_bh_r, 2342 IIC_iLoad_bh_iu,IIC_iLoad_bh_ru]>; 2343def :ItinRW<[A9WriteLbsi, A9WriteAdr2], [IIC_iLoad_bh_si,IIC_iLoad_bh_siu]>; 2344def :ItinRW<[A9WriteL, A9WriteLHi, A9WriteAdr], [IIC_iLoad_d_i,IIC_iLoad_d_r, 2345 IIC_iLoad_d_ru]>; 2346// Store either has no def operands, or the one def for address writeback. 2347def :ItinRW<[A9WriteAdr, A9WriteS], [IIC_iStore_i, IIC_iStore_r, 2348 IIC_iStore_iu, IIC_iStore_ru, 2349 IIC_iStore_d_i, IIC_iStore_d_r, 2350 IIC_iStore_d_ru]>; 2351def :ItinRW<[A9WriteAdr2, A9WriteS], [IIC_iStore_si, IIC_iStore_siu, 2352 IIC_iStore_bh_i, IIC_iStore_bh_r, 2353 IIC_iStore_bh_iu, IIC_iStore_bh_ru]>; 2354def :ItinRW<[A9WriteAdr3, A9WriteS], [IIC_iStore_bh_si, IIC_iStore_bh_siu]>; 2355 2356// A9WriteML will be expanded into a separate write for each def 2357// operand. Address generation consumes resources, but A9WriteLMAdr 2358// is listed after all def operands, so has no effective latency. 2359// 2360// Note: A9WriteLM expands into an even number of def operands. The 2361// actual number of def operands may be less by one. 2362def :ItinRW<[A9WriteLM, A9WriteLMAdr, A9WriteIssue], [IIC_iLoad_m, IIC_iPop]>; 2363 2364// Load multiple with address writeback has an extra def operand in 2365// front of the loaded registers. 2366// 2367// Reuse the load-multiple variants for store-multiple because the 2368// resources are identical, For stores only the address writeback 2369// has a def operand so the WriteL latencies are unused. 2370def :ItinRW<[A9WriteLMAdr, A9WriteLM, A9WriteIssue], [IIC_iLoad_mu, 2371 IIC_iStore_m, 2372 IIC_iStore_mu]>; 2373def :ItinRW<[A9WriteLM, A9WriteLMAdr, A9WriteB], [IIC_iLoad_mBr, IIC_iPop_Br]>; 2374def :ItinRW<[A9WriteL, A9WriteAdr, WriteALU], [IIC_iLoadiALU]>; 2375 2376def :ItinRW<[A9WriteLSfp, A9WriteAdr], [IIC_fpLoad32, IIC_fpLoad64]>; 2377 2378def :ItinRW<[A9WriteLMfp, A9WriteLMAdr], [IIC_fpLoad_m]>; 2379def :ItinRW<[A9WriteLMAdr, A9WriteLMfp], [IIC_fpLoad_mu]>; 2380def :ItinRW<[A9WriteAdr, A9WriteLSfp], [IIC_fpStore32, IIC_fpStore64, 2381 IIC_fpStore_m, IIC_fpStore_mu]>; 2382 2383// Note: Unlike VLDM, VLD1 expects the writeback operand after the 2384// normal writes. 2385def :ItinRW<[A9WriteLfp1, A9WriteAdr1], [IIC_VLD1, IIC_VLD1u, 2386 IIC_VLD1x2, IIC_VLD1x2u]>; 2387def :ItinRW<[A9WriteLfp2, A9WriteAdr2], [IIC_VLD1x3, IIC_VLD1x3u, 2388 IIC_VLD1x4, IIC_VLD1x4u, 2389 IIC_VLD4dup, IIC_VLD4dupu]>; 2390def :ItinRW<[A9WriteLfp1Mov, A9WriteAdr1], [IIC_VLD1dup, IIC_VLD1dupu, 2391 IIC_VLD2, IIC_VLD2u, 2392 IIC_VLD2dup, IIC_VLD2dupu]>; 2393def :ItinRW<[A9WriteLfp2Mov, A9WriteAdr1], [IIC_VLD1ln, IIC_VLD1lnu, 2394 IIC_VLD2x2, IIC_VLD2x2u, 2395 IIC_VLD2ln, IIC_VLD2lnu]>; 2396def :ItinRW<[A9WriteLfp3Mov, A9WriteAdr3], [IIC_VLD3, IIC_VLD3u, 2397 IIC_VLD3dup, IIC_VLD3dupu]>; 2398def :ItinRW<[A9WriteLfp4Mov, A9WriteAdr4], [IIC_VLD4, IIC_VLD4u, 2399 IIC_VLD4ln, IIC_VLD4lnu]>; 2400def :ItinRW<[A9WriteLfp5Mov, A9WriteAdr5], [IIC_VLD3ln, IIC_VLD3lnu]>; 2401 2402// Vector stores use similar resources to vector loads, so use the 2403// same write types. The address write must be first for stores with 2404// address writeback. 2405def :ItinRW<[A9WriteAdr1, A9WriteLfp1], [IIC_VST1, IIC_VST1u, 2406 IIC_VST1x2, IIC_VST1x2u, 2407 IIC_VST1ln, IIC_VST1lnu, 2408 IIC_VST2, IIC_VST2u, 2409 IIC_VST2x2, IIC_VST2x2u, 2410 IIC_VST2ln, IIC_VST2lnu]>; 2411def :ItinRW<[A9WriteAdr2, A9WriteLfp2], [IIC_VST1x3, IIC_VST1x3u, 2412 IIC_VST1x4, IIC_VST1x4u, 2413 IIC_VST3, IIC_VST3u, 2414 IIC_VST3ln, IIC_VST3lnu, 2415 IIC_VST4, IIC_VST4u, 2416 IIC_VST4ln, IIC_VST4lnu]>; 2417 2418// NEON moves. 2419def :ItinRW<[A9WriteV2], [IIC_VMOVSI, IIC_VMOVDI, IIC_VMOVD, IIC_VMOVQ]>; 2420def :ItinRW<[A9WriteV1], [IIC_VMOV, IIC_VMOVIS, IIC_VMOVID]>; 2421def :ItinRW<[A9WriteV3], [IIC_VMOVISL, IIC_VMOVN]>; 2422 2423// NEON integer arithmetic 2424// 2425// VADD/VAND/VORR/VEOR/VBIC/VORN/VBIT/VBIF/VBSL 2426def :ItinRW<[A9WriteV3, A9Read2, A9Read2], [IIC_VBINiD, IIC_VBINiQ]>; 2427// VSUB/VMVN/VCLSD/VCLZD/VCNTD 2428def :ItinRW<[A9WriteV3, A9Read2], [IIC_VSUBiD, IIC_VSUBiQ, IIC_VCNTiD]>; 2429// VADDL/VSUBL/VNEG are mapped later under IIC_SHLi. 2430// ... 2431// VHADD/VRHADD/VQADD/VTST/VADH/VRADH 2432def :ItinRW<[A9WriteV4, A9Read2, A9Read2], [IIC_VBINi4D, IIC_VBINi4Q]>; 2433 2434// VSBH/VRSBH/VHSUB/VQSUB/VABD/VCEQ/VCGE/VCGT/VMAX/VMIN/VPMAX/VPMIN/VABDL 2435def :ItinRW<[A9WriteV4, A9Read2], [IIC_VSUBi4D, IIC_VSUBi4Q]>; 2436// VQNEG/VQABS 2437def :ItinRW<[A9WriteV4], [IIC_VQUNAiD, IIC_VQUNAiQ]>; 2438// VABS 2439def :ItinRW<[A9WriteV4, A9Read2], [IIC_VUNAiD, IIC_VUNAiQ]>; 2440// VPADD/VPADDL are mapped later under IIC_SHLi. 2441// ... 2442// VCLSQ/VCLZQ/VCNTQ, takes two cycles. 2443def :ItinRW<[A9Write2V4, A9Read3], [IIC_VCNTiQ]>; 2444// VMOVimm/VMVNimm/VORRimm/VBICimm 2445def :ItinRW<[A9WriteV3], [IIC_VMOVImm]>; 2446def :ItinRW<[A9WriteV6, A9Read3, A9Read2], [IIC_VABAD, IIC_VABAQ]>; 2447def :ItinRW<[A9WriteV6, A9Read3], [IIC_VPALiD, IIC_VPALiQ]>; 2448 2449// NEON integer multiply 2450// 2451// Note: these don't quite match the timing docs, but they do match 2452// the original A9 itinerary. 2453def :ItinRW<[A9WriteV6, A9Read2, A9Read2], [IIC_VMULi16D]>; 2454def :ItinRW<[A9WriteV7, A9Read2, A9Read2], [IIC_VMULi16Q]>; 2455def :ItinRW<[A9Write2V7, A9Read2], [IIC_VMULi32D]>; 2456def :ItinRW<[A9Write2V9, A9Read2], [IIC_VMULi32Q]>; 2457def :ItinRW<[A9WriteV6, A9Read3, A9Read2, A9Read2], [IIC_VMACi16D]>; 2458def :ItinRW<[A9WriteV7, A9Read3, A9Read2, A9Read2], [IIC_VMACi16Q]>; 2459def :ItinRW<[A9Write2V7, A9Read3, A9Read2], [IIC_VMACi32D]>; 2460def :ItinRW<[A9Write2V9, A9Read3, A9Read2], [IIC_VMACi32Q]>; 2461 2462// NEON integer shift 2463// TODO: Q,Q,Q shifts should actually reserve FP for 2 cycles. 2464def :ItinRW<[A9WriteV3], [IIC_VSHLiD, IIC_VSHLiQ]>; 2465def :ItinRW<[A9WriteV4], [IIC_VSHLi4D, IIC_VSHLi4Q]>; 2466 2467// NEON permute 2468def :ItinRW<[A9WriteV2, A9WriteV2], [IIC_VPERMD, IIC_VPERMQ, IIC_VEXTD]>; 2469def :ItinRW<[A9WriteV3, A9WriteV4, ReadDefault, A9Read2], 2470 [IIC_VPERMQ3, IIC_VEXTQ]>; 2471def :ItinRW<[A9WriteV3, A9Read2], [IIC_VTB1]>; 2472def :ItinRW<[A9WriteV3, A9Read2, A9Read2], [IIC_VTB2]>; 2473def :ItinRW<[A9WriteV4, A9Read2, A9Read2, A9Read3], [IIC_VTB3]>; 2474def :ItinRW<[A9WriteV4, A9Read2, A9Read2, A9Read3, A9Read3], [IIC_VTB4]>; 2475def :ItinRW<[A9WriteV3, ReadDefault, A9Read2], [IIC_VTBX1]>; 2476def :ItinRW<[A9WriteV3, ReadDefault, A9Read2, A9Read2], [IIC_VTBX2]>; 2477def :ItinRW<[A9WriteV4, ReadDefault, A9Read2, A9Read2, A9Read3], [IIC_VTBX3]>; 2478def :ItinRW<[A9WriteV4, ReadDefault, A9Read2, A9Read2, A9Read3, A9Read3], 2479 [IIC_VTBX4]>; 2480 2481// NEON floating-point 2482def :ItinRW<[A9WriteV5, A9Read2, A9Read2], [IIC_VBIND]>; 2483def :ItinRW<[A9WriteV6, A9Read2, A9Read2], [IIC_VBINQ]>; 2484def :ItinRW<[A9WriteV5, A9Read2], [IIC_VUNAD, IIC_VFMULD]>; 2485def :ItinRW<[A9WriteV6, A9Read2], [IIC_VUNAQ, IIC_VFMULQ]>; 2486def :ItinRW<[A9WriteV9, A9Read3, A9Read2], [IIC_VMACD, IIC_VFMACD]>; 2487def :ItinRW<[A9WriteV10, A9Read3, A9Read2], [IIC_VMACQ, IIC_VFMACQ]>; 2488def :ItinRW<[A9WriteV9, A9Read2, A9Read2], [IIC_VRECSD]>; 2489def :ItinRW<[A9WriteV10, A9Read2, A9Read2], [IIC_VRECSQ]>; 2490 2491// Map SchedRWs that are identical for cortexa9 to existing resources. 2492def : SchedAlias<WriteALU, A9WriteALU>; 2493def : SchedAlias<WriteALUsr, A9WriteALUsr>; 2494def : SchedAlias<WriteALUSsr, A9WriteALUsr>; 2495def : SchedAlias<ReadALU, A9ReadALU>; 2496def : SchedAlias<ReadALUsr, A9ReadALU>; 2497def : SchedAlias<WriteST, A9WriteS>; 2498 2499// ===---------------------------------------------------------------------===// 2500// Floating-point. Map target defined SchedReadWrite to processor specific ones 2501// 2502def : WriteRes<WriteFPCVT, [A9UnitFP, A9UnitAGU]> { let Latency = 4; } 2503def : SchedAlias<WriteFPMOV, A9WriteFMov>; 2504 2505def : SchedAlias<WriteFPALU32, A9WriteF>; 2506def : SchedAlias<WriteFPALU64, A9WriteF>; 2507 2508def : SchedAlias<WriteFPMUL32, A9WriteFMulS>; 2509def : SchedAlias<WriteFPMUL64, A9WriteFMulD>; 2510 2511def : SchedAlias<WriteFPMAC32, A9WriteFMAS>; 2512def : SchedAlias<WriteFPMAC64, A9WriteFMAD>; 2513 2514def : SchedAlias<WriteFPDIV32, A9WriteFDivS>; 2515def : SchedAlias<WriteFPDIV64, A9WriteFDivD>; 2516def : SchedAlias<WriteFPSQRT32, A9WriteFSqrtS>; 2517def : SchedAlias<WriteFPSQRT64, A9WriteFSqrtD>; 2518 2519def : ReadAdvance<ReadFPMUL, 0>; 2520def : ReadAdvance<ReadFPMAC, 0>; 2521 2522// ===---------------------------------------------------------------------===// 2523// Subtarget-specific overrides. Map opcodes to list of SchedReadWrite types. 2524// 2525def : InstRW< [WriteALU], 2526 (instregex "ANDri", "ORRri", "EORri", "BICri", "ANDrr", "ORRrr", "EORrr", 2527 "BICrr")>; 2528def : InstRW< [WriteALUsi], (instrs ANDrsi, ORRrsi, EORrsi, BICrsi)>; 2529def : InstRW< [WriteALUsr], (instrs ANDrsr, ORRrsr, EORrsr, BICrsr)>; 2530 2531 2532def : SchedAlias<WriteCMP, A9WriteALU>; 2533def : SchedAlias<WriteCMPsi, A9WriteALU>; 2534def : SchedAlias<WriteCMPsr, A9WriteALU>; 2535 2536def : InstRW< [A9WriteIsr], (instregex "MOVsr", "MOVsi", "MVNsr", "MOVCCsi", 2537 "MOVCCsr")>; 2538def : InstRW< [WriteALU, A9ReadALU], (instregex "MVNr")>; 2539def : InstRW< [A9WriteI2], (instregex "MOVCCi32imm", "MOVi32imm")>; 2540def : InstRW< [A9WriteI2pc], (instregex "MOV_ga_pcrel")>; 2541def : InstRW< [A9WriteI2ld], (instregex "MOV_ga_pcrel_ldr")>; 2542 2543def : InstRW< [WriteALU], (instregex "SEL")>; 2544 2545def : InstRW< [WriteALUsi], (instregex "BFC", "BFI", "UBFX", "SBFX")>; 2546 2547def : InstRW< [A9WriteM], 2548 (instregex "MUL", "MULv5", "SMMUL", "SMMULR", "MLA", "MLAv5", "MLS", 2549 "SMMLA", "SMMLAR", "SMMLS", "SMMLSR")>; 2550def : InstRW< [A9WriteM, A9WriteMHi], 2551 (instregex "SMULL", "SMULLv5", "UMULL", "UMULLv5", "SMLAL$", "UMLAL", 2552 "UMAAL", "SMLALv5", "UMLALv5", "SMLALBB", "SMLALBT", "SMLALTB", 2553 "SMLALTT")>; 2554// FIXME: These instructions used to have NoItinerary. Just copied the one from above. 2555def : InstRW< [A9WriteM, A9WriteMHi], 2556 (instregex "SMLAD", "SMLADX", "SMLALD", "SMLALDX", "SMLSD", "SMLSDX", 2557 "SMLSLD", "SMLSLDX", "SMUAD", "SMUADX", "SMUSD", "SMUSDX")>; 2558 2559def : InstRW<[A9WriteM16, A9WriteM16Hi], 2560 (instregex "SMULBB", "SMULBT", "SMULTB", "SMULTT", "SMULWB", "SMULWT")>; 2561def : InstRW<[A9WriteM16, A9WriteM16Hi], 2562 (instregex "SMLABB", "SMLABT", "SMLATB", "SMLATT", "SMLAWB", "SMLAWT")>; 2563 2564def : InstRW<[A9WriteL], (instregex "LDRi12", "PICLDR$")>; 2565def : InstRW<[A9WriteLsi], (instregex "LDRrs")>; 2566def : InstRW<[A9WriteLb], 2567 (instregex "LDRBi12", "PICLDRH", "PICLDRB", "PICLDRSH", "PICLDRSB", 2568 "LDRH", "LDRSH", "LDRSB")>; 2569def : InstRW<[A9WriteLbsi], (instregex "LDRrs")>; 2570 2571def : WriteRes<WriteDIV, []> { let Latency = 0; } 2572 2573def : WriteRes<WriteBr, [A9UnitB]>; 2574def : WriteRes<WriteBrL, [A9UnitB]>; 2575def : WriteRes<WriteBrTbl, [A9UnitB]>; 2576def : WriteRes<WritePreLd, []>; 2577def : WriteRes<WriteNoop, []> { let Latency = 0; let NumMicroOps = 0; } 2578} // SchedModel = CortexA9Model 2579