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 N8 pipeline settings. 24 ;; ------------------------------------------------------------------------ 25 26 (define_automaton "nds32_n7_machine") 27 28 ;; ------------------------------------------------------------------------ 29 ;; Pipeline Stages 30 ;; ------------------------------------------------------------------------ 31 ;; IF - Instruction Fetch 32 ;; Instruction Alignment 33 ;; Instruction Pre-decode 34 ;; II - Instruction Issue 35 ;; Instruction Decode 36 ;; Register File Access 37 ;; Instruction Execution 38 ;; Interrupt Handling 39 ;; EXD - Psuedo Stage 40 ;; Load Data Completion 41 42 (define_cpu_unit "n7_ii" "nds32_n7_machine") 43 44 (define_insn_reservation "nds_n7_unknown" 1 45 (and (eq_attr "type" "unknown") 46 (eq_attr "pipeline_model" "n7")) 47 "n7_ii") 48 49 (define_insn_reservation "nds_n7_misc" 1 50 (and (eq_attr "type" "misc") 51 (eq_attr "pipeline_model" "n7")) 52 "n7_ii") 53 54 (define_insn_reservation "nds_n7_alu" 1 55 (and (eq_attr "type" "alu") 56 (eq_attr "pipeline_model" "n7")) 57 "n7_ii") 58 59 (define_insn_reservation "nds_n7_load" 1 60 (and (match_test "nds32::load_single_p (insn)") 61 (eq_attr "pipeline_model" "n7")) 62 "n7_ii") 63 64 (define_insn_reservation "nds_n7_store" 1 65 (and (match_test "nds32::store_single_p (insn)") 66 (eq_attr "pipeline_model" "n7")) 67 "n7_ii") 68 69 (define_insn_reservation "nds_n7_load_multiple_1" 1 70 (and (and (eq_attr "type" "load_multiple") 71 (eq_attr "combo" "1")) 72 (eq_attr "pipeline_model" "n7")) 73 "n7_ii") 74 75 (define_insn_reservation "nds_n7_load_multiple_2" 1 76 (and (ior (and (eq_attr "type" "load_multiple") 77 (eq_attr "combo" "2")) 78 (match_test "nds32::load_double_p (insn)")) 79 (eq_attr "pipeline_model" "n7")) 80 "n7_ii*2") 81 82 (define_insn_reservation "nds_n7_load_multiple_3" 1 83 (and (and (eq_attr "type" "load_multiple") 84 (eq_attr "combo" "3")) 85 (eq_attr "pipeline_model" "n7")) 86 "n7_ii*3") 87 88 (define_insn_reservation "nds_n7_load_multiple_4" 1 89 (and (and (eq_attr "type" "load_multiple") 90 (eq_attr "combo" "4")) 91 (eq_attr "pipeline_model" "n7")) 92 "n7_ii*4") 93 94 (define_insn_reservation "nds_n7_load_multiple_5" 1 95 (and (and (eq_attr "type" "load_multiple") 96 (eq_attr "combo" "5")) 97 (eq_attr "pipeline_model" "n7")) 98 "n7_ii*5") 99 100 (define_insn_reservation "nds_n7_load_multiple_6" 1 101 (and (and (eq_attr "type" "load_multiple") 102 (eq_attr "combo" "6")) 103 (eq_attr "pipeline_model" "n7")) 104 "n7_ii*6") 105 106 (define_insn_reservation "nds_n7_load_multiple_7" 1 107 (and (and (eq_attr "type" "load_multiple") 108 (eq_attr "combo" "7")) 109 (eq_attr "pipeline_model" "n7")) 110 "n7_ii*7") 111 112 (define_insn_reservation "nds_n7_load_multiple_8" 1 113 (and (and (eq_attr "type" "load_multiple") 114 (eq_attr "combo" "8")) 115 (eq_attr "pipeline_model" "n7")) 116 "n7_ii*8") 117 118 (define_insn_reservation "nds_n7_load_multiple_12" 1 119 (and (and (eq_attr "type" "load_multiple") 120 (eq_attr "combo" "12")) 121 (eq_attr "pipeline_model" "n7")) 122 "n7_ii*12") 123 124 (define_insn_reservation "nds_n7_store_multiple_1" 1 125 (and (and (eq_attr "type" "store_multiple") 126 (eq_attr "combo" "1")) 127 (eq_attr "pipeline_model" "n7")) 128 "n7_ii") 129 130 (define_insn_reservation "nds_n7_store_multiple_2" 1 131 (and (ior (and (eq_attr "type" "store_multiple") 132 (eq_attr "combo" "2")) 133 (match_test "nds32::store_double_p (insn)")) 134 (eq_attr "pipeline_model" "n7")) 135 "n7_ii*2") 136 137 (define_insn_reservation "nds_n7_store_multiple_3" 1 138 (and (and (eq_attr "type" "store_multiple") 139 (eq_attr "combo" "3")) 140 (eq_attr "pipeline_model" "n7")) 141 "n7_ii*3") 142 143 (define_insn_reservation "nds_n7_store_multiple_4" 1 144 (and (and (eq_attr "type" "store_multiple") 145 (eq_attr "combo" "4")) 146 (eq_attr "pipeline_model" "n7")) 147 "n7_ii*4") 148 149 (define_insn_reservation "nds_n7_store_multiple_5" 1 150 (and (and (eq_attr "type" "store_multiple") 151 (eq_attr "combo" "5")) 152 (eq_attr "pipeline_model" "n7")) 153 "n7_ii*5") 154 155 (define_insn_reservation "nds_n7_store_multiple_6" 1 156 (and (and (eq_attr "type" "store_multiple") 157 (eq_attr "combo" "6")) 158 (eq_attr "pipeline_model" "n7")) 159 "n7_ii*6") 160 161 (define_insn_reservation "nds_n7_store_multiple_7" 1 162 (and (and (eq_attr "type" "store_multiple") 163 (eq_attr "combo" "7")) 164 (eq_attr "pipeline_model" "n7")) 165 "n7_ii*7") 166 167 (define_insn_reservation "nds_n7_store_multiple_8" 1 168 (and (and (eq_attr "type" "store_multiple") 169 (eq_attr "combo" "8")) 170 (eq_attr "pipeline_model" "n7")) 171 "n7_ii*8") 172 173 (define_insn_reservation "nds_n7_store_multiple_12" 1 174 (and (and (eq_attr "type" "store_multiple") 175 (eq_attr "combo" "12")) 176 (eq_attr "pipeline_model" "n7")) 177 "n7_ii*12") 178 179 (define_insn_reservation "nds_n7_mul_fast" 1 180 (and (match_test "nds32_mul_config != MUL_TYPE_SLOW") 181 (and (eq_attr "type" "mul") 182 (eq_attr "pipeline_model" "n7"))) 183 "n7_ii") 184 185 (define_insn_reservation "nds_n7_mul_slow" 1 186 (and (match_test "nds32_mul_config == MUL_TYPE_SLOW") 187 (and (eq_attr "type" "mul") 188 (eq_attr "pipeline_model" "n7"))) 189 "n7_ii*17") 190 191 (define_insn_reservation "nds_n7_mac_fast" 1 192 (and (match_test "nds32_mul_config != MUL_TYPE_SLOW") 193 (and (eq_attr "type" "mac") 194 (eq_attr "pipeline_model" "n7"))) 195 "n7_ii*2") 196 197 (define_insn_reservation "nds_n7_mac_slow" 1 198 (and (match_test "nds32_mul_config == MUL_TYPE_SLOW") 199 (and (eq_attr "type" "mac") 200 (eq_attr "pipeline_model" "n7"))) 201 "n7_ii*18") 202 203 (define_insn_reservation "nds_n7_div" 1 204 (and (eq_attr "type" "div") 205 (eq_attr "pipeline_model" "n7")) 206 "n7_ii*37") 207 208 (define_insn_reservation "nds_n7_branch" 1 209 (and (eq_attr "type" "branch") 210 (eq_attr "pipeline_model" "n7")) 211 "n7_ii") 212 213 ;; ------------------------------------------------------------------------ 214 ;; Comment Notations and Bypass Rules 215 ;; ------------------------------------------------------------------------ 216 ;; Producers (LHS) 217 ;; LD_!bi 218 ;; Load data from the memory (without updating the base register) and 219 ;; produce the loaded data. The result is ready at EXD. 220 ;; LMW(N, M) 221 ;; There are N micro-operations within an instruction that loads multiple 222 ;; words. The result produced by the M-th micro-operation is sent to 223 ;; consumers. The result is ready at EXD. If the base register should be 224 ;; updated, an extra micro-operation is inserted to the sequence, and the 225 ;; result is ready at II. 226 ;; 227 ;; Consumers (RHS) 228 ;; ALU, MUL, DIV 229 ;; Require operands at II. 230 ;; MOVD44_E 231 ;; A double-word move instruction needs two micro-operations because the 232 ;; reigster ports is 2R1W. The first micro-operation writes an even number 233 ;; register, and the second micro-operation writes an odd number register. 234 ;; Each input operand is required at II for each micro-operation. The letter 235 ;; 'E' stands for even. 236 ;; MAC_RaRb 237 ;; A MAC instruction is separated into two micro-operations. The first 238 ;; micro-operation does the multiplication, which requires operands Ra 239 ;; and Rb at II. The second micro-options does the accumulation, which 240 ;; requires the operand Rt at II. 241 ;; ADDR_IN_MOP(N) 242 ;; Because the reigster port is 2R1W, some load/store instructions are 243 ;; separated into many micro-operations. N denotes the address input is 244 ;; required by the N-th micro-operation. Such operand is required at II. 245 ;; ST_bi 246 ;; A post-increment store instruction requires its data at II. 247 ;; ST_!bi_RI 248 ;; A store instruction with an immediate offset requires its data at II. 249 ;; If the offset field is a register (ST_!bi_RR), the instruction will be 250 ;; separated into two micro-operations, and the second one requires the 251 ;; input operand at II in order to store it to the memory. 252 ;; SMW(N, M) 253 ;; There are N micro-operations within an instruction that stores multiple 254 ;; words. Each M-th micro-operation requires its data at II. If the base 255 ;; register should be updated, an extra micro-operation is inserted to the 256 ;; sequence. 257 ;; BR_COND 258 ;; If a branch instruction is conditional, its input data is required at II. 259 260 ;; LD_!bi 261 ;; -> ALU, MOVD44_E, MUL, MAC_RaRb, DIV, BR, ADDR_IN_MOP(1), ST_bi, ST_!bi_RI, SMW(N, 1) 262 (define_bypass 2 263 "nds_n7_load" 264 "nds_n7_alu,\ 265 nds_n7_mul_fast, nds_n7_mul_slow,\ 266 nds_n7_mac_fast, nds_n7_mac_slow,\ 267 nds_n7_div,\ 268 nds_n7_branch,\ 269 nds_n7_load, nds_n7_store,\ 270 nds_n7_load_multiple_1,nds_n7_load_multiple_2, nds_n7_load_multiple_3,\ 271 nds_n7_load_multiple_4,nds_n7_load_multiple_5, nds_n7_load_multiple_6,\ 272 nds_n7_load_multiple_7,nds_n7_load_multiple_8, nds_n7_load_multiple_12,\ 273 nds_n7_store_multiple_1,nds_n7_store_multiple_2, nds_n7_store_multiple_3,\ 274 nds_n7_store_multiple_4,nds_n7_store_multiple_5, nds_n7_store_multiple_6,\ 275 nds_n7_store_multiple_7,nds_n7_store_multiple_8, nds_n7_store_multiple_12" 276 "nds32_n7_load_to_ii_p" 277 ) 278 279 ;; LMW(N, N) 280 ;; -> ALU, MOVD44_E, MUL, MAC_RaRb, DIV, BR, AADR_IN_MOP(1), ST_bi, ST_!bi_RI, SMW(N, 1) 281 (define_bypass 2 282 "nds_n7_load_multiple_1,nds_n7_load_multiple_2, nds_n7_load_multiple_3,\ 283 nds_n7_load_multiple_4,nds_n7_load_multiple_5, nds_n7_load_multiple_6,\ 284 nds_n7_load_multiple_7,nds_n7_load_multiple_8, nds_n7_load_multiple_12" 285 "nds_n7_alu,\ 286 nds_n7_mul_fast, nds_n7_mul_slow,\ 287 nds_n7_mac_fast, nds_n7_mac_slow,\ 288 nds_n7_div,\ 289 nds_n7_branch,\ 290 nds_n7_load, nds_n7_store,\ 291 nds_n7_load_multiple_1,nds_n7_load_multiple_2, nds_n7_load_multiple_3,\ 292 nds_n7_load_multiple_4,nds_n7_load_multiple_5, nds_n7_load_multiple_6,\ 293 nds_n7_load_multiple_7,nds_n7_load_multiple_8, nds_n7_load_multiple_12,\ 294 nds_n7_store_multiple_1,nds_n7_store_multiple_2, nds_n7_store_multiple_3,\ 295 nds_n7_store_multiple_4,nds_n7_store_multiple_5, nds_n7_store_multiple_6,\ 296 nds_n7_store_multiple_7,nds_n7_store_multiple_8, nds_n7_store_multiple_12" 297 "nds32_n7_last_load_to_ii_p" 298 ) 299