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