1 ;; Pipeline descriptions of Andes NDS32 cpu for GNU compiler 2 ;; Copyright (C) 2012-2022 Free Software Foundation, Inc. 3 ;; Contributed by Andes Technology Corporation. 4 ;; 5 ;; This file is part of GCC. 6 ;; 7 ;; GCC is free software; you can redistribute it and/or modify it 8 ;; under the terms of the GNU General Public License as published 9 ;; by the Free Software Foundation; either version 3, or (at your 10 ;; option) any later version. 11 ;; 12 ;; GCC is distributed in the hope that it will be useful, but WITHOUT 13 ;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 14 ;; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public 15 ;; License for more details. 16 ;; 17 ;; You should have received a copy of the GNU General Public License 18 ;; along with GCC; see the file COPYING3. If not see 19 ;; <http://www.gnu.org/licenses/>. 20 21 22 ;; ------------------------------------------------------------------------ 23 ;; Define E8 pipeline settings. 24 ;; ------------------------------------------------------------------------ 25 26 (define_automaton "nds32_e8_machine") 27 28 ;; ------------------------------------------------------------------------ 29 ;; Pipeline Stages 30 ;; ------------------------------------------------------------------------ 31 ;; IF - Instruction Fetch 32 ;; II - Instruction Issue / Address Generation 33 ;; EX - Instruction Execution 34 ;; EXD - Psuedo Stage / Load Data Completion 35 36 (define_cpu_unit "e8_ii" "nds32_e8_machine") 37 (define_cpu_unit "e8_ex" "nds32_e8_machine") 38 39 (define_insn_reservation "nds_e8_unknown" 1 40 (and (eq_attr "type" "unknown") 41 (eq_attr "pipeline_model" "e8")) 42 "e8_ii, e8_ex") 43 44 (define_insn_reservation "nds_e8_misc" 1 45 (and (eq_attr "type" "misc") 46 (eq_attr "pipeline_model" "e8")) 47 "e8_ii, e8_ex") 48 49 (define_insn_reservation "nds_e8_alu" 1 50 (and (eq_attr "type" "alu") 51 (eq_attr "pipeline_model" "e8")) 52 "e8_ii, e8_ex") 53 54 (define_insn_reservation "nds_e8_load" 1 55 (and (match_test "nds32::load_single_p (insn)") 56 (eq_attr "pipeline_model" "e8")) 57 "e8_ii, e8_ex") 58 59 (define_insn_reservation "nds_e8_store" 1 60 (and (match_test "nds32::store_single_p (insn)") 61 (eq_attr "pipeline_model" "e8")) 62 "e8_ii, e8_ex") 63 64 (define_insn_reservation "nds_e8_load_multiple_1" 1 65 (and (and (eq_attr "type" "load_multiple") 66 (eq_attr "combo" "1")) 67 (eq_attr "pipeline_model" "e8")) 68 "e8_ii, e8_ex") 69 70 (define_insn_reservation "nds_e8_load_multiple_2" 1 71 (and (ior (and (eq_attr "type" "load_multiple") 72 (eq_attr "combo" "2")) 73 (match_test "nds32::load_double_p (insn)")) 74 (eq_attr "pipeline_model" "e8")) 75 "e8_ii, e8_ii+e8_ex, e8_ex") 76 77 (define_insn_reservation "nds_e8_load_multiple_3" 1 78 (and (and (eq_attr "type" "load_multiple") 79 (eq_attr "combo" "3")) 80 (eq_attr "pipeline_model" "e8")) 81 "e8_ii, (e8_ii+e8_ex)*2, e8_ex") 82 83 (define_insn_reservation "nds_e8_load_multiple_4" 1 84 (and (and (eq_attr "type" "load_multiple") 85 (eq_attr "combo" "4")) 86 (eq_attr "pipeline_model" "e8")) 87 "e8_ii, (e8_ii+e8_ex)*3, e8_ex") 88 89 (define_insn_reservation "nds_e8_load_multiple_5" 1 90 (and (and (eq_attr "type" "load_multiple") 91 (eq_attr "combo" "5")) 92 (eq_attr "pipeline_model" "e8")) 93 "e8_ii, (e8_ii+e8_ex)*4, e8_ex") 94 95 (define_insn_reservation "nds_e8_load_multiple_6" 1 96 (and (and (eq_attr "type" "load_multiple") 97 (eq_attr "combo" "6")) 98 (eq_attr "pipeline_model" "e8")) 99 "e8_ii, (e8_ii+e8_ex)*5, e8_ex") 100 101 (define_insn_reservation "nds_e8_load_multiple_7" 1 102 (and (and (eq_attr "type" "load_multiple") 103 (eq_attr "combo" "7")) 104 (eq_attr "pipeline_model" "e8")) 105 "e8_ii, (e8_ii+e8_ex)*6, e8_ex") 106 107 (define_insn_reservation "nds_e8_load_multiple_8" 1 108 (and (and (eq_attr "type" "load_multiple") 109 (eq_attr "combo" "8")) 110 (eq_attr "pipeline_model" "e8")) 111 "e8_ii, (e8_ii+e8_ex)*7, e8_ex") 112 113 (define_insn_reservation "nds_e8_load_multiple_12" 1 114 (and (and (eq_attr "type" "load_multiple") 115 (eq_attr "combo" "12")) 116 (eq_attr "pipeline_model" "e8")) 117 "e8_ii, (e8_ii+e8_ex)*11, e8_ex") 118 119 (define_insn_reservation "nds_e8_store_multiple_1" 1 120 (and (and (eq_attr "type" "store_multiple") 121 (eq_attr "combo" "1")) 122 (eq_attr "pipeline_model" "e8")) 123 "e8_ii, e8_ex") 124 125 (define_insn_reservation "nds_e8_store_multiple_2" 1 126 (and (ior (and (eq_attr "type" "store_multiple") 127 (eq_attr "combo" "2")) 128 (match_test "nds32::store_double_p (insn)")) 129 (eq_attr "pipeline_model" "e8")) 130 "e8_ii, e8_ii+e8_ex, e8_ex") 131 132 (define_insn_reservation "nds_e8_store_multiple_3" 1 133 (and (and (eq_attr "type" "store_multiple") 134 (eq_attr "combo" "3")) 135 (eq_attr "pipeline_model" "e8")) 136 "e8_ii, (e8_ii+e8_ex)*2, e8_ex") 137 138 (define_insn_reservation "nds_e8_store_multiple_4" 1 139 (and (and (eq_attr "type" "store_multiple") 140 (eq_attr "combo" "4")) 141 (eq_attr "pipeline_model" "e8")) 142 "e8_ii, (e8_ii+e8_ex)*3, e8_ex") 143 144 (define_insn_reservation "nds_e8_store_multiple_5" 1 145 (and (and (eq_attr "type" "store_multiple") 146 (eq_attr "combo" "5")) 147 (eq_attr "pipeline_model" "e8")) 148 "e8_ii, (e8_ii+e8_ex)*4, e8_ex") 149 150 (define_insn_reservation "nds_e8_store_multiple_6" 1 151 (and (and (eq_attr "type" "store_multiple") 152 (eq_attr "combo" "6")) 153 (eq_attr "pipeline_model" "e8")) 154 "e8_ii, (e8_ii+e8_ex)*5, e8_ex") 155 156 (define_insn_reservation "nds_e8_store_multiple_7" 1 157 (and (and (eq_attr "type" "store_multiple") 158 (eq_attr "combo" "7")) 159 (eq_attr "pipeline_model" "e8")) 160 "e8_ii, (e8_ii+e8_ex)*6, e8_ex") 161 162 (define_insn_reservation "nds_e8_store_multiple_8" 1 163 (and (and (eq_attr "type" "store_multiple") 164 (eq_attr "combo" "8")) 165 (eq_attr "pipeline_model" "e8")) 166 "e8_ii, (e8_ii+e8_ex)*7, e8_ex") 167 168 (define_insn_reservation "nds_e8_store_multiple_12" 1 169 (and (and (eq_attr "type" "store_multiple") 170 (eq_attr "combo" "12")) 171 (eq_attr "pipeline_model" "e8")) 172 "e8_ii, (e8_ii+e8_ex)*11, e8_ex") 173 174 (define_insn_reservation "nds_e8_mul_fast" 1 175 (and (match_test "nds32_mul_config != MUL_TYPE_SLOW") 176 (and (eq_attr "type" "mul") 177 (eq_attr "pipeline_model" "e8"))) 178 "e8_ii, e8_ex") 179 180 (define_insn_reservation "nds_e8_mul_slow" 1 181 (and (match_test "nds32_mul_config == MUL_TYPE_SLOW") 182 (and (eq_attr "type" "mul") 183 (eq_attr "pipeline_model" "e8"))) 184 "e8_ii, e8_ex*16") 185 186 (define_insn_reservation "nds_e8_mac_fast" 1 187 (and (match_test "nds32_mul_config != MUL_TYPE_SLOW") 188 (and (eq_attr "type" "mac") 189 (eq_attr "pipeline_model" "e8"))) 190 "e8_ii, e8_ii+e8_ex, e8_ex") 191 192 (define_insn_reservation "nds_e8_mac_slow" 1 193 (and (match_test "nds32_mul_config == MUL_TYPE_SLOW") 194 (and (eq_attr "type" "mac") 195 (eq_attr "pipeline_model" "e8"))) 196 "e8_ii, (e8_ii+e8_ex)*16, e8_ex") 197 198 (define_insn_reservation "nds_e8_div" 1 199 (and (eq_attr "type" "div") 200 (eq_attr "pipeline_model" "e8")) 201 "e8_ii, (e8_ii+e8_ex)*36, e8_ex") 202 203 (define_insn_reservation "nds_e8_branch" 1 204 (and (eq_attr "type" "branch") 205 (eq_attr "pipeline_model" "e8")) 206 "e8_ii, e8_ex") 207 208 ;; ------------------------------------------------------------------------ 209 ;; Comment Notations and Bypass Rules 210 ;; ------------------------------------------------------------------------ 211 ;; Producers (LHS) 212 ;; LD 213 ;; Load data from the memory and produce the loaded data. The result is 214 ;; ready at EXD. 215 ;; LMW(N, M) 216 ;; There are N micro-operations within an instruction that loads multiple 217 ;; words. The result produced by the M-th micro-operation is sent to 218 ;; consumers. The result is ready at EXD. 219 ;; ADDR_OUT 220 ;; Most load/store instructions can produce an address output if updating 221 ;; the base register is required. The result is ready at EX, which is 222 ;; produced by ALU. 223 ;; ALU, MOVD44, MUL, MAC 224 ;; The result is ready at EX. 225 ;; DIV_Rs 226 ;; A division instruction saves the quotient result to Rt and saves the 227 ;; remainder result to Rs. The instruction is separated into two micro- 228 ;; operations. The first micro-operation writes to Rt, and the seconde 229 ;; one writes to Rs. Each of the results is ready at EX. 230 ;; 231 ;; Consumers (RHS) 232 ;; ALU, MUL, DIV 233 ;; Require operands at EX. 234 ;; ADDR_IN_MOP(N) 235 ;; N denotes the address input is required by the N-th micro-operation. 236 ;; Such operand is required at II. 237 ;; ST 238 ;; A store instruction requires its data at EX. 239 ;; SMW(N, M) 240 ;; There are N micro-operations within an instruction that stores multiple 241 ;; words. Each M-th micro-operation requires its data at EX. 242 ;; BR_COND 243 ;; If a branch instruction is conditional, its input data is required at EX. 244 245 ;; LD -> ADDR_IN_MOP(1) 246 (define_bypass 2 247 "nds_e8_load" 248 "nds_e8_branch,\ 249 nds_e8_load, nds_e8_store,\ 250 nds_e8_load_multiple_1,nds_e8_load_multiple_2, nds_e8_load_multiple_3,\ 251 nds_e8_load_multiple_4,nds_e8_load_multiple_5, nds_e8_load_multiple_6,\ 252 nds_e8_load_multiple_7,nds_e8_load_multiple_8, nds_e8_load_multiple_12,\ 253 nds_e8_store_multiple_1,nds_e8_store_multiple_2, nds_e8_store_multiple_3,\ 254 nds_e8_store_multiple_4,nds_e8_store_multiple_5, nds_e8_store_multiple_6,\ 255 nds_e8_store_multiple_7,nds_e8_store_multiple_8, nds_e8_store_multiple_12" 256 "nds32_e8_load_to_ii_p" 257 ) 258 259 ;; LD -> ALU, MUL, MAC, DIV, BR_COND, ST, SMW(N, 1) 260 (define_bypass 2 261 "nds_e8_load" 262 "nds_e8_alu, 263 nds_e8_mul_fast, nds_e8_mul_slow,\ 264 nds_e8_mac_fast, nds_e8_mac_slow,\ 265 nds_e8_div,\ 266 nds_e8_branch,\ 267 nds_e8_store,\ 268 nds_e8_store_multiple_1,nds_e8_store_multiple_2, nds_e8_store_multiple_3,\ 269 nds_e8_store_multiple_4,nds_e8_store_multiple_5, nds_e8_store_multiple_6,\ 270 nds_e8_store_multiple_7,nds_e8_store_multiple_8, nds_e8_store_multiple_12" 271 "nds32_e8_load_to_ex_p" 272 ) 273 274 ;; ALU, MOVD44, MUL, MAC, DIV_Rs, LD_bi, ADDR_OUT -> ADDR_IN_MOP(1) 275 (define_bypass 2 276 "nds_e8_alu, 277 nds_e8_mul_fast, nds_e8_mul_slow,\ 278 nds_e8_mac_fast, nds_e8_mac_slow,\ 279 nds_e8_div,\ 280 nds_e8_load, nds_e8_store,\ 281 nds_e8_load_multiple_1,nds_e8_load_multiple_2, nds_e8_load_multiple_3,\ 282 nds_e8_load_multiple_4,nds_e8_load_multiple_5, nds_e8_load_multiple_6,\ 283 nds_e8_load_multiple_7,nds_e8_load_multiple_8, nds_e8_load_multiple_12,\ 284 nds_e8_store_multiple_1,nds_e8_store_multiple_2, nds_e8_store_multiple_3,\ 285 nds_e8_store_multiple_4,nds_e8_store_multiple_5, nds_e8_store_multiple_6,\ 286 nds_e8_store_multiple_7,nds_e8_store_multiple_8, nds_e8_store_multiple_12" 287 "nds_e8_branch,\ 288 nds_e8_load, nds_e8_store,\ 289 nds_e8_load_multiple_1,nds_e8_load_multiple_2, nds_e8_load_multiple_3,\ 290 nds_e8_load_multiple_4,nds_e8_load_multiple_5, nds_e8_load_multiple_6,\ 291 nds_e8_load_multiple_7,nds_e8_load_multiple_8, nds_e8_load_multiple_12,\ 292 nds_e8_store_multiple_1,nds_e8_store_multiple_2, nds_e8_store_multiple_3,\ 293 nds_e8_store_multiple_4,nds_e8_store_multiple_5, nds_e8_store_multiple_6,\ 294 nds_e8_store_multiple_7,nds_e8_store_multiple_8, nds_e8_store_multiple_12" 295 "nds32_e8_ex_to_ii_p" 296 ) 297 298 ;; LMW(N, N) -> ADDR_IN_MOP(1) 299 (define_bypass 2 300 "nds_e8_load_multiple_1,nds_e8_load_multiple_2, nds_e8_load_multiple_3,\ 301 nds_e8_load_multiple_4,nds_e8_load_multiple_5, nds_e8_load_multiple_6,\ 302 nds_e8_load_multiple_7,nds_e8_load_multiple_8, nds_e8_load_multiple_12" 303 "nds_e8_branch,\ 304 nds_e8_load, nds_e8_store,\ 305 nds_e8_load_multiple_1,nds_e8_load_multiple_2, nds_e8_load_multiple_3,\ 306 nds_e8_load_multiple_4,nds_e8_load_multiple_5, nds_e8_load_multiple_6,\ 307 nds_e8_load_multiple_7,nds_e8_load_multiple_8, nds_e8_load_multiple_12,\ 308 nds_e8_store_multiple_1,nds_e8_store_multiple_2, nds_e8_store_multiple_3,\ 309 nds_e8_store_multiple_4,nds_e8_store_multiple_5, nds_e8_store_multiple_6,\ 310 nds_e8_store_multiple_7,nds_e8_store_multiple_8, nds_e8_store_multiple_12" 311 "nds32_e8_last_load_to_ii_p" 312 ) 313 314 ;; LMW(N, N) -> ALU, MUL, MAC, DIV, BR_COND, ST, SMW(N, 1) 315 (define_bypass 2 316 "nds_e8_load_multiple_1,nds_e8_load_multiple_2, nds_e8_load_multiple_3,\ 317 nds_e8_load_multiple_4,nds_e8_load_multiple_5, nds_e8_load_multiple_6,\ 318 nds_e8_load_multiple_7,nds_e8_load_multiple_8, nds_e8_load_multiple_12" 319 "nds_e8_alu, 320 nds_e8_mul_fast, nds_e8_mul_slow,\ 321 nds_e8_mac_fast, nds_e8_mac_slow,\ 322 nds_e8_div,\ 323 nds_e8_branch,\ 324 nds_e8_store,\ 325 nds_e8_store_multiple_1,nds_e8_store_multiple_2, nds_e8_store_multiple_3,\ 326 nds_e8_store_multiple_4,nds_e8_store_multiple_5, nds_e8_store_multiple_6,\ 327 nds_e8_store_multiple_7,nds_e8_store_multiple_8, nds_e8_store_multiple_12" 328 "nds32_e8_last_load_to_ex_p" 329 ) 330