1 1.1 mrg ;; Scheduling description for Renesas SH4a 2 1.12 mrg ;; Copyright (C) 2003-2022 Free Software Foundation, Inc. 3 1.1 mrg ;; 4 1.1 mrg ;; This file is part of GCC. 5 1.1 mrg ;; 6 1.1 mrg ;; GNU CC is free software; you can redistribute it and/or modify 7 1.1 mrg ;; it under the terms of the GNU General Public License as published by 8 1.1 mrg ;; the Free Software Foundation; either version 3, or (at your option) 9 1.1 mrg ;; any later version. 10 1.1 mrg ;; 11 1.1 mrg ;; GNU CC is distributed in the hope that it will be useful, 12 1.1 mrg ;; but WITHOUT ANY WARRANTY; without even the implied warranty of 13 1.1 mrg ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 1.1 mrg ;; GNU General Public License for more details. 15 1.1 mrg ;; 16 1.1 mrg ;; You should have received a copy of the GNU General Public License 17 1.1 mrg ;; along with GCC; see the file COPYING3. If not see 18 1.1 mrg ;; <http://www.gnu.org/licenses/>. 19 1.1 mrg 20 1.1 mrg ;; The following description models the SH4A pipeline 21 1.1 mrg ;; using the DFA based scheduler. 22 1.1 mrg (define_automaton "sh4a") 23 1.1 mrg 24 1.1 mrg (define_cpu_unit "sh4a_ex" "sh4a") 25 1.1 mrg (define_cpu_unit "sh4a_ls" "sh4a") 26 1.1 mrg (define_cpu_unit "sh4a_fex" "sh4a") 27 1.1 mrg (define_cpu_unit "sh4a_fls" "sh4a") 28 1.1 mrg (define_cpu_unit "sh4a_mult" "sh4a") 29 1.1 mrg (define_cpu_unit "sh4a_fdiv" "sh4a") 30 1.1 mrg 31 1.1 mrg ;; Decoding is done on the integer pipeline like the 32 1.1 mrg ;; sh4. Define issue to be the | of the two pipelines 33 1.1 mrg ;; to control how often instructions are issued. 34 1.1 mrg (define_reservation "ID_or" "sh4a_ex|sh4a_ls") 35 1.1 mrg (define_reservation "ID_and" "sh4a_ex+sh4a_ls") 36 1.1 mrg 37 1.1 mrg ;; ======================================================= 38 1.1 mrg ;; Locking Descriptions 39 1.1 mrg 40 1.1 mrg ;; Sh4a_Memory access on the LS pipeline. 41 1.1 mrg (define_cpu_unit "sh4a_memory" "sh4a") 42 1.1 mrg 43 1.1 mrg ;; Other access on the LS pipeline. 44 1.1 mrg (define_cpu_unit "sh4a_load_store" "sh4a") 45 1.1 mrg 46 1.1 mrg ;; The address calculator used for branch instructions. 47 1.1 mrg ;; This will be reserved after "issue" of branch instructions 48 1.1 mrg ;; and this is to make sure that no two branch instructions 49 1.1 mrg ;; can be issued in parallel. 50 1.1 mrg (define_reservation "sh4a_addrcalc" "sh4a_ex") 51 1.1 mrg 52 1.1 mrg ;; ======================================================= 53 1.1 mrg ;; Reservations 54 1.1 mrg 55 1.1 mrg ;; Branch (BF,BF/S,BT,BT/S,BRA,BSR) 56 1.1 mrg ;; Group: BR 57 1.1 mrg ;; Latency when taken: 2 58 1.1 mrg (define_insn_reservation "sh4a_branch" 2 59 1.1 mrg (and (eq_attr "cpu" "sh4a") 60 1.1 mrg (eq_attr "type" "cbranch,jump")) 61 1.1 mrg "ID_or+sh4a_addrcalc") 62 1.1 mrg 63 1.1 mrg ;; Jump (JSR,JMP,RTS) 64 1.1 mrg ;; Group: BR 65 1.1 mrg ;; Latency: 3 66 1.1 mrg (define_insn_reservation "sh4a_jump" 3 67 1.1 mrg (and (eq_attr "cpu" "sh4a") 68 1.1 mrg (eq_attr "type" "return,jump_ind")) 69 1.1 mrg "ID_or+sh4a_addrcalc") 70 1.1 mrg 71 1.1 mrg ;; RTE 72 1.1 mrg ;; Group: CO 73 1.1 mrg ;; Latency: 3 74 1.1 mrg (define_insn_reservation "sh4a_rte" 3 75 1.1 mrg (and (eq_attr "cpu" "sh4a") 76 1.1 mrg (eq_attr "type" "rte")) 77 1.1 mrg "ID_and*4") 78 1.1 mrg 79 1.1 mrg ;; EX Group Single 80 1.1 mrg ;; Group: EX 81 1.1 mrg ;; Latency: 0 82 1.1 mrg (define_insn_reservation "sh4a_ex" 0 83 1.1 mrg (and (eq_attr "cpu" "sh4a") 84 1.1 mrg (eq_attr "insn_class" "ex_group")) 85 1.1 mrg "sh4a_ex") 86 1.1 mrg 87 1.1 mrg ;; MOVA 88 1.1 mrg ;; Group: LS 89 1.1 mrg ;; Latency: 1 90 1.1 mrg (define_insn_reservation "sh4a_mova" 1 91 1.1 mrg (and (eq_attr "cpu" "sh4a") 92 1.1 mrg (eq_attr "type" "mova")) 93 1.1 mrg "sh4a_ls+sh4a_load_store") 94 1.1 mrg 95 1.1 mrg ;; MOV 96 1.1 mrg ;; Group: MT 97 1.1 mrg ;; Latency: 0 98 1.1 mrg ;; ??? not sure if movi8 belongs here, but that's where it was 99 1.1 mrg ;; effectively before. 100 1.1 mrg (define_insn_reservation "sh4a_mov" 0 101 1.1 mrg (and (eq_attr "cpu" "sh4a") 102 1.1 mrg (eq_attr "type" "move,movi8,gp_mac")) 103 1.1 mrg "ID_or") 104 1.1 mrg 105 1.1 mrg ;; Load 106 1.1 mrg ;; Group: LS 107 1.1 mrg ;; Latency: 3 108 1.1 mrg (define_insn_reservation "sh4a_load" 3 109 1.1 mrg (and (eq_attr "cpu" "sh4a") 110 1.1 mrg (eq_attr "type" "load,pcload,mem_mac")) 111 1.1 mrg "sh4a_ls+sh4a_memory") 112 1.1 mrg 113 1.1 mrg (define_insn_reservation "sh4a_load_si" 3 114 1.1 mrg (and (eq_attr "cpu" "sh4a") 115 1.1 mrg (eq_attr "type" "load_si,pcload_si")) 116 1.1 mrg "sh4a_ls+sh4a_memory") 117 1.1 mrg 118 1.1 mrg ;; Store 119 1.1 mrg ;; Group: LS 120 1.1 mrg ;; Latency: 0 121 1.1 mrg (define_insn_reservation "sh4a_store" 0 122 1.1 mrg (and (eq_attr "cpu" "sh4a") 123 1.1 mrg (eq_attr "type" "store,fstore,mac_mem")) 124 1.1 mrg "sh4a_ls+sh4a_memory") 125 1.1 mrg 126 1.1 mrg ;; CWB TYPE 127 1.1 mrg 128 1.1 mrg ;; MOVUA 129 1.1 mrg ;; Group: LS 130 1.1 mrg ;; Latency: 3 131 1.1 mrg (define_insn_reservation "sh4a_movua" 3 132 1.1 mrg (and (eq_attr "cpu" "sh4a") 133 1.1 mrg (eq_attr "type" "movua")) 134 1.1 mrg "sh4a_ls+sh4a_memory*2") 135 1.1 mrg 136 1.1 mrg ;; Fixed point multiplication (single) 137 1.1 mrg ;; Group: CO 138 1.1 mrg ;; Latency: 2 139 1.1 mrg (define_insn_reservation "sh4a_smult" 2 140 1.1 mrg (and (eq_attr "cpu" "sh4a") 141 1.1 mrg (eq_attr "type" "smpy")) 142 1.1 mrg "ID_or+sh4a_mult") 143 1.1 mrg 144 1.1 mrg ;; Fixed point multiplication (double) 145 1.1 mrg ;; Group: CO 146 1.1 mrg ;; Latency: 3 147 1.1 mrg (define_insn_reservation "sh4a_dmult" 3 148 1.1 mrg (and (eq_attr "cpu" "sh4a") 149 1.1 mrg (eq_attr "type" "dmpy")) 150 1.1 mrg "ID_or+sh4a_mult") 151 1.1 mrg 152 1.1 mrg (define_insn_reservation "sh4a_mac_gp" 3 153 1.1 mrg (and (eq_attr "cpu" "sh4a") 154 1.1 mrg (eq_attr "type" "mac_gp")) 155 1.1 mrg "ID_and") 156 1.1 mrg 157 1.1 mrg ;; Other MT group instructions(1 step operations) 158 1.1 mrg ;; Group: MT 159 1.1 mrg ;; Latency: 1 160 1.1 mrg (define_insn_reservation "sh4a_mt" 1 161 1.1 mrg (and (eq_attr "cpu" "sh4a") 162 1.1 mrg (eq_attr "type" "mt_group")) 163 1.1 mrg "ID_or") 164 1.1 mrg 165 1.1 mrg ;; Floating point reg move 166 1.1 mrg ;; Group: LS 167 1.1 mrg ;; Latency: 2 168 1.1 mrg (define_insn_reservation "sh4a_freg_mov" 2 169 1.1 mrg (and (eq_attr "cpu" "sh4a") 170 1.1 mrg (eq_attr "type" "fmove")) 171 1.1 mrg "sh4a_ls,sh4a_fls") 172 1.1 mrg 173 1.1 mrg ;; Single precision floating point computation FCMP/EQ, 174 1.1 mrg ;; FCMP/GT, FADD, FLOAT, FMAC, FMUL, FSUB, FTRC, FRVHG, FSCHG 175 1.1 mrg ;; Group: FE 176 1.1 mrg ;; Latency: 3 177 1.1 mrg (define_insn_reservation "sh4a_fp_arith" 3 178 1.1 mrg (and (eq_attr "cpu" "sh4a") 179 1.1 mrg (eq_attr "type" "fp,fp_cmp,fpscr_toggle")) 180 1.1 mrg "ID_or,sh4a_fex") 181 1.1 mrg 182 1.1 mrg (define_insn_reservation "sh4a_fp_arith_ftrc" 3 183 1.1 mrg (and (eq_attr "cpu" "sh4a") 184 1.1 mrg (eq_attr "type" "ftrc_s")) 185 1.1 mrg "ID_or,sh4a_fex") 186 1.1 mrg 187 1.1 mrg ;; Single-precision FDIV/FSQRT 188 1.1 mrg ;; Group: FE 189 1.1 mrg ;; Latency: 20 190 1.1 mrg (define_insn_reservation "sh4a_fdiv" 20 191 1.1 mrg (and (eq_attr "cpu" "sh4a") 192 1.1 mrg (eq_attr "type" "fdiv")) 193 1.1 mrg "ID_or,sh4a_fex+sh4a_fdiv,sh4a_fex") 194 1.1 mrg 195 1.1 mrg ;; Double Precision floating point computation 196 1.1 mrg ;; (FCNVDS, FCNVSD, FLOAT, FTRC) 197 1.1 mrg ;; Group: FE 198 1.1 mrg ;; Latency: 3 199 1.1 mrg (define_insn_reservation "sh4a_dp_float" 3 200 1.1 mrg (and (eq_attr "cpu" "sh4a") 201 1.1 mrg (eq_attr "type" "dfp_conv")) 202 1.1 mrg "ID_or,sh4a_fex") 203 1.1 mrg 204 1.1 mrg ;; Double-precision floating-point (FADD,FMUL,FSUB) 205 1.1 mrg ;; Group: FE 206 1.1 mrg ;; Latency: 5 207 1.1 mrg (define_insn_reservation "sh4a_fp_double_arith" 5 208 1.1 mrg (and (eq_attr "cpu" "sh4a") 209 1.1 mrg (eq_attr "type" "dfp_arith,dfp_mul")) 210 1.1 mrg "ID_or,sh4a_fex*3") 211 1.1 mrg 212 1.1 mrg ;; Double precision FDIV/SQRT 213 1.1 mrg ;; Group: FE 214 1.1 mrg ;; Latency: 36 215 1.1 mrg (define_insn_reservation "sh4a_dp_div" 36 216 1.1 mrg (and (eq_attr "cpu" "sh4a") 217 1.1 mrg (eq_attr "type" "dfdiv")) 218 1.1 mrg "ID_or,sh4a_fex+sh4a_fdiv,sh4a_fex*2") 219 1.1 mrg 220 1.1 mrg ;; FSRRA 221 1.1 mrg ;; Group: FE 222 1.1 mrg ;; Latency: 5 223 1.1 mrg (define_insn_reservation "sh4a_fsrra" 5 224 1.1 mrg (and (eq_attr "cpu" "sh4a") 225 1.1 mrg (eq_attr "type" "fsrra")) 226 1.1 mrg "ID_or,sh4a_fex") 227 1.1 mrg 228 1.1 mrg ;; FSCA 229 1.1 mrg ;; Group: FE 230 1.1 mrg ;; Latency: 7 231 1.1 mrg (define_insn_reservation "sh4a_fsca" 7 232 1.1 mrg (and (eq_attr "cpu" "sh4a") 233 1.1 mrg (eq_attr "type" "fsca")) 234 1.1 mrg "ID_or,sh4a_fex*3") 235