xref: /freebsd/contrib/llvm-project/llvm/lib/Target/ARM/ARMScheduleA9.td (revision e8d8bef961a50d4dc22501cde4fb9fb0be1b2532)
10b57cec5SDimitry Andric//=- ARMScheduleA9.td - ARM Cortex-A9 Scheduling Definitions -*- tablegen -*-=//
20b57cec5SDimitry Andric//
30b57cec5SDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric// See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric//
70b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric//
90b57cec5SDimitry Andric// This file defines the itinerary class data for the ARM Cortex A9 processors.
100b57cec5SDimitry Andric//
110b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
120b57cec5SDimitry Andric
130b57cec5SDimitry Andric// ===---------------------------------------------------------------------===//
140b57cec5SDimitry Andric// This section contains legacy support for itineraries. This is
150b57cec5SDimitry Andric// required until SD and PostRA schedulers are replaced by MachineScheduler.
160b57cec5SDimitry Andric
170b57cec5SDimitry Andric//
180b57cec5SDimitry Andric// Ad-hoc scheduling information derived from pretty vague "Cortex-A9 Technical
190b57cec5SDimitry Andric// Reference Manual".
200b57cec5SDimitry Andric//
210b57cec5SDimitry Andric// Functional units
220b57cec5SDimitry Andricdef A9_Issue0  : FuncUnit; // Issue 0
230b57cec5SDimitry Andricdef A9_Issue1  : FuncUnit; // Issue 1
240b57cec5SDimitry Andricdef A9_Branch  : FuncUnit; // Branch
250b57cec5SDimitry Andricdef A9_ALU0    : FuncUnit; // ALU / MUL pipeline 0
260b57cec5SDimitry Andricdef A9_ALU1    : FuncUnit; // ALU pipeline 1
270b57cec5SDimitry Andricdef A9_AGU     : FuncUnit; // Address generation unit for ld / st
280b57cec5SDimitry Andricdef A9_NPipe   : FuncUnit; // NEON pipeline
290b57cec5SDimitry Andricdef A9_MUX0    : FuncUnit; // AGU + NEON/FPU multiplexer
300b57cec5SDimitry Andricdef A9_LSUnit  : FuncUnit; // L/S Unit
310b57cec5SDimitry Andricdef A9_DRegsVFP: FuncUnit; // FP register set, VFP side
320b57cec5SDimitry Andricdef A9_DRegsN  : FuncUnit; // FP register set, NEON side
330b57cec5SDimitry Andric
340b57cec5SDimitry Andric// Bypasses
350b57cec5SDimitry Andricdef A9_LdBypass : Bypass;
360b57cec5SDimitry Andric
370b57cec5SDimitry Andricdef CortexA9Itineraries : ProcessorItineraries<
380b57cec5SDimitry Andric  [A9_Issue0, A9_Issue1, A9_Branch, A9_ALU0, A9_ALU1, A9_AGU, A9_NPipe, A9_MUX0,
390b57cec5SDimitry Andric   A9_LSUnit, A9_DRegsVFP, A9_DRegsN],
400b57cec5SDimitry Andric  [A9_LdBypass], [
410b57cec5SDimitry Andric  // Two fully-pipelined integer ALU pipelines
420b57cec5SDimitry Andric
430b57cec5SDimitry Andric  //
440b57cec5SDimitry Andric  // Move instructions, unconditional
450b57cec5SDimitry Andric  InstrItinData<IIC_iMOVi   , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
460b57cec5SDimitry Andric                               InstrStage<1, [A9_ALU0, A9_ALU1]>], [1]>,
470b57cec5SDimitry Andric  InstrItinData<IIC_iMOVr   , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
480b57cec5SDimitry Andric                               InstrStage<1, [A9_ALU0, A9_ALU1]>], [1, 1]>,
490b57cec5SDimitry Andric  InstrItinData<IIC_iMOVsi  , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
500b57cec5SDimitry Andric                               InstrStage<1, [A9_ALU0, A9_ALU1]>], [1, 1]>,
510b57cec5SDimitry Andric  InstrItinData<IIC_iMOVsr  , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
520b57cec5SDimitry Andric                               InstrStage<2, [A9_ALU0, A9_ALU1]>], [2, 1, 1]>,
530b57cec5SDimitry Andric  InstrItinData<IIC_iMOVix2 , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
540b57cec5SDimitry Andric                               InstrStage<1, [A9_ALU0, A9_ALU1]>,
550b57cec5SDimitry Andric                               InstrStage<1, [A9_ALU0, A9_ALU1]>], [2]>,
560b57cec5SDimitry Andric  InstrItinData<IIC_iMOVix2addpc,[InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
570b57cec5SDimitry Andric                                  InstrStage<1, [A9_ALU0, A9_ALU1]>,
580b57cec5SDimitry Andric                                  InstrStage<1, [A9_ALU0, A9_ALU1]>,
590b57cec5SDimitry Andric                                  InstrStage<1, [A9_ALU0, A9_ALU1]>], [3]>,
600b57cec5SDimitry Andric  InstrItinData<IIC_iMOVix2ld,[InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
610b57cec5SDimitry Andric                               InstrStage<1, [A9_ALU0, A9_ALU1]>,
620b57cec5SDimitry Andric                               InstrStage<1, [A9_ALU0, A9_ALU1]>,
630b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
640b57cec5SDimitry Andric                               InstrStage<1, [A9_AGU], 0>,
650b57cec5SDimitry Andric                               InstrStage<1, [A9_LSUnit]>], [5]>,
660b57cec5SDimitry Andric  //
670b57cec5SDimitry Andric  // MVN instructions
680b57cec5SDimitry Andric  InstrItinData<IIC_iMVNi   , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
690b57cec5SDimitry Andric                               InstrStage<1, [A9_ALU0, A9_ALU1]>],
700b57cec5SDimitry Andric                              [1]>,
710b57cec5SDimitry Andric  InstrItinData<IIC_iMVNr   , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
720b57cec5SDimitry Andric                               InstrStage<1, [A9_ALU0, A9_ALU1]>],
730b57cec5SDimitry Andric                              [1, 1], [NoBypass, A9_LdBypass]>,
740b57cec5SDimitry Andric  InstrItinData<IIC_iMVNsi  , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
750b57cec5SDimitry Andric                               InstrStage<2, [A9_ALU0, A9_ALU1]>],
760b57cec5SDimitry Andric                              [2, 1]>,
770b57cec5SDimitry Andric  InstrItinData<IIC_iMVNsr  , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
780b57cec5SDimitry Andric                               InstrStage<3, [A9_ALU0, A9_ALU1]>],
790b57cec5SDimitry Andric                              [3, 1, 1]>,
800b57cec5SDimitry Andric  //
810b57cec5SDimitry Andric  // No operand cycles
820b57cec5SDimitry Andric  InstrItinData<IIC_iALUx   , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
830b57cec5SDimitry Andric                               InstrStage<1, [A9_ALU0, A9_ALU1]>]>,
840b57cec5SDimitry Andric  //
850b57cec5SDimitry Andric  // Binary Instructions that produce a result
860b57cec5SDimitry Andric  InstrItinData<IIC_iALUi , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
870b57cec5SDimitry Andric                             InstrStage<1, [A9_ALU0, A9_ALU1]>],
880b57cec5SDimitry Andric                            [1, 1], [NoBypass, A9_LdBypass]>,
890b57cec5SDimitry Andric  InstrItinData<IIC_iALUr , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
900b57cec5SDimitry Andric                             InstrStage<1, [A9_ALU0, A9_ALU1]>],
910b57cec5SDimitry Andric                            [1, 1, 1], [NoBypass, A9_LdBypass, A9_LdBypass]>,
920b57cec5SDimitry Andric  InstrItinData<IIC_iALUsi, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
930b57cec5SDimitry Andric                             InstrStage<2, [A9_ALU0, A9_ALU1]>],
940b57cec5SDimitry Andric                            [2, 1, 1], [NoBypass, A9_LdBypass, NoBypass]>,
950b57cec5SDimitry Andric  InstrItinData<IIC_iALUsir,[InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
960b57cec5SDimitry Andric                             InstrStage<2, [A9_ALU0, A9_ALU1]>],
970b57cec5SDimitry Andric                            [2, 1, 1], [NoBypass, NoBypass, A9_LdBypass]>,
980b57cec5SDimitry Andric  InstrItinData<IIC_iALUsr, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
990b57cec5SDimitry Andric                             InstrStage<3, [A9_ALU0, A9_ALU1]>],
1000b57cec5SDimitry Andric                            [3, 1, 1, 1],
1010b57cec5SDimitry Andric                            [NoBypass, A9_LdBypass, NoBypass, NoBypass]>,
1020b57cec5SDimitry Andric  //
1030b57cec5SDimitry Andric  // Bitwise Instructions that produce a result
1040b57cec5SDimitry Andric  InstrItinData<IIC_iBITi , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
1050b57cec5SDimitry Andric                             InstrStage<1, [A9_ALU0, A9_ALU1]>], [1, 1]>,
1060b57cec5SDimitry Andric  InstrItinData<IIC_iBITr , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
1070b57cec5SDimitry Andric                             InstrStage<1, [A9_ALU0, A9_ALU1]>], [1, 1, 1]>,
1080b57cec5SDimitry Andric  InstrItinData<IIC_iBITsi, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
1090b57cec5SDimitry Andric                             InstrStage<2, [A9_ALU0, A9_ALU1]>], [2, 1, 1]>,
1100b57cec5SDimitry Andric  InstrItinData<IIC_iBITsr, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
1110b57cec5SDimitry Andric                             InstrStage<3, [A9_ALU0, A9_ALU1]>], [3, 1, 1, 1]>,
1120b57cec5SDimitry Andric  //
1130b57cec5SDimitry Andric  // Unary Instructions that produce a result
1140b57cec5SDimitry Andric
1150b57cec5SDimitry Andric  // CLZ, RBIT, etc.
1160b57cec5SDimitry Andric  InstrItinData<IIC_iUNAr , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
1170b57cec5SDimitry Andric                             InstrStage<1, [A9_ALU0, A9_ALU1]>], [1, 1]>,
1180b57cec5SDimitry Andric
1190b57cec5SDimitry Andric  // BFC, BFI, UBFX, SBFX
1200b57cec5SDimitry Andric  InstrItinData<IIC_iUNAsi, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
1210b57cec5SDimitry Andric                             InstrStage<2, [A9_ALU0, A9_ALU1]>], [2, 1]>,
1220b57cec5SDimitry Andric
1230b57cec5SDimitry Andric  //
1240b57cec5SDimitry Andric  // Zero and sign extension instructions
1250b57cec5SDimitry Andric  InstrItinData<IIC_iEXTr , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
1260b57cec5SDimitry Andric                             InstrStage<1, [A9_ALU0, A9_ALU1]>], [2, 1]>,
1270b57cec5SDimitry Andric  InstrItinData<IIC_iEXTAr, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
1280b57cec5SDimitry Andric                             InstrStage<2, [A9_ALU0, A9_ALU1]>], [3, 1, 1]>,
1290b57cec5SDimitry Andric  InstrItinData<IIC_iEXTAsr,[InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
1300b57cec5SDimitry Andric                             InstrStage<3, [A9_ALU0, A9_ALU1]>], [3, 1, 1, 1]>,
1310b57cec5SDimitry Andric  //
1320b57cec5SDimitry Andric  // Compare instructions
1330b57cec5SDimitry Andric  InstrItinData<IIC_iCMPi   , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
1340b57cec5SDimitry Andric                               InstrStage<1, [A9_ALU0, A9_ALU1]>],
1350b57cec5SDimitry Andric                               [1], [A9_LdBypass]>,
1360b57cec5SDimitry Andric  InstrItinData<IIC_iCMPr   , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
1370b57cec5SDimitry Andric                               InstrStage<1, [A9_ALU0, A9_ALU1]>],
1380b57cec5SDimitry Andric                               [1, 1], [A9_LdBypass, A9_LdBypass]>,
1390b57cec5SDimitry Andric  InstrItinData<IIC_iCMPsi  , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
1400b57cec5SDimitry Andric                               InstrStage<2, [A9_ALU0, A9_ALU1]>],
1410b57cec5SDimitry Andric                                [1, 1], [A9_LdBypass, NoBypass]>,
1420b57cec5SDimitry Andric  InstrItinData<IIC_iCMPsr  , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
1430b57cec5SDimitry Andric                               InstrStage<3, [A9_ALU0, A9_ALU1]>],
1440b57cec5SDimitry Andric                              [1, 1, 1], [A9_LdBypass, NoBypass, NoBypass]>,
1450b57cec5SDimitry Andric  //
1460b57cec5SDimitry Andric  // Test instructions
1470b57cec5SDimitry Andric  InstrItinData<IIC_iTSTi   , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
1480b57cec5SDimitry Andric                               InstrStage<1, [A9_ALU0, A9_ALU1]>], [1]>,
1490b57cec5SDimitry Andric  InstrItinData<IIC_iTSTr   , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
1500b57cec5SDimitry Andric                               InstrStage<1, [A9_ALU0, A9_ALU1]>], [1, 1]>,
1510b57cec5SDimitry Andric  InstrItinData<IIC_iTSTsi  , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
1520b57cec5SDimitry Andric                               InstrStage<2, [A9_ALU0, A9_ALU1]>], [1, 1]>,
1530b57cec5SDimitry Andric  InstrItinData<IIC_iTSTsr  , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
1540b57cec5SDimitry Andric                               InstrStage<3, [A9_ALU0, A9_ALU1]>], [1, 1, 1]>,
1550b57cec5SDimitry Andric  //
1560b57cec5SDimitry Andric  // Move instructions, conditional
1570b57cec5SDimitry Andric  // FIXME: Correctly model the extra input dep on the destination.
1580b57cec5SDimitry Andric  InstrItinData<IIC_iCMOVi  , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
1590b57cec5SDimitry Andric                               InstrStage<1, [A9_ALU0, A9_ALU1]>], [1]>,
1600b57cec5SDimitry Andric  InstrItinData<IIC_iCMOVr  , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
1610b57cec5SDimitry Andric                               InstrStage<1, [A9_ALU0, A9_ALU1]>], [1, 1]>,
1620b57cec5SDimitry Andric  InstrItinData<IIC_iCMOVsi , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
1630b57cec5SDimitry Andric                               InstrStage<1, [A9_ALU0, A9_ALU1]>], [1, 1]>,
1640b57cec5SDimitry Andric  InstrItinData<IIC_iCMOVsr , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
1650b57cec5SDimitry Andric                               InstrStage<2, [A9_ALU0, A9_ALU1]>], [2, 1, 1]>,
1660b57cec5SDimitry Andric  InstrItinData<IIC_iCMOVix2, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
1670b57cec5SDimitry Andric                               InstrStage<1, [A9_ALU0, A9_ALU1]>,
1680b57cec5SDimitry Andric                               InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
1690b57cec5SDimitry Andric                               InstrStage<1, [A9_ALU0, A9_ALU1]>], [2]>,
1700b57cec5SDimitry Andric
1710b57cec5SDimitry Andric  // Integer multiply pipeline
1720b57cec5SDimitry Andric  //
1730b57cec5SDimitry Andric  InstrItinData<IIC_iMUL16  , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
1740b57cec5SDimitry Andric                               InstrStage<2, [A9_ALU0]>], [3, 1, 1]>,
1750b57cec5SDimitry Andric  InstrItinData<IIC_iMAC16  , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
1760b57cec5SDimitry Andric                               InstrStage<2, [A9_ALU0]>],
1770b57cec5SDimitry Andric                              [3, 1, 1, 1]>,
1780b57cec5SDimitry Andric  InstrItinData<IIC_iMUL32  , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
1790b57cec5SDimitry Andric                               InstrStage<2, [A9_ALU0]>], [4, 1, 1]>,
1800b57cec5SDimitry Andric  InstrItinData<IIC_iMAC32  , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
1810b57cec5SDimitry Andric                               InstrStage<2, [A9_ALU0]>],
1820b57cec5SDimitry Andric                              [4, 1, 1, 1]>,
1830b57cec5SDimitry Andric  InstrItinData<IIC_iMUL64  , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
1840b57cec5SDimitry Andric                               InstrStage<3, [A9_ALU0]>], [4, 5, 1, 1]>,
1850b57cec5SDimitry Andric  InstrItinData<IIC_iMAC64  , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
1860b57cec5SDimitry Andric                               InstrStage<3, [A9_ALU0]>],
1870b57cec5SDimitry Andric                              [4, 5, 1, 1]>,
1880b57cec5SDimitry Andric  // Integer load pipeline
1890b57cec5SDimitry Andric  // FIXME: The timings are some rough approximations
1900b57cec5SDimitry Andric  //
1910b57cec5SDimitry Andric  // Immediate offset
1920b57cec5SDimitry Andric  InstrItinData<IIC_iLoad_i   , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
1930b57cec5SDimitry Andric                                 InstrStage<1, [A9_MUX0], 0>,
1940b57cec5SDimitry Andric                                 InstrStage<1, [A9_AGU], 0>,
1950b57cec5SDimitry Andric                                 InstrStage<1, [A9_LSUnit]>],
1960b57cec5SDimitry Andric                                [3, 1], [A9_LdBypass]>,
1970b57cec5SDimitry Andric  InstrItinData<IIC_iLoad_bh_i, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
1980b57cec5SDimitry Andric                                 InstrStage<1, [A9_MUX0], 0>,
1990b57cec5SDimitry Andric                                 InstrStage<2, [A9_AGU], 0>,
2000b57cec5SDimitry Andric                                 InstrStage<1, [A9_LSUnit]>],
2010b57cec5SDimitry Andric                                [4, 1], [A9_LdBypass]>,
2020b57cec5SDimitry Andric  // FIXME: If address is 64-bit aligned, AGU cycles is 1.
2030b57cec5SDimitry Andric  InstrItinData<IIC_iLoad_d_i , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
2040b57cec5SDimitry Andric                                 InstrStage<1, [A9_MUX0], 0>,
2050b57cec5SDimitry Andric                                 InstrStage<2, [A9_AGU], 0>,
2060b57cec5SDimitry Andric                                 InstrStage<1, [A9_LSUnit]>],
2070b57cec5SDimitry Andric                                [3, 3, 1], [A9_LdBypass]>,
2080b57cec5SDimitry Andric  //
2090b57cec5SDimitry Andric  // Register offset
2100b57cec5SDimitry Andric  InstrItinData<IIC_iLoad_r   , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
2110b57cec5SDimitry Andric                                 InstrStage<1, [A9_MUX0], 0>,
2120b57cec5SDimitry Andric                                 InstrStage<1, [A9_AGU], 0>,
2130b57cec5SDimitry Andric                                 InstrStage<1, [A9_LSUnit]>],
2140b57cec5SDimitry Andric                                [3, 1, 1], [A9_LdBypass]>,
2150b57cec5SDimitry Andric  InstrItinData<IIC_iLoad_bh_r, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
2160b57cec5SDimitry Andric                                 InstrStage<1, [A9_MUX0], 0>,
2170b57cec5SDimitry Andric                                 InstrStage<2, [A9_AGU], 0>,
2180b57cec5SDimitry Andric                                 InstrStage<1, [A9_LSUnit]>],
2190b57cec5SDimitry Andric                                [4, 1, 1], [A9_LdBypass]>,
2200b57cec5SDimitry Andric  InstrItinData<IIC_iLoad_d_r , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
2210b57cec5SDimitry Andric                                 InstrStage<1, [A9_MUX0], 0>,
2220b57cec5SDimitry Andric                                 InstrStage<2, [A9_AGU], 0>,
2230b57cec5SDimitry Andric                                 InstrStage<1, [A9_LSUnit]>],
2240b57cec5SDimitry Andric                                [3, 3, 1, 1], [A9_LdBypass]>,
2250b57cec5SDimitry Andric  //
2260b57cec5SDimitry Andric  // Scaled register offset
2270b57cec5SDimitry Andric  InstrItinData<IIC_iLoad_si  , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
2280b57cec5SDimitry Andric                                 InstrStage<1, [A9_MUX0], 0>,
2290b57cec5SDimitry Andric                                 InstrStage<1, [A9_AGU], 0>,
2300b57cec5SDimitry Andric                                 InstrStage<1, [A9_LSUnit], 0>],
2310b57cec5SDimitry Andric                                [4, 1, 1], [A9_LdBypass]>,
2320b57cec5SDimitry Andric  InstrItinData<IIC_iLoad_bh_si,[InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
2330b57cec5SDimitry Andric                                 InstrStage<1, [A9_MUX0], 0>,
2340b57cec5SDimitry Andric                                 InstrStage<2, [A9_AGU], 0>,
2350b57cec5SDimitry Andric                                 InstrStage<1, [A9_LSUnit]>],
2360b57cec5SDimitry Andric                                [5, 1, 1], [A9_LdBypass]>,
2370b57cec5SDimitry Andric  //
2380b57cec5SDimitry Andric  // Immediate offset with update
2390b57cec5SDimitry Andric  InstrItinData<IIC_iLoad_iu  , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
2400b57cec5SDimitry Andric                                 InstrStage<1, [A9_MUX0], 0>,
2410b57cec5SDimitry Andric                                 InstrStage<1, [A9_AGU], 0>,
2420b57cec5SDimitry Andric                                 InstrStage<1, [A9_LSUnit]>],
2430b57cec5SDimitry Andric                                [3, 2, 1], [A9_LdBypass]>,
2440b57cec5SDimitry Andric  InstrItinData<IIC_iLoad_bh_iu,[InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
2450b57cec5SDimitry Andric                                 InstrStage<1, [A9_MUX0], 0>,
2460b57cec5SDimitry Andric                                 InstrStage<2, [A9_AGU], 0>,
2470b57cec5SDimitry Andric                                 InstrStage<1, [A9_LSUnit]>],
2480b57cec5SDimitry Andric                                [4, 3, 1], [A9_LdBypass]>,
2490b57cec5SDimitry Andric  //
2500b57cec5SDimitry Andric  // Register offset with update
2510b57cec5SDimitry Andric  InstrItinData<IIC_iLoad_ru  , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
2520b57cec5SDimitry Andric                                 InstrStage<1, [A9_MUX0], 0>,
2530b57cec5SDimitry Andric                                 InstrStage<1, [A9_AGU], 0>,
2540b57cec5SDimitry Andric                                 InstrStage<1, [A9_LSUnit]>],
2550b57cec5SDimitry Andric                                [3, 2, 1, 1], [A9_LdBypass]>,
2560b57cec5SDimitry Andric  InstrItinData<IIC_iLoad_bh_ru,[InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
2570b57cec5SDimitry Andric                                 InstrStage<1, [A9_MUX0], 0>,
2580b57cec5SDimitry Andric                                 InstrStage<2, [A9_AGU], 0>,
2590b57cec5SDimitry Andric                                 InstrStage<1, [A9_LSUnit]>],
2600b57cec5SDimitry Andric                                [4, 3, 1, 1], [A9_LdBypass]>,
2610b57cec5SDimitry Andric  InstrItinData<IIC_iLoad_d_ru, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
2620b57cec5SDimitry Andric                                 InstrStage<1, [A9_MUX0], 0>,
2630b57cec5SDimitry Andric                                 InstrStage<2, [A9_AGU], 0>,
2640b57cec5SDimitry Andric                                 InstrStage<1, [A9_LSUnit]>],
2650b57cec5SDimitry Andric                                [3, 3, 1, 1], [A9_LdBypass]>,
2660b57cec5SDimitry Andric  //
2670b57cec5SDimitry Andric  // Scaled register offset with update
2680b57cec5SDimitry Andric  InstrItinData<IIC_iLoad_siu , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
2690b57cec5SDimitry Andric                                 InstrStage<1, [A9_MUX0], 0>,
2700b57cec5SDimitry Andric                                 InstrStage<1, [A9_AGU], 0>,
2710b57cec5SDimitry Andric                                 InstrStage<1, [A9_LSUnit]>],
2720b57cec5SDimitry Andric                                [4, 3, 1, 1], [A9_LdBypass]>,
2730b57cec5SDimitry Andric  InstrItinData<IIC_iLoad_bh_siu,[InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
2740b57cec5SDimitry Andric                                  InstrStage<1, [A9_MUX0], 0>,
2750b57cec5SDimitry Andric                                  InstrStage<2, [A9_AGU], 0>,
2760b57cec5SDimitry Andric                                  InstrStage<1, [A9_LSUnit]>],
2770b57cec5SDimitry Andric                                 [5, 4, 1, 1], [A9_LdBypass]>,
2780b57cec5SDimitry Andric  //
2790b57cec5SDimitry Andric  // Load multiple, def is the 5th operand.
2800b57cec5SDimitry Andric  // FIXME: This assumes 3 to 4 registers.
2810b57cec5SDimitry Andric  InstrItinData<IIC_iLoad_m  , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
2820b57cec5SDimitry Andric                                InstrStage<1, [A9_MUX0], 0>,
2830b57cec5SDimitry Andric                                InstrStage<2, [A9_AGU], 1>,
2840b57cec5SDimitry Andric                                InstrStage<2, [A9_LSUnit]>],
2850b57cec5SDimitry Andric                               [1, 1, 1, 1, 3],
2860b57cec5SDimitry Andric                         [NoBypass, NoBypass, NoBypass, NoBypass, A9_LdBypass],
2870b57cec5SDimitry Andric                         -1>, // dynamic uops
2880b57cec5SDimitry Andric  //
2890b57cec5SDimitry Andric  // Load multiple + update, defs are the 1st and 5th operands.
2900b57cec5SDimitry Andric  InstrItinData<IIC_iLoad_mu , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
2910b57cec5SDimitry Andric                                InstrStage<1, [A9_MUX0], 0>,
2920b57cec5SDimitry Andric                                InstrStage<2, [A9_AGU], 1>,
2930b57cec5SDimitry Andric                                InstrStage<2, [A9_LSUnit]>],
2940b57cec5SDimitry Andric                               [2, 1, 1, 1, 3],
2950b57cec5SDimitry Andric                         [NoBypass, NoBypass, NoBypass, NoBypass, A9_LdBypass],
2960b57cec5SDimitry Andric                         -1>, // dynamic uops
2970b57cec5SDimitry Andric  //
2980b57cec5SDimitry Andric  // Load multiple plus branch
2990b57cec5SDimitry Andric  InstrItinData<IIC_iLoad_mBr, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
3000b57cec5SDimitry Andric                                InstrStage<1, [A9_MUX0], 0>,
3010b57cec5SDimitry Andric                                InstrStage<1, [A9_AGU], 1>,
3020b57cec5SDimitry Andric                                InstrStage<2, [A9_LSUnit]>,
3030b57cec5SDimitry Andric                                InstrStage<1, [A9_Branch]>],
3040b57cec5SDimitry Andric                               [1, 2, 1, 1, 3],
3050b57cec5SDimitry Andric                         [NoBypass, NoBypass, NoBypass, NoBypass, A9_LdBypass],
3060b57cec5SDimitry Andric                         -1>, // dynamic uops
3070b57cec5SDimitry Andric  //
3080b57cec5SDimitry Andric  // Pop, def is the 3rd operand.
3090b57cec5SDimitry Andric  InstrItinData<IIC_iPop  ,    [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
3100b57cec5SDimitry Andric                                InstrStage<1, [A9_MUX0], 0>,
3110b57cec5SDimitry Andric                                InstrStage<2, [A9_AGU], 1>,
3120b57cec5SDimitry Andric                                InstrStage<2, [A9_LSUnit]>],
3130b57cec5SDimitry Andric                               [1, 1, 3],
3140b57cec5SDimitry Andric                               [NoBypass, NoBypass, A9_LdBypass],
3150b57cec5SDimitry Andric                               -1>, // dynamic uops
3160b57cec5SDimitry Andric  //
3170b57cec5SDimitry Andric  // Pop + branch, def is the 3rd operand.
3180b57cec5SDimitry Andric  InstrItinData<IIC_iPop_Br,   [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
3190b57cec5SDimitry Andric                                InstrStage<1, [A9_MUX0], 0>,
3200b57cec5SDimitry Andric                                InstrStage<2, [A9_AGU], 1>,
3210b57cec5SDimitry Andric                                InstrStage<2, [A9_LSUnit]>,
3220b57cec5SDimitry Andric                                InstrStage<1, [A9_Branch]>],
3230b57cec5SDimitry Andric                               [1, 1, 3],
3240b57cec5SDimitry Andric                               [NoBypass, NoBypass, A9_LdBypass],
3250b57cec5SDimitry Andric                               -1>, // dynamic uops
3260b57cec5SDimitry Andric  //
3270b57cec5SDimitry Andric  // iLoadi + iALUr for t2LDRpci_pic.
3280b57cec5SDimitry Andric  InstrItinData<IIC_iLoadiALU, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
3290b57cec5SDimitry Andric                                InstrStage<1, [A9_MUX0], 0>,
3300b57cec5SDimitry Andric                                InstrStage<1, [A9_AGU], 0>,
3310b57cec5SDimitry Andric                                InstrStage<1, [A9_LSUnit]>,
3320b57cec5SDimitry Andric                                InstrStage<1, [A9_ALU0, A9_ALU1]>],
3330b57cec5SDimitry Andric                               [2, 1]>,
3340b57cec5SDimitry Andric
3350b57cec5SDimitry Andric  // Integer store pipeline
3360b57cec5SDimitry Andric  ///
3370b57cec5SDimitry Andric  // Immediate offset
3380b57cec5SDimitry Andric  InstrItinData<IIC_iStore_i  , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
3390b57cec5SDimitry Andric                                 InstrStage<1, [A9_MUX0], 0>,
3400b57cec5SDimitry Andric                                 InstrStage<1, [A9_AGU], 0>,
3410b57cec5SDimitry Andric                                 InstrStage<1, [A9_LSUnit]>], [1, 1]>,
3420b57cec5SDimitry Andric  InstrItinData<IIC_iStore_bh_i,[InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
3430b57cec5SDimitry Andric                                 InstrStage<1, [A9_MUX0], 0>,
3440b57cec5SDimitry Andric                                 InstrStage<2, [A9_AGU], 1>,
3450b57cec5SDimitry Andric                                 InstrStage<1, [A9_LSUnit]>], [1, 1]>,
3460b57cec5SDimitry Andric  // FIXME: If address is 64-bit aligned, AGU cycles is 1.
3470b57cec5SDimitry Andric  InstrItinData<IIC_iStore_d_i, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
3480b57cec5SDimitry Andric                                 InstrStage<1, [A9_MUX0], 0>,
3490b57cec5SDimitry Andric                                 InstrStage<2, [A9_AGU], 1>,
3500b57cec5SDimitry Andric                                 InstrStage<1, [A9_LSUnit]>], [1, 1]>,
3510b57cec5SDimitry Andric  //
3520b57cec5SDimitry Andric  // Register offset
3530b57cec5SDimitry Andric  InstrItinData<IIC_iStore_r  , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
3540b57cec5SDimitry Andric                                 InstrStage<1, [A9_MUX0], 0>,
3550b57cec5SDimitry Andric                                 InstrStage<1, [A9_AGU], 0>,
3560b57cec5SDimitry Andric                                 InstrStage<1, [A9_LSUnit]>], [1, 1, 1]>,
3570b57cec5SDimitry Andric  InstrItinData<IIC_iStore_bh_r,[InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
3580b57cec5SDimitry Andric                                 InstrStage<1, [A9_MUX0], 0>,
3590b57cec5SDimitry Andric                                 InstrStage<2, [A9_AGU], 1>,
3600b57cec5SDimitry Andric                                 InstrStage<1, [A9_LSUnit]>], [1, 1, 1]>,
3610b57cec5SDimitry Andric  InstrItinData<IIC_iStore_d_r, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
3620b57cec5SDimitry Andric                                 InstrStage<1, [A9_MUX0], 0>,
3630b57cec5SDimitry Andric                                 InstrStage<2, [A9_AGU], 1>,
3640b57cec5SDimitry Andric                                 InstrStage<1, [A9_LSUnit]>], [1, 1, 1]>,
3650b57cec5SDimitry Andric  //
3660b57cec5SDimitry Andric  // Scaled register offset
3670b57cec5SDimitry Andric  InstrItinData<IIC_iStore_si ,  [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
3680b57cec5SDimitry Andric                                  InstrStage<1, [A9_MUX0], 0>,
3690b57cec5SDimitry Andric                                  InstrStage<1, [A9_AGU], 0>,
3700b57cec5SDimitry Andric                                  InstrStage<1, [A9_LSUnit]>], [1, 1, 1]>,
3710b57cec5SDimitry Andric  InstrItinData<IIC_iStore_bh_si,[InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
3720b57cec5SDimitry Andric                                  InstrStage<1, [A9_MUX0], 0>,
3730b57cec5SDimitry Andric                                  InstrStage<2, [A9_AGU], 1>,
3740b57cec5SDimitry Andric                                  InstrStage<1, [A9_LSUnit]>], [1, 1, 1]>,
3750b57cec5SDimitry Andric  //
3760b57cec5SDimitry Andric  // Immediate offset with update
3770b57cec5SDimitry Andric  InstrItinData<IIC_iStore_iu ,  [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
3780b57cec5SDimitry Andric                                  InstrStage<1, [A9_MUX0], 0>,
3790b57cec5SDimitry Andric                                  InstrStage<1, [A9_AGU], 0>,
3800b57cec5SDimitry Andric                                  InstrStage<1, [A9_LSUnit]>], [2, 1, 1]>,
3810b57cec5SDimitry Andric  InstrItinData<IIC_iStore_bh_iu,[InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
3820b57cec5SDimitry Andric                                  InstrStage<1, [A9_MUX0], 0>,
3830b57cec5SDimitry Andric                                  InstrStage<2, [A9_AGU], 1>,
3840b57cec5SDimitry Andric                                  InstrStage<1, [A9_LSUnit]>], [3, 1, 1]>,
3850b57cec5SDimitry Andric  //
3860b57cec5SDimitry Andric  // Register offset with update
3870b57cec5SDimitry Andric  InstrItinData<IIC_iStore_ru ,  [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
3880b57cec5SDimitry Andric                                  InstrStage<1, [A9_MUX0], 0>,
3890b57cec5SDimitry Andric                                  InstrStage<1, [A9_AGU], 0>,
3900b57cec5SDimitry Andric                                  InstrStage<1, [A9_LSUnit]>],
3910b57cec5SDimitry Andric                                 [2, 1, 1, 1]>,
3920b57cec5SDimitry Andric  InstrItinData<IIC_iStore_bh_ru,[InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
3930b57cec5SDimitry Andric                                  InstrStage<1, [A9_MUX0], 0>,
3940b57cec5SDimitry Andric                                  InstrStage<2, [A9_AGU], 1>,
3950b57cec5SDimitry Andric                                  InstrStage<1, [A9_LSUnit]>],
3960b57cec5SDimitry Andric                                 [3, 1, 1, 1]>,
3970b57cec5SDimitry Andric  InstrItinData<IIC_iStore_d_ru, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
3980b57cec5SDimitry Andric                                  InstrStage<1, [A9_MUX0], 0>,
3990b57cec5SDimitry Andric                                  InstrStage<2, [A9_AGU], 1>,
4000b57cec5SDimitry Andric                                  InstrStage<1, [A9_LSUnit]>],
4010b57cec5SDimitry Andric                                 [3, 1, 1, 1]>,
4020b57cec5SDimitry Andric  //
4030b57cec5SDimitry Andric  // Scaled register offset with update
4040b57cec5SDimitry Andric  InstrItinData<IIC_iStore_siu,    [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
4050b57cec5SDimitry Andric                                    InstrStage<1, [A9_MUX0], 0>,
4060b57cec5SDimitry Andric                                    InstrStage<1, [A9_AGU], 0>,
4070b57cec5SDimitry Andric                                    InstrStage<1, [A9_LSUnit]>],
4080b57cec5SDimitry Andric                                   [2, 1, 1, 1]>,
4090b57cec5SDimitry Andric  InstrItinData<IIC_iStore_bh_siu, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
4100b57cec5SDimitry Andric                                    InstrStage<1, [A9_MUX0], 0>,
4110b57cec5SDimitry Andric                                    InstrStage<2, [A9_AGU], 1>,
4120b57cec5SDimitry Andric                                    InstrStage<1, [A9_LSUnit]>],
4130b57cec5SDimitry Andric                                   [3, 1, 1, 1]>,
4140b57cec5SDimitry Andric  //
4150b57cec5SDimitry Andric  // Store multiple
4160b57cec5SDimitry Andric  InstrItinData<IIC_iStore_m , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
4170b57cec5SDimitry Andric                                InstrStage<1, [A9_MUX0], 0>,
4180b57cec5SDimitry Andric                                InstrStage<1, [A9_AGU], 0>,
4190b57cec5SDimitry Andric                                InstrStage<2, [A9_LSUnit]>],
4200b57cec5SDimitry Andric                [], [], -1>, // dynamic uops
4210b57cec5SDimitry Andric  //
4220b57cec5SDimitry Andric  // Store multiple + update
4230b57cec5SDimitry Andric  InstrItinData<IIC_iStore_mu, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
4240b57cec5SDimitry Andric                                InstrStage<1, [A9_MUX0], 0>,
4250b57cec5SDimitry Andric                                InstrStage<1, [A9_AGU], 0>,
4260b57cec5SDimitry Andric                                InstrStage<2, [A9_LSUnit]>],
4270b57cec5SDimitry Andric                [2], [], -1>, // dynamic uops
4280b57cec5SDimitry Andric  //
4290b57cec5SDimitry Andric  // Preload
4300b57cec5SDimitry Andric  InstrItinData<IIC_Preload,   [InstrStage<1, [A9_Issue0, A9_Issue1]>], [1, 1]>,
4310b57cec5SDimitry Andric
4320b57cec5SDimitry Andric  // Branch
4330b57cec5SDimitry Andric  //
4340b57cec5SDimitry Andric  // no delay slots, so the latency of a branch is unimportant
4350b57cec5SDimitry Andric  InstrItinData<IIC_Br       , [InstrStage<1, [A9_Issue0], 0>,
4360b57cec5SDimitry Andric                                InstrStage<1, [A9_Issue1], 0>,
4370b57cec5SDimitry Andric                                InstrStage<1, [A9_Branch]>]>,
4380b57cec5SDimitry Andric
4390b57cec5SDimitry Andric  // VFP and NEON shares the same register file. This means that every VFP
4400b57cec5SDimitry Andric  // instruction should wait for full completion of the consecutive NEON
4410b57cec5SDimitry Andric  // instruction and vice-versa. We model this behavior with two artificial FUs:
4420b57cec5SDimitry Andric  // DRegsVFP and DRegsVFP.
4430b57cec5SDimitry Andric  //
4440b57cec5SDimitry Andric  // Every VFP instruction:
4450b57cec5SDimitry Andric  //  - Acquires DRegsVFP resource for 1 cycle
4460b57cec5SDimitry Andric  //  - Reserves DRegsN resource for the whole duration (including time to
4470b57cec5SDimitry Andric  //    register file writeback!).
4480b57cec5SDimitry Andric  // Every NEON instruction does the same but with FUs swapped.
4490b57cec5SDimitry Andric  //
4500b57cec5SDimitry Andric  // Since the reserved FU cannot be acquired, this models precisely
4510b57cec5SDimitry Andric  // "cross-domain" stalls.
4520b57cec5SDimitry Andric
4530b57cec5SDimitry Andric  // VFP
4540b57cec5SDimitry Andric  // Issue through integer pipeline, and execute in NEON unit.
4550b57cec5SDimitry Andric
4560b57cec5SDimitry Andric  // FP Special Register to Integer Register File Move
4570b57cec5SDimitry Andric  InstrItinData<IIC_fpSTAT , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
4580b57cec5SDimitry Andric                              InstrStage<1, [A9_MUX0], 0>,
4590b57cec5SDimitry Andric                              InstrStage<1, [A9_DRegsVFP], 0, Required>,
4600b57cec5SDimitry Andric                              InstrStage<2, [A9_DRegsN],   0, Reserved>,
4610b57cec5SDimitry Andric                              InstrStage<1, [A9_NPipe]>],
4620b57cec5SDimitry Andric                             [1]>,
4630b57cec5SDimitry Andric  //
4640b57cec5SDimitry Andric  // Single-precision FP Unary
4650b57cec5SDimitry Andric  InstrItinData<IIC_fpUNA32 , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
4660b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
4670b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsVFP], 0, Required>,
4680b57cec5SDimitry Andric                               // Extra latency cycles since wbck is 2 cycles
4690b57cec5SDimitry Andric                               InstrStage<3, [A9_DRegsN],   0, Reserved>,
4700b57cec5SDimitry Andric                               InstrStage<1, [A9_NPipe]>],
4710b57cec5SDimitry Andric                              [1, 1]>,
4720b57cec5SDimitry Andric  //
4730b57cec5SDimitry Andric  // Double-precision FP Unary
4740b57cec5SDimitry Andric  InstrItinData<IIC_fpUNA64 , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
4750b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
4760b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsVFP], 0, Required>,
4770b57cec5SDimitry Andric                               // Extra latency cycles since wbck is 2 cycles
4780b57cec5SDimitry Andric                               InstrStage<3, [A9_DRegsN],   0, Reserved>,
4790b57cec5SDimitry Andric                               InstrStage<1, [A9_NPipe]>],
4800b57cec5SDimitry Andric                              [1, 1]>,
4810b57cec5SDimitry Andric
4820b57cec5SDimitry Andric  //
4830b57cec5SDimitry Andric  // Single-precision FP Compare
4840b57cec5SDimitry Andric  InstrItinData<IIC_fpCMP32 , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
4850b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
4860b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsVFP], 0, Required>,
4870b57cec5SDimitry Andric                               // Extra latency cycles since wbck is 4 cycles
4880b57cec5SDimitry Andric                               InstrStage<5, [A9_DRegsN],   0, Reserved>,
4890b57cec5SDimitry Andric                               InstrStage<1, [A9_NPipe]>],
4900b57cec5SDimitry Andric                              [1, 1]>,
4910b57cec5SDimitry Andric  //
4920b57cec5SDimitry Andric  // Double-precision FP Compare
4930b57cec5SDimitry Andric  InstrItinData<IIC_fpCMP64 , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
4940b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
4950b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsVFP], 0, Required>,
4960b57cec5SDimitry Andric                               // Extra latency cycles since wbck is 4 cycles
4970b57cec5SDimitry Andric                               InstrStage<5, [A9_DRegsN],   0, Reserved>,
4980b57cec5SDimitry Andric                               InstrStage<1, [A9_NPipe]>],
4990b57cec5SDimitry Andric                              [1, 1]>,
5000b57cec5SDimitry Andric  //
5010b57cec5SDimitry Andric  // Single to Double FP Convert
5020b57cec5SDimitry Andric  InstrItinData<IIC_fpCVTSD , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
5030b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
5040b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsVFP], 0, Required>,
5050b57cec5SDimitry Andric                               InstrStage<5, [A9_DRegsN],   0, Reserved>,
5060b57cec5SDimitry Andric                               InstrStage<1, [A9_NPipe]>],
5070b57cec5SDimitry Andric                              [4, 1]>,
5080b57cec5SDimitry Andric  //
5090b57cec5SDimitry Andric  // Double to Single FP Convert
5100b57cec5SDimitry Andric  InstrItinData<IIC_fpCVTDS , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
5110b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
5120b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsVFP], 0, Required>,
5130b57cec5SDimitry Andric                               InstrStage<5, [A9_DRegsN],   0, Reserved>,
5140b57cec5SDimitry Andric                               InstrStage<1, [A9_NPipe]>],
5150b57cec5SDimitry Andric                              [4, 1]>,
5160b57cec5SDimitry Andric
5170b57cec5SDimitry Andric  //
5180b57cec5SDimitry Andric  // Single to Half FP Convert
5190b57cec5SDimitry Andric  InstrItinData<IIC_fpCVTSH , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
5200b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
5210b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsVFP], 0, Required>,
5220b57cec5SDimitry Andric                               InstrStage<5, [A9_DRegsN],   0, Reserved>,
5230b57cec5SDimitry Andric                               InstrStage<1, [A9_NPipe]>],
5240b57cec5SDimitry Andric                              [4, 1]>,
5250b57cec5SDimitry Andric  //
5260b57cec5SDimitry Andric  // Half to Single FP Convert
5270b57cec5SDimitry Andric  InstrItinData<IIC_fpCVTHS , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
5280b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
5290b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsVFP], 0, Required>,
5300b57cec5SDimitry Andric                               InstrStage<3, [A9_DRegsN],   0, Reserved>,
5310b57cec5SDimitry Andric                               InstrStage<1, [A9_NPipe]>],
5320b57cec5SDimitry Andric                              [2, 1]>,
5330b57cec5SDimitry Andric
5340b57cec5SDimitry Andric  //
5350b57cec5SDimitry Andric  // Single-Precision FP to Integer Convert
5360b57cec5SDimitry Andric  InstrItinData<IIC_fpCVTSI , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
5370b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
5380b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsVFP], 0, Required>,
5390b57cec5SDimitry Andric                               InstrStage<5, [A9_DRegsN],   0, Reserved>,
5400b57cec5SDimitry Andric                               InstrStage<1, [A9_NPipe]>],
5410b57cec5SDimitry Andric                              [4, 1]>,
5420b57cec5SDimitry Andric  //
5430b57cec5SDimitry Andric  // Double-Precision FP to Integer Convert
5440b57cec5SDimitry Andric  InstrItinData<IIC_fpCVTDI , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
5450b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
5460b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsVFP], 0, Required>,
5470b57cec5SDimitry Andric                               InstrStage<5, [A9_DRegsN],   0, Reserved>,
5480b57cec5SDimitry Andric                               InstrStage<1, [A9_NPipe]>],
5490b57cec5SDimitry Andric                              [4, 1]>,
5500b57cec5SDimitry Andric  //
5510b57cec5SDimitry Andric  // Integer to Single-Precision FP Convert
5520b57cec5SDimitry Andric  InstrItinData<IIC_fpCVTIS , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
5530b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
5540b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsVFP], 0, Required>,
5550b57cec5SDimitry Andric                               InstrStage<5, [A9_DRegsN],   0, Reserved>,
5560b57cec5SDimitry Andric                               InstrStage<1, [A9_NPipe]>],
5570b57cec5SDimitry Andric                              [4, 1]>,
5580b57cec5SDimitry Andric  //
5590b57cec5SDimitry Andric  // Integer to Double-Precision FP Convert
5600b57cec5SDimitry Andric  InstrItinData<IIC_fpCVTID , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
5610b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
5620b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsVFP], 0, Required>,
5630b57cec5SDimitry Andric                               InstrStage<5, [A9_DRegsN],   0, Reserved>,
5640b57cec5SDimitry Andric                               InstrStage<1, [A9_NPipe]>],
5650b57cec5SDimitry Andric                              [4, 1]>,
5660b57cec5SDimitry Andric  //
5670b57cec5SDimitry Andric  // Single-precision FP ALU
5680b57cec5SDimitry Andric  InstrItinData<IIC_fpALU32 , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
5690b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
5700b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsVFP], 0, Required>,
5710b57cec5SDimitry Andric                               InstrStage<5, [A9_DRegsN],   0, Reserved>,
5720b57cec5SDimitry Andric                               InstrStage<1, [A9_NPipe]>],
5730b57cec5SDimitry Andric                              [4, 1, 1]>,
5740b57cec5SDimitry Andric  //
5750b57cec5SDimitry Andric  // Double-precision FP ALU
5760b57cec5SDimitry Andric  InstrItinData<IIC_fpALU64 , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
5770b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
5780b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsVFP], 0, Required>,
5790b57cec5SDimitry Andric                               InstrStage<5, [A9_DRegsN],   0, Reserved>,
5800b57cec5SDimitry Andric                               InstrStage<1, [A9_NPipe]>],
5810b57cec5SDimitry Andric                              [4, 1, 1]>,
5820b57cec5SDimitry Andric  //
5830b57cec5SDimitry Andric  // Single-precision FP Multiply
5840b57cec5SDimitry Andric  InstrItinData<IIC_fpMUL32 , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
5850b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
5860b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsVFP], 0, Required>,
5870b57cec5SDimitry Andric                               InstrStage<6, [A9_DRegsN],   0, Reserved>,
5880b57cec5SDimitry Andric                               InstrStage<1, [A9_NPipe]>],
5890b57cec5SDimitry Andric                              [5, 1, 1]>,
5900b57cec5SDimitry Andric  //
5910b57cec5SDimitry Andric  // Double-precision FP Multiply
5920b57cec5SDimitry Andric  InstrItinData<IIC_fpMUL64 , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
5930b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
5940b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsVFP], 0, Required>,
5950b57cec5SDimitry Andric                               InstrStage<7, [A9_DRegsN],   0, Reserved>,
5960b57cec5SDimitry Andric                               InstrStage<2, [A9_NPipe]>],
5970b57cec5SDimitry Andric                              [6, 1, 1]>,
5980b57cec5SDimitry Andric  //
5990b57cec5SDimitry Andric  // Single-precision FP MAC
6000b57cec5SDimitry Andric  InstrItinData<IIC_fpMAC32 , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
6010b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
6020b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsVFP], 0, Required>,
6030b57cec5SDimitry Andric                               InstrStage<9, [A9_DRegsN],   0, Reserved>,
6040b57cec5SDimitry Andric                               InstrStage<1, [A9_NPipe]>],
6050b57cec5SDimitry Andric                              [8, 1, 1, 1]>,
6060b57cec5SDimitry Andric  //
6070b57cec5SDimitry Andric  // Double-precision FP MAC
6080b57cec5SDimitry Andric  InstrItinData<IIC_fpMAC64 , [InstrStage<1,  [A9_Issue0, A9_Issue1], 0>,
6090b57cec5SDimitry Andric                               InstrStage<1,  [A9_MUX0], 0>,
6100b57cec5SDimitry Andric                               InstrStage<1,  [A9_DRegsVFP], 0, Required>,
6110b57cec5SDimitry Andric                               InstrStage<10, [A9_DRegsN],  0, Reserved>,
6120b57cec5SDimitry Andric                               InstrStage<2,  [A9_NPipe]>],
6130b57cec5SDimitry Andric                              [9, 1, 1, 1]>,
6140b57cec5SDimitry Andric  //
6150b57cec5SDimitry Andric  // Single-precision Fused FP MAC
6160b57cec5SDimitry Andric  InstrItinData<IIC_fpFMAC32, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
6170b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
6180b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsVFP], 0, Required>,
6190b57cec5SDimitry Andric                               InstrStage<9, [A9_DRegsN],   0, Reserved>,
6200b57cec5SDimitry Andric                               InstrStage<1, [A9_NPipe]>],
6210b57cec5SDimitry Andric                              [8, 1, 1, 1]>,
6220b57cec5SDimitry Andric  //
6230b57cec5SDimitry Andric  // Double-precision Fused FP MAC
6240b57cec5SDimitry Andric  InstrItinData<IIC_fpFMAC64, [InstrStage<1,  [A9_Issue0, A9_Issue1], 0>,
6250b57cec5SDimitry Andric                               InstrStage<1,  [A9_MUX0], 0>,
6260b57cec5SDimitry Andric                               InstrStage<1,  [A9_DRegsVFP], 0, Required>,
6270b57cec5SDimitry Andric                               InstrStage<10, [A9_DRegsN],  0, Reserved>,
6280b57cec5SDimitry Andric                               InstrStage<2,  [A9_NPipe]>],
6290b57cec5SDimitry Andric                              [9, 1, 1, 1]>,
6300b57cec5SDimitry Andric  //
6310b57cec5SDimitry Andric  // Single-precision FP DIV
6320b57cec5SDimitry Andric  InstrItinData<IIC_fpDIV32 , [InstrStage<1,  [A9_Issue0, A9_Issue1], 0>,
6330b57cec5SDimitry Andric                               InstrStage<1,  [A9_MUX0], 0>,
6340b57cec5SDimitry Andric                               InstrStage<1,  [A9_DRegsVFP], 0, Required>,
6350b57cec5SDimitry Andric                               InstrStage<16, [A9_DRegsN],  0, Reserved>,
6360b57cec5SDimitry Andric                               InstrStage<10, [A9_NPipe]>],
6370b57cec5SDimitry Andric                              [15, 1, 1]>,
6380b57cec5SDimitry Andric  //
6390b57cec5SDimitry Andric  // Double-precision FP DIV
6400b57cec5SDimitry Andric  InstrItinData<IIC_fpDIV64 , [InstrStage<1,  [A9_Issue0, A9_Issue1], 0>,
6410b57cec5SDimitry Andric                               InstrStage<1,  [A9_MUX0], 0>,
6420b57cec5SDimitry Andric                               InstrStage<1,  [A9_DRegsVFP], 0, Required>,
6430b57cec5SDimitry Andric                               InstrStage<26, [A9_DRegsN],  0, Reserved>,
6440b57cec5SDimitry Andric                               InstrStage<20, [A9_NPipe]>],
6450b57cec5SDimitry Andric                              [25, 1, 1]>,
6460b57cec5SDimitry Andric  //
6470b57cec5SDimitry Andric  // Single-precision FP SQRT
6480b57cec5SDimitry Andric  InstrItinData<IIC_fpSQRT32, [InstrStage<1,  [A9_Issue0, A9_Issue1], 0>,
6490b57cec5SDimitry Andric                               InstrStage<1,  [A9_MUX0], 0>,
6500b57cec5SDimitry Andric                               InstrStage<1,  [A9_DRegsVFP], 0, Required>,
6510b57cec5SDimitry Andric                               InstrStage<18, [A9_DRegsN],   0, Reserved>,
6520b57cec5SDimitry Andric                               InstrStage<13, [A9_NPipe]>],
6530b57cec5SDimitry Andric                              [17, 1]>,
6540b57cec5SDimitry Andric  //
6550b57cec5SDimitry Andric  // Double-precision FP SQRT
6560b57cec5SDimitry Andric  InstrItinData<IIC_fpSQRT64, [InstrStage<1,  [A9_Issue0, A9_Issue1], 0>,
6570b57cec5SDimitry Andric                               InstrStage<1,  [A9_MUX0], 0>,
6580b57cec5SDimitry Andric                               InstrStage<1,  [A9_DRegsVFP], 0, Required>,
6590b57cec5SDimitry Andric                               InstrStage<33, [A9_DRegsN],   0, Reserved>,
6600b57cec5SDimitry Andric                               InstrStage<28, [A9_NPipe]>],
6610b57cec5SDimitry Andric                              [32, 1]>,
6620b57cec5SDimitry Andric
6630b57cec5SDimitry Andric  //
6640b57cec5SDimitry Andric  // Integer to Single-precision Move
6650b57cec5SDimitry Andric  InstrItinData<IIC_fpMOVIS,  [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
6660b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
6670b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsVFP], 0, Required>,
6680b57cec5SDimitry Andric                               // Extra 1 latency cycle since wbck is 2 cycles
6690b57cec5SDimitry Andric                               InstrStage<3, [A9_DRegsN],   0, Reserved>,
6700b57cec5SDimitry Andric                               InstrStage<1, [A9_NPipe]>],
6710b57cec5SDimitry Andric                              [1, 1]>,
6720b57cec5SDimitry Andric  //
6730b57cec5SDimitry Andric  // Integer to Double-precision Move
6740b57cec5SDimitry Andric  InstrItinData<IIC_fpMOVID,  [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
6750b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
6760b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsVFP], 0, Required>,
6770b57cec5SDimitry Andric                               // Extra 1 latency cycle since wbck is 2 cycles
6780b57cec5SDimitry Andric                               InstrStage<3, [A9_DRegsN],   0, Reserved>,
6790b57cec5SDimitry Andric                               InstrStage<1, [A9_NPipe]>],
6800b57cec5SDimitry Andric                              [1, 1, 1]>,
6810b57cec5SDimitry Andric  //
6820b57cec5SDimitry Andric  // Single-precision to Integer Move
6830b57cec5SDimitry Andric  //
6840b57cec5SDimitry Andric  // On A9 move-from-VFP is free to issue with no stall if other VFP
6850b57cec5SDimitry Andric  // operations are in flight. I assume it still can't dual-issue though.
6860b57cec5SDimitry Andric  InstrItinData<IIC_fpMOVSI,  [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
6870b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>],
6880b57cec5SDimitry Andric                              [2, 1]>,
6890b57cec5SDimitry Andric  //
6900b57cec5SDimitry Andric  // Double-precision to Integer Move
6910b57cec5SDimitry Andric  //
6920b57cec5SDimitry Andric  // On A9 move-from-VFP is free to issue with no stall if other VFP
6930b57cec5SDimitry Andric  // operations are in flight. I assume it still can't dual-issue though.
6940b57cec5SDimitry Andric  InstrItinData<IIC_fpMOVDI,  [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
6950b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>],
6960b57cec5SDimitry Andric                              [2, 1, 1]>,
6970b57cec5SDimitry Andric  //
6980b57cec5SDimitry Andric  // Single-precision FP Load
6990b57cec5SDimitry Andric  InstrItinData<IIC_fpLoad32, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
7000b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
7010b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsVFP], 0, Required>,
7020b57cec5SDimitry Andric                               InstrStage<2, [A9_DRegsN],   0, Reserved>,
7030b57cec5SDimitry Andric                               InstrStage<1, [A9_NPipe], 0>,
7040b57cec5SDimitry Andric                               InstrStage<1, [A9_LSUnit]>],
7050b57cec5SDimitry Andric                              [1, 1]>,
7060b57cec5SDimitry Andric  //
7070b57cec5SDimitry Andric  // Double-precision FP Load
7080b57cec5SDimitry Andric  // FIXME: Result latency is 1 if address is 64-bit aligned.
7090b57cec5SDimitry Andric  InstrItinData<IIC_fpLoad64, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
7100b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
7110b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsVFP], 0, Required>,
7120b57cec5SDimitry Andric                               InstrStage<2, [A9_DRegsN],   0, Reserved>,
7130b57cec5SDimitry Andric                               InstrStage<1, [A9_NPipe], 0>,
7140b57cec5SDimitry Andric                               InstrStage<1, [A9_LSUnit]>],
7150b57cec5SDimitry Andric                              [2, 1]>,
7160b57cec5SDimitry Andric  //
7170b57cec5SDimitry Andric  // FP Load Multiple
7180b57cec5SDimitry Andric  // FIXME: assumes 2 doubles which requires 2 LS cycles.
7190b57cec5SDimitry Andric  InstrItinData<IIC_fpLoad_m, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
7200b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
7210b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsVFP], 0, Required>,
7220b57cec5SDimitry Andric                               InstrStage<2, [A9_DRegsN],   0, Reserved>,
7230b57cec5SDimitry Andric                               InstrStage<1, [A9_NPipe], 0>,
7240b57cec5SDimitry Andric                               InstrStage<2, [A9_LSUnit]>],
7250b57cec5SDimitry Andric                [1, 1, 1, 1], [], -1>, // dynamic uops
7260b57cec5SDimitry Andric  //
7270b57cec5SDimitry Andric  // FP Load Multiple + update
7280b57cec5SDimitry Andric  // FIXME: assumes 2 doubles which requires 2 LS cycles.
7290b57cec5SDimitry Andric  InstrItinData<IIC_fpLoad_mu,[InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
7300b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
7310b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsVFP], 0, Required>,
7320b57cec5SDimitry Andric                               InstrStage<2, [A9_DRegsN],   0, Reserved>,
7330b57cec5SDimitry Andric                               InstrStage<1, [A9_NPipe], 0>,
7340b57cec5SDimitry Andric                               InstrStage<2, [A9_LSUnit]>],
7350b57cec5SDimitry Andric                [2, 1, 1, 1], [], -1>, // dynamic uops
7360b57cec5SDimitry Andric  //
7370b57cec5SDimitry Andric  // Single-precision FP Store
7380b57cec5SDimitry Andric  InstrItinData<IIC_fpStore32,[InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
7390b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
7400b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsVFP], 0, Required>,
7410b57cec5SDimitry Andric                               InstrStage<2, [A9_DRegsN],   0, Reserved>,
7420b57cec5SDimitry Andric                               InstrStage<1, [A9_NPipe], 0>,
7430b57cec5SDimitry Andric                               InstrStage<1, [A9_LSUnit]>],
7440b57cec5SDimitry Andric                              [1, 1]>,
7450b57cec5SDimitry Andric  //
7460b57cec5SDimitry Andric  // Double-precision FP Store
7470b57cec5SDimitry Andric  InstrItinData<IIC_fpStore64,[InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
7480b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
7490b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsVFP], 0, Required>,
7500b57cec5SDimitry Andric                               InstrStage<2, [A9_DRegsN],   0, Reserved>,
7510b57cec5SDimitry Andric                               InstrStage<1, [A9_NPipe], 0>,
7520b57cec5SDimitry Andric                               InstrStage<1, [A9_LSUnit]>],
7530b57cec5SDimitry Andric                              [1, 1]>,
7540b57cec5SDimitry Andric  //
7550b57cec5SDimitry Andric  // FP Store Multiple
7560b57cec5SDimitry Andric  // FIXME: assumes 2 doubles which requires 2 LS cycles.
7570b57cec5SDimitry Andric  InstrItinData<IIC_fpStore_m,[InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
7580b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
7590b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsVFP], 0, Required>,
7600b57cec5SDimitry Andric                               InstrStage<2, [A9_DRegsN],   0, Reserved>,
7610b57cec5SDimitry Andric                               InstrStage<1, [A9_NPipe], 0>,
7620b57cec5SDimitry Andric                               InstrStage<2, [A9_LSUnit]>],
7630b57cec5SDimitry Andric                [1, 1, 1, 1], [], -1>, // dynamic uops
7640b57cec5SDimitry Andric  //
7650b57cec5SDimitry Andric  // FP Store Multiple + update
7660b57cec5SDimitry Andric  // FIXME: assumes 2 doubles which requires 2 LS cycles.
7670b57cec5SDimitry Andric  InstrItinData<IIC_fpStore_mu,[InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
7680b57cec5SDimitry Andric                                InstrStage<1, [A9_MUX0], 0>,
7690b57cec5SDimitry Andric                                InstrStage<1, [A9_DRegsVFP], 0, Required>,
7700b57cec5SDimitry Andric                                InstrStage<2, [A9_DRegsN],   0, Reserved>,
7710b57cec5SDimitry Andric                                InstrStage<1, [A9_NPipe], 0>,
7720b57cec5SDimitry Andric                                InstrStage<2, [A9_LSUnit]>],
7730b57cec5SDimitry Andric                [2, 1, 1, 1], [], -1>, // dynamic uops
7740b57cec5SDimitry Andric  // NEON
7750b57cec5SDimitry Andric  // VLD1
7760b57cec5SDimitry Andric  InstrItinData<IIC_VLD1,     [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
7770b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
7780b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsN],   0, Required>,
7790b57cec5SDimitry Andric                               InstrStage<7, [A9_DRegsVFP], 0, Reserved>,
7800b57cec5SDimitry Andric                               InstrStage<1, [A9_NPipe], 0>,
7810b57cec5SDimitry Andric                               InstrStage<1, [A9_LSUnit]>],
7820b57cec5SDimitry Andric                              [1, 1]>,
7830b57cec5SDimitry Andric  // VLD1x2
7840b57cec5SDimitry Andric  InstrItinData<IIC_VLD1x2,   [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
7850b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
7860b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsN],   0, Required>,
7870b57cec5SDimitry Andric                               InstrStage<7, [A9_DRegsVFP], 0, Reserved>,
7880b57cec5SDimitry Andric                               InstrStage<1, [A9_NPipe], 0>,
7890b57cec5SDimitry Andric                               InstrStage<1, [A9_LSUnit]>],
7900b57cec5SDimitry Andric                              [1, 1, 1]>,
7910b57cec5SDimitry Andric  // VLD1x3
7920b57cec5SDimitry Andric  InstrItinData<IIC_VLD1x3,   [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
7930b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
7940b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsN],   0, Required>,
7950b57cec5SDimitry Andric                               InstrStage<8, [A9_DRegsVFP], 0, Reserved>,
7960b57cec5SDimitry Andric                               InstrStage<2, [A9_NPipe], 0>,
7970b57cec5SDimitry Andric                               InstrStage<2, [A9_LSUnit]>],
7980b57cec5SDimitry Andric                              [1, 1, 2, 1]>,
7990b57cec5SDimitry Andric  // VLD1x4
8000b57cec5SDimitry Andric  InstrItinData<IIC_VLD1x4,   [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
8010b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
8020b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsN],   0, Required>,
8030b57cec5SDimitry Andric                               InstrStage<8, [A9_DRegsVFP], 0, Reserved>,
8040b57cec5SDimitry Andric                               InstrStage<2, [A9_NPipe], 0>,
8050b57cec5SDimitry Andric                               InstrStage<2, [A9_LSUnit]>],
8060b57cec5SDimitry Andric                              [1, 1, 2, 2, 1]>,
8070b57cec5SDimitry Andric  // VLD1u
8080b57cec5SDimitry Andric  InstrItinData<IIC_VLD1u,    [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
8090b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
8100b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsN],   0, Required>,
8110b57cec5SDimitry Andric                               InstrStage<7, [A9_DRegsVFP], 0, Reserved>,
8120b57cec5SDimitry Andric                               InstrStage<1, [A9_NPipe], 0>,
8130b57cec5SDimitry Andric                               InstrStage<1, [A9_LSUnit]>],
8140b57cec5SDimitry Andric                              [1, 2, 1]>,
8150b57cec5SDimitry Andric  // VLD1x2u
8160b57cec5SDimitry Andric  InstrItinData<IIC_VLD1x2u,  [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
8170b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
8180b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsN],   0, Required>,
8190b57cec5SDimitry Andric                               InstrStage<7, [A9_DRegsVFP], 0, Reserved>,
8200b57cec5SDimitry Andric                               InstrStage<1, [A9_NPipe], 0>,
8210b57cec5SDimitry Andric                               InstrStage<1, [A9_LSUnit]>],
8220b57cec5SDimitry Andric                              [1, 1, 2, 1]>,
8230b57cec5SDimitry Andric  // VLD1x3u
8240b57cec5SDimitry Andric  InstrItinData<IIC_VLD1x3u,  [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
8250b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
8260b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsN],   0, Required>,
8270b57cec5SDimitry Andric                               InstrStage<8, [A9_DRegsVFP], 0, Reserved>,
8280b57cec5SDimitry Andric                               InstrStage<2, [A9_NPipe], 0>,
8290b57cec5SDimitry Andric                               InstrStage<2, [A9_LSUnit]>],
8300b57cec5SDimitry Andric                              [1, 1, 2, 2, 1]>,
8310b57cec5SDimitry Andric  // VLD1x4u
8320b57cec5SDimitry Andric  InstrItinData<IIC_VLD1x4u,  [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
8330b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
8340b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsN],   0, Required>,
8350b57cec5SDimitry Andric                               InstrStage<8, [A9_DRegsVFP], 0, Reserved>,
8360b57cec5SDimitry Andric                               InstrStage<2, [A9_NPipe], 0>,
8370b57cec5SDimitry Andric                               InstrStage<2, [A9_LSUnit]>],
8380b57cec5SDimitry Andric                              [1, 1, 2, 2, 2, 1]>,
8390b57cec5SDimitry Andric  //
8400b57cec5SDimitry Andric  // VLD1ln
8410b57cec5SDimitry Andric  InstrItinData<IIC_VLD1ln,   [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
8420b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
8430b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsN],   0, Required>,
8440b57cec5SDimitry Andric                               InstrStage<8, [A9_DRegsVFP], 0, Reserved>,
8450b57cec5SDimitry Andric                               InstrStage<2, [A9_NPipe], 0>,
8460b57cec5SDimitry Andric                               InstrStage<2, [A9_LSUnit]>],
8470b57cec5SDimitry Andric                              [3, 1, 1, 1]>,
8480b57cec5SDimitry Andric  //
8490b57cec5SDimitry Andric  // VLD1lnu
8500b57cec5SDimitry Andric  InstrItinData<IIC_VLD1lnu,  [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
8510b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
8520b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsN],   0, Required>,
8530b57cec5SDimitry Andric                               InstrStage<8, [A9_DRegsVFP], 0, Reserved>,
8540b57cec5SDimitry Andric                               InstrStage<2, [A9_NPipe], 0>,
8550b57cec5SDimitry Andric                               InstrStage<2, [A9_LSUnit]>],
8560b57cec5SDimitry Andric                              [3, 2, 1, 1, 1, 1]>,
8570b57cec5SDimitry Andric  //
8580b57cec5SDimitry Andric  // VLD1dup
8590b57cec5SDimitry Andric  InstrItinData<IIC_VLD1dup,  [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
8600b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
8610b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsN],   0, Required>,
8620b57cec5SDimitry Andric                               InstrStage<7, [A9_DRegsVFP], 0, Reserved>,
8630b57cec5SDimitry Andric                               InstrStage<1, [A9_NPipe], 0>,
8640b57cec5SDimitry Andric                               InstrStage<1, [A9_LSUnit]>],
8650b57cec5SDimitry Andric                              [2, 1]>,
8660b57cec5SDimitry Andric  //
8670b57cec5SDimitry Andric  // VLD1dupu
8680b57cec5SDimitry Andric  InstrItinData<IIC_VLD1dupu, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
8690b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
8700b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsN],   0, Required>,
8710b57cec5SDimitry Andric                               InstrStage<7, [A9_DRegsVFP], 0, Reserved>,
8720b57cec5SDimitry Andric                               InstrStage<1, [A9_NPipe], 0>,
8730b57cec5SDimitry Andric                               InstrStage<1, [A9_LSUnit]>],
8740b57cec5SDimitry Andric                              [2, 2, 1, 1]>,
8750b57cec5SDimitry Andric  //
8760b57cec5SDimitry Andric  // VLD2
8770b57cec5SDimitry Andric  InstrItinData<IIC_VLD2,     [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
8780b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
8790b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsN],   0, Required>,
8800b57cec5SDimitry Andric                               // Extra latency cycles since wbck is 7 cycles
8810b57cec5SDimitry Andric                               InstrStage<7, [A9_DRegsVFP], 0, Reserved>,
8820b57cec5SDimitry Andric                               InstrStage<1, [A9_NPipe], 0>,
8830b57cec5SDimitry Andric                               InstrStage<1, [A9_LSUnit]>],
8840b57cec5SDimitry Andric                              [2, 2, 1]>,
8850b57cec5SDimitry Andric  //
8860b57cec5SDimitry Andric  // VLD2x2
8870b57cec5SDimitry Andric  InstrItinData<IIC_VLD2x2,   [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
8880b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
8890b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsN],   0, Required>,
8900b57cec5SDimitry Andric                               InstrStage<8, [A9_DRegsVFP], 0, Reserved>,
8910b57cec5SDimitry Andric                               InstrStage<2, [A9_NPipe], 0>,
8920b57cec5SDimitry Andric                               InstrStage<2, [A9_LSUnit]>],
8930b57cec5SDimitry Andric                              [2, 3, 2, 3, 1]>,
8940b57cec5SDimitry Andric  //
8950b57cec5SDimitry Andric  // VLD2ln
8960b57cec5SDimitry Andric  InstrItinData<IIC_VLD2ln,   [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
8970b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
8980b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsN],   0, Required>,
8990b57cec5SDimitry Andric                               InstrStage<8, [A9_DRegsVFP], 0, Reserved>,
9000b57cec5SDimitry Andric                               InstrStage<2, [A9_NPipe], 0>,
9010b57cec5SDimitry Andric                               InstrStage<2, [A9_LSUnit]>],
9020b57cec5SDimitry Andric                              [3, 3, 1, 1, 1, 1]>,
9030b57cec5SDimitry Andric  //
9040b57cec5SDimitry Andric  // VLD2u
9050b57cec5SDimitry Andric  InstrItinData<IIC_VLD2u,    [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
9060b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
9070b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsN],   0, Required>,
9080b57cec5SDimitry Andric                               // Extra latency cycles since wbck is 7 cycles
9090b57cec5SDimitry Andric                               InstrStage<7, [A9_DRegsVFP], 0, Reserved>,
9100b57cec5SDimitry Andric                               InstrStage<1, [A9_NPipe], 0>,
9110b57cec5SDimitry Andric                               InstrStage<1, [A9_LSUnit]>],
9120b57cec5SDimitry Andric                              [2, 2, 2, 1, 1, 1]>,
9130b57cec5SDimitry Andric  //
9140b57cec5SDimitry Andric  // VLD2x2u
9150b57cec5SDimitry Andric  InstrItinData<IIC_VLD2x2u,  [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
9160b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
9170b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsN],   0, Required>,
9180b57cec5SDimitry Andric                               InstrStage<8, [A9_DRegsVFP], 0, Reserved>,
9190b57cec5SDimitry Andric                               InstrStage<2, [A9_NPipe], 0>,
9200b57cec5SDimitry Andric                               InstrStage<2, [A9_LSUnit]>],
9210b57cec5SDimitry Andric                              [2, 3, 2, 3, 2, 1]>,
9220b57cec5SDimitry Andric  //
9230b57cec5SDimitry Andric  // VLD2lnu
9240b57cec5SDimitry Andric  InstrItinData<IIC_VLD2lnu,  [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
9250b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
9260b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsN],   0, Required>,
9270b57cec5SDimitry Andric                               InstrStage<8, [A9_DRegsVFP], 0, Reserved>,
9280b57cec5SDimitry Andric                               InstrStage<2, [A9_NPipe], 0>,
9290b57cec5SDimitry Andric                               InstrStage<2, [A9_LSUnit]>],
9300b57cec5SDimitry Andric                              [3, 3, 2, 1, 1, 1, 1, 1]>,
9310b57cec5SDimitry Andric  //
9320b57cec5SDimitry Andric  // VLD2dup
9330b57cec5SDimitry Andric  InstrItinData<IIC_VLD2dup,  [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
9340b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
9350b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsN],   0, Required>,
9360b57cec5SDimitry Andric                               InstrStage<7, [A9_DRegsVFP], 0, Reserved>,
9370b57cec5SDimitry Andric                               InstrStage<1, [A9_NPipe], 0>,
9380b57cec5SDimitry Andric                               InstrStage<1, [A9_LSUnit]>],
9390b57cec5SDimitry Andric                              [2, 2, 1]>,
9400b57cec5SDimitry Andric  //
9410b57cec5SDimitry Andric  // VLD2dupu
9420b57cec5SDimitry Andric  InstrItinData<IIC_VLD2dupu, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
9430b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
9440b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsN],   0, Required>,
9450b57cec5SDimitry Andric                               InstrStage<7, [A9_DRegsVFP], 0, Reserved>,
9460b57cec5SDimitry Andric                               InstrStage<1, [A9_NPipe], 0>,
9470b57cec5SDimitry Andric                               InstrStage<1, [A9_LSUnit]>],
9480b57cec5SDimitry Andric                              [2, 2, 2, 1, 1]>,
9490b57cec5SDimitry Andric  //
9500b57cec5SDimitry Andric  // VLD3
9510b57cec5SDimitry Andric  InstrItinData<IIC_VLD3,     [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
9520b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
9530b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsN],   0, Required>,
9540b57cec5SDimitry Andric                               InstrStage<9,[A9_DRegsVFP], 0, Reserved>,
9550b57cec5SDimitry Andric                               InstrStage<3, [A9_NPipe], 0>,
9560b57cec5SDimitry Andric                               InstrStage<3, [A9_LSUnit]>],
9570b57cec5SDimitry Andric                              [3, 3, 4, 1]>,
9580b57cec5SDimitry Andric  //
9590b57cec5SDimitry Andric  // VLD3ln
9600b57cec5SDimitry Andric  InstrItinData<IIC_VLD3ln,   [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
9610b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
9620b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsN],   0, Required>,
9630b57cec5SDimitry Andric                               InstrStage<11,[A9_DRegsVFP], 0, Reserved>,
9640b57cec5SDimitry Andric                               InstrStage<5, [A9_NPipe], 0>,
9650b57cec5SDimitry Andric                               InstrStage<5, [A9_LSUnit]>],
9660b57cec5SDimitry Andric                              [5, 5, 6, 1, 1, 1, 1, 2]>,
9670b57cec5SDimitry Andric  //
9680b57cec5SDimitry Andric  // VLD3u
9690b57cec5SDimitry Andric  InstrItinData<IIC_VLD3u,    [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
9700b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
9710b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsN],   0, Required>,
9720b57cec5SDimitry Andric                               InstrStage<9,[A9_DRegsVFP], 0, Reserved>,
9730b57cec5SDimitry Andric                               InstrStage<3, [A9_NPipe], 0>,
9740b57cec5SDimitry Andric                               InstrStage<3, [A9_LSUnit]>],
9750b57cec5SDimitry Andric                              [3, 3, 4, 2, 1]>,
9760b57cec5SDimitry Andric  //
9770b57cec5SDimitry Andric  // VLD3lnu
9780b57cec5SDimitry Andric  InstrItinData<IIC_VLD3lnu,  [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
9790b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
9800b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsN],   0, Required>,
9810b57cec5SDimitry Andric                               InstrStage<11,[A9_DRegsVFP], 0, Reserved>,
9820b57cec5SDimitry Andric                               InstrStage<5, [A9_NPipe], 0>,
9830b57cec5SDimitry Andric                               InstrStage<5, [A9_LSUnit]>],
9840b57cec5SDimitry Andric                              [5, 5, 6, 2, 1, 1, 1, 1, 1, 2]>,
9850b57cec5SDimitry Andric  //
9860b57cec5SDimitry Andric  // VLD3dup
9870b57cec5SDimitry Andric  InstrItinData<IIC_VLD3dup,  [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
9880b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
9890b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsN],   0, Required>,
9900b57cec5SDimitry Andric                               InstrStage<9, [A9_DRegsVFP], 0, Reserved>,
9910b57cec5SDimitry Andric                               InstrStage<3, [A9_NPipe], 0>,
9920b57cec5SDimitry Andric                               InstrStage<3, [A9_LSUnit]>],
9930b57cec5SDimitry Andric                              [3, 3, 4, 1]>,
9940b57cec5SDimitry Andric  //
9950b57cec5SDimitry Andric  // VLD3dupu
9960b57cec5SDimitry Andric  InstrItinData<IIC_VLD3dupu, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
9970b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
9980b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsN],   0, Required>,
9990b57cec5SDimitry Andric                               InstrStage<9, [A9_DRegsVFP], 0, Reserved>,
10000b57cec5SDimitry Andric                               InstrStage<3, [A9_NPipe], 0>,
10010b57cec5SDimitry Andric                               InstrStage<3, [A9_LSUnit]>],
10020b57cec5SDimitry Andric                              [3, 3, 4, 2, 1, 1]>,
10030b57cec5SDimitry Andric  //
10040b57cec5SDimitry Andric  // VLD4
10050b57cec5SDimitry Andric  InstrItinData<IIC_VLD4,     [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
10060b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
10070b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsN],   0, Required>,
10080b57cec5SDimitry Andric                               InstrStage<9,[A9_DRegsVFP], 0, Reserved>,
10090b57cec5SDimitry Andric                               InstrStage<3, [A9_NPipe], 0>,
10100b57cec5SDimitry Andric                               InstrStage<3, [A9_LSUnit]>],
10110b57cec5SDimitry Andric                              [3, 3, 4, 4, 1]>,
10120b57cec5SDimitry Andric  //
10130b57cec5SDimitry Andric  // VLD4ln
10140b57cec5SDimitry Andric  InstrItinData<IIC_VLD4ln,   [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
10150b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
10160b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsN],   0, Required>,
10170b57cec5SDimitry Andric                               InstrStage<10,[A9_DRegsVFP], 0, Reserved>,
10180b57cec5SDimitry Andric                               InstrStage<4, [A9_NPipe], 0>,
10190b57cec5SDimitry Andric                               InstrStage<4, [A9_LSUnit]>],
10200b57cec5SDimitry Andric                              [4, 4, 5, 5, 1, 1, 1, 1, 2, 2]>,
10210b57cec5SDimitry Andric  //
10220b57cec5SDimitry Andric  // VLD4u
10230b57cec5SDimitry Andric  InstrItinData<IIC_VLD4u,    [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
10240b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
10250b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsN],   0, Required>,
10260b57cec5SDimitry Andric                               InstrStage<9,[A9_DRegsVFP], 0, Reserved>,
10270b57cec5SDimitry Andric                               InstrStage<3, [A9_NPipe], 0>,
10280b57cec5SDimitry Andric                               InstrStage<3, [A9_LSUnit]>],
10290b57cec5SDimitry Andric                              [3, 3, 4, 4, 2, 1]>,
10300b57cec5SDimitry Andric  //
10310b57cec5SDimitry Andric  // VLD4lnu
10320b57cec5SDimitry Andric  InstrItinData<IIC_VLD4lnu,  [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
10330b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
10340b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsN],   0, Required>,
10350b57cec5SDimitry Andric                               InstrStage<10,[A9_DRegsVFP], 0, Reserved>,
10360b57cec5SDimitry Andric                               InstrStage<4, [A9_NPipe], 0>,
10370b57cec5SDimitry Andric                               InstrStage<4, [A9_LSUnit]>],
10380b57cec5SDimitry Andric                              [4, 4, 5, 5, 2, 1, 1, 1, 1, 1, 2, 2]>,
10390b57cec5SDimitry Andric  //
10400b57cec5SDimitry Andric  // VLD4dup
10410b57cec5SDimitry Andric  InstrItinData<IIC_VLD4dup,  [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
10420b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
10430b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsN],   0, Required>,
10440b57cec5SDimitry Andric                               InstrStage<8, [A9_DRegsVFP], 0, Reserved>,
10450b57cec5SDimitry Andric                               InstrStage<2, [A9_NPipe], 0>,
10460b57cec5SDimitry Andric                               InstrStage<2, [A9_LSUnit]>],
10470b57cec5SDimitry Andric                              [2, 2, 3, 3, 1]>,
10480b57cec5SDimitry Andric  //
10490b57cec5SDimitry Andric  // VLD4dupu
10500b57cec5SDimitry Andric  InstrItinData<IIC_VLD4dupu, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
10510b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
10520b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsN],   0, Required>,
10530b57cec5SDimitry Andric                               InstrStage<8, [A9_DRegsVFP], 0, Reserved>,
10540b57cec5SDimitry Andric                               InstrStage<2, [A9_NPipe], 0>,
10550b57cec5SDimitry Andric                               InstrStage<2, [A9_LSUnit]>],
10560b57cec5SDimitry Andric                              [2, 2, 3, 3, 2, 1, 1]>,
10570b57cec5SDimitry Andric  //
10580b57cec5SDimitry Andric  // VST1
10590b57cec5SDimitry Andric  InstrItinData<IIC_VST1,     [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
10600b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
10610b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsN],   0, Required>,
10620b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsVFP], 0, Reserved>,
10630b57cec5SDimitry Andric                               InstrStage<1, [A9_NPipe], 0>,
10640b57cec5SDimitry Andric                               InstrStage<1, [A9_LSUnit]>],
10650b57cec5SDimitry Andric                              [1, 1, 1]>,
10660b57cec5SDimitry Andric  //
10670b57cec5SDimitry Andric  // VST1x2
10680b57cec5SDimitry Andric  InstrItinData<IIC_VST1x2,   [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
10690b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
10700b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsN],   0, Required>,
10710b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsVFP], 0, Reserved>,
10720b57cec5SDimitry Andric                               InstrStage<1, [A9_NPipe], 0>,
10730b57cec5SDimitry Andric                               InstrStage<1, [A9_LSUnit]>],
10740b57cec5SDimitry Andric                              [1, 1, 1, 1]>,
10750b57cec5SDimitry Andric  //
10760b57cec5SDimitry Andric  // VST1x3
10770b57cec5SDimitry Andric  InstrItinData<IIC_VST1x3,   [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
10780b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
10790b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsN],   0, Required>,
10800b57cec5SDimitry Andric                               InstrStage<2, [A9_DRegsVFP], 0, Reserved>,
10810b57cec5SDimitry Andric                               InstrStage<2, [A9_NPipe], 0>,
10820b57cec5SDimitry Andric                               InstrStage<2, [A9_LSUnit]>],
10830b57cec5SDimitry Andric                              [1, 1, 1, 1, 2]>,
10840b57cec5SDimitry Andric  //
10850b57cec5SDimitry Andric  // VST1x4
10860b57cec5SDimitry Andric  InstrItinData<IIC_VST1x4,   [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
10870b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
10880b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsN],   0, Required>,
10890b57cec5SDimitry Andric                               InstrStage<2, [A9_DRegsVFP], 0, Reserved>,
10900b57cec5SDimitry Andric                               InstrStage<2, [A9_NPipe], 0>,
10910b57cec5SDimitry Andric                               InstrStage<2, [A9_LSUnit]>],
10920b57cec5SDimitry Andric                              [1, 1, 1, 1, 2, 2]>,
10930b57cec5SDimitry Andric  //
10940b57cec5SDimitry Andric  // VST1u
10950b57cec5SDimitry Andric  InstrItinData<IIC_VST1u,    [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
10960b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
10970b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsN],   0, Required>,
10980b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsVFP], 0, Reserved>,
10990b57cec5SDimitry Andric                               InstrStage<1, [A9_NPipe], 0>,
11000b57cec5SDimitry Andric                               InstrStage<1, [A9_LSUnit]>],
11010b57cec5SDimitry Andric                              [2, 1, 1, 1, 1]>,
11020b57cec5SDimitry Andric  //
11030b57cec5SDimitry Andric  // VST1x2u
11040b57cec5SDimitry Andric  InstrItinData<IIC_VST1x2u,  [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
11050b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
11060b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsN],   0, Required>,
11070b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsVFP], 0, Reserved>,
11080b57cec5SDimitry Andric                               InstrStage<1, [A9_NPipe], 0>,
11090b57cec5SDimitry Andric                               InstrStage<1, [A9_LSUnit]>],
11100b57cec5SDimitry Andric                              [2, 1, 1, 1, 1, 1]>,
11110b57cec5SDimitry Andric  //
11120b57cec5SDimitry Andric  // VST1x3u
11130b57cec5SDimitry Andric  InstrItinData<IIC_VST1x3u,  [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
11140b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
11150b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsN],   0, Required>,
11160b57cec5SDimitry Andric                               InstrStage<2, [A9_DRegsVFP], 0, Reserved>,
11170b57cec5SDimitry Andric                               InstrStage<2, [A9_NPipe], 0>,
11180b57cec5SDimitry Andric                               InstrStage<2, [A9_LSUnit]>],
11190b57cec5SDimitry Andric                              [2, 1, 1, 1, 1, 1, 2]>,
11200b57cec5SDimitry Andric  //
11210b57cec5SDimitry Andric  // VST1x4u
11220b57cec5SDimitry Andric  InstrItinData<IIC_VST1x4u,  [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
11230b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
11240b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsN],   0, Required>,
11250b57cec5SDimitry Andric                               InstrStage<2, [A9_DRegsVFP], 0, Reserved>,
11260b57cec5SDimitry Andric                               InstrStage<2, [A9_NPipe], 0>,
11270b57cec5SDimitry Andric                               InstrStage<2, [A9_LSUnit]>],
11280b57cec5SDimitry Andric                              [2, 1, 1, 1, 1, 1, 2, 2]>,
11290b57cec5SDimitry Andric  //
11300b57cec5SDimitry Andric  // VST1ln
11310b57cec5SDimitry Andric  InstrItinData<IIC_VST1ln,   [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
11320b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
11330b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsN],   0, Required>,
11340b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsVFP], 0, Reserved>,
11350b57cec5SDimitry Andric                               InstrStage<1, [A9_NPipe], 0>,
11360b57cec5SDimitry Andric                               InstrStage<1, [A9_LSUnit]>],
11370b57cec5SDimitry Andric                              [1, 1, 1]>,
11380b57cec5SDimitry Andric  //
11390b57cec5SDimitry Andric  // VST1lnu
11400b57cec5SDimitry Andric  InstrItinData<IIC_VST1lnu,  [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
11410b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
11420b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsN],   0, Required>,
11430b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsVFP], 0, Reserved>,
11440b57cec5SDimitry Andric                               InstrStage<1, [A9_NPipe], 0>,
11450b57cec5SDimitry Andric                               InstrStage<1, [A9_LSUnit]>],
11460b57cec5SDimitry Andric                              [2, 1, 1, 1, 1]>,
11470b57cec5SDimitry Andric  //
11480b57cec5SDimitry Andric  // VST2
11490b57cec5SDimitry Andric  InstrItinData<IIC_VST2,     [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
11500b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
11510b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsN],   0, Required>,
11520b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsVFP], 0, Reserved>,
11530b57cec5SDimitry Andric                               InstrStage<1, [A9_NPipe], 0>,
11540b57cec5SDimitry Andric                               InstrStage<1, [A9_LSUnit]>],
11550b57cec5SDimitry Andric                              [1, 1, 1, 1]>,
11560b57cec5SDimitry Andric  //
11570b57cec5SDimitry Andric  // VST2x2
11580b57cec5SDimitry Andric  InstrItinData<IIC_VST2x2,   [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
11590b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
11600b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsN],   0, Required>,
11610b57cec5SDimitry Andric                               InstrStage<3, [A9_DRegsVFP], 0, Reserved>,
11620b57cec5SDimitry Andric                               InstrStage<3, [A9_NPipe], 0>,
11630b57cec5SDimitry Andric                               InstrStage<3, [A9_LSUnit]>],
11640b57cec5SDimitry Andric                              [1, 1, 1, 1, 2, 2]>,
11650b57cec5SDimitry Andric  //
11660b57cec5SDimitry Andric  // VST2u
11670b57cec5SDimitry Andric  InstrItinData<IIC_VST2u,    [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
11680b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
11690b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsN],   0, Required>,
11700b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsVFP], 0, Reserved>,
11710b57cec5SDimitry Andric                               InstrStage<1, [A9_NPipe], 0>,
11720b57cec5SDimitry Andric                               InstrStage<1, [A9_LSUnit]>],
11730b57cec5SDimitry Andric                              [2, 1, 1, 1, 1, 1]>,
11740b57cec5SDimitry Andric  //
11750b57cec5SDimitry Andric  // VST2x2u
11760b57cec5SDimitry Andric  InstrItinData<IIC_VST2x2u,  [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
11770b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
11780b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsN],   0, Required>,
11790b57cec5SDimitry Andric                               InstrStage<3, [A9_DRegsVFP], 0, Reserved>,
11800b57cec5SDimitry Andric                               InstrStage<3, [A9_NPipe], 0>,
11810b57cec5SDimitry Andric                               InstrStage<3, [A9_LSUnit]>],
11820b57cec5SDimitry Andric                              [2, 1, 1, 1, 1, 1, 2, 2]>,
11830b57cec5SDimitry Andric  //
11840b57cec5SDimitry Andric  // VST2ln
11850b57cec5SDimitry Andric  InstrItinData<IIC_VST2ln,   [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
11860b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
11870b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsN],   0, Required>,
11880b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsVFP], 0, Reserved>,
11890b57cec5SDimitry Andric                               InstrStage<1, [A9_NPipe], 0>,
11900b57cec5SDimitry Andric                               InstrStage<1, [A9_LSUnit]>],
11910b57cec5SDimitry Andric                              [1, 1, 1, 1]>,
11920b57cec5SDimitry Andric  //
11930b57cec5SDimitry Andric  // VST2lnu
11940b57cec5SDimitry Andric  InstrItinData<IIC_VST2lnu,  [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
11950b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
11960b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsN],   0, Required>,
11970b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsVFP], 0, Reserved>,
11980b57cec5SDimitry Andric                               InstrStage<1, [A9_NPipe], 0>,
11990b57cec5SDimitry Andric                               InstrStage<1, [A9_LSUnit]>],
12000b57cec5SDimitry Andric                              [2, 1, 1, 1, 1, 1]>,
12010b57cec5SDimitry Andric  //
12020b57cec5SDimitry Andric  // VST3
12030b57cec5SDimitry Andric  InstrItinData<IIC_VST3,     [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
12040b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
12050b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsN],   0, Required>,
12060b57cec5SDimitry Andric                               InstrStage<2, [A9_DRegsVFP], 0, Reserved>,
12070b57cec5SDimitry Andric                               InstrStage<2, [A9_NPipe], 0>,
12080b57cec5SDimitry Andric                               InstrStage<2, [A9_LSUnit]>],
12090b57cec5SDimitry Andric                              [1, 1, 1, 1, 2]>,
12100b57cec5SDimitry Andric  //
12110b57cec5SDimitry Andric  // VST3u
12120b57cec5SDimitry Andric  InstrItinData<IIC_VST3u,    [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
12130b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
12140b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsN],   0, Required>,
12150b57cec5SDimitry Andric                               InstrStage<2, [A9_DRegsVFP], 0, Reserved>,
12160b57cec5SDimitry Andric                               InstrStage<2, [A9_NPipe], 0>,
12170b57cec5SDimitry Andric                               InstrStage<2, [A9_LSUnit]>],
12180b57cec5SDimitry Andric                              [2, 1, 1, 1, 1, 1, 2]>,
12190b57cec5SDimitry Andric  //
12200b57cec5SDimitry Andric  // VST3ln
12210b57cec5SDimitry Andric  InstrItinData<IIC_VST3ln,   [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
12220b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
12230b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsN],   0, Required>,
12240b57cec5SDimitry Andric                               InstrStage<3, [A9_DRegsVFP], 0, Reserved>,
12250b57cec5SDimitry Andric                               InstrStage<3, [A9_NPipe], 0>,
12260b57cec5SDimitry Andric                               InstrStage<3, [A9_LSUnit]>],
12270b57cec5SDimitry Andric                              [1, 1, 1, 1, 2]>,
12280b57cec5SDimitry Andric  //
12290b57cec5SDimitry Andric  // VST3lnu
12300b57cec5SDimitry Andric  InstrItinData<IIC_VST3lnu,  [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
12310b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
12320b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsN],   0, Required>,
12330b57cec5SDimitry Andric                               InstrStage<3, [A9_DRegsVFP], 0, Reserved>,
12340b57cec5SDimitry Andric                               InstrStage<3, [A9_NPipe], 0>,
12350b57cec5SDimitry Andric                               InstrStage<3, [A9_LSUnit]>],
12360b57cec5SDimitry Andric                              [2, 1, 1, 1, 1, 1, 2]>,
12370b57cec5SDimitry Andric  //
12380b57cec5SDimitry Andric  // VST4
12390b57cec5SDimitry Andric  InstrItinData<IIC_VST4,     [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
12400b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
12410b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsN],   0, Required>,
12420b57cec5SDimitry Andric                               InstrStage<2, [A9_DRegsVFP], 0, Reserved>,
12430b57cec5SDimitry Andric                               InstrStage<2, [A9_NPipe], 0>,
12440b57cec5SDimitry Andric                               InstrStage<2, [A9_LSUnit]>],
12450b57cec5SDimitry Andric                              [1, 1, 1, 1, 2, 2]>,
12460b57cec5SDimitry Andric  //
12470b57cec5SDimitry Andric  // VST4u
12480b57cec5SDimitry Andric  InstrItinData<IIC_VST4u,    [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
12490b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
12500b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsN],   0, Required>,
12510b57cec5SDimitry Andric                               InstrStage<2, [A9_DRegsVFP], 0, Reserved>,
12520b57cec5SDimitry Andric                               InstrStage<2, [A9_NPipe], 0>,
12530b57cec5SDimitry Andric                               InstrStage<2, [A9_LSUnit]>],
12540b57cec5SDimitry Andric                              [2, 1, 1, 1, 1, 1, 2, 2]>,
12550b57cec5SDimitry Andric  //
12560b57cec5SDimitry Andric  // VST4ln
12570b57cec5SDimitry Andric  InstrItinData<IIC_VST4ln,   [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
12580b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
12590b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsN],   0, Required>,
12600b57cec5SDimitry Andric                               InstrStage<2, [A9_DRegsVFP], 0, Reserved>,
12610b57cec5SDimitry Andric                               InstrStage<2, [A9_NPipe], 0>,
12620b57cec5SDimitry Andric                               InstrStage<2, [A9_LSUnit]>],
12630b57cec5SDimitry Andric                              [1, 1, 1, 1, 2, 2]>,
12640b57cec5SDimitry Andric  //
12650b57cec5SDimitry Andric  // VST4lnu
12660b57cec5SDimitry Andric  InstrItinData<IIC_VST4lnu,  [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
12670b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
12680b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsN],   0, Required>,
12690b57cec5SDimitry Andric                               InstrStage<2, [A9_DRegsVFP], 0, Reserved>,
12700b57cec5SDimitry Andric                               InstrStage<2, [A9_NPipe], 0>,
12710b57cec5SDimitry Andric                               InstrStage<2, [A9_LSUnit]>],
12720b57cec5SDimitry Andric                              [2, 1, 1, 1, 1, 1, 2, 2]>,
12730b57cec5SDimitry Andric
12740b57cec5SDimitry Andric  //
12750b57cec5SDimitry Andric  // Double-register Integer Unary
12760b57cec5SDimitry Andric  InstrItinData<IIC_VUNAiD,   [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
12770b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
12780b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsN],   0, Required>,
12790b57cec5SDimitry Andric                               // Extra latency cycles since wbck is 6 cycles
12800b57cec5SDimitry Andric                               InstrStage<7, [A9_DRegsVFP], 0, Reserved>,
12810b57cec5SDimitry Andric                               InstrStage<1, [A9_NPipe]>],
12820b57cec5SDimitry Andric                              [4, 2]>,
12830b57cec5SDimitry Andric  //
12840b57cec5SDimitry Andric  // Quad-register Integer Unary
12850b57cec5SDimitry Andric  InstrItinData<IIC_VUNAiQ,   [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
12860b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
12870b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsN],   0, Required>,
12880b57cec5SDimitry Andric                               // Extra latency cycles since wbck is 6 cycles
12890b57cec5SDimitry Andric                               InstrStage<7, [A9_DRegsVFP], 0, Reserved>,
12900b57cec5SDimitry Andric                               InstrStage<1, [A9_NPipe]>],
12910b57cec5SDimitry Andric                              [4, 2]>,
12920b57cec5SDimitry Andric  //
12930b57cec5SDimitry Andric  // Double-register Integer Q-Unary
12940b57cec5SDimitry Andric  InstrItinData<IIC_VQUNAiD,  [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
12950b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
12960b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsN],   0, Required>,
12970b57cec5SDimitry Andric                               // Extra latency cycles since wbck is 6 cycles
12980b57cec5SDimitry Andric                               InstrStage<7, [A9_DRegsVFP], 0, Reserved>,
12990b57cec5SDimitry Andric                               InstrStage<1, [A9_NPipe]>],
13000b57cec5SDimitry Andric                              [4, 1]>,
13010b57cec5SDimitry Andric  //
13020b57cec5SDimitry Andric  // Quad-register Integer CountQ-Unary
13030b57cec5SDimitry Andric  InstrItinData<IIC_VQUNAiQ,  [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
13040b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
13050b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsN],   0, Required>,
13060b57cec5SDimitry Andric                               // Extra latency cycles since wbck is 6 cycles
13070b57cec5SDimitry Andric                               InstrStage<7, [A9_DRegsVFP], 0, Reserved>,
13080b57cec5SDimitry Andric                               InstrStage<1, [A9_NPipe]>],
13090b57cec5SDimitry Andric                              [4, 1]>,
13100b57cec5SDimitry Andric  //
13110b57cec5SDimitry Andric  // Double-register Integer Binary
13120b57cec5SDimitry Andric  InstrItinData<IIC_VBINiD,   [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
13130b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
13140b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsN],   0, Required>,
13150b57cec5SDimitry Andric                               // Extra latency cycles since wbck is 6 cycles
13160b57cec5SDimitry Andric                               InstrStage<7, [A9_DRegsVFP], 0, Reserved>,
13170b57cec5SDimitry Andric                               InstrStage<1, [A9_NPipe]>],
13180b57cec5SDimitry Andric                              [3, 2, 2]>,
13190b57cec5SDimitry Andric  //
13200b57cec5SDimitry Andric  // Quad-register Integer Binary
13210b57cec5SDimitry Andric  InstrItinData<IIC_VBINiQ,   [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
13220b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
13230b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsN],   0, Required>,
13240b57cec5SDimitry Andric                               // Extra latency cycles since wbck is 6 cycles
13250b57cec5SDimitry Andric                               InstrStage<7, [A9_DRegsVFP], 0, Reserved>,
13260b57cec5SDimitry Andric                               InstrStage<1, [A9_NPipe]>],
13270b57cec5SDimitry Andric                              [3, 2, 2]>,
13280b57cec5SDimitry Andric  //
13290b57cec5SDimitry Andric  // Double-register Integer Subtract
13300b57cec5SDimitry Andric  InstrItinData<IIC_VSUBiD,   [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
13310b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
13320b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsN],   0, Required>,
13330b57cec5SDimitry Andric                               // Extra latency cycles since wbck is 6 cycles
13340b57cec5SDimitry Andric                               InstrStage<7, [A9_DRegsVFP], 0, Reserved>,
13350b57cec5SDimitry Andric                               InstrStage<1, [A9_NPipe]>],
13360b57cec5SDimitry Andric                              [3, 2, 1]>,
13370b57cec5SDimitry Andric  //
13380b57cec5SDimitry Andric  // Quad-register Integer Subtract
13390b57cec5SDimitry Andric  InstrItinData<IIC_VSUBiQ,   [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
13400b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
13410b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsN],   0, Required>,
13420b57cec5SDimitry Andric                               // Extra latency cycles since wbck is 6 cycles
13430b57cec5SDimitry Andric                               InstrStage<7, [A9_DRegsVFP], 0, Reserved>,
13440b57cec5SDimitry Andric                               InstrStage<1, [A9_NPipe]>],
13450b57cec5SDimitry Andric                              [3, 2, 1]>,
13460b57cec5SDimitry Andric  //
13470b57cec5SDimitry Andric  // Double-register Integer Shift
13480b57cec5SDimitry Andric  InstrItinData<IIC_VSHLiD,   [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
13490b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
13500b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsN],   0, Required>,
13510b57cec5SDimitry Andric                               // Extra latency cycles since wbck is 6 cycles
13520b57cec5SDimitry Andric                               InstrStage<7, [A9_DRegsVFP], 0, Reserved>,
13530b57cec5SDimitry Andric                               InstrStage<1, [A9_NPipe]>],
13540b57cec5SDimitry Andric                              [3, 1, 1]>,
13550b57cec5SDimitry Andric  //
13560b57cec5SDimitry Andric  // Quad-register Integer Shift
13570b57cec5SDimitry Andric  InstrItinData<IIC_VSHLiQ,   [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
13580b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
13590b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsN],   0, Required>,
13600b57cec5SDimitry Andric                               // Extra latency cycles since wbck is 6 cycles
13610b57cec5SDimitry Andric                               InstrStage<7, [A9_DRegsVFP], 0, Reserved>,
13620b57cec5SDimitry Andric                               InstrStage<1, [A9_NPipe]>],
13630b57cec5SDimitry Andric                              [3, 1, 1]>,
13640b57cec5SDimitry Andric  //
13650b57cec5SDimitry Andric  // Double-register Integer Shift (4 cycle)
13660b57cec5SDimitry Andric  InstrItinData<IIC_VSHLi4D,  [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
13670b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
13680b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsN],   0, Required>,
13690b57cec5SDimitry Andric                               // Extra latency cycles since wbck is 6 cycles
13700b57cec5SDimitry Andric                               InstrStage<7, [A9_DRegsVFP], 0, Reserved>,
13710b57cec5SDimitry Andric                               InstrStage<1, [A9_NPipe]>],
13720b57cec5SDimitry Andric                              [4, 1, 1]>,
13730b57cec5SDimitry Andric  //
13740b57cec5SDimitry Andric  // Quad-register Integer Shift (4 cycle)
13750b57cec5SDimitry Andric  InstrItinData<IIC_VSHLi4Q,  [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
13760b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
13770b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsN],   0, Required>,
13780b57cec5SDimitry Andric                               // Extra latency cycles since wbck is 6 cycles
13790b57cec5SDimitry Andric                               InstrStage<7, [A9_DRegsVFP], 0, Reserved>,
13800b57cec5SDimitry Andric                               InstrStage<1, [A9_NPipe]>],
13810b57cec5SDimitry Andric                              [4, 1, 1]>,
13820b57cec5SDimitry Andric  //
13830b57cec5SDimitry Andric  // Double-register Integer Binary (4 cycle)
13840b57cec5SDimitry Andric  InstrItinData<IIC_VBINi4D,  [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
13850b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
13860b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsN],   0, Required>,
13870b57cec5SDimitry Andric                               // Extra latency cycles since wbck is 6 cycles
13880b57cec5SDimitry Andric                               InstrStage<7, [A9_DRegsVFP], 0, Reserved>,
13890b57cec5SDimitry Andric                               InstrStage<1, [A9_NPipe]>],
13900b57cec5SDimitry Andric                              [4, 2, 2]>,
13910b57cec5SDimitry Andric  //
13920b57cec5SDimitry Andric  // Quad-register Integer Binary (4 cycle)
13930b57cec5SDimitry Andric  InstrItinData<IIC_VBINi4Q,  [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
13940b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
13950b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsN],   0, Required>,
13960b57cec5SDimitry Andric                               // Extra latency cycles since wbck is 6 cycles
13970b57cec5SDimitry Andric                               InstrStage<7, [A9_DRegsVFP], 0, Reserved>,
13980b57cec5SDimitry Andric                               InstrStage<1, [A9_NPipe]>],
13990b57cec5SDimitry Andric                              [4, 2, 2]>,
14000b57cec5SDimitry Andric  //
14010b57cec5SDimitry Andric  // Double-register Integer Subtract (4 cycle)
14020b57cec5SDimitry Andric  InstrItinData<IIC_VSUBi4D,  [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
14030b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
14040b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsN],   0, Required>,
14050b57cec5SDimitry Andric                               // Extra latency cycles since wbck is 6 cycles
14060b57cec5SDimitry Andric                               InstrStage<7, [A9_DRegsVFP], 0, Reserved>,
14070b57cec5SDimitry Andric                               InstrStage<1, [A9_NPipe]>],
14080b57cec5SDimitry Andric                              [4, 2, 1]>,
14090b57cec5SDimitry Andric  //
14100b57cec5SDimitry Andric  // Quad-register Integer Subtract (4 cycle)
14110b57cec5SDimitry Andric  InstrItinData<IIC_VSUBi4Q,  [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
14120b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
14130b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsN],   0, Required>,
14140b57cec5SDimitry Andric                               // Extra latency cycles since wbck is 6 cycles
14150b57cec5SDimitry Andric                               InstrStage<7, [A9_DRegsVFP], 0, Reserved>,
14160b57cec5SDimitry Andric                               InstrStage<1, [A9_NPipe]>],
14170b57cec5SDimitry Andric                              [4, 2, 1]>,
14180b57cec5SDimitry Andric
14190b57cec5SDimitry Andric  //
14200b57cec5SDimitry Andric  // Double-register Integer Count
14210b57cec5SDimitry Andric  InstrItinData<IIC_VCNTiD,   [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
14220b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
14230b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsN],   0, Required>,
14240b57cec5SDimitry Andric                               // Extra latency cycles since wbck is 6 cycles
14250b57cec5SDimitry Andric                               InstrStage<7, [A9_DRegsVFP], 0, Reserved>,
14260b57cec5SDimitry Andric                               InstrStage<1, [A9_NPipe]>],
14270b57cec5SDimitry Andric                              [3, 2, 2]>,
14280b57cec5SDimitry Andric  //
14290b57cec5SDimitry Andric  // Quad-register Integer Count
14300b57cec5SDimitry Andric  // Result written in N3, but that is relative to the last cycle of multicycle,
14310b57cec5SDimitry Andric  // so we use 4 for those cases
14320b57cec5SDimitry Andric  InstrItinData<IIC_VCNTiQ,   [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
14330b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
14340b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsN],   0, Required>,
14350b57cec5SDimitry Andric                               // Extra latency cycles since wbck is 7 cycles
14360b57cec5SDimitry Andric                               InstrStage<8, [A9_DRegsVFP], 0, Reserved>,
14370b57cec5SDimitry Andric                               InstrStage<2, [A9_NPipe]>],
14380b57cec5SDimitry Andric                              [4, 2, 2]>,
14390b57cec5SDimitry Andric  //
14400b57cec5SDimitry Andric  // Double-register Absolute Difference and Accumulate
14410b57cec5SDimitry Andric  InstrItinData<IIC_VABAD,    [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
14420b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
14430b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsN],   0, Required>,
14440b57cec5SDimitry Andric                               // Extra latency cycles since wbck is 6 cycles
14450b57cec5SDimitry Andric                               InstrStage<7, [A9_DRegsVFP], 0, Reserved>,
14460b57cec5SDimitry Andric                               InstrStage<1, [A9_NPipe]>],
14470b57cec5SDimitry Andric                              [6, 3, 2, 1]>,
14480b57cec5SDimitry Andric  //
14490b57cec5SDimitry Andric  // Quad-register Absolute Difference and Accumulate
14500b57cec5SDimitry Andric  InstrItinData<IIC_VABAQ,    [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
14510b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
14520b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsN],   0, Required>,
14530b57cec5SDimitry Andric                               // Extra latency cycles since wbck is 6 cycles
14540b57cec5SDimitry Andric                               InstrStage<7, [A9_DRegsVFP], 0, Reserved>,
14550b57cec5SDimitry Andric                               InstrStage<2, [A9_NPipe]>],
14560b57cec5SDimitry Andric                              [6, 3, 2, 1]>,
14570b57cec5SDimitry Andric  //
14580b57cec5SDimitry Andric  // Double-register Integer Pair Add Long
14590b57cec5SDimitry Andric  InstrItinData<IIC_VPALiD,   [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
14600b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
14610b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsN],   0, Required>,
14620b57cec5SDimitry Andric                               // Extra latency cycles since wbck is 6 cycles
14630b57cec5SDimitry Andric                               InstrStage<7, [A9_DRegsVFP], 0, Reserved>,
14640b57cec5SDimitry Andric                               InstrStage<1, [A9_NPipe]>],
14650b57cec5SDimitry Andric                              [6, 3, 1]>,
14660b57cec5SDimitry Andric  //
14670b57cec5SDimitry Andric  // Quad-register Integer Pair Add Long
14680b57cec5SDimitry Andric  InstrItinData<IIC_VPALiQ,   [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
14690b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
14700b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsN],   0, Required>,
14710b57cec5SDimitry Andric                               // Extra latency cycles since wbck is 6 cycles
14720b57cec5SDimitry Andric                               InstrStage<7, [A9_DRegsVFP], 0, Reserved>,
14730b57cec5SDimitry Andric                               InstrStage<2, [A9_NPipe]>],
14740b57cec5SDimitry Andric                              [6, 3, 1]>,
14750b57cec5SDimitry Andric
14760b57cec5SDimitry Andric  //
14770b57cec5SDimitry Andric  // Double-register Integer Multiply (.8, .16)
14780b57cec5SDimitry Andric  InstrItinData<IIC_VMULi16D, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
14790b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
14800b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsN],   0, Required>,
14810b57cec5SDimitry Andric                               // Extra latency cycles since wbck is 6 cycles
14820b57cec5SDimitry Andric                               InstrStage<7, [A9_DRegsVFP], 0, Reserved>,
14830b57cec5SDimitry Andric                               InstrStage<1, [A9_NPipe]>],
14840b57cec5SDimitry Andric                              [6, 2, 2]>,
14850b57cec5SDimitry Andric  //
14860b57cec5SDimitry Andric  // Quad-register Integer Multiply (.8, .16)
14870b57cec5SDimitry Andric  InstrItinData<IIC_VMULi16Q, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
14880b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
14890b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsN],   0, Required>,
14900b57cec5SDimitry Andric                               // Extra latency cycles since wbck is 7 cycles
14910b57cec5SDimitry Andric                               InstrStage<8, [A9_DRegsVFP], 0, Reserved>,
14920b57cec5SDimitry Andric                               InstrStage<2, [A9_NPipe]>],
14930b57cec5SDimitry Andric                              [7, 2, 2]>,
14940b57cec5SDimitry Andric
14950b57cec5SDimitry Andric  //
14960b57cec5SDimitry Andric  // Double-register Integer Multiply (.32)
14970b57cec5SDimitry Andric  InstrItinData<IIC_VMULi32D, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
14980b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
14990b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsN],   0, Required>,
15000b57cec5SDimitry Andric                               // Extra latency cycles since wbck is 7 cycles
15010b57cec5SDimitry Andric                               InstrStage<8, [A9_DRegsVFP], 0, Reserved>,
15020b57cec5SDimitry Andric                               InstrStage<2, [A9_NPipe]>],
15030b57cec5SDimitry Andric                              [7, 2, 1]>,
15040b57cec5SDimitry Andric  //
15050b57cec5SDimitry Andric  // Quad-register Integer Multiply (.32)
15060b57cec5SDimitry Andric  InstrItinData<IIC_VMULi32Q, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
15070b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
15080b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsN],   0, Required>,
15090b57cec5SDimitry Andric                               // Extra latency cycles since wbck is 9 cycles
15100b57cec5SDimitry Andric                               InstrStage<10, [A9_DRegsVFP], 0, Reserved>,
15110b57cec5SDimitry Andric                               InstrStage<4, [A9_NPipe]>],
15120b57cec5SDimitry Andric                              [9, 2, 1]>,
15130b57cec5SDimitry Andric  //
15140b57cec5SDimitry Andric  // Double-register Integer Multiply-Accumulate (.8, .16)
15150b57cec5SDimitry Andric  InstrItinData<IIC_VMACi16D, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
15160b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
15170b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsN],   0, Required>,
15180b57cec5SDimitry Andric                               // Extra latency cycles since wbck is 6 cycles
15190b57cec5SDimitry Andric                               InstrStage<7, [A9_DRegsVFP], 0, Reserved>,
15200b57cec5SDimitry Andric                               InstrStage<1, [A9_NPipe]>],
15210b57cec5SDimitry Andric                              [6, 3, 2, 2]>,
15220b57cec5SDimitry Andric  //
15230b57cec5SDimitry Andric  // Double-register Integer Multiply-Accumulate (.32)
15240b57cec5SDimitry Andric  InstrItinData<IIC_VMACi32D, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
15250b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
15260b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsN],   0, Required>,
15270b57cec5SDimitry Andric                               // Extra latency cycles since wbck is 7 cycles
15280b57cec5SDimitry Andric                               InstrStage<8, [A9_DRegsVFP], 0, Reserved>,
15290b57cec5SDimitry Andric                               InstrStage<2, [A9_NPipe]>],
15300b57cec5SDimitry Andric                              [7, 3, 2, 1]>,
15310b57cec5SDimitry Andric  //
15320b57cec5SDimitry Andric  // Quad-register Integer Multiply-Accumulate (.8, .16)
15330b57cec5SDimitry Andric  InstrItinData<IIC_VMACi16Q, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
15340b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
15350b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsN],   0, Required>,
15360b57cec5SDimitry Andric                               // Extra latency cycles since wbck is 7 cycles
15370b57cec5SDimitry Andric                               InstrStage<8, [A9_DRegsVFP], 0, Reserved>,
15380b57cec5SDimitry Andric                               InstrStage<2, [A9_NPipe]>],
15390b57cec5SDimitry Andric                              [7, 3, 2, 2]>,
15400b57cec5SDimitry Andric  //
15410b57cec5SDimitry Andric  // Quad-register Integer Multiply-Accumulate (.32)
15420b57cec5SDimitry Andric  InstrItinData<IIC_VMACi32Q, [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
15430b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
15440b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsN],   0, Required>,
15450b57cec5SDimitry Andric                               // Extra latency cycles since wbck is 9 cycles
15460b57cec5SDimitry Andric                               InstrStage<10, [A9_DRegsVFP], 0, Reserved>,
15470b57cec5SDimitry Andric                               InstrStage<4, [A9_NPipe]>],
15480b57cec5SDimitry Andric                              [9, 3, 2, 1]>,
15490b57cec5SDimitry Andric
15500b57cec5SDimitry Andric  //
15510b57cec5SDimitry Andric  // Move
15520b57cec5SDimitry Andric  InstrItinData<IIC_VMOV,     [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
15530b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
15540b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsN],   0, Required>,
15550b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsVFP], 0, Reserved>,
15560b57cec5SDimitry Andric                               InstrStage<1, [A9_NPipe]>],
15570b57cec5SDimitry Andric                              [1,1]>,
15580b57cec5SDimitry Andric  //
15590b57cec5SDimitry Andric  // Move Immediate
15600b57cec5SDimitry Andric  InstrItinData<IIC_VMOVImm,  [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
15610b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
15620b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsN],   0, Required>,
15630b57cec5SDimitry Andric                               // Extra latency cycles since wbck is 6 cycles
15640b57cec5SDimitry Andric                               InstrStage<7, [A9_DRegsVFP], 0, Reserved>,
15650b57cec5SDimitry Andric                               InstrStage<1, [A9_NPipe]>],
15660b57cec5SDimitry Andric                              [3]>,
15670b57cec5SDimitry Andric  //
15680b57cec5SDimitry Andric  // Double-register Permute Move
15690b57cec5SDimitry Andric  InstrItinData<IIC_VMOVD,    [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
15700b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
15710b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsN],   0, Required>,
15720b57cec5SDimitry Andric                               // Extra latency cycles since wbck is 6 cycles
15730b57cec5SDimitry Andric                               InstrStage<7, [A9_DRegsVFP], 0, Reserved>,
15740b57cec5SDimitry Andric                               InstrStage<1, [A9_NPipe]>],
15750b57cec5SDimitry Andric                              [2, 1]>,
15760b57cec5SDimitry Andric  //
15770b57cec5SDimitry Andric  // Quad-register Permute Move
15780b57cec5SDimitry Andric  InstrItinData<IIC_VMOVQ,    [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
15790b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
15800b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsN],   0, Required>,
15810b57cec5SDimitry Andric                               // Extra latency cycles since wbck is 6 cycles
15820b57cec5SDimitry Andric                               InstrStage<7, [A9_DRegsVFP], 0, Reserved>,
15830b57cec5SDimitry Andric                               InstrStage<1, [A9_NPipe]>],
15840b57cec5SDimitry Andric                              [2, 1]>,
15850b57cec5SDimitry Andric  //
15860b57cec5SDimitry Andric  // Integer to Single-precision Move
15870b57cec5SDimitry Andric  InstrItinData<IIC_VMOVIS ,  [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
15880b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
15890b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsN],   0, Required>,
15900b57cec5SDimitry Andric                               InstrStage<3, [A9_DRegsVFP], 0, Reserved>,
15910b57cec5SDimitry Andric                               InstrStage<1, [A9_NPipe]>],
15920b57cec5SDimitry Andric                              [1, 1]>,
15930b57cec5SDimitry Andric  //
15940b57cec5SDimitry Andric  // Integer to Double-precision Move
15950b57cec5SDimitry Andric  InstrItinData<IIC_VMOVID ,  [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
15960b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
15970b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsN],   0, Required>,
15980b57cec5SDimitry Andric                               InstrStage<3, [A9_DRegsVFP], 0, Reserved>,
15990b57cec5SDimitry Andric                               InstrStage<1, [A9_NPipe]>],
16000b57cec5SDimitry Andric                              [1, 1, 1]>,
16010b57cec5SDimitry Andric  //
16020b57cec5SDimitry Andric  // Single-precision to Integer Move
16030b57cec5SDimitry Andric  InstrItinData<IIC_VMOVSI ,  [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
16040b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
16050b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsN],   0, Required>,
16060b57cec5SDimitry Andric                               InstrStage<3, [A9_DRegsVFP], 0, Reserved>,
16070b57cec5SDimitry Andric                               InstrStage<1, [A9_NPipe]>],
16080b57cec5SDimitry Andric                              [2, 1]>,
16090b57cec5SDimitry Andric  //
16100b57cec5SDimitry Andric  // Double-precision to Integer Move
16110b57cec5SDimitry Andric  InstrItinData<IIC_VMOVDI ,  [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
16120b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
16130b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsN],   0, Required>,
16140b57cec5SDimitry Andric                               InstrStage<3, [A9_DRegsVFP], 0, Reserved>,
16150b57cec5SDimitry Andric                               InstrStage<1, [A9_NPipe]>],
16160b57cec5SDimitry Andric                              [2, 2, 1]>,
16170b57cec5SDimitry Andric  //
16180b57cec5SDimitry Andric  // Integer to Lane Move
16190b57cec5SDimitry Andric  InstrItinData<IIC_VMOVISL , [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
16200b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
16210b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsN],   0, Required>,
16220b57cec5SDimitry Andric                               InstrStage<4, [A9_DRegsVFP], 0, Reserved>,
16230b57cec5SDimitry Andric                               InstrStage<2, [A9_NPipe]>],
16240b57cec5SDimitry Andric                              [3, 1, 1]>,
16250b57cec5SDimitry Andric
16260b57cec5SDimitry Andric  //
16270b57cec5SDimitry Andric  // Vector narrow move
16280b57cec5SDimitry Andric  InstrItinData<IIC_VMOVN,    [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
16290b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
16300b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsN],   0, Required>,
16310b57cec5SDimitry Andric                               // Extra latency cycles since wbck is 6 cycles
16320b57cec5SDimitry Andric                               InstrStage<7, [A9_DRegsVFP], 0, Reserved>,
16330b57cec5SDimitry Andric                               InstrStage<1, [A9_NPipe]>],
16340b57cec5SDimitry Andric                              [3, 1]>,
16350b57cec5SDimitry Andric  //
16360b57cec5SDimitry Andric  // Double-register FP Unary
16370b57cec5SDimitry Andric  InstrItinData<IIC_VUNAD,    [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
16380b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
16390b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsN],   0, Required>,
16400b57cec5SDimitry Andric                               // Extra latency cycles since wbck is 6 cycles
16410b57cec5SDimitry Andric                               InstrStage<7, [A9_DRegsVFP], 0, Reserved>,
16420b57cec5SDimitry Andric                               InstrStage<1, [A9_NPipe]>],
16430b57cec5SDimitry Andric                              [5, 2]>,
16440b57cec5SDimitry Andric  //
16450b57cec5SDimitry Andric  // Quad-register FP Unary
16460b57cec5SDimitry Andric  // Result written in N5, but that is relative to the last cycle of multicycle,
16470b57cec5SDimitry Andric  // so we use 6 for those cases
16480b57cec5SDimitry Andric  InstrItinData<IIC_VUNAQ,    [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
16490b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
16500b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsN],   0, Required>,
16510b57cec5SDimitry Andric                               // Extra latency cycles since wbck is 7 cycles
16520b57cec5SDimitry Andric                               InstrStage<8, [A9_DRegsVFP], 0, Reserved>,
16530b57cec5SDimitry Andric                               InstrStage<2, [A9_NPipe]>],
16540b57cec5SDimitry Andric                              [6, 2]>,
16550b57cec5SDimitry Andric  //
16560b57cec5SDimitry Andric  // Double-register FP Binary
16570b57cec5SDimitry Andric  // FIXME: We're using this itin for many instructions and [2, 2] here is too
16580b57cec5SDimitry Andric  // optimistic.
16590b57cec5SDimitry Andric  InstrItinData<IIC_VBIND,    [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
16600b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
16610b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsN],   0, Required>,
16620b57cec5SDimitry Andric                               // Extra latency cycles since wbck is 6 cycles
16630b57cec5SDimitry Andric                               InstrStage<7, [A9_DRegsVFP], 0, Reserved>,
16640b57cec5SDimitry Andric                               InstrStage<1, [A9_NPipe]>],
16650b57cec5SDimitry Andric                              [5, 2, 2]>,
16660b57cec5SDimitry Andric
16670b57cec5SDimitry Andric  //
16680b57cec5SDimitry Andric  // VPADD, etc.
16690b57cec5SDimitry Andric  InstrItinData<IIC_VPBIND,   [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
16700b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
16710b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsN],   0, Required>,
16720b57cec5SDimitry Andric                               // Extra latency cycles since wbck is 6 cycles
16730b57cec5SDimitry Andric                               InstrStage<7, [A9_DRegsVFP], 0, Reserved>,
16740b57cec5SDimitry Andric                               InstrStage<1, [A9_NPipe]>],
16750b57cec5SDimitry Andric                              [5, 1, 1]>,
16760b57cec5SDimitry Andric  //
16770b57cec5SDimitry Andric  // Double-register FP VMUL
16780b57cec5SDimitry Andric  InstrItinData<IIC_VFMULD,   [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
16790b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
16800b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsN],   0, Required>,
16810b57cec5SDimitry Andric                               // Extra latency cycles since wbck is 6 cycles
16820b57cec5SDimitry Andric                               InstrStage<7, [A9_DRegsVFP], 0, Reserved>,
16830b57cec5SDimitry Andric                               InstrStage<1, [A9_NPipe]>],
16840b57cec5SDimitry Andric                              [5, 2, 1]>,
16850b57cec5SDimitry Andric  //
16860b57cec5SDimitry Andric  // Quad-register FP Binary
16870b57cec5SDimitry Andric  // Result written in N5, but that is relative to the last cycle of multicycle,
16880b57cec5SDimitry Andric  // so we use 6 for those cases
16890b57cec5SDimitry Andric  // FIXME: We're using this itin for many instructions and [2, 2] here is too
16900b57cec5SDimitry Andric  // optimistic.
16910b57cec5SDimitry Andric  InstrItinData<IIC_VBINQ,    [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
16920b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
16930b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsN],   0, Required>,
16940b57cec5SDimitry Andric                               // Extra latency cycles since wbck is 7 cycles
16950b57cec5SDimitry Andric                               InstrStage<8, [A9_DRegsVFP], 0, Reserved>,
16960b57cec5SDimitry Andric                               InstrStage<2, [A9_NPipe]>],
16970b57cec5SDimitry Andric                              [6, 2, 2]>,
16980b57cec5SDimitry Andric  //
16990b57cec5SDimitry Andric  // Quad-register FP VMUL
17000b57cec5SDimitry Andric  InstrItinData<IIC_VFMULQ,   [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
17010b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
17020b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsN],   0, Required>,
17030b57cec5SDimitry Andric                               // Extra latency cycles since wbck is 7 cycles
17040b57cec5SDimitry Andric                               InstrStage<8, [A9_DRegsVFP], 0, Reserved>,
17050b57cec5SDimitry Andric                               InstrStage<1, [A9_NPipe]>],
17060b57cec5SDimitry Andric                              [6, 2, 1]>,
17070b57cec5SDimitry Andric  //
17080b57cec5SDimitry Andric  // Double-register FP Multiple-Accumulate
17090b57cec5SDimitry Andric  InstrItinData<IIC_VMACD,    [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
17100b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
17110b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsN],   0, Required>,
17120b57cec5SDimitry Andric                               // Extra latency cycles since wbck is 7 cycles
17130b57cec5SDimitry Andric                               InstrStage<8, [A9_DRegsVFP], 0, Reserved>,
17140b57cec5SDimitry Andric                               InstrStage<2, [A9_NPipe]>],
17150b57cec5SDimitry Andric                              [6, 3, 2, 1]>,
17160b57cec5SDimitry Andric  //
17170b57cec5SDimitry Andric  // Quad-register FP Multiple-Accumulate
17180b57cec5SDimitry Andric  // Result written in N9, but that is relative to the last cycle of multicycle,
17190b57cec5SDimitry Andric  // so we use 10 for those cases
17200b57cec5SDimitry Andric  InstrItinData<IIC_VMACQ,    [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
17210b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
17220b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsN],   0, Required>,
17230b57cec5SDimitry Andric                               // Extra latency cycles since wbck is 9 cycles
17240b57cec5SDimitry Andric                               InstrStage<10, [A9_DRegsVFP], 0, Reserved>,
17250b57cec5SDimitry Andric                               InstrStage<4, [A9_NPipe]>],
17260b57cec5SDimitry Andric                              [8, 4, 2, 1]>,
17270b57cec5SDimitry Andric  //
17280b57cec5SDimitry Andric  // Double-register Fused FP Multiple-Accumulate
17290b57cec5SDimitry Andric  InstrItinData<IIC_VFMACD,   [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
17300b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
17310b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsN],   0, Required>,
17320b57cec5SDimitry Andric                               // Extra latency cycles since wbck is 7 cycles
17330b57cec5SDimitry Andric                               InstrStage<8, [A9_DRegsVFP], 0, Reserved>,
17340b57cec5SDimitry Andric                               InstrStage<2, [A9_NPipe]>],
17350b57cec5SDimitry Andric                              [6, 3, 2, 1]>,
17360b57cec5SDimitry Andric  //
17370b57cec5SDimitry Andric  // Quad-register Fused FP Multiple-Accumulate
17380b57cec5SDimitry Andric  // Result written in N9, but that is relative to the last cycle of multicycle,
17390b57cec5SDimitry Andric  // so we use 10 for those cases
17400b57cec5SDimitry Andric  InstrItinData<IIC_VFMACQ,   [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
17410b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
17420b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsN],   0, Required>,
17430b57cec5SDimitry Andric                               // Extra latency cycles since wbck is 9 cycles
17440b57cec5SDimitry Andric                               InstrStage<10, [A9_DRegsVFP], 0, Reserved>,
17450b57cec5SDimitry Andric                               InstrStage<4, [A9_NPipe]>],
17460b57cec5SDimitry Andric                              [8, 4, 2, 1]>,
17470b57cec5SDimitry Andric  //
17480b57cec5SDimitry Andric  // Double-register Reciprical Step
17490b57cec5SDimitry Andric  InstrItinData<IIC_VRECSD,   [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
17500b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
17510b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsN],   0, Required>,
17520b57cec5SDimitry Andric                               // Extra latency cycles since wbck is 10 cycles
17530b57cec5SDimitry Andric                               InstrStage<11, [A9_DRegsVFP], 0, Reserved>,
17540b57cec5SDimitry Andric                               InstrStage<1, [A9_NPipe]>],
17550b57cec5SDimitry Andric                              [9, 2, 2]>,
17560b57cec5SDimitry Andric  //
17570b57cec5SDimitry Andric  // Quad-register Reciprical Step
17580b57cec5SDimitry Andric  InstrItinData<IIC_VRECSQ,   [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
17590b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
17600b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsN],   0, Required>,
17610b57cec5SDimitry Andric                               // Extra latency cycles since wbck is 11 cycles
17620b57cec5SDimitry Andric                               InstrStage<12, [A9_DRegsVFP], 0, Reserved>,
17630b57cec5SDimitry Andric                               InstrStage<2, [A9_NPipe]>],
17640b57cec5SDimitry Andric                              [10, 2, 2]>,
17650b57cec5SDimitry Andric  //
17660b57cec5SDimitry Andric  // Double-register Permute
17670b57cec5SDimitry Andric  InstrItinData<IIC_VPERMD,   [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
17680b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
17690b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsN],   0, Required>,
17700b57cec5SDimitry Andric                               // Extra latency cycles since wbck is 6 cycles
17710b57cec5SDimitry Andric                               InstrStage<7, [A9_DRegsVFP], 0, Reserved>,
17720b57cec5SDimitry Andric                               InstrStage<1, [A9_NPipe]>],
17730b57cec5SDimitry Andric                              [2, 2, 1, 1]>,
17740b57cec5SDimitry Andric  //
17750b57cec5SDimitry Andric  // Quad-register Permute
17760b57cec5SDimitry Andric  // Result written in N2, but that is relative to the last cycle of multicycle,
17770b57cec5SDimitry Andric  // so we use 3 for those cases
17780b57cec5SDimitry Andric  InstrItinData<IIC_VPERMQ,   [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
17790b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
17800b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsN],   0, Required>,
17810b57cec5SDimitry Andric                               // Extra latency cycles since wbck is 7 cycles
17820b57cec5SDimitry Andric                               InstrStage<8, [A9_DRegsVFP], 0, Reserved>,
17830b57cec5SDimitry Andric                               InstrStage<2, [A9_NPipe]>],
17840b57cec5SDimitry Andric                              [3, 3, 1, 1]>,
17850b57cec5SDimitry Andric  //
17860b57cec5SDimitry Andric  // Quad-register Permute (3 cycle issue)
17870b57cec5SDimitry Andric  // Result written in N2, but that is relative to the last cycle of multicycle,
17880b57cec5SDimitry Andric  // so we use 4 for those cases
17890b57cec5SDimitry Andric  InstrItinData<IIC_VPERMQ3,  [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
17900b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
17910b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsN],   0, Required>,
17920b57cec5SDimitry Andric                               // Extra latency cycles since wbck is 8 cycles
17930b57cec5SDimitry Andric                               InstrStage<9, [A9_DRegsVFP], 0, Reserved>,
17940b57cec5SDimitry Andric                               InstrStage<3, [A9_NPipe]>],
17950b57cec5SDimitry Andric                              [4, 4, 1, 1]>,
17960b57cec5SDimitry Andric
17970b57cec5SDimitry Andric  //
17980b57cec5SDimitry Andric  // Double-register VEXT
17990b57cec5SDimitry Andric  InstrItinData<IIC_VEXTD,    [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
18000b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
18010b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsN],   0, Required>,
18020b57cec5SDimitry Andric                               // Extra latency cycles since wbck is 6 cycles
18030b57cec5SDimitry Andric                               InstrStage<7, [A9_DRegsVFP], 0, Reserved>,
18040b57cec5SDimitry Andric                               InstrStage<1, [A9_NPipe]>],
18050b57cec5SDimitry Andric                              [2, 1, 1]>,
18060b57cec5SDimitry Andric  //
18070b57cec5SDimitry Andric  // Quad-register VEXT
18080b57cec5SDimitry Andric  InstrItinData<IIC_VEXTQ,    [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
18090b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
18100b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsN],   0, Required>,
18110b57cec5SDimitry Andric                               // Extra latency cycles since wbck is 7 cycles
18120b57cec5SDimitry Andric                               InstrStage<8, [A9_DRegsVFP], 0, Reserved>,
18130b57cec5SDimitry Andric                               InstrStage<2, [A9_NPipe]>],
18140b57cec5SDimitry Andric                              [3, 1, 2]>,
18150b57cec5SDimitry Andric  //
18160b57cec5SDimitry Andric  // VTB
18170b57cec5SDimitry Andric  InstrItinData<IIC_VTB1,     [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
18180b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
18190b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsN],   0, Required>,
18200b57cec5SDimitry Andric                               // Extra latency cycles since wbck is 7 cycles
18210b57cec5SDimitry Andric                               InstrStage<8, [A9_DRegsVFP], 0, Reserved>,
18220b57cec5SDimitry Andric                               InstrStage<2, [A9_NPipe]>],
18230b57cec5SDimitry Andric                              [3, 2, 1]>,
18240b57cec5SDimitry Andric  InstrItinData<IIC_VTB2,     [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
18250b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
18260b57cec5SDimitry Andric                               InstrStage<2, [A9_DRegsN],   0, Required>,
18270b57cec5SDimitry Andric                               // Extra latency cycles since wbck is 7 cycles
18280b57cec5SDimitry Andric                               InstrStage<8, [A9_DRegsVFP], 0, Reserved>,
18290b57cec5SDimitry Andric                               InstrStage<2, [A9_NPipe]>],
18300b57cec5SDimitry Andric                              [3, 2, 2, 1]>,
18310b57cec5SDimitry Andric  InstrItinData<IIC_VTB3,     [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
18320b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
18330b57cec5SDimitry Andric                               InstrStage<2, [A9_DRegsN],   0, Required>,
18340b57cec5SDimitry Andric                               // Extra latency cycles since wbck is 8 cycles
18350b57cec5SDimitry Andric                               InstrStage<9, [A9_DRegsVFP], 0, Reserved>,
18360b57cec5SDimitry Andric                               InstrStage<3, [A9_NPipe]>],
18370b57cec5SDimitry Andric                              [4, 2, 2, 3, 1]>,
18380b57cec5SDimitry Andric  InstrItinData<IIC_VTB4,     [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
18390b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
18400b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsN],   0, Required>,
18410b57cec5SDimitry Andric                               // Extra latency cycles since wbck is 8 cycles
18420b57cec5SDimitry Andric                               InstrStage<9, [A9_DRegsVFP], 0, Reserved>,
18430b57cec5SDimitry Andric                               InstrStage<3, [A9_NPipe]>],
18440b57cec5SDimitry Andric                              [4, 2, 2, 3, 3, 1]>,
18450b57cec5SDimitry Andric  //
18460b57cec5SDimitry Andric  // VTBX
18470b57cec5SDimitry Andric  InstrItinData<IIC_VTBX1,    [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
18480b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
18490b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsN],   0, Required>,
18500b57cec5SDimitry Andric                               // Extra latency cycles since wbck is 7 cycles
18510b57cec5SDimitry Andric                               InstrStage<8, [A9_DRegsVFP], 0, Reserved>,
18520b57cec5SDimitry Andric                               InstrStage<2, [A9_NPipe]>],
18530b57cec5SDimitry Andric                              [3, 1, 2, 1]>,
18540b57cec5SDimitry Andric  InstrItinData<IIC_VTBX2,    [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
18550b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
18560b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsN],   0, Required>,
18570b57cec5SDimitry Andric                               // Extra latency cycles since wbck is 7 cycles
18580b57cec5SDimitry Andric                               InstrStage<8, [A9_DRegsVFP], 0, Reserved>,
18590b57cec5SDimitry Andric                               InstrStage<2, [A9_NPipe]>],
18600b57cec5SDimitry Andric                              [3, 1, 2, 2, 1]>,
18610b57cec5SDimitry Andric  InstrItinData<IIC_VTBX3,    [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
18620b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
18630b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsN],   0, Required>,
18640b57cec5SDimitry Andric                               // Extra latency cycles since wbck is 8 cycles
18650b57cec5SDimitry Andric                               InstrStage<9, [A9_DRegsVFP], 0, Reserved>,
18660b57cec5SDimitry Andric                               InstrStage<3, [A9_NPipe]>],
18670b57cec5SDimitry Andric                              [4, 1, 2, 2, 3, 1]>,
18680b57cec5SDimitry Andric  InstrItinData<IIC_VTBX4,    [InstrStage<1, [A9_Issue0, A9_Issue1], 0>,
18690b57cec5SDimitry Andric                               InstrStage<1, [A9_MUX0], 0>,
18700b57cec5SDimitry Andric                               InstrStage<1, [A9_DRegsN],   0, Required>,
18710b57cec5SDimitry Andric                               // Extra latency cycles since wbck is 8 cycles
18720b57cec5SDimitry Andric                               InstrStage<9, [A9_DRegsVFP], 0, Reserved>,
18730b57cec5SDimitry Andric                               InstrStage<2, [A9_NPipe]>],
18740b57cec5SDimitry Andric                              [4, 1, 2, 2, 3, 3, 1]>
18750b57cec5SDimitry Andric]>;
18760b57cec5SDimitry Andric
18770b57cec5SDimitry Andric// ===---------------------------------------------------------------------===//
18780b57cec5SDimitry Andric// The following definitions describe the simpler per-operand machine model.
18790b57cec5SDimitry Andric// This works with MachineScheduler and will eventually replace itineraries.
18800b57cec5SDimitry Andric
18810b57cec5SDimitry Andricclass A9WriteLMOpsListType<list<WriteSequence> writes> {
18820b57cec5SDimitry Andric  list <WriteSequence> Writes = writes;
18830b57cec5SDimitry Andric  SchedMachineModel SchedModel = ?;
18840b57cec5SDimitry Andric}
18850b57cec5SDimitry Andric
18860b57cec5SDimitry Andric// Cortex-A9 machine model for scheduling and other instruction cost heuristics.
18870b57cec5SDimitry Andricdef CortexA9Model : SchedMachineModel {
18880b57cec5SDimitry Andric  let IssueWidth = 2; // 2 micro-ops are dispatched per cycle.
18890b57cec5SDimitry Andric  let MicroOpBufferSize = 56; // Based on available renamed registers.
18900b57cec5SDimitry Andric  let LoadLatency = 2; // Optimistic load latency assuming bypass.
18910b57cec5SDimitry Andric                       // This is overriden by OperandCycles if the
18920b57cec5SDimitry Andric                       // Itineraries are queried instead.
18930b57cec5SDimitry Andric  let MispredictPenalty = 8; // Based on estimate of pipeline depth.
18940b57cec5SDimitry Andric
18950b57cec5SDimitry Andric  let Itineraries = CortexA9Itineraries;
18960b57cec5SDimitry Andric
18970b57cec5SDimitry Andric  // FIXME: Many vector operations were never given an itinerary. We
18980b57cec5SDimitry Andric  // haven't mapped these to the new model either.
18990b57cec5SDimitry Andric  let CompleteModel = 0;
19000b57cec5SDimitry Andric
19010b57cec5SDimitry Andric  // FIXME: Remove when all errors have been fixed.
19020b57cec5SDimitry Andric  let FullInstRWOverlapCheck = 0;
19030b57cec5SDimitry Andric}
19040b57cec5SDimitry Andric
19050b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
19060b57cec5SDimitry Andric// Define each kind of processor resource and number available.
19070b57cec5SDimitry Andric//
19080b57cec5SDimitry Andric// The AGU unit has BufferSize=1 so that the latency between operations
19090b57cec5SDimitry Andric// that use it are considered to stall other operations.
19100b57cec5SDimitry Andric//
19110b57cec5SDimitry Andric// The FP unit has BufferSize=0 so that it is a hard dispatch
19120b57cec5SDimitry Andric// hazard. No instruction may be dispatched while the unit is reserved.
19130b57cec5SDimitry Andric
19140b57cec5SDimitry Andriclet SchedModel = CortexA9Model in {
19150b57cec5SDimitry Andric
19160b57cec5SDimitry Andricdef A9UnitALU : ProcResource<2>;
19170b57cec5SDimitry Andricdef A9UnitMul : ProcResource<1> { let Super = A9UnitALU; }
19180b57cec5SDimitry Andricdef A9UnitAGU : ProcResource<1> { let BufferSize = 1; }
19190b57cec5SDimitry Andricdef A9UnitLS  : ProcResource<1>;
19200b57cec5SDimitry Andricdef A9UnitFP  : ProcResource<1> { let BufferSize = 0; }
19210b57cec5SDimitry Andricdef A9UnitB   : ProcResource<1>;
19220b57cec5SDimitry Andric
19230b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
19240b57cec5SDimitry Andric// Define scheduler read/write types with their resources and latency on A9.
19250b57cec5SDimitry Andric
19260b57cec5SDimitry Andric// Consume an issue slot, but no processor resources. This is useful when all
19270b57cec5SDimitry Andric// other writes associated with the operand have NumMicroOps = 0.
19280b57cec5SDimitry Andricdef A9WriteIssue : SchedWriteRes<[]> { let Latency = 0; }
19290b57cec5SDimitry Andric
19300b57cec5SDimitry Andric// Write an integer register.
19310b57cec5SDimitry Andricdef A9WriteI : SchedWriteRes<[A9UnitALU]>;
19320b57cec5SDimitry Andric// Write an integer shifted-by register
19330b57cec5SDimitry Andricdef A9WriteIsr : SchedWriteRes<[A9UnitALU]> { let Latency = 2; }
19340b57cec5SDimitry Andric
19350b57cec5SDimitry Andric// Basic ALU.
19360b57cec5SDimitry Andricdef A9WriteALU : SchedWriteRes<[A9UnitALU]>;
19370b57cec5SDimitry Andric// ALU with operand shifted by immediate.
19380b57cec5SDimitry Andricdef : WriteRes<WriteALUsi, [A9UnitALU]> { let Latency = 2; }
19390b57cec5SDimitry Andric// ALU with operand shifted by register.
19400b57cec5SDimitry Andricdef A9WriteALUsr : SchedWriteRes<[A9UnitALU]> { let Latency = 3; }
19410b57cec5SDimitry Andric
19420b57cec5SDimitry Andric// Multiplication
19430b57cec5SDimitry Andricdef A9WriteM   : SchedWriteRes<[A9UnitMul, A9UnitMul]> { let Latency = 4; }
19440b57cec5SDimitry Andricdef A9WriteMHi : SchedWriteRes<[A9UnitMul]> { let Latency = 5;
19450b57cec5SDimitry Andric                                              let NumMicroOps = 0; }
19460b57cec5SDimitry Andricdef A9WriteM16   : SchedWriteRes<[A9UnitMul]> { let Latency = 3; }
19470b57cec5SDimitry Andricdef A9WriteM16Hi : SchedWriteRes<[A9UnitMul]> { let Latency = 4;
19480b57cec5SDimitry Andric                                                let NumMicroOps = 0; }
19490b57cec5SDimitry Andricdef : SchedAlias<WriteMUL16, A9WriteM16>;
19500b57cec5SDimitry Andricdef : SchedAlias<WriteMUL32, A9WriteM>;
19510b57cec5SDimitry Andricdef : SchedAlias<WriteMUL64Lo, A9WriteM>;
19520b57cec5SDimitry Andricdef : SchedAlias<WriteMUL64Hi, A9WriteMHi>;
19530b57cec5SDimitry Andricdef : SchedAlias<WriteMAC16, A9WriteM16>;
19540b57cec5SDimitry Andricdef : SchedAlias<WriteMAC32, A9WriteM>;
19550b57cec5SDimitry Andricdef : SchedAlias<WriteMAC64Lo, A9WriteM>;
19560b57cec5SDimitry Andricdef : SchedAlias<WriteMAC64Hi, A9WriteMHi>;
19570b57cec5SDimitry Andricdef : ReadAdvance<ReadMUL, 0>;
19580b57cec5SDimitry Andricdef : ReadAdvance<ReadMAC, 0>;
19590b57cec5SDimitry Andric
19600b57cec5SDimitry Andric// Floating-point
19610b57cec5SDimitry Andric// Only one FP or AGU instruction may issue per cycle. We model this
19620b57cec5SDimitry Andric// by having FP instructions consume the AGU resource.
19630b57cec5SDimitry Andricdef A9WriteF      : SchedWriteRes<[A9UnitFP, A9UnitAGU]> { let Latency = 4; }
19640b57cec5SDimitry Andricdef A9WriteFMov   : SchedWriteRes<[A9UnitFP, A9UnitAGU]> { let Latency = 1; }
19650b57cec5SDimitry Andricdef A9WriteFMulS  : SchedWriteRes<[A9UnitFP, A9UnitAGU]> { let Latency = 5; }
19660b57cec5SDimitry Andricdef A9WriteFMulD  : SchedWriteRes<[A9UnitFP, A9UnitAGU]> { let Latency = 6; }
19670b57cec5SDimitry Andricdef A9WriteFMAS   : SchedWriteRes<[A9UnitFP, A9UnitAGU]> { let Latency = 8; }
19680b57cec5SDimitry Andric
19690b57cec5SDimitry Andricdef A9WriteFMAD   : SchedWriteRes<[A9UnitFP, A9UnitAGU]> { let Latency = 9; }
19700b57cec5SDimitry Andricdef A9WriteFDivS  : SchedWriteRes<[A9UnitFP, A9UnitAGU]> { let Latency = 15; }
19710b57cec5SDimitry Andricdef A9WriteFDivD  : SchedWriteRes<[A9UnitFP, A9UnitAGU]> { let Latency = 25; }
19720b57cec5SDimitry Andricdef A9WriteFSqrtS : SchedWriteRes<[A9UnitFP, A9UnitAGU]> { let Latency = 17; }
19730b57cec5SDimitry Andricdef A9WriteFSqrtD : SchedWriteRes<[A9UnitFP, A9UnitAGU]> { let Latency = 32; }
19740b57cec5SDimitry Andric
19750b57cec5SDimitry Andric// NEON has an odd mix of latencies. Simply name the write types by latency.
19760b57cec5SDimitry Andricdef A9WriteV1 : SchedWriteRes<[A9UnitFP, A9UnitAGU]> { let Latency = 1; }
19770b57cec5SDimitry Andricdef A9WriteV2 : SchedWriteRes<[A9UnitFP, A9UnitAGU]> { let Latency = 2; }
19780b57cec5SDimitry Andricdef A9WriteV3 : SchedWriteRes<[A9UnitFP, A9UnitAGU]> { let Latency = 3; }
19790b57cec5SDimitry Andricdef A9WriteV4 : SchedWriteRes<[A9UnitFP, A9UnitAGU]> { let Latency = 4; }
19800b57cec5SDimitry Andricdef A9WriteV5 : SchedWriteRes<[A9UnitFP, A9UnitAGU]> { let Latency = 5; }
19810b57cec5SDimitry Andricdef A9WriteV6 : SchedWriteRes<[A9UnitFP, A9UnitAGU]> { let Latency = 6; }
19820b57cec5SDimitry Andricdef A9WriteV7 : SchedWriteRes<[A9UnitFP, A9UnitAGU]> { let Latency = 7; }
19830b57cec5SDimitry Andricdef A9WriteV9 : SchedWriteRes<[A9UnitFP, A9UnitAGU]> { let Latency = 9; }
19840b57cec5SDimitry Andricdef A9WriteV10 : SchedWriteRes<[A9UnitFP, A9UnitAGU]> { let Latency = 10; }
19850b57cec5SDimitry Andric
19860b57cec5SDimitry Andricdef : WriteRes<WriteVLD1, []>;
19870b57cec5SDimitry Andricdef : WriteRes<WriteVLD2, []>;
19880b57cec5SDimitry Andricdef : WriteRes<WriteVLD3, []>;
19890b57cec5SDimitry Andricdef : WriteRes<WriteVLD4, []>;
19900b57cec5SDimitry Andricdef : WriteRes<WriteVST1, []>;
19910b57cec5SDimitry Andricdef : WriteRes<WriteVST2, []>;
19920b57cec5SDimitry Andricdef : WriteRes<WriteVST3, []>;
19930b57cec5SDimitry Andricdef : WriteRes<WriteVST4, []>;
19940b57cec5SDimitry Andric
19950b57cec5SDimitry Andric// Reserve A9UnitFP for 2 consecutive cycles.
19960b57cec5SDimitry Andricdef A9Write2V4 : SchedWriteRes<[A9UnitFP, A9UnitAGU]> {
19970b57cec5SDimitry Andric  let Latency = 4;
19980b57cec5SDimitry Andric  let ResourceCycles = [2, 1];
19990b57cec5SDimitry Andric}
20000b57cec5SDimitry Andricdef A9Write2V7 : SchedWriteRes<[A9UnitFP, A9UnitAGU]> {
20010b57cec5SDimitry Andric  let Latency = 7;
20020b57cec5SDimitry Andric  let ResourceCycles = [2, 1];
20030b57cec5SDimitry Andric}
20040b57cec5SDimitry Andricdef A9Write2V9 : SchedWriteRes<[A9UnitFP, A9UnitAGU]> {
20050b57cec5SDimitry Andric  let Latency = 9;
20060b57cec5SDimitry Andric  let ResourceCycles = [2, 1];
20070b57cec5SDimitry Andric}
20080b57cec5SDimitry Andric
20090b57cec5SDimitry Andric// Branches don't have a def operand but still consume resources.
20100b57cec5SDimitry Andricdef A9WriteB : SchedWriteRes<[A9UnitB]>;
20110b57cec5SDimitry Andric
20120b57cec5SDimitry Andric// Address generation.
20130b57cec5SDimitry Andricdef A9WriteAdr : SchedWriteRes<[A9UnitAGU]> { let NumMicroOps = 0; }
20140b57cec5SDimitry Andric
20150b57cec5SDimitry Andric// Load Integer.
20160b57cec5SDimitry Andricdef A9WriteL : SchedWriteRes<[A9UnitLS]> { let Latency = 3; }
20170b57cec5SDimitry Andricdef : SchedAlias<WriteLd, A9WriteL>;
20180b57cec5SDimitry Andric// Load the upper 32-bits using the same micro-op.
20190b57cec5SDimitry Andricdef A9WriteLHi : SchedWriteRes<[]> { let Latency = 3;
20200b57cec5SDimitry Andric                                     let NumMicroOps = 0; }
20210b57cec5SDimitry Andric// Offset shifted by register.
20220b57cec5SDimitry Andricdef A9WriteLsi : SchedWriteRes<[A9UnitLS]> { let Latency = 4; }
20230b57cec5SDimitry Andric// Load (and zero extend) a byte.
20240b57cec5SDimitry Andricdef A9WriteLb : SchedWriteRes<[A9UnitLS]> { let Latency = 4; }
20250b57cec5SDimitry Andricdef A9WriteLbsi : SchedWriteRes<[A9UnitLS]> { let Latency = 5; }
20260b57cec5SDimitry Andric
20270b57cec5SDimitry Andric// Load or Store Float, aligned.
20280b57cec5SDimitry Andricdef A9WriteLSfp : SchedWriteRes<[A9UnitLS, A9UnitFP]> { let Latency = 1; }
20290b57cec5SDimitry Andric
20300b57cec5SDimitry Andric// Store Integer.
20310b57cec5SDimitry Andricdef A9WriteS : SchedWriteRes<[A9UnitLS]>;
20320b57cec5SDimitry Andric
20330b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
20340b57cec5SDimitry Andric// Define resources dynamically for load multiple variants.
20350b57cec5SDimitry Andric
20360b57cec5SDimitry Andric// Define helpers for extra latency without consuming resources.
20370b57cec5SDimitry Andricdef A9WriteCycle1 : SchedWriteRes<[]> { let Latency = 1; let NumMicroOps = 0; }
20380b57cec5SDimitry Andricforeach NumCycles = 2-8 in {
20390b57cec5SDimitry Andricdef A9WriteCycle#NumCycles : WriteSequence<[A9WriteCycle1], NumCycles>;
20400b57cec5SDimitry Andric} // foreach NumCycles
20410b57cec5SDimitry Andric
20420b57cec5SDimitry Andric// Define address generation sequences and predicates for 8 flavors of LDMs.
20430b57cec5SDimitry Andricforeach NumAddr = 1-8 in {
20440b57cec5SDimitry Andric
20450b57cec5SDimitry Andric// Define A9WriteAdr1-8 as a sequence of A9WriteAdr with additive
20460b57cec5SDimitry Andric// latency for instructions that generate multiple loads or stores.
20470b57cec5SDimitry Andricdef A9WriteAdr#NumAddr : WriteSequence<[A9WriteAdr], NumAddr>;
20480b57cec5SDimitry Andric
20490b57cec5SDimitry Andric// Define a predicate to select the LDM based on number of memory addresses.
20500b57cec5SDimitry Andricdef A9LMAdr#NumAddr#Pred :
20510b57cec5SDimitry Andric  SchedPredicate<"(TII->getNumLDMAddresses(*MI)+1)/2 == "#NumAddr>;
20520b57cec5SDimitry Andric
20530b57cec5SDimitry Andric} // foreach NumAddr
20540b57cec5SDimitry Andric
20550b57cec5SDimitry Andric// Fall-back for unknown LDMs.
20560b57cec5SDimitry Andricdef A9LMUnknownPred : SchedPredicate<"TII->getNumLDMAddresses(*MI) == 0">;
20570b57cec5SDimitry Andric
20580b57cec5SDimitry Andric// LDM/VLDM/VLDn address generation latency & resources.
20590b57cec5SDimitry Andric// Dynamically select the A9WriteAdrN sequence using a predicate.
20600b57cec5SDimitry Andricdef A9WriteLMAdr : SchedWriteVariant<[
20610b57cec5SDimitry Andric  SchedVar<A9LMAdr1Pred, [A9WriteAdr1]>,
20620b57cec5SDimitry Andric  SchedVar<A9LMAdr2Pred, [A9WriteAdr2]>,
20630b57cec5SDimitry Andric  SchedVar<A9LMAdr3Pred, [A9WriteAdr3]>,
20640b57cec5SDimitry Andric  SchedVar<A9LMAdr4Pred, [A9WriteAdr4]>,
20650b57cec5SDimitry Andric  SchedVar<A9LMAdr5Pred, [A9WriteAdr5]>,
20660b57cec5SDimitry Andric  SchedVar<A9LMAdr6Pred, [A9WriteAdr6]>,
20670b57cec5SDimitry Andric  SchedVar<A9LMAdr7Pred, [A9WriteAdr7]>,
20680b57cec5SDimitry Andric  SchedVar<A9LMAdr8Pred, [A9WriteAdr8]>,
20690b57cec5SDimitry Andric  // For unknown LDM/VLDM/VSTM, assume 2 32-bit registers.
20700b57cec5SDimitry Andric  SchedVar<A9LMUnknownPred, [A9WriteAdr2]>]>;
20710b57cec5SDimitry Andric
20720b57cec5SDimitry Andric// Define LDM Resources.
20730b57cec5SDimitry Andric// These take no issue resource, so they can be combined with other
20740b57cec5SDimitry Andric// writes like WriteB.
20750b57cec5SDimitry Andric// A9WriteLMLo takes a single LS resource and 2 cycles.
20760b57cec5SDimitry Andricdef A9WriteLMLo : SchedWriteRes<[A9UnitLS]> { let Latency = 2;
20770b57cec5SDimitry Andric                                              let NumMicroOps = 0; }
20780b57cec5SDimitry Andric// Assuming aligned access, the upper half of each pair is free with
20790b57cec5SDimitry Andric// the same latency.
20800b57cec5SDimitry Andricdef A9WriteLMHi : SchedWriteRes<[]> { let Latency = 2;
20810b57cec5SDimitry Andric                                      let NumMicroOps = 0; }
20820b57cec5SDimitry Andric// Each A9WriteL#N variant adds N cycles of latency without consuming
20830b57cec5SDimitry Andric// additional resources.
20840b57cec5SDimitry Andricforeach NumAddr = 1-8 in {
20850b57cec5SDimitry Andricdef A9WriteL#NumAddr : WriteSequence<
20860b57cec5SDimitry Andric  [A9WriteLMLo, !cast<SchedWrite>("A9WriteCycle"#NumAddr)]>;
20870b57cec5SDimitry Andricdef A9WriteL#NumAddr#Hi : WriteSequence<
20880b57cec5SDimitry Andric  [A9WriteLMHi, !cast<SchedWrite>("A9WriteCycle"#NumAddr)]>;
20890b57cec5SDimitry Andric}
20900b57cec5SDimitry Andric
20910b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
20920b57cec5SDimitry Andric// LDM: Load multiple into 32-bit integer registers.
20930b57cec5SDimitry Andric
20940b57cec5SDimitry Andricdef A9WriteLMOpsList : A9WriteLMOpsListType<
20950b57cec5SDimitry Andric                 [A9WriteL1, A9WriteL1Hi,
20960b57cec5SDimitry Andric                  A9WriteL2, A9WriteL2Hi,
20970b57cec5SDimitry Andric                  A9WriteL3, A9WriteL3Hi,
20980b57cec5SDimitry Andric                  A9WriteL4, A9WriteL4Hi,
20990b57cec5SDimitry Andric                  A9WriteL5, A9WriteL5Hi,
21000b57cec5SDimitry Andric                  A9WriteL6, A9WriteL6Hi,
21010b57cec5SDimitry Andric                  A9WriteL7, A9WriteL7Hi,
21020b57cec5SDimitry Andric                  A9WriteL8, A9WriteL8Hi]>;
21030b57cec5SDimitry Andric
21040b57cec5SDimitry Andric// A9WriteLM variants expand into a pair of writes for each 64-bit
21050b57cec5SDimitry Andric// value loaded. When the number of registers is odd, the last
21060b57cec5SDimitry Andric// A9WriteLnHi is naturally ignored because the instruction has no
21070b57cec5SDimitry Andric// following def operands.  These variants take no issue resource, so
21080b57cec5SDimitry Andric// they may need to be part of a WriteSequence that includes A9WriteIssue.
21090b57cec5SDimitry Andricdef A9WriteLM : SchedWriteVariant<[
21100b57cec5SDimitry Andric  SchedVar<A9LMAdr1Pred, A9WriteLMOpsList.Writes[0-1]>,
21110b57cec5SDimitry Andric  SchedVar<A9LMAdr2Pred, A9WriteLMOpsList.Writes[0-3]>,
21120b57cec5SDimitry Andric  SchedVar<A9LMAdr3Pred, A9WriteLMOpsList.Writes[0-5]>,
21130b57cec5SDimitry Andric  SchedVar<A9LMAdr4Pred, A9WriteLMOpsList.Writes[0-7]>,
21140b57cec5SDimitry Andric  SchedVar<A9LMAdr5Pred, A9WriteLMOpsList.Writes[0-9]>,
21150b57cec5SDimitry Andric  SchedVar<A9LMAdr6Pred, A9WriteLMOpsList.Writes[0-11]>,
21160b57cec5SDimitry Andric  SchedVar<A9LMAdr7Pred, A9WriteLMOpsList.Writes[0-13]>,
21170b57cec5SDimitry Andric  SchedVar<A9LMAdr8Pred, A9WriteLMOpsList.Writes[0-15]>,
21180b57cec5SDimitry Andric  // For unknown LDMs, define the maximum number of writes, but only
21190b57cec5SDimitry Andric  // make the first two consume resources.
21200b57cec5SDimitry Andric  SchedVar<A9LMUnknownPred, [A9WriteL1, A9WriteL1Hi,
21210b57cec5SDimitry Andric                             A9WriteL2, A9WriteL2Hi,
21220b57cec5SDimitry Andric                             A9WriteL3Hi, A9WriteL3Hi,
21230b57cec5SDimitry Andric                             A9WriteL4Hi, A9WriteL4Hi,
21240b57cec5SDimitry Andric                             A9WriteL5Hi, A9WriteL5Hi,
21250b57cec5SDimitry Andric                             A9WriteL6Hi, A9WriteL6Hi,
21260b57cec5SDimitry Andric                             A9WriteL7Hi, A9WriteL7Hi,
21270b57cec5SDimitry Andric                             A9WriteL8Hi, A9WriteL8Hi]>]> {
21280b57cec5SDimitry Andric  let Variadic = 1;
21290b57cec5SDimitry Andric}
21300b57cec5SDimitry Andric
21310b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
21320b57cec5SDimitry Andric// VFP Load/Store Multiple Variants, and NEON VLDn/VSTn support.
21330b57cec5SDimitry Andric
21340b57cec5SDimitry Andric// A9WriteLfpOp is the same as A9WriteLSfp but takes no issue resources
21350b57cec5SDimitry Andric// so can be used in WriteSequences for in single-issue instructions that
21360b57cec5SDimitry Andric// encapsulate multiple loads.
21370b57cec5SDimitry Andricdef A9WriteLfpOp : SchedWriteRes<[A9UnitLS, A9UnitFP]> {
21380b57cec5SDimitry Andric  let Latency = 1;
21390b57cec5SDimitry Andric  let NumMicroOps = 0;
21400b57cec5SDimitry Andric}
21410b57cec5SDimitry Andric
21420b57cec5SDimitry Andricforeach NumAddr = 1-8 in {
21430b57cec5SDimitry Andric
21440b57cec5SDimitry Andric// Helper for A9WriteLfp1-8: A sequence of fp loads with no micro-ops.
21450b57cec5SDimitry Andricdef A9WriteLfp#NumAddr#Seq : WriteSequence<[A9WriteLfpOp], NumAddr>;
21460b57cec5SDimitry Andric
21470b57cec5SDimitry Andric// A9WriteLfp1-8 definitions are statically expanded into a sequence of
21480b57cec5SDimitry Andric// A9WriteLfpOps with additive latency that takes a single issue slot.
21490b57cec5SDimitry Andric// Used directly to describe NEON VLDn.
21500b57cec5SDimitry Andricdef A9WriteLfp#NumAddr : WriteSequence<
21510b57cec5SDimitry Andric  [A9WriteIssue, !cast<SchedWrite>("A9WriteLfp"#NumAddr#Seq)]>;
21520b57cec5SDimitry Andric
21530b57cec5SDimitry Andric// A9WriteLfp1-8Mov adds a cycle of latency and FP resource for
21540b57cec5SDimitry Andric// permuting loaded values.
21550b57cec5SDimitry Andricdef A9WriteLfp#NumAddr#Mov : WriteSequence<
21560b57cec5SDimitry Andric  [A9WriteF, !cast<SchedWrite>("A9WriteLfp"#NumAddr#Seq)]>;
21570b57cec5SDimitry Andric
21580b57cec5SDimitry Andric} // foreach NumAddr
21590b57cec5SDimitry Andric
21600b57cec5SDimitry Andric// Define VLDM/VSTM PreRA resources.
21610b57cec5SDimitry Andric// A9WriteLMfpPreRA are dynamically expanded into the correct
21620b57cec5SDimitry Andric// A9WriteLfp1-8 sequence based on a predicate. This supports the
21630b57cec5SDimitry Andric// preRA VLDM variants in which all 64-bit loads are written to the
21640b57cec5SDimitry Andric// same tuple of either single or double precision registers.
21650b57cec5SDimitry Andricdef A9WriteLMfpPreRA : SchedWriteVariant<[
21660b57cec5SDimitry Andric  SchedVar<A9LMAdr1Pred, [A9WriteLfp1]>,
21670b57cec5SDimitry Andric  SchedVar<A9LMAdr2Pred, [A9WriteLfp2]>,
21680b57cec5SDimitry Andric  SchedVar<A9LMAdr3Pred, [A9WriteLfp3]>,
21690b57cec5SDimitry Andric  SchedVar<A9LMAdr4Pred, [A9WriteLfp4]>,
21700b57cec5SDimitry Andric  SchedVar<A9LMAdr5Pred, [A9WriteLfp5]>,
21710b57cec5SDimitry Andric  SchedVar<A9LMAdr6Pred, [A9WriteLfp6]>,
21720b57cec5SDimitry Andric  SchedVar<A9LMAdr7Pred, [A9WriteLfp7]>,
21730b57cec5SDimitry Andric  SchedVar<A9LMAdr8Pred, [A9WriteLfp8]>,
21740b57cec5SDimitry Andric  // For unknown VLDM/VSTM PreRA, assume 2xS registers.
21750b57cec5SDimitry Andric  SchedVar<A9LMUnknownPred, [A9WriteLfp2]>]>;
21760b57cec5SDimitry Andric
21770b57cec5SDimitry Andric// Define VLDM/VSTM PostRA Resources.
21780b57cec5SDimitry Andric// A9WriteLMfpLo takes a LS and FP resource and one issue slot but no latency.
21790b57cec5SDimitry Andricdef A9WriteLMfpLo : SchedWriteRes<[A9UnitLS, A9UnitFP]> { let Latency = 0; }
21800b57cec5SDimitry Andric
21810b57cec5SDimitry Andricforeach NumAddr = 1-8 in {
21820b57cec5SDimitry Andric
21830b57cec5SDimitry Andric// Each A9WriteL#N variant adds N cycles of latency without consuming
21840b57cec5SDimitry Andric// additional resources.
21850b57cec5SDimitry Andricdef A9WriteLMfp#NumAddr : WriteSequence<
21860b57cec5SDimitry Andric  [A9WriteLMfpLo, !cast<SchedWrite>("A9WriteCycle"#NumAddr)]>;
21870b57cec5SDimitry Andric
21880b57cec5SDimitry Andric// Assuming aligned access, the upper half of each pair is free with
21890b57cec5SDimitry Andric// the same latency.
21900b57cec5SDimitry Andricdef A9WriteLMfp#NumAddr#Hi : WriteSequence<
21910b57cec5SDimitry Andric  [A9WriteLMHi, !cast<SchedWrite>("A9WriteCycle"#NumAddr)]>;
21920b57cec5SDimitry Andric
21930b57cec5SDimitry Andric} // foreach NumAddr
21940b57cec5SDimitry Andric
21950b57cec5SDimitry Andric// VLDM PostRA Variants. These variants expand A9WriteLMfpPostRA into a
21960b57cec5SDimitry Andric// pair of writes for each 64-bit data loaded. When the number of
21970b57cec5SDimitry Andric// registers is odd, the last WriteLMfpnHi is naturally ignored because
21980b57cec5SDimitry Andric// the instruction has no following def operands.
21990b57cec5SDimitry Andric
22000b57cec5SDimitry Andricdef A9WriteLMfpPostRAOpsList : A9WriteLMOpsListType<
22010b57cec5SDimitry Andric                 [A9WriteLMfp1, A9WriteLMfp2,       // 0-1
22020b57cec5SDimitry Andric                  A9WriteLMfp3, A9WriteLMfp4,       // 2-3
22030b57cec5SDimitry Andric                  A9WriteLMfp5, A9WriteLMfp6,       // 4-5
22040b57cec5SDimitry Andric                  A9WriteLMfp7, A9WriteLMfp8,       // 6-7
22050b57cec5SDimitry Andric                  A9WriteLMfp1Hi,                   // 8-8
22060b57cec5SDimitry Andric                  A9WriteLMfp2Hi, A9WriteLMfp2Hi,   // 9-10
22070b57cec5SDimitry Andric                  A9WriteLMfp3Hi, A9WriteLMfp3Hi,   // 11-12
22080b57cec5SDimitry Andric                  A9WriteLMfp4Hi, A9WriteLMfp4Hi,   // 13-14
22090b57cec5SDimitry Andric                  A9WriteLMfp5Hi, A9WriteLMfp5Hi,   // 15-16
22100b57cec5SDimitry Andric                  A9WriteLMfp6Hi, A9WriteLMfp6Hi,   // 17-18
22110b57cec5SDimitry Andric                  A9WriteLMfp7Hi, A9WriteLMfp7Hi,   // 19-20
22120b57cec5SDimitry Andric                  A9WriteLMfp8Hi, A9WriteLMfp8Hi]>; // 21-22
22130b57cec5SDimitry Andric
22140b57cec5SDimitry Andricdef A9WriteLMfpPostRA : SchedWriteVariant<[
22150b57cec5SDimitry Andric  SchedVar<A9LMAdr1Pred, A9WriteLMfpPostRAOpsList.Writes[0-0, 8-8]>,
22160b57cec5SDimitry Andric  SchedVar<A9LMAdr2Pred, A9WriteLMfpPostRAOpsList.Writes[0-1, 9-10]>,
22170b57cec5SDimitry Andric  SchedVar<A9LMAdr3Pred, A9WriteLMfpPostRAOpsList.Writes[0-2, 10-12]>,
22180b57cec5SDimitry Andric  SchedVar<A9LMAdr4Pred, A9WriteLMfpPostRAOpsList.Writes[0-3, 11-14]>,
22190b57cec5SDimitry Andric  SchedVar<A9LMAdr5Pred, A9WriteLMfpPostRAOpsList.Writes[0-4, 12-16]>,
22200b57cec5SDimitry Andric  SchedVar<A9LMAdr6Pred, A9WriteLMfpPostRAOpsList.Writes[0-5, 13-18]>,
22210b57cec5SDimitry Andric  SchedVar<A9LMAdr7Pred, A9WriteLMfpPostRAOpsList.Writes[0-6, 14-20]>,
22220b57cec5SDimitry Andric  SchedVar<A9LMAdr8Pred, A9WriteLMfpPostRAOpsList.Writes[0-7, 15-22]>,
22230b57cec5SDimitry Andric  // For unknown LDMs, define the maximum number of writes, but only
22240b57cec5SDimitry Andric  // make the first two consume resources. We are optimizing for the case
22250b57cec5SDimitry Andric  // where the operands are DPRs, and this determines the first eight
22260b57cec5SDimitry Andric  // types. The remaining eight types are filled to cover the case
22270b57cec5SDimitry Andric  // where the operands are SPRs.
22280b57cec5SDimitry Andric  SchedVar<A9LMUnknownPred, [A9WriteLMfp1, A9WriteLMfp2,
22290b57cec5SDimitry Andric                             A9WriteLMfp3Hi, A9WriteLMfp4Hi,
22300b57cec5SDimitry Andric                             A9WriteLMfp5Hi, A9WriteLMfp6Hi,
22310b57cec5SDimitry Andric                             A9WriteLMfp7Hi, A9WriteLMfp8Hi,
22320b57cec5SDimitry Andric                             A9WriteLMfp5Hi, A9WriteLMfp5Hi,
22330b57cec5SDimitry Andric                             A9WriteLMfp6Hi, A9WriteLMfp6Hi,
22340b57cec5SDimitry Andric                             A9WriteLMfp7Hi, A9WriteLMfp7Hi,
22350b57cec5SDimitry Andric                             A9WriteLMfp8Hi, A9WriteLMfp8Hi]>]> {
22360b57cec5SDimitry Andric  let Variadic = 1;
22370b57cec5SDimitry Andric}
22380b57cec5SDimitry Andric
22390b57cec5SDimitry Andric// Distinguish between our multiple MI-level forms of the same
22400b57cec5SDimitry Andric// VLDM/VSTM instructions.
22410b57cec5SDimitry Andricdef A9PreRA : SchedPredicate<
22428bcb0991SDimitry Andric  "Register::isVirtualRegister(MI->getOperand(0).getReg())">;
22430b57cec5SDimitry Andricdef A9PostRA : SchedPredicate<
22448bcb0991SDimitry Andric  "Register::isPhysicalRegister(MI->getOperand(0).getReg())">;
22450b57cec5SDimitry Andric
22460b57cec5SDimitry Andric// VLDM represents all destination registers as a single register
22470b57cec5SDimitry Andric// tuple, unlike LDM. So the number of write operands is not variadic.
22480b57cec5SDimitry Andricdef A9WriteLMfp : SchedWriteVariant<[
22490b57cec5SDimitry Andric  SchedVar<A9PreRA, [A9WriteLMfpPreRA]>,
22500b57cec5SDimitry Andric  SchedVar<A9PostRA, [A9WriteLMfpPostRA]>]>;
22510b57cec5SDimitry Andric
22520b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
22530b57cec5SDimitry Andric// Resources for other (non-LDM/VLDM) Variants.
22540b57cec5SDimitry Andric
22550b57cec5SDimitry Andric// These mov immediate writers are unconditionally expanded with
22560b57cec5SDimitry Andric// additive latency.
22570b57cec5SDimitry Andricdef A9WriteI2 : WriteSequence<[A9WriteI, A9WriteI]>;
22580b57cec5SDimitry Andricdef A9WriteI2pc : WriteSequence<[A9WriteI, A9WriteI, WriteALU]>;
22590b57cec5SDimitry Andricdef A9WriteI2ld  : WriteSequence<[A9WriteI, A9WriteI, A9WriteL]>;
22600b57cec5SDimitry Andric
22610b57cec5SDimitry Andric// Some ALU operations can read loaded integer values one cycle early.
22620b57cec5SDimitry Andricdef A9ReadALU : SchedReadAdvance<1,
22630b57cec5SDimitry Andric  [A9WriteL, A9WriteLHi, A9WriteLsi, A9WriteLb, A9WriteLbsi,
22640b57cec5SDimitry Andric   A9WriteL1, A9WriteL2, A9WriteL3, A9WriteL4,
22650b57cec5SDimitry Andric   A9WriteL5, A9WriteL6, A9WriteL7, A9WriteL8,
22660b57cec5SDimitry Andric   A9WriteL1Hi, A9WriteL2Hi, A9WriteL3Hi, A9WriteL4Hi,
22670b57cec5SDimitry Andric   A9WriteL5Hi, A9WriteL6Hi, A9WriteL7Hi, A9WriteL8Hi]>;
22680b57cec5SDimitry Andric
22690b57cec5SDimitry Andric// Read types for operands that are unconditionally read in cycle N
22700b57cec5SDimitry Andric// after the instruction issues, decreases producer latency by N-1.
22710b57cec5SDimitry Andricdef A9Read2 : SchedReadAdvance<1>;
22720b57cec5SDimitry Andricdef A9Read3 : SchedReadAdvance<2>;
22730b57cec5SDimitry Andricdef A9Read4 : SchedReadAdvance<3>;
22740b57cec5SDimitry Andric
22750b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
22760b57cec5SDimitry Andric// Map itinerary classes to scheduler read/write resources per operand.
22770b57cec5SDimitry Andric//
22780b57cec5SDimitry Andric// For ARM, we piggyback scheduler resources on the Itinerary classes
22790b57cec5SDimitry Andric// to avoid perturbing the existing instruction definitions.
22800b57cec5SDimitry Andric
22810b57cec5SDimitry Andric// This table follows the ARM Cortex-A9 Technical Reference Manuals,
22820b57cec5SDimitry Andric// mostly in order.
22830b57cec5SDimitry Andric
22840b57cec5SDimitry Andricdef :ItinRW<[WriteALU], [IIC_iMOVi,IIC_iMOVr,IIC_iMOVsi,
22850b57cec5SDimitry Andric                         IIC_iMVNi,IIC_iMVNsi,
22860b57cec5SDimitry Andric                         IIC_iCMOVi,IIC_iCMOVr,IIC_iCMOVsi]>;
22870b57cec5SDimitry Andricdef :ItinRW<[WriteALU, A9ReadALU],[IIC_iMVNr]>;
22880b57cec5SDimitry Andricdef :ItinRW<[A9WriteIsr], [IIC_iMOVsr,IIC_iMVNsr,IIC_iCMOVsr]>;
22890b57cec5SDimitry Andric
22900b57cec5SDimitry Andricdef :ItinRW<[A9WriteI2],   [IIC_iMOVix2,IIC_iCMOVix2]>;
22910b57cec5SDimitry Andricdef :ItinRW<[A9WriteI2pc], [IIC_iMOVix2addpc]>;
22920b57cec5SDimitry Andricdef :ItinRW<[A9WriteI2ld], [IIC_iMOVix2ld]>;
22930b57cec5SDimitry Andric
22940b57cec5SDimitry Andricdef :ItinRW<[WriteALU], [IIC_iBITi,IIC_iBITr,IIC_iUNAr,IIC_iTSTi,IIC_iTSTr]>;
22950b57cec5SDimitry Andricdef :ItinRW<[WriteALU, A9ReadALU], [IIC_iALUi, IIC_iCMPi, IIC_iCMPsi]>;
22960b57cec5SDimitry Andricdef :ItinRW<[WriteALU, A9ReadALU, A9ReadALU],[IIC_iALUr,IIC_iCMPr]>;
22970b57cec5SDimitry Andricdef :ItinRW<[WriteALUsi], [IIC_iBITsi,IIC_iUNAsi,IIC_iEXTr,IIC_iTSTsi]>;
22980b57cec5SDimitry Andricdef :ItinRW<[WriteALUsi, A9ReadALU], [IIC_iALUsi]>;
22990b57cec5SDimitry Andricdef :ItinRW<[WriteALUsi, ReadDefault, A9ReadALU], [IIC_iALUsir]>; // RSB
23000b57cec5SDimitry Andricdef :ItinRW<[A9WriteALUsr], [IIC_iBITsr,IIC_iTSTsr,IIC_iEXTAr,IIC_iEXTAsr]>;
23010b57cec5SDimitry Andricdef :ItinRW<[A9WriteALUsr, A9ReadALU], [IIC_iALUsr,IIC_iCMPsr]>;
23020b57cec5SDimitry Andric
23030b57cec5SDimitry Andric// A9WriteHi ignored for MUL32.
23040b57cec5SDimitry Andricdef :ItinRW<[A9WriteM, A9WriteMHi], [IIC_iMUL32,IIC_iMAC32,
23050b57cec5SDimitry Andric                                     IIC_iMUL64,IIC_iMAC64]>;
23060b57cec5SDimitry Andric// FIXME: SMLALxx needs itin classes
23070b57cec5SDimitry Andricdef :ItinRW<[A9WriteM16, A9WriteM16Hi], [IIC_iMUL16,IIC_iMAC16]>;
23080b57cec5SDimitry Andric
23090b57cec5SDimitry Andric// TODO: For floating-point ops, we model the pipeline forwarding
23100b57cec5SDimitry Andric// latencies here. WAW latencies are sometimes longer.
23110b57cec5SDimitry Andric
23120b57cec5SDimitry Andricdef :ItinRW<[A9WriteFMov], [IIC_fpSTAT, IIC_fpMOVIS, IIC_fpMOVID, IIC_fpMOVSI,
23130b57cec5SDimitry Andric                            IIC_fpUNA32, IIC_fpUNA64,
23140b57cec5SDimitry Andric                            IIC_fpCMP32, IIC_fpCMP64]>;
23150b57cec5SDimitry Andricdef :ItinRW<[A9WriteFMov, A9WriteFMov], [IIC_fpMOVDI]>;
23160b57cec5SDimitry Andricdef :ItinRW<[A9WriteF], [IIC_fpCVTSD, IIC_fpCVTDS, IIC_fpCVTSH, IIC_fpCVTHS,
23170b57cec5SDimitry Andric                         IIC_fpCVTIS, IIC_fpCVTID, IIC_fpCVTSI, IIC_fpCVTDI,
23180b57cec5SDimitry Andric                         IIC_fpALU32, IIC_fpALU64]>;
23190b57cec5SDimitry Andricdef :ItinRW<[A9WriteFMulS], [IIC_fpMUL32]>;
23200b57cec5SDimitry Andricdef :ItinRW<[A9WriteFMulD], [IIC_fpMUL64]>;
23210b57cec5SDimitry Andricdef :ItinRW<[A9WriteFMAS], [IIC_fpMAC32]>;
23220b57cec5SDimitry Andricdef :ItinRW<[A9WriteFMAD], [IIC_fpMAC64]>;
23230b57cec5SDimitry Andricdef :ItinRW<[A9WriteFDivS], [IIC_fpDIV32]>;
23240b57cec5SDimitry Andricdef :ItinRW<[A9WriteFDivD], [IIC_fpDIV64]>;
23250b57cec5SDimitry Andricdef :ItinRW<[A9WriteFSqrtS], [IIC_fpSQRT32]>;
23260b57cec5SDimitry Andricdef :ItinRW<[A9WriteFSqrtD], [IIC_fpSQRT64]>;
23270b57cec5SDimitry Andric
23280b57cec5SDimitry Andricdef :ItinRW<[A9WriteB], [IIC_Br]>;
23290b57cec5SDimitry Andric
23300b57cec5SDimitry Andric// A9 PLD is processed in a dedicated unit.
23310b57cec5SDimitry Andricdef :ItinRW<[], [IIC_Preload]>;
23320b57cec5SDimitry Andric
23330b57cec5SDimitry Andric// Note: We must assume that loads are aligned, since the machine
23340b57cec5SDimitry Andric// model cannot know this statically and A9 ignores alignment hints.
23350b57cec5SDimitry Andric
23360b57cec5SDimitry Andric// A9WriteAdr consumes AGU regardless address writeback. But it's
23370b57cec5SDimitry Andric// latency is only relevant for users of an updated address.
23380b57cec5SDimitry Andricdef :ItinRW<[A9WriteL, A9WriteAdr], [IIC_iLoad_i,IIC_iLoad_r,
23390b57cec5SDimitry Andric                                     IIC_iLoad_iu,IIC_iLoad_ru]>;
23400b57cec5SDimitry Andricdef :ItinRW<[A9WriteLsi, A9WriteAdr], [IIC_iLoad_si,IIC_iLoad_siu]>;
23410b57cec5SDimitry Andricdef :ItinRW<[A9WriteLb, A9WriteAdr2], [IIC_iLoad_bh_i,IIC_iLoad_bh_r,
23420b57cec5SDimitry Andric                                       IIC_iLoad_bh_iu,IIC_iLoad_bh_ru]>;
23430b57cec5SDimitry Andricdef :ItinRW<[A9WriteLbsi, A9WriteAdr2], [IIC_iLoad_bh_si,IIC_iLoad_bh_siu]>;
23440b57cec5SDimitry Andricdef :ItinRW<[A9WriteL, A9WriteLHi, A9WriteAdr], [IIC_iLoad_d_i,IIC_iLoad_d_r,
23450b57cec5SDimitry Andric                                            IIC_iLoad_d_ru]>;
23460b57cec5SDimitry Andric// Store either has no def operands, or the one def for address writeback.
23470b57cec5SDimitry Andricdef :ItinRW<[A9WriteAdr, A9WriteS], [IIC_iStore_i, IIC_iStore_r,
23480b57cec5SDimitry Andric                                     IIC_iStore_iu, IIC_iStore_ru,
23490b57cec5SDimitry Andric                                     IIC_iStore_d_i, IIC_iStore_d_r,
23500b57cec5SDimitry Andric                                     IIC_iStore_d_ru]>;
23510b57cec5SDimitry Andricdef :ItinRW<[A9WriteAdr2, A9WriteS], [IIC_iStore_si, IIC_iStore_siu,
23520b57cec5SDimitry Andric                                      IIC_iStore_bh_i, IIC_iStore_bh_r,
23530b57cec5SDimitry Andric                                      IIC_iStore_bh_iu, IIC_iStore_bh_ru]>;
23540b57cec5SDimitry Andricdef :ItinRW<[A9WriteAdr3, A9WriteS], [IIC_iStore_bh_si, IIC_iStore_bh_siu]>;
23550b57cec5SDimitry Andric
23560b57cec5SDimitry Andric// A9WriteML will be expanded into a separate write for each def
23570b57cec5SDimitry Andric// operand. Address generation consumes resources, but A9WriteLMAdr
23580b57cec5SDimitry Andric// is listed after all def operands, so has no effective latency.
23590b57cec5SDimitry Andric//
23600b57cec5SDimitry Andric// Note: A9WriteLM expands into an even number of def operands. The
23610b57cec5SDimitry Andric// actual number of def operands may be less by one.
23620b57cec5SDimitry Andricdef :ItinRW<[A9WriteLM, A9WriteLMAdr, A9WriteIssue], [IIC_iLoad_m, IIC_iPop]>;
23630b57cec5SDimitry Andric
23640b57cec5SDimitry Andric// Load multiple with address writeback has an extra def operand in
23650b57cec5SDimitry Andric// front of the loaded registers.
23660b57cec5SDimitry Andric//
23670b57cec5SDimitry Andric// Reuse the load-multiple variants for store-multiple because the
23680b57cec5SDimitry Andric// resources are identical, For stores only the address writeback
23690b57cec5SDimitry Andric// has a def operand so the WriteL latencies are unused.
23700b57cec5SDimitry Andricdef :ItinRW<[A9WriteLMAdr, A9WriteLM, A9WriteIssue], [IIC_iLoad_mu,
23710b57cec5SDimitry Andric                                                      IIC_iStore_m,
23720b57cec5SDimitry Andric                                                      IIC_iStore_mu]>;
23730b57cec5SDimitry Andricdef :ItinRW<[A9WriteLM, A9WriteLMAdr, A9WriteB], [IIC_iLoad_mBr, IIC_iPop_Br]>;
23740b57cec5SDimitry Andricdef :ItinRW<[A9WriteL, A9WriteAdr, WriteALU], [IIC_iLoadiALU]>;
23750b57cec5SDimitry Andric
23760b57cec5SDimitry Andricdef :ItinRW<[A9WriteLSfp, A9WriteAdr], [IIC_fpLoad32, IIC_fpLoad64]>;
23770b57cec5SDimitry Andric
23780b57cec5SDimitry Andricdef :ItinRW<[A9WriteLMfp, A9WriteLMAdr], [IIC_fpLoad_m]>;
23790b57cec5SDimitry Andricdef :ItinRW<[A9WriteLMAdr, A9WriteLMfp], [IIC_fpLoad_mu]>;
23800b57cec5SDimitry Andricdef :ItinRW<[A9WriteAdr, A9WriteLSfp], [IIC_fpStore32, IIC_fpStore64,
23810b57cec5SDimitry Andric                                        IIC_fpStore_m, IIC_fpStore_mu]>;
23820b57cec5SDimitry Andric
23830b57cec5SDimitry Andric// Note: Unlike VLDM, VLD1 expects the writeback operand after the
23840b57cec5SDimitry Andric// normal writes.
23850b57cec5SDimitry Andricdef :ItinRW<[A9WriteLfp1, A9WriteAdr1], [IIC_VLD1, IIC_VLD1u,
23860b57cec5SDimitry Andric                                         IIC_VLD1x2, IIC_VLD1x2u]>;
23870b57cec5SDimitry Andricdef :ItinRW<[A9WriteLfp2, A9WriteAdr2], [IIC_VLD1x3, IIC_VLD1x3u,
23880b57cec5SDimitry Andric                                         IIC_VLD1x4, IIC_VLD1x4u,
23890b57cec5SDimitry Andric                                         IIC_VLD4dup, IIC_VLD4dupu]>;
23900b57cec5SDimitry Andricdef :ItinRW<[A9WriteLfp1Mov, A9WriteAdr1], [IIC_VLD1dup, IIC_VLD1dupu,
23910b57cec5SDimitry Andric                                            IIC_VLD2, IIC_VLD2u,
23920b57cec5SDimitry Andric                                            IIC_VLD2dup, IIC_VLD2dupu]>;
23930b57cec5SDimitry Andricdef :ItinRW<[A9WriteLfp2Mov, A9WriteAdr1], [IIC_VLD1ln, IIC_VLD1lnu,
23940b57cec5SDimitry Andric                                            IIC_VLD2x2, IIC_VLD2x2u,
23950b57cec5SDimitry Andric                                            IIC_VLD2ln, IIC_VLD2lnu]>;
23960b57cec5SDimitry Andricdef :ItinRW<[A9WriteLfp3Mov, A9WriteAdr3], [IIC_VLD3, IIC_VLD3u,
23970b57cec5SDimitry Andric                                            IIC_VLD3dup, IIC_VLD3dupu]>;
23980b57cec5SDimitry Andricdef :ItinRW<[A9WriteLfp4Mov, A9WriteAdr4], [IIC_VLD4, IIC_VLD4u,
23990b57cec5SDimitry Andric                                            IIC_VLD4ln, IIC_VLD4lnu]>;
24000b57cec5SDimitry Andricdef :ItinRW<[A9WriteLfp5Mov, A9WriteAdr5], [IIC_VLD3ln, IIC_VLD3lnu]>;
24010b57cec5SDimitry Andric
24020b57cec5SDimitry Andric// Vector stores use similar resources to vector loads, so use the
24030b57cec5SDimitry Andric// same write types. The address write must be first for stores with
24040b57cec5SDimitry Andric// address writeback.
24050b57cec5SDimitry Andricdef :ItinRW<[A9WriteAdr1, A9WriteLfp1], [IIC_VST1, IIC_VST1u,
24060b57cec5SDimitry Andric                                         IIC_VST1x2, IIC_VST1x2u,
24070b57cec5SDimitry Andric                                         IIC_VST1ln, IIC_VST1lnu,
24080b57cec5SDimitry Andric                                         IIC_VST2, IIC_VST2u,
24090b57cec5SDimitry Andric                                         IIC_VST2x2, IIC_VST2x2u,
24100b57cec5SDimitry Andric                                         IIC_VST2ln, IIC_VST2lnu]>;
24110b57cec5SDimitry Andricdef :ItinRW<[A9WriteAdr2, A9WriteLfp2], [IIC_VST1x3, IIC_VST1x3u,
24120b57cec5SDimitry Andric                                         IIC_VST1x4, IIC_VST1x4u,
24130b57cec5SDimitry Andric                                         IIC_VST3, IIC_VST3u,
24140b57cec5SDimitry Andric                                         IIC_VST3ln, IIC_VST3lnu,
24150b57cec5SDimitry Andric                                         IIC_VST4, IIC_VST4u,
24160b57cec5SDimitry Andric                                         IIC_VST4ln, IIC_VST4lnu]>;
24170b57cec5SDimitry Andric
24180b57cec5SDimitry Andric// NEON moves.
24190b57cec5SDimitry Andricdef :ItinRW<[A9WriteV2], [IIC_VMOVSI, IIC_VMOVDI, IIC_VMOVD, IIC_VMOVQ]>;
24200b57cec5SDimitry Andricdef :ItinRW<[A9WriteV1], [IIC_VMOV, IIC_VMOVIS, IIC_VMOVID]>;
24210b57cec5SDimitry Andricdef :ItinRW<[A9WriteV3], [IIC_VMOVISL, IIC_VMOVN]>;
24220b57cec5SDimitry Andric
24230b57cec5SDimitry Andric// NEON integer arithmetic
24240b57cec5SDimitry Andric//
24250b57cec5SDimitry Andric// VADD/VAND/VORR/VEOR/VBIC/VORN/VBIT/VBIF/VBSL
24260b57cec5SDimitry Andricdef :ItinRW<[A9WriteV3, A9Read2, A9Read2], [IIC_VBINiD, IIC_VBINiQ]>;
24270b57cec5SDimitry Andric// VSUB/VMVN/VCLSD/VCLZD/VCNTD
24280b57cec5SDimitry Andricdef :ItinRW<[A9WriteV3, A9Read2], [IIC_VSUBiD, IIC_VSUBiQ, IIC_VCNTiD]>;
24290b57cec5SDimitry Andric// VADDL/VSUBL/VNEG are mapped later under IIC_SHLi.
24300b57cec5SDimitry Andric// ...
24310b57cec5SDimitry Andric// VHADD/VRHADD/VQADD/VTST/VADH/VRADH
24320b57cec5SDimitry Andricdef :ItinRW<[A9WriteV4, A9Read2, A9Read2], [IIC_VBINi4D, IIC_VBINi4Q]>;
24330b57cec5SDimitry Andric
24340b57cec5SDimitry Andric// VSBH/VRSBH/VHSUB/VQSUB/VABD/VCEQ/VCGE/VCGT/VMAX/VMIN/VPMAX/VPMIN/VABDL
24350b57cec5SDimitry Andricdef :ItinRW<[A9WriteV4, A9Read2], [IIC_VSUBi4D, IIC_VSUBi4Q]>;
24360b57cec5SDimitry Andric// VQNEG/VQABS
24370b57cec5SDimitry Andricdef :ItinRW<[A9WriteV4], [IIC_VQUNAiD, IIC_VQUNAiQ]>;
24380b57cec5SDimitry Andric// VABS
24390b57cec5SDimitry Andricdef :ItinRW<[A9WriteV4, A9Read2], [IIC_VUNAiD, IIC_VUNAiQ]>;
24400b57cec5SDimitry Andric// VPADD/VPADDL are mapped later under IIC_SHLi.
24410b57cec5SDimitry Andric// ...
24420b57cec5SDimitry Andric// VCLSQ/VCLZQ/VCNTQ, takes two cycles.
24430b57cec5SDimitry Andricdef :ItinRW<[A9Write2V4, A9Read3], [IIC_VCNTiQ]>;
24440b57cec5SDimitry Andric// VMOVimm/VMVNimm/VORRimm/VBICimm
24450b57cec5SDimitry Andricdef :ItinRW<[A9WriteV3], [IIC_VMOVImm]>;
24460b57cec5SDimitry Andricdef :ItinRW<[A9WriteV6, A9Read3, A9Read2], [IIC_VABAD, IIC_VABAQ]>;
24470b57cec5SDimitry Andricdef :ItinRW<[A9WriteV6, A9Read3], [IIC_VPALiD, IIC_VPALiQ]>;
24480b57cec5SDimitry Andric
24490b57cec5SDimitry Andric// NEON integer multiply
24500b57cec5SDimitry Andric//
24510b57cec5SDimitry Andric// Note: these don't quite match the timing docs, but they do match
24520b57cec5SDimitry Andric// the original A9 itinerary.
24530b57cec5SDimitry Andricdef :ItinRW<[A9WriteV6, A9Read2, A9Read2], [IIC_VMULi16D]>;
24540b57cec5SDimitry Andricdef :ItinRW<[A9WriteV7, A9Read2, A9Read2], [IIC_VMULi16Q]>;
24550b57cec5SDimitry Andricdef :ItinRW<[A9Write2V7, A9Read2], [IIC_VMULi32D]>;
24560b57cec5SDimitry Andricdef :ItinRW<[A9Write2V9, A9Read2], [IIC_VMULi32Q]>;
24570b57cec5SDimitry Andricdef :ItinRW<[A9WriteV6, A9Read3, A9Read2, A9Read2], [IIC_VMACi16D]>;
24580b57cec5SDimitry Andricdef :ItinRW<[A9WriteV7, A9Read3, A9Read2, A9Read2], [IIC_VMACi16Q]>;
24590b57cec5SDimitry Andricdef :ItinRW<[A9Write2V7, A9Read3, A9Read2], [IIC_VMACi32D]>;
24600b57cec5SDimitry Andricdef :ItinRW<[A9Write2V9, A9Read3, A9Read2], [IIC_VMACi32Q]>;
24610b57cec5SDimitry Andric
24620b57cec5SDimitry Andric// NEON integer shift
24630b57cec5SDimitry Andric// TODO: Q,Q,Q shifts should actually reserve FP for 2 cycles.
24640b57cec5SDimitry Andricdef :ItinRW<[A9WriteV3], [IIC_VSHLiD, IIC_VSHLiQ]>;
24650b57cec5SDimitry Andricdef :ItinRW<[A9WriteV4], [IIC_VSHLi4D, IIC_VSHLi4Q]>;
24660b57cec5SDimitry Andric
24670b57cec5SDimitry Andric// NEON permute
24680b57cec5SDimitry Andricdef :ItinRW<[A9WriteV2, A9WriteV2], [IIC_VPERMD, IIC_VPERMQ, IIC_VEXTD]>;
24690b57cec5SDimitry Andricdef :ItinRW<[A9WriteV3, A9WriteV4, ReadDefault, A9Read2],
24700b57cec5SDimitry Andric            [IIC_VPERMQ3, IIC_VEXTQ]>;
24710b57cec5SDimitry Andricdef :ItinRW<[A9WriteV3, A9Read2], [IIC_VTB1]>;
24720b57cec5SDimitry Andricdef :ItinRW<[A9WriteV3, A9Read2, A9Read2], [IIC_VTB2]>;
24730b57cec5SDimitry Andricdef :ItinRW<[A9WriteV4, A9Read2, A9Read2, A9Read3], [IIC_VTB3]>;
24740b57cec5SDimitry Andricdef :ItinRW<[A9WriteV4, A9Read2, A9Read2, A9Read3, A9Read3], [IIC_VTB4]>;
24750b57cec5SDimitry Andricdef :ItinRW<[A9WriteV3, ReadDefault, A9Read2], [IIC_VTBX1]>;
24760b57cec5SDimitry Andricdef :ItinRW<[A9WriteV3, ReadDefault, A9Read2, A9Read2], [IIC_VTBX2]>;
24770b57cec5SDimitry Andricdef :ItinRW<[A9WriteV4, ReadDefault, A9Read2, A9Read2, A9Read3], [IIC_VTBX3]>;
24780b57cec5SDimitry Andricdef :ItinRW<[A9WriteV4, ReadDefault, A9Read2, A9Read2, A9Read3, A9Read3],
24790b57cec5SDimitry Andric            [IIC_VTBX4]>;
24800b57cec5SDimitry Andric
24810b57cec5SDimitry Andric// NEON floating-point
24820b57cec5SDimitry Andricdef :ItinRW<[A9WriteV5, A9Read2, A9Read2], [IIC_VBIND]>;
24830b57cec5SDimitry Andricdef :ItinRW<[A9WriteV6, A9Read2, A9Read2], [IIC_VBINQ]>;
24840b57cec5SDimitry Andricdef :ItinRW<[A9WriteV5, A9Read2], [IIC_VUNAD, IIC_VFMULD]>;
24850b57cec5SDimitry Andricdef :ItinRW<[A9WriteV6, A9Read2], [IIC_VUNAQ, IIC_VFMULQ]>;
24860b57cec5SDimitry Andricdef :ItinRW<[A9WriteV9, A9Read3, A9Read2], [IIC_VMACD, IIC_VFMACD]>;
24870b57cec5SDimitry Andricdef :ItinRW<[A9WriteV10, A9Read3, A9Read2], [IIC_VMACQ, IIC_VFMACQ]>;
24880b57cec5SDimitry Andricdef :ItinRW<[A9WriteV9, A9Read2, A9Read2], [IIC_VRECSD]>;
24890b57cec5SDimitry Andricdef :ItinRW<[A9WriteV10, A9Read2, A9Read2], [IIC_VRECSQ]>;
24900b57cec5SDimitry Andric
24910b57cec5SDimitry Andric// Map SchedRWs that are identical for cortexa9 to existing resources.
24920b57cec5SDimitry Andricdef : SchedAlias<WriteALU, A9WriteALU>;
24930b57cec5SDimitry Andricdef : SchedAlias<WriteALUsr, A9WriteALUsr>;
24940b57cec5SDimitry Andricdef : SchedAlias<WriteALUSsr, A9WriteALUsr>;
24950b57cec5SDimitry Andricdef : SchedAlias<ReadALU, A9ReadALU>;
24960b57cec5SDimitry Andricdef : SchedAlias<ReadALUsr, A9ReadALU>;
24970b57cec5SDimitry Andricdef : SchedAlias<WriteST, A9WriteS>;
24980b57cec5SDimitry Andric
24990b57cec5SDimitry Andric// ===---------------------------------------------------------------------===//
25000b57cec5SDimitry Andric// Floating-point. Map target defined SchedReadWrite to processor specific ones
25010b57cec5SDimitry Andric//
25020b57cec5SDimitry Andricdef : WriteRes<WriteFPCVT, [A9UnitFP, A9UnitAGU]> { let Latency = 4; }
25030b57cec5SDimitry Andricdef : SchedAlias<WriteFPMOV, A9WriteFMov>;
25040b57cec5SDimitry Andric
25050b57cec5SDimitry Andricdef : SchedAlias<WriteFPALU32, A9WriteF>;
25060b57cec5SDimitry Andricdef : SchedAlias<WriteFPALU64, A9WriteF>;
25070b57cec5SDimitry Andric
25080b57cec5SDimitry Andricdef : SchedAlias<WriteFPMUL32, A9WriteFMulS>;
25090b57cec5SDimitry Andricdef : SchedAlias<WriteFPMUL64, A9WriteFMulD>;
25100b57cec5SDimitry Andric
25110b57cec5SDimitry Andricdef : SchedAlias<WriteFPMAC32, A9WriteFMAS>;
25120b57cec5SDimitry Andricdef : SchedAlias<WriteFPMAC64, A9WriteFMAD>;
25130b57cec5SDimitry Andric
25140b57cec5SDimitry Andricdef : SchedAlias<WriteFPDIV32, A9WriteFDivS>;
25150b57cec5SDimitry Andricdef : SchedAlias<WriteFPDIV64, A9WriteFDivD>;
25160b57cec5SDimitry Andricdef : SchedAlias<WriteFPSQRT32, A9WriteFSqrtS>;
25170b57cec5SDimitry Andricdef : SchedAlias<WriteFPSQRT64, A9WriteFSqrtD>;
25180b57cec5SDimitry Andric
25190b57cec5SDimitry Andricdef : ReadAdvance<ReadFPMUL, 0>;
25200b57cec5SDimitry Andricdef : ReadAdvance<ReadFPMAC, 0>;
25210b57cec5SDimitry Andric
25220b57cec5SDimitry Andric// ===---------------------------------------------------------------------===//
25230b57cec5SDimitry Andric// Subtarget-specific overrides. Map opcodes to list of SchedReadWrite types.
25240b57cec5SDimitry Andric//
25250b57cec5SDimitry Andricdef : InstRW< [WriteALU],
25260b57cec5SDimitry Andric      (instregex "ANDri", "ORRri", "EORri", "BICri", "ANDrr", "ORRrr", "EORrr",
25270b57cec5SDimitry Andric                 "BICrr")>;
2528*e8d8bef9SDimitry Andricdef : InstRW< [WriteALUsi], (instrs ANDrsi, ORRrsi, EORrsi, BICrsi)>;
2529*e8d8bef9SDimitry Andricdef : InstRW< [WriteALUsr], (instrs ANDrsr, ORRrsr, EORrsr, BICrsr)>;
25300b57cec5SDimitry Andric
25310b57cec5SDimitry Andric
25320b57cec5SDimitry Andricdef : SchedAlias<WriteCMP, A9WriteALU>;
25330b57cec5SDimitry Andricdef : SchedAlias<WriteCMPsi, A9WriteALU>;
25340b57cec5SDimitry Andricdef : SchedAlias<WriteCMPsr, A9WriteALU>;
25350b57cec5SDimitry Andric
25360b57cec5SDimitry Andricdef : InstRW< [A9WriteIsr], (instregex "MOVsr", "MOVsi", "MVNsr", "MOVCCsi",
25370b57cec5SDimitry Andric                                       "MOVCCsr")>;
25380b57cec5SDimitry Andricdef : InstRW< [WriteALU, A9ReadALU], (instregex "MVNr")>;
25390b57cec5SDimitry Andricdef : InstRW< [A9WriteI2], (instregex "MOVCCi32imm", "MOVi32imm")>;
25400b57cec5SDimitry Andricdef : InstRW< [A9WriteI2pc], (instregex "MOV_ga_pcrel")>;
25410b57cec5SDimitry Andricdef : InstRW< [A9WriteI2ld], (instregex "MOV_ga_pcrel_ldr")>;
25420b57cec5SDimitry Andric
25430b57cec5SDimitry Andricdef : InstRW< [WriteALU], (instregex "SEL")>;
25440b57cec5SDimitry Andric
25450b57cec5SDimitry Andricdef : InstRW< [WriteALUsi], (instregex "BFC", "BFI", "UBFX", "SBFX")>;
25460b57cec5SDimitry Andric
25470b57cec5SDimitry Andricdef : InstRW< [A9WriteM],
25480b57cec5SDimitry Andric      (instregex "MUL", "MULv5", "SMMUL", "SMMULR", "MLA", "MLAv5", "MLS",
25490b57cec5SDimitry Andric      "SMMLA", "SMMLAR", "SMMLS", "SMMLSR")>;
25500b57cec5SDimitry Andricdef : InstRW< [A9WriteM, A9WriteMHi],
25510b57cec5SDimitry Andric      (instregex "SMULL", "SMULLv5", "UMULL", "UMULLv5", "SMLAL$", "UMLAL",
25520b57cec5SDimitry Andric      "UMAAL", "SMLALv5", "UMLALv5", "SMLALBB", "SMLALBT", "SMLALTB",
25530b57cec5SDimitry Andric      "SMLALTT")>;
25540b57cec5SDimitry Andric// FIXME: These instructions used to have NoItinerary. Just copied the one from above.
25550b57cec5SDimitry Andricdef : InstRW< [A9WriteM, A9WriteMHi],
25560b57cec5SDimitry Andric      (instregex "SMLAD", "SMLADX", "SMLALD", "SMLALDX", "SMLSD", "SMLSDX",
25570b57cec5SDimitry Andric      "SMLSLD", "SMLSLDX", "SMUAD", "SMUADX", "SMUSD", "SMUSDX")>;
25580b57cec5SDimitry Andric
25590b57cec5SDimitry Andricdef : InstRW<[A9WriteM16, A9WriteM16Hi],
25600b57cec5SDimitry Andric      (instregex "SMULBB", "SMULBT", "SMULTB", "SMULTT", "SMULWB", "SMULWT")>;
25610b57cec5SDimitry Andricdef : InstRW<[A9WriteM16, A9WriteM16Hi],
25620b57cec5SDimitry Andric      (instregex "SMLABB", "SMLABT", "SMLATB", "SMLATT", "SMLAWB", "SMLAWT")>;
25630b57cec5SDimitry Andric
25640b57cec5SDimitry Andricdef : InstRW<[A9WriteL], (instregex "LDRi12", "PICLDR$")>;
25650b57cec5SDimitry Andricdef : InstRW<[A9WriteLsi], (instregex "LDRrs")>;
25660b57cec5SDimitry Andricdef : InstRW<[A9WriteLb],
25670b57cec5SDimitry Andric      (instregex "LDRBi12", "PICLDRH", "PICLDRB", "PICLDRSH", "PICLDRSB",
25680b57cec5SDimitry Andric      "LDRH", "LDRSH", "LDRSB")>;
25690b57cec5SDimitry Andricdef : InstRW<[A9WriteLbsi], (instregex "LDRrs")>;
25700b57cec5SDimitry Andric
25710b57cec5SDimitry Andricdef : WriteRes<WriteDIV, []> { let Latency = 0; }
25720b57cec5SDimitry Andric
25730b57cec5SDimitry Andricdef : WriteRes<WriteBr, [A9UnitB]>;
25740b57cec5SDimitry Andricdef : WriteRes<WriteBrL, [A9UnitB]>;
25750b57cec5SDimitry Andricdef : WriteRes<WriteBrTbl, [A9UnitB]>;
25760b57cec5SDimitry Andricdef : WriteRes<WritePreLd, []>;
25770b57cec5SDimitry Andricdef : WriteRes<WriteNoop, []> { let Latency = 0; let NumMicroOps = 0; }
25780b57cec5SDimitry Andric} // SchedModel = CortexA9Model
2579