[Hexagon] Allocate MCInst in the MCContext to avoid leaking it.
[oota-llvm.git] / lib / Target / Hexagon / HexagonScheduleV4.td
1 //=-HexagonScheduleV4.td - HexagonV4 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 // There are four SLOTS (four parallel pipelines) in Hexagon V4 machine.
11 // This file describes that machine information.
12
13 //
14 //    |===========|==================================================|
15 //    | PIPELINE  |              Instruction Classes                 |
16 //    |===========|==================================================|
17 //    | SLOT0     |  LD       ST    ALU32     MEMOP     NV    SYSTEM |
18 //    |-----------|--------------------------------------------------|
19 //    | SLOT1     |  LD       ST    ALU32                            |
20 //    |-----------|--------------------------------------------------|
21 //    | SLOT2     |  XTYPE          ALU32     J         JR           |
22 //    |-----------|--------------------------------------------------|
23 //    | SLOT3     |  XTYPE          ALU32     J         CR           |
24 //    |===========|==================================================|
25
26 // Functional Units.
27 def SLOT0       : FuncUnit;
28 def SLOT1       : FuncUnit;
29 def SLOT2       : FuncUnit;
30 def SLOT3       : FuncUnit;
31 // Endloop is a pseudo instruction that is encoded with 2 bits in a packet
32 // rather than taking an execution slot. This special unit is needed
33 // to schedule an ENDLOOP with 4 other instructions.
34 def SLOT_ENDLOOP: FuncUnit;
35
36 // Itinerary classes.
37 def PSEUDO      : InstrItinClass;
38 def PSEUDOM   : InstrItinClass;
39 // ALU64/M/S Instruction classes of V2 are collectively knownn as XTYPE in V4.
40 def DUPLEX      : InstrItinClass;
41 def PREFIX      : InstrItinClass;
42 def COMPOUND_CJ_ARCHDEPSLOT    : InstrItinClass;
43 def COMPOUND    : InstrItinClass;
44
45 def ALU32_2op_tc_1_SLOT0123  : InstrItinClass;
46 def ALU32_2op_tc_2early_SLOT0123  : InstrItinClass;
47 def ALU32_3op_tc_2early_SLOT0123  : InstrItinClass;
48 def ALU32_3op_tc_1_SLOT0123  : InstrItinClass;
49 def ALU32_3op_tc_2_SLOT0123  : InstrItinClass;
50 def ALU32_ADDI_tc_1_SLOT0123 : InstrItinClass;
51 def ALU64_tc_1_SLOT23        : InstrItinClass;
52 def ALU64_tc_1or2_SLOT23     : InstrItinClass;
53 def ALU64_tc_2_SLOT23        : InstrItinClass;
54 def ALU64_tc_2early_SLOT23   : InstrItinClass;
55 def ALU64_tc_3x_SLOT23       : InstrItinClass;
56 def CR_tc_2_SLOT3            : InstrItinClass;
57 def CR_tc_2early_SLOT23      : InstrItinClass;
58 def CR_tc_2early_SLOT3       : InstrItinClass;
59 def CR_tc_3x_SLOT23          : InstrItinClass;
60 def CR_tc_3x_SLOT3           : InstrItinClass;
61 def J_tc_2early_SLOT23       : InstrItinClass;
62 def J_tc_2early_CJUMP_UCJUMP_ARCHDEPSLOT       : InstrItinClass;
63 def J_tc_2early_SLOT2        : InstrItinClass;
64 def LD_tc_ld_SLOT01          : InstrItinClass;
65 def LD_tc_ld_SLOT0           : InstrItinClass;
66 def LD_tc_3or4stall_SLOT0    : InstrItinClass;
67 def M_tc_1_SLOT23            : InstrItinClass;
68 def M_tc_1or2_SLOT23         : InstrItinClass;
69 def M_tc_2_SLOT23            : InstrItinClass;
70 def M_tc_3_SLOT23            : InstrItinClass;
71 def M_tc_3x_SLOT23           : InstrItinClass;
72 def M_tc_3or4x_SLOT23        : InstrItinClass;
73 def ST_tc_st_SLOT01          : InstrItinClass;
74 def ST_tc_st_SLOT0           : InstrItinClass;
75 def ST_tc_ld_SLOT0           : InstrItinClass;
76 def ST_tc_3stall_SLOT0       : InstrItinClass;
77 def S_2op_tc_1_SLOT23        : InstrItinClass;
78 def S_2op_tc_2_SLOT23        : InstrItinClass;
79 def S_2op_tc_2early_SLOT23   : InstrItinClass;
80 def S_2op_tc_3or4x_SLOT23    : InstrItinClass;
81 def S_3op_tc_1_SLOT23        : InstrItinClass;
82 def S_3op_tc_1or2_SLOT23     : InstrItinClass;
83 def S_3op_tc_2_SLOT23        : InstrItinClass;
84 def S_3op_tc_2early_SLOT23   : InstrItinClass;
85 def S_3op_tc_3_SLOT23        : InstrItinClass;
86 def S_3op_tc_3x_SLOT23       : InstrItinClass;
87 def NCJ_tc_3or4stall_SLOT0   : InstrItinClass;
88 def V2LDST_tc_ld_SLOT01      : InstrItinClass;
89 def V2LDST_tc_st_SLOT0       : InstrItinClass;
90 def V2LDST_tc_st_SLOT01      : InstrItinClass;
91 def V4LDST_tc_ld_SLOT01      : InstrItinClass;
92 def V4LDST_tc_st_SLOT0       : InstrItinClass;
93 def V4LDST_tc_st_SLOT01      : InstrItinClass;
94 def J_tc_2early_SLOT0123     : InstrItinClass;
95 def EXTENDER_tc_1_SLOT0123   : InstrItinClass;
96 def S_3op_tc_3stall_SLOT23   : InstrItinClass;
97
98
99 def HexagonItinerariesV4 :
100       ProcessorItineraries<[SLOT0, SLOT1, SLOT2, SLOT3, SLOT_ENDLOOP], [], [
101         // ALU32
102         InstrItinData<ALU32_2op_tc_1_SLOT0123  ,
103                      [InstrStage<1, [SLOT0, SLOT1, SLOT2, SLOT3]>]>,
104         InstrItinData<ALU32_2op_tc_2early_SLOT0123,
105                      [InstrStage<1, [SLOT0, SLOT1, SLOT2, SLOT3]>]>,
106         InstrItinData<ALU32_3op_tc_1_SLOT0123   ,
107                      [InstrStage<1, [SLOT0, SLOT1, SLOT2, SLOT3]>]>,
108         InstrItinData<ALU32_3op_tc_2early_SLOT0123,
109                      [InstrStage<1, [SLOT0, SLOT1, SLOT2, SLOT3]>]>,
110         InstrItinData<ALU32_3op_tc_2_SLOT0123   ,
111                      [InstrStage<1, [SLOT0, SLOT1, SLOT2, SLOT3]>]>,
112         InstrItinData<ALU32_ADDI_tc_1_SLOT0123  ,
113                      [InstrStage<1, [SLOT0, SLOT1, SLOT2, SLOT3]>]>,
114
115         // ALU64
116         InstrItinData<ALU64_tc_1_SLOT23      , [InstrStage<1, [SLOT2, SLOT3]>]>,
117         InstrItinData<ALU64_tc_1or2_SLOT23   , [InstrStage<1, [SLOT2, SLOT3]>]>,
118         InstrItinData<ALU64_tc_2_SLOT23      , [InstrStage<1, [SLOT2, SLOT3]>]>,
119         InstrItinData<ALU64_tc_2early_SLOT23 , [InstrStage<1, [SLOT2, SLOT3]>]>,
120         InstrItinData<ALU64_tc_3x_SLOT23     , [InstrStage<1, [SLOT2, SLOT3]>]>,
121
122         // CR -> System
123         InstrItinData<CR_tc_2_SLOT3          , [InstrStage<1, [SLOT3]>]>,
124         InstrItinData<CR_tc_2early_SLOT3     , [InstrStage<1, [SLOT3]>]>,
125         InstrItinData<CR_tc_3x_SLOT3         , [InstrStage<1, [SLOT3]>]>,
126
127         // Jump (conditional/unconditional/return etc)
128         // CR
129         InstrItinData<CR_tc_2early_SLOT23    , [InstrStage<1, [SLOT2, SLOT3]>]>,
130         InstrItinData<CR_tc_3x_SLOT23        , [InstrStage<1, [SLOT2, SLOT3]>]>,
131         // J
132         InstrItinData<J_tc_2early_SLOT23     , [InstrStage<1, [SLOT2, SLOT3]>]>,
133         // JR
134         InstrItinData<J_tc_2early_SLOT2      , [InstrStage<1, [SLOT2]>]>,
135
136         //Load
137         InstrItinData<LD_tc_ld_SLOT01        , [InstrStage<1, [SLOT0, SLOT1]>]>,
138         InstrItinData<LD_tc_ld_SLOT0         , [InstrStage<1, [SLOT0]>]>,
139         InstrItinData<LD_tc_3or4stall_SLOT0  , [InstrStage<1, [SLOT0]>]>,
140
141         // M
142         InstrItinData<M_tc_1_SLOT23          , [InstrStage<1, [SLOT2, SLOT3]>]>,
143         InstrItinData<M_tc_1or2_SLOT23       , [InstrStage<1, [SLOT2, SLOT3]>]>,
144         InstrItinData<M_tc_2_SLOT23          , [InstrStage<1, [SLOT2, SLOT3]>]>,
145         InstrItinData<M_tc_3_SLOT23          , [InstrStage<1, [SLOT2, SLOT3]>]>,
146         InstrItinData<M_tc_3x_SLOT23         , [InstrStage<1, [SLOT2, SLOT3]>]>,
147         InstrItinData<M_tc_3or4x_SLOT23      , [InstrStage<1, [SLOT2, SLOT3]>]>,
148
149         // Store
150         // ST
151         InstrItinData<ST_tc_st_SLOT01        , [InstrStage<1, [SLOT0, SLOT1]>]>,
152         // ST0
153         InstrItinData<ST_tc_st_SLOT0         , [InstrStage<1, [SLOT0]>]>,
154         InstrItinData<ST_tc_ld_SLOT0         , [InstrStage<1, [SLOT0]>]>,
155
156         // S
157         InstrItinData<S_2op_tc_1_SLOT23      , [InstrStage<1, [SLOT2, SLOT3]>]>,
158         InstrItinData<S_2op_tc_2_SLOT23      , [InstrStage<1, [SLOT2, SLOT3]>]>,
159         InstrItinData<S_2op_tc_2early_SLOT23 , [InstrStage<1, [SLOT2, SLOT3]>]>,
160         InstrItinData<S_2op_tc_3or4x_SLOT23  , [InstrStage<1, [SLOT2, SLOT3]>]>,
161         InstrItinData<S_3op_tc_1_SLOT23      , [InstrStage<1, [SLOT2, SLOT3]>]>,
162         InstrItinData<S_3op_tc_1or2_SLOT23   , [InstrStage<1, [SLOT2, SLOT3]>]>,
163         InstrItinData<S_3op_tc_2early_SLOT23 , [InstrStage<1, [SLOT2, SLOT3]>]>,
164         InstrItinData<S_3op_tc_2_SLOT23      , [InstrStage<1, [SLOT2, SLOT3]>]>,
165         InstrItinData<S_3op_tc_3_SLOT23      , [InstrStage<1, [SLOT2, SLOT3]>]>,
166         InstrItinData<S_3op_tc_3x_SLOT23     , [InstrStage<1, [SLOT2, SLOT3]>]>,
167
168         // SYS
169         InstrItinData<ST_tc_3stall_SLOT0     , [InstrStage<1, [SLOT0]>]>,
170
171         // New Value Compare Jump
172         InstrItinData<NCJ_tc_3or4stall_SLOT0 , [InstrStage<1, [SLOT0]>]>,
173
174         // Mem ops - MEM_V4
175         InstrItinData<V2LDST_tc_st_SLOT0     , [InstrStage<1, [SLOT0]>]>,
176         InstrItinData<V2LDST_tc_ld_SLOT01    , [InstrStage<1, [SLOT0, SLOT1]>]>,
177         InstrItinData<V2LDST_tc_st_SLOT01    , [InstrStage<1, [SLOT0, SLOT1]>]>,
178         InstrItinData<V4LDST_tc_st_SLOT0     , [InstrStage<1, [SLOT0]>]>,
179         InstrItinData<V4LDST_tc_ld_SLOT01    , [InstrStage<1, [SLOT0, SLOT1]>]>,
180         InstrItinData<V4LDST_tc_st_SLOT01    , [InstrStage<1, [SLOT0, SLOT1]>]>,
181
182         InstrItinData<DUPLEX , [InstrStage<1, [SLOT0]>]>,
183
184         // ENDLOOP
185         InstrItinData<J_tc_2early_SLOT0123   , [InstrStage<1, [SLOT_ENDLOOP]>]>,
186
187         // Extender/PREFIX
188         InstrItinData<EXTENDER_tc_1_SLOT0123,
189                      [InstrStage<1, [SLOT0, SLOT1, SLOT2, SLOT3]>]>,
190
191         InstrItinData<COMPOUND , [InstrStage<1, [SLOT2, SLOT3]>]>,
192         InstrItinData<PSEUDO , [InstrStage<1, [SLOT0, SLOT1, SLOT2, SLOT3]>]>,
193         InstrItinData<PSEUDOM, [InstrStage<1, [SLOT2, SLOT3], 0>,
194                                 InstrStage<1, [SLOT2, SLOT3]>]>
195       ]>;
196
197 def HexagonModelV4 : SchedMachineModel {
198   // Max issue per cycle == bundle width.
199   let IssueWidth = 4;
200   let Itineraries = HexagonItinerariesV4;
201   let LoadLatency = 1;
202 }
203
204 //===----------------------------------------------------------------------===//
205 // Hexagon V4 Resource Definitions -
206 //===----------------------------------------------------------------------===//