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 //===----------------------------------------------------------------------===// 207