]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm/lib/Target/Hexagon/HexagonScheduleV60.td
Merge CK as of commit 24d26965d1a28039062ba3bcf9433b623f3d2c5e, to get
[FreeBSD/FreeBSD.git] / contrib / llvm / lib / Target / Hexagon / HexagonScheduleV60.td
1 //=-HexagonScheduleV60.td - HexagonV60 Scheduling Definitions *- tablegen -*-=//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9
10 // CVI pipes from the "Hexagon Multimedia Co-Processor Extensions Arch Spec".
11 def CVI_ST     : FuncUnit;
12 def CVI_XLANE  : FuncUnit;
13 def CVI_SHIFT  : FuncUnit;
14 def CVI_MPY0   : FuncUnit;
15 def CVI_MPY1   : FuncUnit;
16 def CVI_LD     : FuncUnit;
17
18 // Combined functional units.
19 def CVI_XLSHF  : FuncUnit;
20 def CVI_MPY01  : FuncUnit;
21 def CVI_ALL    : FuncUnit;
22
23 // Combined functional unit data.
24 def HexagonComboFuncsV60 :
25     ComboFuncUnits<[
26       ComboFuncData<CVI_XLSHF    , [CVI_XLANE, CVI_SHIFT]>,
27       ComboFuncData<CVI_MPY01    , [CVI_MPY0, CVI_MPY1]>,
28       ComboFuncData<CVI_ALL      , [CVI_ST, CVI_XLANE, CVI_SHIFT,
29                                     CVI_MPY0, CVI_MPY1, CVI_LD]>
30     ]>;
31
32 // Note: When adding additional vector scheduling classes, add the
33 // corresponding methods to the class HexagonInstrInfo.
34 def CVI_VA           : InstrItinClass;
35 def CVI_VA_DV        : InstrItinClass;
36 def CVI_VX_LONG      : InstrItinClass;
37 def CVI_VX_LATE      : InstrItinClass;
38 def CVI_VX           : InstrItinClass;
39 def CVI_VX_DV_LONG   : InstrItinClass;
40 def CVI_VX_DV        : InstrItinClass;
41 def CVI_VX_DV_SLOT2  : InstrItinClass;
42 def CVI_VP           : InstrItinClass;
43 def CVI_VP_LONG      : InstrItinClass;
44 def CVI_VP_VS_EARLY  : InstrItinClass;
45 def CVI_VP_VS_LONG_EARLY   : InstrItinClass;
46 def CVI_VP_VS_LONG   : InstrItinClass;
47 def CVI_VP_VS   : InstrItinClass;
48 def CVI_VP_DV        : InstrItinClass;
49 def CVI_VS           : InstrItinClass;
50 def CVI_VINLANESAT   : InstrItinClass;
51 def CVI_VM_LD        : InstrItinClass;
52 def CVI_VM_TMP_LD    : InstrItinClass;
53 def CVI_VM_CUR_LD    : InstrItinClass;
54 def CVI_VM_VP_LDU    : InstrItinClass;
55 def CVI_VM_ST        : InstrItinClass;
56 def CVI_VM_NEW_ST    : InstrItinClass;
57 def CVI_VM_STU       : InstrItinClass;
58 def CVI_HIST         : InstrItinClass;
59 def CVI_VA_EXT       : InstrItinClass;
60
61 // There are four SLOTS (four parallel pipelines) in Hexagon V60 machine.
62 // This file describes that machine information.
63 //
64 //    |===========|==================================================|
65 //    | PIPELINE  |              Instruction Classes                 |
66 //    |===========|==================================================|
67 //    | SLOT0     |  LD       ST    ALU32     MEMOP     NV    SYSTEM |
68 //    |-----------|--------------------------------------------------|
69 //    | SLOT1     |  LD       ST    ALU32                            |
70 //    |-----------|--------------------------------------------------|
71 //    | SLOT2     |  XTYPE          ALU32     J         JR           |
72 //    |-----------|--------------------------------------------------|
73 //    | SLOT3     |  XTYPE          ALU32     J         CR           |
74 //    |===========|==================================================|
75 //
76 //
77 // In addition to using the above SLOTS, there are also six vector pipelines
78 // in the CVI co-processor in the Hexagon V60 machine.
79 //
80 //      |=========| |=========| |=========| |=========| |=========| |=========|
81 // SLOT | CVI_LD  | |CVI_MPY3 | |CVI_MPY2 | |CVI_SHIFT| |CVI_XLANE| | CVI_ST  |
82 // ==== |=========| |=========| |=========| |=========| |=========| |=========|
83 // S0-3 |         | | CVI_VA  | | CVI_VA  | | CVI_VA  | | CVI_VA  | |         |
84 // S2-3 |         | | CVI_VX  | | CVI_VX  | |         | |         | |         |
85 // S0-3 |         | |         | |         | |         | | CVI_VP  | |         |
86 // S0-3 |         | |         | |         | | CVI_VS  | |         | |         |
87 // S0-1 |(CVI_LD) | | CVI_LD  | | CVI_LD  | | CVI_LD  | | CVI_LD  | |         |
88 // S0-1 |(C*TMP_LD) |         | |         | |         | |         | |         |
89 // S01  |(C*_LDU) | |         | |         | |         | | C*_LDU  | |         |
90 // S0   |         | | CVI_ST  | | CVI_ST  | | CVI_ST  | | CVI_ST  | |(CVI_ST) |
91 // S0   |         | |         | |         | |         | |         | |(C*TMP_ST)
92 // S01  |         | |         | |         | |         | | VSTU    | |(C*_STU) |
93 //      |=========| |=========| |=========| |=========| |=========| |=========|
94 //                  |=====================| |=====================|
95 //                  | CVI_MPY2 & CVI_MPY3 | |CVI_XLANE & CVI_SHIFT|
96 //                  |=====================| |=====================|
97 // S0-3             | CVI_VA_DV           | | CVI_VA_DV           |
98 // S0-3             |                     | | CVI_VP_DV           |
99 // S2-3             | CVI_VX_DV           | |                     |
100 //                  |=====================| |=====================|
101 //      |=====================================================================|
102 // S0-3 | CVI_HIST   Histogram                                                |
103 // S0123| CVI_VA_EXT Extract                                                  |
104 //      |=====================================================================|
105
106 def HexagonItinerariesV60 :
107       ProcessorItineraries<[SLOT0, SLOT1, SLOT2, SLOT3, SLOT_ENDLOOP,
108                             CVI_ST, CVI_XLANE, CVI_SHIFT, CVI_MPY0, CVI_MPY1,
109                             CVI_LD, CVI_XLSHF, CVI_MPY01, CVI_ALL], [], [
110         // ALU32
111         InstrItinData<ALU32_2op_tc_1_SLOT0123     ,
112                       [InstrStage<1, [SLOT0, SLOT1, SLOT2, SLOT3]>]>,
113         InstrItinData<ALU32_2op_tc_2early_SLOT0123,
114                       [InstrStage<2, [SLOT0, SLOT1, SLOT2, SLOT3]>]>,
115         InstrItinData<ALU32_3op_tc_1_SLOT0123     ,
116                       [InstrStage<1, [SLOT0, SLOT1, SLOT2, SLOT3]>]>,
117         InstrItinData<ALU32_3op_tc_2_SLOT0123     ,
118                       [InstrStage<2, [SLOT0, SLOT1, SLOT2, SLOT3]>]>,
119         InstrItinData<ALU32_3op_tc_2early_SLOT0123,
120                       [InstrStage<2, [SLOT0, SLOT1, SLOT2, SLOT3]>]>,
121         InstrItinData<ALU32_ADDI_tc_1_SLOT0123    ,
122                       [InstrStage<1, [SLOT0, SLOT1, SLOT2, SLOT3]>]>,
123
124         // ALU64
125         InstrItinData<ALU64_tc_1_SLOT23     , [InstrStage<1, [SLOT2, SLOT3]>]>,
126         InstrItinData<ALU64_tc_2_SLOT23     , [InstrStage<2, [SLOT2, SLOT3]>]>,
127         InstrItinData<ALU64_tc_2early_SLOT23, [InstrStage<2, [SLOT2, SLOT3]>]>,
128         InstrItinData<ALU64_tc_3x_SLOT23    , [InstrStage<3, [SLOT2, SLOT3]>]>,
129
130         // CR -> System
131         InstrItinData<CR_tc_2_SLOT3      , [InstrStage<2, [SLOT3]>]>,
132         InstrItinData<CR_tc_2early_SLOT3 , [InstrStage<2, [SLOT3]>]>,
133         InstrItinData<CR_tc_3x_SLOT3     , [InstrStage<3, [SLOT3]>]>,
134
135         // Jump (conditional/unconditional/return etc)
136         InstrItinData<CR_tc_2early_SLOT23, [InstrStage<2, [SLOT2, SLOT3]>]>,
137         InstrItinData<CR_tc_3x_SLOT23    , [InstrStage<3, [SLOT2, SLOT3]>]>,
138         InstrItinData<CJ_tc_1_SLOT23     , [InstrStage<1, [SLOT2, SLOT3]>]>,
139         InstrItinData<CJ_tc_2early_SLOT23, [InstrStage<2, [SLOT2, SLOT3]>]>,
140         InstrItinData<J_tc_2early_SLOT23 , [InstrStage<2, [SLOT2, SLOT3]>]>,
141         InstrItinData<J_tc_2early_CJUMP_UCJUMP_ARCHDEPSLOT     , [InstrStage<1, [SLOT2, SLOT3]>]>,
142
143         // JR
144         InstrItinData<J_tc_2early_SLOT2  , [InstrStage<2, [SLOT2]>]>,
145         InstrItinData<J_tc_3stall_SLOT2  , [InstrStage<3, [SLOT2]>]>,
146
147         // Extender
148         InstrItinData<EXTENDER_tc_1_SLOT0123, [InstrStage<1,
149                               [SLOT0, SLOT1, SLOT2, SLOT3]>]>,
150
151         // Load
152         InstrItinData<LD_tc_ld_SLOT01      , [InstrStage<3, [SLOT0, SLOT1]>]>,
153         InstrItinData<LD_tc_3or4stall_SLOT0, [InstrStage<4, [SLOT0]>]>,
154         InstrItinData<LD_tc_ld_SLOT0       , [InstrStage<3, [SLOT0]>]>,
155
156         // M
157         InstrItinData<M_tc_1_SLOT23     , [InstrStage<1, [SLOT2, SLOT3]>]>,
158         InstrItinData<M_tc_2_SLOT23     , [InstrStage<2, [SLOT2, SLOT3]>]>,
159         InstrItinData<M_tc_3_SLOT23     , [InstrStage<3, [SLOT2, SLOT3]>]>,
160         InstrItinData<M_tc_3x_SLOT23    , [InstrStage<3, [SLOT2, SLOT3]>]>,
161         InstrItinData<M_tc_3or4x_SLOT23 , [InstrStage<4, [SLOT2, SLOT3]>]>,
162         InstrItinData<M_tc_3stall_SLOT23, [InstrStage<3, [SLOT2, SLOT3]>]>,
163
164         // Store
165         InstrItinData<ST_tc_st_SLOT01   , [InstrStage<1, [SLOT0, SLOT1]>]>,
166         InstrItinData<ST_tc_3stall_SLOT0, [InstrStage<3, [SLOT0]>]>,
167         InstrItinData<ST_tc_ld_SLOT0    , [InstrStage<3, [SLOT0]>]>,
168         InstrItinData<ST_tc_st_SLOT0    , [InstrStage<1, [SLOT0]>]>,
169
170         // S
171         InstrItinData<S_2op_tc_1_SLOT23     , [InstrStage<1, [SLOT2, SLOT3]>]>,
172         InstrItinData<S_2op_tc_2_SLOT23     , [InstrStage<2, [SLOT2, SLOT3]>]>,
173         InstrItinData<S_2op_tc_2early_SLOT23, [InstrStage<2, [SLOT2, SLOT3]>]>,
174         // The S_2op_tc_3x_SLOT23 slots are 4 cycles on v60.
175         InstrItinData<S_2op_tc_3or4x_SLOT23 , [InstrStage<4, [SLOT2, SLOT3]>]>,
176         InstrItinData<S_3op_tc_1_SLOT23     , [InstrStage<1, [SLOT2, SLOT3]>]>,
177         InstrItinData<S_3op_tc_2_SLOT23     , [InstrStage<2, [SLOT2, SLOT3]>]>,
178         InstrItinData<S_3op_tc_2early_SLOT23, [InstrStage<2, [SLOT2, SLOT3]>]>,
179         InstrItinData<S_3op_tc_3_SLOT23     , [InstrStage<3, [SLOT2, SLOT3]>]>,
180         InstrItinData<S_3op_tc_3stall_SLOT23, [InstrStage<3, [SLOT2, SLOT3]>]>,
181         InstrItinData<S_3op_tc_3x_SLOT23    , [InstrStage<3, [SLOT2, SLOT3]>]>,
182
183         // New Value Compare Jump
184         InstrItinData<NCJ_tc_3or4stall_SLOT0, [InstrStage<4, [SLOT0]>]>,
185
186         // Mem ops
187         InstrItinData<V2LDST_tc_st_SLOT0  , [InstrStage<1, [SLOT0]>]>,
188         InstrItinData<V2LDST_tc_ld_SLOT01 , [InstrStage<2, [SLOT0, SLOT1]>]>,
189         InstrItinData<V2LDST_tc_st_SLOT01 , [InstrStage<1, [SLOT0, SLOT1]>]>,
190         InstrItinData<V4LDST_tc_st_SLOT0  , [InstrStage<1, [SLOT0]>]>,
191         InstrItinData<V4LDST_tc_ld_SLOT01 , [InstrStage<3, [SLOT0, SLOT1]>]>,
192         InstrItinData<V4LDST_tc_st_SLOT01 , [InstrStage<1, [SLOT0, SLOT1]>]>,
193
194         // Endloop
195         InstrItinData<J_tc_2early_SLOT0123, [InstrStage<2, [SLOT_ENDLOOP]>]>,
196
197         // Vector
198         InstrItinData<COPROC_VMEM_vtc_long_SLOT01,
199                              [InstrStage<3, [SLOT0, SLOT1]>]>,
200         InstrItinData<COPROC_VX_vtc_long_SLOT23  ,
201                              [InstrStage<3, [SLOT2, SLOT3]>]>,
202         InstrItinData<COPROC_VX_vtc_SLOT23 ,
203                              [InstrStage<3, [SLOT2, SLOT3]>]>,
204         InstrItinData<MAPPING_tc_1_SLOT0123      ,
205                              [InstrStage<1, [SLOT0, SLOT1, SLOT2, SLOT3]>]>,
206
207         // Duplex and Compound
208         InstrItinData<DUPLEX     , [InstrStage<1, [SLOT0]>]>,
209         InstrItinData<COMPOUND_CJ_ARCHDEPSLOT   , [InstrStage<1, [SLOT2, SLOT3]>]>,
210         InstrItinData<COMPOUND , [InstrStage<1, [SLOT2, SLOT3]>]>,
211         // Misc
212         InstrItinData<PREFIX , [InstrStage<1, [SLOT0, SLOT1, SLOT2, SLOT3]>]>,
213         InstrItinData<PSEUDO , [InstrStage<1, [SLOT0, SLOT1, SLOT2, SLOT3]>]>,
214         InstrItinData<PSEUDOM    , [InstrStage<1, [SLOT2, SLOT3], 0>,
215                                     InstrStage<1, [SLOT2, SLOT3]>]>,
216
217         // Latest CVI spec definitions.
218         InstrItinData<CVI_VA,[InstrStage<1, [SLOT0,SLOT1,SLOT2,SLOT3], 0>,
219                                     InstrStage<1, [CVI_XLANE,CVI_SHIFT,
220                                                    CVI_MPY0, CVI_MPY1]>]>,
221         InstrItinData<CVI_VA_DV,
222                                    [InstrStage<1, [SLOT0,SLOT1,SLOT2,SLOT3], 0>,
223                                     InstrStage<1, [CVI_XLSHF, CVI_MPY01]>]>,
224         InstrItinData<CVI_VX_LONG, [InstrStage<1, [SLOT2, SLOT3], 0>,
225                                     InstrStage<1, [CVI_MPY0, CVI_MPY1]>]>,
226         InstrItinData<CVI_VX_LATE, [InstrStage<1, [SLOT2, SLOT3], 0>,
227                                     InstrStage<1, [CVI_MPY0, CVI_MPY1]>]>,
228         InstrItinData<CVI_VX,[InstrStage<1, [SLOT2, SLOT3], 0>,
229                                     InstrStage<1, [CVI_MPY0, CVI_MPY1]>]>,
230         InstrItinData<CVI_VX_DV_LONG,
231                                    [InstrStage<1, [SLOT2, SLOT3], 0>,
232                                     InstrStage<1, [CVI_MPY01]>]>,
233         InstrItinData<CVI_VX_DV,
234                                    [InstrStage<1, [SLOT2, SLOT3], 0>,
235                                     InstrStage<1, [CVI_MPY01]>]>,
236         InstrItinData<CVI_VX_DV_SLOT2,
237                                    [InstrStage<1, [SLOT2], 0>,
238                                     InstrStage<1, [CVI_MPY01]>]>,
239         InstrItinData<CVI_VP,      [InstrStage<1, [SLOT0,SLOT1,SLOT2,SLOT3], 0>,
240                                     InstrStage<1, [CVI_XLANE]>]>,
241         InstrItinData<CVI_VP_LONG, [InstrStage<1, [SLOT0,SLOT1,SLOT2,SLOT3], 0>,
242                                     InstrStage<1, [CVI_XLANE]>]>,
243         InstrItinData<CVI_VP_VS_EARLY,
244                                    [InstrStage<1, [SLOT0,SLOT1,SLOT2,SLOT3], 0>,
245                                     InstrStage<1, [CVI_XLSHF]>]>,
246         InstrItinData<CVI_VP_VS_LONG,
247                                    [InstrStage<1, [SLOT0,SLOT1,SLOT2,SLOT3], 0>,
248                                     InstrStage<1, [CVI_XLSHF]>]>,
249         InstrItinData<CVI_VP_VS,
250                                    [InstrStage<1, [SLOT0,SLOT1,SLOT2,SLOT3], 0>,
251                                     InstrStage<1, [CVI_XLSHF]>]>,
252         InstrItinData<CVI_VP_VS_LONG_EARLY,
253                                    [InstrStage<1, [SLOT0,SLOT1,SLOT2,SLOT3], 0>,
254                                     InstrStage<1, [CVI_XLSHF]>]>,
255         InstrItinData<CVI_VP_DV  , [InstrStage<1, [SLOT0,SLOT1,SLOT2,SLOT3], 0>,
256                                     InstrStage<1, [CVI_XLSHF]>]>,
257         InstrItinData<CVI_VS,
258                                    [InstrStage<1, [SLOT0,SLOT1,SLOT2,SLOT3], 0>,
259                                     InstrStage<1, [CVI_SHIFT]>]>,
260         InstrItinData<CVI_VINLANESAT,
261                                    [InstrStage<1, [SLOT0,SLOT1,SLOT2,SLOT3], 0>,
262                                     InstrStage<1, [CVI_SHIFT]>]>,
263         InstrItinData<CVI_VM_LD  , [InstrStage<1, [SLOT0, SLOT1], 0>,
264                                     InstrStage<1, [CVI_LD], 0>,
265                                     InstrStage<1, [CVI_XLANE, CVI_SHIFT,
266                                                    CVI_MPY0, CVI_MPY1]>]>,
267         InstrItinData<CVI_VM_TMP_LD,[InstrStage<1,[SLOT0, SLOT1], 0>,
268                                     InstrStage<1, [CVI_LD]>]>,
269         InstrItinData<CVI_VM_CUR_LD,[InstrStage<1,[SLOT0, SLOT1], 0>,
270                                     InstrStage<1, [CVI_LD], 0>,
271                                     InstrStage<1, [CVI_XLANE, CVI_SHIFT,
272                                                    CVI_MPY0, CVI_MPY1]>]>,
273         InstrItinData<CVI_VM_VP_LDU,[InstrStage<1,[SLOT0], 0>,
274                                     InstrStage<1, [SLOT1], 0>,
275                                     InstrStage<1, [CVI_LD], 0>,
276                                     InstrStage<1, [CVI_XLANE]>]>,
277         InstrItinData<CVI_VM_ST  , [InstrStage<1, [SLOT0], 0>,
278                                     InstrStage<1, [CVI_ST], 0>,
279                                     InstrStage<1, [CVI_XLANE, CVI_SHIFT,
280                                                    CVI_MPY0, CVI_MPY1]>]>,
281         InstrItinData<CVI_VM_NEW_ST,[InstrStage<1,[SLOT0], 0>,
282                                     InstrStage<1, [CVI_ST]>]>,
283         InstrItinData<CVI_VM_STU , [InstrStage<1, [SLOT0], 0>,
284                                     InstrStage<1, [SLOT1], 0>,
285                                     InstrStage<1, [CVI_ST], 0>,
286                                     InstrStage<1, [CVI_XLANE]>]>,
287         InstrItinData<CVI_HIST   , [InstrStage<1, [SLOT0,SLOT1,SLOT2,SLOT3], 0>,
288                                     InstrStage<1, [CVI_ALL]>]>
289       ]>;
290
291 def HexagonModelV60 : SchedMachineModel {
292   // Max issue per cycle == bundle width.
293   let IssueWidth = 4;
294   let Itineraries = HexagonItinerariesV60;
295   let LoadLatency = 1;
296   let CompleteModel = 0;
297 }
298
299 //===----------------------------------------------------------------------===//
300 // Hexagon V60 Resource Definitions -
301 //===----------------------------------------------------------------------===//