1 //=-HexagonScheduleV4.td - HexagonV4 Scheduling Definitions --*- tablegen -*-=//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // There are four SLOTS (four parallel pipelines) in Hexagon V4 machine.
11 // This file describes that machine information.
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 // |===========|==================================================|
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;
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;
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;
99 def HexagonItinerariesV4 :
100 ProcessorItineraries<[SLOT0, SLOT1, SLOT2, SLOT3, SLOT_ENDLOOP], [], [
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]>]>,
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]>]>,
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]>]>,
127 // Jump (conditional/unconditional/return etc)
129 InstrItinData<CR_tc_2early_SLOT23 , [InstrStage<1, [SLOT2, SLOT3]>]>,
130 InstrItinData<CR_tc_3x_SLOT23 , [InstrStage<1, [SLOT2, SLOT3]>]>,
132 InstrItinData<J_tc_2early_SLOT23 , [InstrStage<1, [SLOT2, SLOT3]>]>,
134 InstrItinData<J_tc_2early_SLOT2 , [InstrStage<1, [SLOT2]>]>,
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]>]>,
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]>]>,
151 InstrItinData<ST_tc_st_SLOT01 , [InstrStage<1, [SLOT0, SLOT1]>]>,
153 InstrItinData<ST_tc_st_SLOT0 , [InstrStage<1, [SLOT0]>]>,
154 InstrItinData<ST_tc_ld_SLOT0 , [InstrStage<1, [SLOT0]>]>,
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]>]>,
169 InstrItinData<ST_tc_3stall_SLOT0 , [InstrStage<1, [SLOT0]>]>,
171 // New Value Compare Jump
172 InstrItinData<NCJ_tc_3or4stall_SLOT0 , [InstrStage<1, [SLOT0]>]>,
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]>]>,
182 InstrItinData<DUPLEX , [InstrStage<1, [SLOT0]>]>,
185 InstrItinData<J_tc_2early_SLOT0123 , [InstrStage<1, [SLOT_ENDLOOP]>]>,
188 InstrItinData<EXTENDER_tc_1_SLOT0123,
189 [InstrStage<1, [SLOT0, SLOT1, SLOT2, SLOT3]>]>,
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]>]>
197 def HexagonModelV4 : SchedMachineModel {
198 // Max issue per cycle == bundle width.
200 let Itineraries = HexagonItinerariesV4;
204 //===----------------------------------------------------------------------===//
205 // Hexagon V4 Resource Definitions -
206 //===----------------------------------------------------------------------===//