xref: /freebsd-src/contrib/llvm-project/llvm/lib/Target/ARM/ARMScheduleV6.td (revision 0b57cec536236d46e3dba9bd041533462f33dbb7)
1*0b57cec5SDimitry Andric//===-- ARMScheduleV6.td - ARM v6 Scheduling Definitions ---*- tablegen -*-===//
2*0b57cec5SDimitry Andric//
3*0b57cec5SDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*0b57cec5SDimitry Andric// See https://llvm.org/LICENSE.txt for license information.
5*0b57cec5SDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*0b57cec5SDimitry Andric//
7*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
8*0b57cec5SDimitry Andric//
9*0b57cec5SDimitry Andric// This file defines the itinerary class data for the ARM v6 processors.
10*0b57cec5SDimitry Andric//
11*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
12*0b57cec5SDimitry Andric
13*0b57cec5SDimitry Andric// Model based on ARM1176
14*0b57cec5SDimitry Andric//
15*0b57cec5SDimitry Andric// Functional Units
16*0b57cec5SDimitry Andricdef V6_Pipe : FuncUnit; // pipeline
17*0b57cec5SDimitry Andric
18*0b57cec5SDimitry Andric// Scheduling information derived from "ARM1176JZF-S Technical Reference Manual"
19*0b57cec5SDimitry Andric//
20*0b57cec5SDimitry Andricdef ARMV6Itineraries : ProcessorItineraries<
21*0b57cec5SDimitry Andric  [V6_Pipe], [], [
22*0b57cec5SDimitry Andric  //
23*0b57cec5SDimitry Andric  // No operand cycles
24*0b57cec5SDimitry Andric  InstrItinData<IIC_iALUx    , [InstrStage<1, [V6_Pipe]>]>,
25*0b57cec5SDimitry Andric  //
26*0b57cec5SDimitry Andric  // Binary Instructions that produce a result
27*0b57cec5SDimitry Andric  InstrItinData<IIC_iALUi    , [InstrStage<1, [V6_Pipe]>], [2, 2]>,
28*0b57cec5SDimitry Andric  InstrItinData<IIC_iALUr    , [InstrStage<1, [V6_Pipe]>], [2, 2, 2]>,
29*0b57cec5SDimitry Andric  InstrItinData<IIC_iALUsi   , [InstrStage<1, [V6_Pipe]>], [2, 2, 1]>,
30*0b57cec5SDimitry Andric  InstrItinData<IIC_iALUsr   , [InstrStage<2, [V6_Pipe]>], [3, 3, 2, 1]>,
31*0b57cec5SDimitry Andric  //
32*0b57cec5SDimitry Andric  // Bitwise Instructions that produce a result
33*0b57cec5SDimitry Andric  InstrItinData<IIC_iBITi    , [InstrStage<1, [V6_Pipe]>], [2, 2]>,
34*0b57cec5SDimitry Andric  InstrItinData<IIC_iBITr    , [InstrStage<1, [V6_Pipe]>], [2, 2, 2]>,
35*0b57cec5SDimitry Andric  InstrItinData<IIC_iBITsi   , [InstrStage<1, [V6_Pipe]>], [2, 2, 1]>,
36*0b57cec5SDimitry Andric  InstrItinData<IIC_iBITsr   , [InstrStage<2, [V6_Pipe]>], [3, 3, 2, 1]>,
37*0b57cec5SDimitry Andric  //
38*0b57cec5SDimitry Andric  // Unary Instructions that produce a result
39*0b57cec5SDimitry Andric  InstrItinData<IIC_iUNAr    , [InstrStage<1, [V6_Pipe]>], [2, 2]>,
40*0b57cec5SDimitry Andric  InstrItinData<IIC_iUNAsi   , [InstrStage<1, [V6_Pipe]>], [2, 1]>,
41*0b57cec5SDimitry Andric  //
42*0b57cec5SDimitry Andric  // Zero and sign extension instructions
43*0b57cec5SDimitry Andric  InstrItinData<IIC_iEXTr    , [InstrStage<1, [V6_Pipe]>], [1, 1]>,
44*0b57cec5SDimitry Andric  InstrItinData<IIC_iEXTAr   , [InstrStage<1, [V6_Pipe]>], [2, 2, 1]>,
45*0b57cec5SDimitry Andric  InstrItinData<IIC_iEXTAsr  , [InstrStage<2, [V6_Pipe]>], [3, 3, 2, 1]>,
46*0b57cec5SDimitry Andric  //
47*0b57cec5SDimitry Andric  // Compare instructions
48*0b57cec5SDimitry Andric  InstrItinData<IIC_iCMPi    , [InstrStage<1, [V6_Pipe]>], [2]>,
49*0b57cec5SDimitry Andric  InstrItinData<IIC_iCMPr    , [InstrStage<1, [V6_Pipe]>], [2, 2]>,
50*0b57cec5SDimitry Andric  InstrItinData<IIC_iCMPsi   , [InstrStage<1, [V6_Pipe]>], [2, 1]>,
51*0b57cec5SDimitry Andric  InstrItinData<IIC_iCMPsr   , [InstrStage<2, [V6_Pipe]>], [3, 2, 1]>,
52*0b57cec5SDimitry Andric  //
53*0b57cec5SDimitry Andric  // Test instructions
54*0b57cec5SDimitry Andric  InstrItinData<IIC_iTSTi    , [InstrStage<1, [V6_Pipe]>], [2]>,
55*0b57cec5SDimitry Andric  InstrItinData<IIC_iTSTr    , [InstrStage<1, [V6_Pipe]>], [2, 2]>,
56*0b57cec5SDimitry Andric  InstrItinData<IIC_iTSTsi   , [InstrStage<1, [V6_Pipe]>], [2, 1]>,
57*0b57cec5SDimitry Andric  InstrItinData<IIC_iTSTsr   , [InstrStage<2, [V6_Pipe]>], [3, 2, 1]>,
58*0b57cec5SDimitry Andric  //
59*0b57cec5SDimitry Andric  // Move instructions, unconditional
60*0b57cec5SDimitry Andric  InstrItinData<IIC_iMOVi    , [InstrStage<1, [V6_Pipe]>], [2]>,
61*0b57cec5SDimitry Andric  InstrItinData<IIC_iMOVr    , [InstrStage<1, [V6_Pipe]>], [2, 2]>,
62*0b57cec5SDimitry Andric  InstrItinData<IIC_iMOVsi   , [InstrStage<1, [V6_Pipe]>], [2, 1]>,
63*0b57cec5SDimitry Andric  InstrItinData<IIC_iMOVsr   , [InstrStage<2, [V6_Pipe]>], [3, 2, 1]>,
64*0b57cec5SDimitry Andric  InstrItinData<IIC_iMOVix2  , [InstrStage<1, [V6_Pipe]>,
65*0b57cec5SDimitry Andric                                InstrStage<1, [V6_Pipe]>], [2]>,
66*0b57cec5SDimitry Andric  InstrItinData<IIC_iMOVix2addpc,[InstrStage<1, [V6_Pipe]>,
67*0b57cec5SDimitry Andric                                  InstrStage<1, [V6_Pipe]>,
68*0b57cec5SDimitry Andric                                  InstrStage<1, [V6_Pipe]>], [3]>,
69*0b57cec5SDimitry Andric  InstrItinData<IIC_iMOVix2ld , [InstrStage<1, [V6_Pipe]>,
70*0b57cec5SDimitry Andric                                 InstrStage<1, [V6_Pipe]>,
71*0b57cec5SDimitry Andric                                 InstrStage<1, [V6_Pipe]>], [5]>,
72*0b57cec5SDimitry Andric  //
73*0b57cec5SDimitry Andric  // Move instructions, conditional
74*0b57cec5SDimitry Andric  InstrItinData<IIC_iCMOVi   , [InstrStage<1, [V6_Pipe]>], [3]>,
75*0b57cec5SDimitry Andric  InstrItinData<IIC_iCMOVr   , [InstrStage<1, [V6_Pipe]>], [3, 2]>,
76*0b57cec5SDimitry Andric  InstrItinData<IIC_iCMOVsi  , [InstrStage<1, [V6_Pipe]>], [3, 1]>,
77*0b57cec5SDimitry Andric  InstrItinData<IIC_iCMOVsr  , [InstrStage<1, [V6_Pipe]>], [4, 2, 1]>,
78*0b57cec5SDimitry Andric  InstrItinData<IIC_iCMOVix2 , [InstrStage<1, [V6_Pipe]>,
79*0b57cec5SDimitry Andric                                InstrStage<1, [V6_Pipe]>], [4]>,
80*0b57cec5SDimitry Andric  //
81*0b57cec5SDimitry Andric  // MVN instructions
82*0b57cec5SDimitry Andric  InstrItinData<IIC_iMVNi    , [InstrStage<1, [V6_Pipe]>], [2]>,
83*0b57cec5SDimitry Andric  InstrItinData<IIC_iMVNr    , [InstrStage<1, [V6_Pipe]>], [2, 2]>,
84*0b57cec5SDimitry Andric  InstrItinData<IIC_iMVNsi   , [InstrStage<1, [V6_Pipe]>], [2, 1]>,
85*0b57cec5SDimitry Andric  InstrItinData<IIC_iMVNsr   , [InstrStage<2, [V6_Pipe]>], [3, 2, 1]>,
86*0b57cec5SDimitry Andric
87*0b57cec5SDimitry Andric  // Integer multiply pipeline
88*0b57cec5SDimitry Andric  //
89*0b57cec5SDimitry Andric  InstrItinData<IIC_iMUL16   , [InstrStage<1, [V6_Pipe]>], [4, 1, 1]>,
90*0b57cec5SDimitry Andric  InstrItinData<IIC_iMAC16   , [InstrStage<1, [V6_Pipe]>], [4, 1, 1, 2]>,
91*0b57cec5SDimitry Andric  InstrItinData<IIC_iMUL32   , [InstrStage<2, [V6_Pipe]>], [5, 1, 1]>,
92*0b57cec5SDimitry Andric  InstrItinData<IIC_iMAC32   , [InstrStage<2, [V6_Pipe]>], [5, 1, 1, 2]>,
93*0b57cec5SDimitry Andric  InstrItinData<IIC_iMUL64   , [InstrStage<3, [V6_Pipe]>], [6, 1, 1]>,
94*0b57cec5SDimitry Andric  InstrItinData<IIC_iMAC64   , [InstrStage<3, [V6_Pipe]>], [6, 1, 1, 2]>,
95*0b57cec5SDimitry Andric
96*0b57cec5SDimitry Andric  // Integer load pipeline
97*0b57cec5SDimitry Andric  //
98*0b57cec5SDimitry Andric  // Immediate offset
99*0b57cec5SDimitry Andric  InstrItinData<IIC_iLoad_i   , [InstrStage<1, [V6_Pipe]>], [4, 1]>,
100*0b57cec5SDimitry Andric  InstrItinData<IIC_iLoad_bh_i, [InstrStage<1, [V6_Pipe]>], [4, 1]>,
101*0b57cec5SDimitry Andric  InstrItinData<IIC_iLoad_d_i , [InstrStage<1, [V6_Pipe]>], [4, 1]>,
102*0b57cec5SDimitry Andric  //
103*0b57cec5SDimitry Andric  // Register offset
104*0b57cec5SDimitry Andric  InstrItinData<IIC_iLoad_r   , [InstrStage<1, [V6_Pipe]>], [4, 1, 1]>,
105*0b57cec5SDimitry Andric  InstrItinData<IIC_iLoad_bh_r, [InstrStage<1, [V6_Pipe]>], [4, 1, 1]>,
106*0b57cec5SDimitry Andric  InstrItinData<IIC_iLoad_d_r , [InstrStage<1, [V6_Pipe]>], [4, 1, 1]>,
107*0b57cec5SDimitry Andric  //
108*0b57cec5SDimitry Andric  // Scaled register offset, issues over 2 cycles
109*0b57cec5SDimitry Andric  InstrItinData<IIC_iLoad_si   , [InstrStage<2, [V6_Pipe]>], [5, 2, 1]>,
110*0b57cec5SDimitry Andric  InstrItinData<IIC_iLoad_bh_si, [InstrStage<2, [V6_Pipe]>], [5, 2, 1]>,
111*0b57cec5SDimitry Andric  //
112*0b57cec5SDimitry Andric  // Immediate offset with update
113*0b57cec5SDimitry Andric  InstrItinData<IIC_iLoad_iu   , [InstrStage<1, [V6_Pipe]>], [4, 2, 1]>,
114*0b57cec5SDimitry Andric  InstrItinData<IIC_iLoad_bh_iu, [InstrStage<1, [V6_Pipe]>], [4, 2, 1]>,
115*0b57cec5SDimitry Andric  //
116*0b57cec5SDimitry Andric  // Register offset with update
117*0b57cec5SDimitry Andric  InstrItinData<IIC_iLoad_ru   , [InstrStage<1, [V6_Pipe]>], [4, 2, 1, 1]>,
118*0b57cec5SDimitry Andric  InstrItinData<IIC_iLoad_bh_ru, [InstrStage<1, [V6_Pipe]>], [4, 2, 1, 1]>,
119*0b57cec5SDimitry Andric  InstrItinData<IIC_iLoad_d_ru , [InstrStage<1, [V6_Pipe]>], [4, 2, 1, 1]>,
120*0b57cec5SDimitry Andric  //
121*0b57cec5SDimitry Andric  // Scaled register offset with update, issues over 2 cycles
122*0b57cec5SDimitry Andric  InstrItinData<IIC_iLoad_siu,   [InstrStage<2, [V6_Pipe]>], [5, 2, 2, 1]>,
123*0b57cec5SDimitry Andric  InstrItinData<IIC_iLoad_bh_siu,[InstrStage<2, [V6_Pipe]>], [5, 2, 2, 1]>,
124*0b57cec5SDimitry Andric
125*0b57cec5SDimitry Andric  //
126*0b57cec5SDimitry Andric  // Load multiple, def is the 5th operand.
127*0b57cec5SDimitry Andric  InstrItinData<IIC_iLoad_m  , [InstrStage<3, [V6_Pipe]>], [1, 1, 1, 1, 4]>,
128*0b57cec5SDimitry Andric  //
129*0b57cec5SDimitry Andric  // Load multiple + update, defs are the 1st and 5th operands.
130*0b57cec5SDimitry Andric  InstrItinData<IIC_iLoad_mu , [InstrStage<3, [V6_Pipe]>], [2, 1, 1, 1, 4]>,
131*0b57cec5SDimitry Andric  //
132*0b57cec5SDimitry Andric  // Load multiple plus branch
133*0b57cec5SDimitry Andric  InstrItinData<IIC_iLoad_mBr, [InstrStage<3, [V6_Pipe]>,
134*0b57cec5SDimitry Andric                                InstrStage<1, [V6_Pipe]>], [1, 2, 1, 1, 4]>,
135*0b57cec5SDimitry Andric
136*0b57cec5SDimitry Andric  //
137*0b57cec5SDimitry Andric  // iLoadi + iALUr for t2LDRpci_pic.
138*0b57cec5SDimitry Andric  InstrItinData<IIC_iLoadiALU, [InstrStage<1, [V6_Pipe]>,
139*0b57cec5SDimitry Andric                                InstrStage<1, [V6_Pipe]>], [3, 1]>,
140*0b57cec5SDimitry Andric
141*0b57cec5SDimitry Andric  //
142*0b57cec5SDimitry Andric  // Pop, def is the 3rd operand.
143*0b57cec5SDimitry Andric  InstrItinData<IIC_iPop     , [InstrStage<3, [V6_Pipe]>], [1, 1, 4]>,
144*0b57cec5SDimitry Andric  //
145*0b57cec5SDimitry Andric  // Pop + branch, def is the 3rd operand.
146*0b57cec5SDimitry Andric  InstrItinData<IIC_iPop_Br,   [InstrStage<3, [V6_Pipe]>,
147*0b57cec5SDimitry Andric                                InstrStage<1, [V6_Pipe]>], [1, 2, 4]>,
148*0b57cec5SDimitry Andric
149*0b57cec5SDimitry Andric  // Integer store pipeline
150*0b57cec5SDimitry Andric  //
151*0b57cec5SDimitry Andric  // Immediate offset
152*0b57cec5SDimitry Andric  InstrItinData<IIC_iStore_i   , [InstrStage<1, [V6_Pipe]>], [2, 1]>,
153*0b57cec5SDimitry Andric  InstrItinData<IIC_iStore_bh_i, [InstrStage<1, [V6_Pipe]>], [2, 1]>,
154*0b57cec5SDimitry Andric  InstrItinData<IIC_iStore_d_i , [InstrStage<1, [V6_Pipe]>], [2, 1]>,
155*0b57cec5SDimitry Andric  //
156*0b57cec5SDimitry Andric  // Register offset
157*0b57cec5SDimitry Andric  InstrItinData<IIC_iStore_r   , [InstrStage<1, [V6_Pipe]>], [2, 1, 1]>,
158*0b57cec5SDimitry Andric  InstrItinData<IIC_iStore_bh_r, [InstrStage<1, [V6_Pipe]>], [2, 1, 1]>,
159*0b57cec5SDimitry Andric  InstrItinData<IIC_iStore_d_r , [InstrStage<1, [V6_Pipe]>], [2, 1, 1]>,
160*0b57cec5SDimitry Andric  //
161*0b57cec5SDimitry Andric  // Scaled register offset, issues over 2 cycles
162*0b57cec5SDimitry Andric  InstrItinData<IIC_iStore_si   , [InstrStage<2, [V6_Pipe]>], [2, 2, 1]>,
163*0b57cec5SDimitry Andric  InstrItinData<IIC_iStore_bh_si, [InstrStage<2, [V6_Pipe]>], [2, 2, 1]>,
164*0b57cec5SDimitry Andric  //
165*0b57cec5SDimitry Andric  // Immediate offset with update
166*0b57cec5SDimitry Andric  InstrItinData<IIC_iStore_iu   , [InstrStage<1, [V6_Pipe]>], [2, 2, 1]>,
167*0b57cec5SDimitry Andric  InstrItinData<IIC_iStore_bh_iu, [InstrStage<1, [V6_Pipe]>], [2, 2, 1]>,
168*0b57cec5SDimitry Andric  //
169*0b57cec5SDimitry Andric  // Register offset with update
170*0b57cec5SDimitry Andric  InstrItinData<IIC_iStore_ru,   [InstrStage<1, [V6_Pipe]>], [2, 2, 1, 1]>,
171*0b57cec5SDimitry Andric  InstrItinData<IIC_iStore_bh_ru,[InstrStage<1, [V6_Pipe]>], [2, 2, 1, 1]>,
172*0b57cec5SDimitry Andric  InstrItinData<IIC_iStore_d_ru, [InstrStage<1, [V6_Pipe]>], [2, 2, 1, 1]>,
173*0b57cec5SDimitry Andric  //
174*0b57cec5SDimitry Andric  // Scaled register offset with update, issues over 2 cycles
175*0b57cec5SDimitry Andric  InstrItinData<IIC_iStore_siu,   [InstrStage<2, [V6_Pipe]>], [2, 2, 2, 1]>,
176*0b57cec5SDimitry Andric  InstrItinData<IIC_iStore_bh_siu,[InstrStage<2, [V6_Pipe]>], [2, 2, 2, 1]>,
177*0b57cec5SDimitry Andric  //
178*0b57cec5SDimitry Andric  // Store multiple
179*0b57cec5SDimitry Andric  InstrItinData<IIC_iStore_m  , [InstrStage<3, [V6_Pipe]>]>,
180*0b57cec5SDimitry Andric  //
181*0b57cec5SDimitry Andric  // Store multiple + update
182*0b57cec5SDimitry Andric  InstrItinData<IIC_iStore_mu , [InstrStage<3, [V6_Pipe]>], [2]>,
183*0b57cec5SDimitry Andric
184*0b57cec5SDimitry Andric  // Branch
185*0b57cec5SDimitry Andric  //
186*0b57cec5SDimitry Andric  // no delay slots, so the latency of a branch is unimportant
187*0b57cec5SDimitry Andric  InstrItinData<IIC_Br      , [InstrStage<1, [V6_Pipe]>]>,
188*0b57cec5SDimitry Andric
189*0b57cec5SDimitry Andric  // VFP
190*0b57cec5SDimitry Andric  // Issue through integer pipeline, and execute in NEON unit. We assume
191*0b57cec5SDimitry Andric  // RunFast mode so that NFP pipeline is used for single-precision when
192*0b57cec5SDimitry Andric  // possible.
193*0b57cec5SDimitry Andric  //
194*0b57cec5SDimitry Andric  // FP Special Register to Integer Register File Move
195*0b57cec5SDimitry Andric  InstrItinData<IIC_fpSTAT , [InstrStage<1, [V6_Pipe]>], [3]>,
196*0b57cec5SDimitry Andric  //
197*0b57cec5SDimitry Andric  // Single-precision FP Unary
198*0b57cec5SDimitry Andric  InstrItinData<IIC_fpUNA32 , [InstrStage<1, [V6_Pipe]>], [5, 2]>,
199*0b57cec5SDimitry Andric  //
200*0b57cec5SDimitry Andric  // Double-precision FP Unary
201*0b57cec5SDimitry Andric  InstrItinData<IIC_fpUNA64 , [InstrStage<1, [V6_Pipe]>], [5, 2]>,
202*0b57cec5SDimitry Andric  //
203*0b57cec5SDimitry Andric  // Single-precision FP Compare
204*0b57cec5SDimitry Andric  InstrItinData<IIC_fpCMP32 , [InstrStage<1, [V6_Pipe]>], [2, 2]>,
205*0b57cec5SDimitry Andric  //
206*0b57cec5SDimitry Andric  // Double-precision FP Compare
207*0b57cec5SDimitry Andric  InstrItinData<IIC_fpCMP64 , [InstrStage<1, [V6_Pipe]>], [2, 2]>,
208*0b57cec5SDimitry Andric  //
209*0b57cec5SDimitry Andric  // Single to Double FP Convert
210*0b57cec5SDimitry Andric  InstrItinData<IIC_fpCVTSD , [InstrStage<1, [V6_Pipe]>], [5, 2]>,
211*0b57cec5SDimitry Andric  //
212*0b57cec5SDimitry Andric  // Double to Single FP Convert
213*0b57cec5SDimitry Andric  InstrItinData<IIC_fpCVTDS , [InstrStage<1, [V6_Pipe]>], [5, 2]>,
214*0b57cec5SDimitry Andric  //
215*0b57cec5SDimitry Andric  // Single-Precision FP to Integer Convert
216*0b57cec5SDimitry Andric  InstrItinData<IIC_fpCVTSI , [InstrStage<1, [V6_Pipe]>], [9, 2]>,
217*0b57cec5SDimitry Andric  //
218*0b57cec5SDimitry Andric  // Double-Precision FP to Integer Convert
219*0b57cec5SDimitry Andric  InstrItinData<IIC_fpCVTDI , [InstrStage<1, [V6_Pipe]>], [9, 2]>,
220*0b57cec5SDimitry Andric  //
221*0b57cec5SDimitry Andric  // Integer to Single-Precision FP Convert
222*0b57cec5SDimitry Andric  InstrItinData<IIC_fpCVTIS , [InstrStage<1, [V6_Pipe]>], [9, 2]>,
223*0b57cec5SDimitry Andric  //
224*0b57cec5SDimitry Andric  // Integer to Double-Precision FP Convert
225*0b57cec5SDimitry Andric  InstrItinData<IIC_fpCVTID , [InstrStage<1, [V6_Pipe]>], [9, 2]>,
226*0b57cec5SDimitry Andric  //
227*0b57cec5SDimitry Andric  // Single-precision FP ALU
228*0b57cec5SDimitry Andric  InstrItinData<IIC_fpALU32 , [InstrStage<1, [V6_Pipe]>], [9, 2, 2]>,
229*0b57cec5SDimitry Andric  //
230*0b57cec5SDimitry Andric  // Double-precision FP ALU
231*0b57cec5SDimitry Andric  InstrItinData<IIC_fpALU64 , [InstrStage<1, [V6_Pipe]>], [9, 2, 2]>,
232*0b57cec5SDimitry Andric  //
233*0b57cec5SDimitry Andric  // Single-precision FP Multiply
234*0b57cec5SDimitry Andric  InstrItinData<IIC_fpMUL32 , [InstrStage<1, [V6_Pipe]>], [9, 2, 2]>,
235*0b57cec5SDimitry Andric  //
236*0b57cec5SDimitry Andric  // Double-precision FP Multiply
237*0b57cec5SDimitry Andric  InstrItinData<IIC_fpMUL64 , [InstrStage<2, [V6_Pipe]>], [9, 2, 2]>,
238*0b57cec5SDimitry Andric  //
239*0b57cec5SDimitry Andric  // Single-precision FP MAC
240*0b57cec5SDimitry Andric  InstrItinData<IIC_fpMAC32 , [InstrStage<1, [V6_Pipe]>], [9, 2, 2, 2]>,
241*0b57cec5SDimitry Andric  //
242*0b57cec5SDimitry Andric  // Double-precision FP MAC
243*0b57cec5SDimitry Andric  InstrItinData<IIC_fpMAC64 , [InstrStage<2, [V6_Pipe]>], [9, 2, 2, 2]>,
244*0b57cec5SDimitry Andric  //
245*0b57cec5SDimitry Andric  // Single-precision Fused FP MAC
246*0b57cec5SDimitry Andric  InstrItinData<IIC_fpFMAC32, [InstrStage<1, [V6_Pipe]>], [9, 2, 2, 2]>,
247*0b57cec5SDimitry Andric  //
248*0b57cec5SDimitry Andric  // Double-precision Fused FP MAC
249*0b57cec5SDimitry Andric  InstrItinData<IIC_fpFMAC64, [InstrStage<2, [V6_Pipe]>], [9, 2, 2, 2]>,
250*0b57cec5SDimitry Andric  //
251*0b57cec5SDimitry Andric  // Single-precision FP DIV
252*0b57cec5SDimitry Andric  InstrItinData<IIC_fpDIV32 , [InstrStage<15, [V6_Pipe]>], [20, 2, 2]>,
253*0b57cec5SDimitry Andric  //
254*0b57cec5SDimitry Andric  // Double-precision FP DIV
255*0b57cec5SDimitry Andric  InstrItinData<IIC_fpDIV64 , [InstrStage<29, [V6_Pipe]>], [34, 2, 2]>,
256*0b57cec5SDimitry Andric  //
257*0b57cec5SDimitry Andric  // Single-precision FP SQRT
258*0b57cec5SDimitry Andric  InstrItinData<IIC_fpSQRT32 , [InstrStage<15, [V6_Pipe]>], [20, 2, 2]>,
259*0b57cec5SDimitry Andric  //
260*0b57cec5SDimitry Andric  // Double-precision FP SQRT
261*0b57cec5SDimitry Andric  InstrItinData<IIC_fpSQRT64 , [InstrStage<29, [V6_Pipe]>], [34, 2, 2]>,
262*0b57cec5SDimitry Andric  //
263*0b57cec5SDimitry Andric  // Integer to Single-precision Move
264*0b57cec5SDimitry Andric  InstrItinData<IIC_fpMOVIS,  [InstrStage<1, [V6_Pipe]>], [10, 1]>,
265*0b57cec5SDimitry Andric  //
266*0b57cec5SDimitry Andric  // Integer to Double-precision Move
267*0b57cec5SDimitry Andric  InstrItinData<IIC_fpMOVID,  [InstrStage<1, [V6_Pipe]>], [10, 1, 1]>,
268*0b57cec5SDimitry Andric  //
269*0b57cec5SDimitry Andric  // Single-precision to Integer Move
270*0b57cec5SDimitry Andric  InstrItinData<IIC_fpMOVSI,  [InstrStage<1, [V6_Pipe]>], [10, 1]>,
271*0b57cec5SDimitry Andric  //
272*0b57cec5SDimitry Andric  // Double-precision to Integer Move
273*0b57cec5SDimitry Andric  InstrItinData<IIC_fpMOVDI,  [InstrStage<1, [V6_Pipe]>], [10, 10, 1]>,
274*0b57cec5SDimitry Andric  //
275*0b57cec5SDimitry Andric  // Single-precision FP Load
276*0b57cec5SDimitry Andric  InstrItinData<IIC_fpLoad32 , [InstrStage<1, [V6_Pipe]>], [5, 2, 2]>,
277*0b57cec5SDimitry Andric  //
278*0b57cec5SDimitry Andric  // Double-precision FP Load
279*0b57cec5SDimitry Andric  InstrItinData<IIC_fpLoad64 , [InstrStage<1, [V6_Pipe]>], [5, 2, 2]>,
280*0b57cec5SDimitry Andric  //
281*0b57cec5SDimitry Andric  // FP Load Multiple
282*0b57cec5SDimitry Andric  InstrItinData<IIC_fpLoad_m , [InstrStage<3, [V6_Pipe]>], [2, 1, 1, 5]>,
283*0b57cec5SDimitry Andric  //
284*0b57cec5SDimitry Andric  // FP Load Multiple + update
285*0b57cec5SDimitry Andric  InstrItinData<IIC_fpLoad_mu, [InstrStage<3, [V6_Pipe]>], [3, 2, 1, 1, 5]>,
286*0b57cec5SDimitry Andric  //
287*0b57cec5SDimitry Andric  // Single-precision FP Store
288*0b57cec5SDimitry Andric  InstrItinData<IIC_fpStore32 , [InstrStage<1, [V6_Pipe]>], [2, 2, 2]>,
289*0b57cec5SDimitry Andric  //
290*0b57cec5SDimitry Andric  // Double-precision FP Store
291*0b57cec5SDimitry Andric  // use FU_Issue to enforce the 1 load/store per cycle limit
292*0b57cec5SDimitry Andric  InstrItinData<IIC_fpStore64 , [InstrStage<1, [V6_Pipe]>], [2, 2, 2]>,
293*0b57cec5SDimitry Andric  //
294*0b57cec5SDimitry Andric  // FP Store Multiple
295*0b57cec5SDimitry Andric  InstrItinData<IIC_fpStore_m, [InstrStage<3, [V6_Pipe]>], [2, 2, 2, 2]>,
296*0b57cec5SDimitry Andric  //
297*0b57cec5SDimitry Andric  // FP Store Multiple + update
298*0b57cec5SDimitry Andric  InstrItinData<IIC_fpStore_mu,[InstrStage<3, [V6_Pipe]>], [3, 2, 2, 2, 2]>
299*0b57cec5SDimitry Andric]>;
300