1;; Marvell WMMX2 pipeline description 2;; Copyright (C) 2011-2021 Free Software Foundation, Inc. 3;; Written by Marvell, Inc. 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(define_automaton "marvell_f_iwmmxt") 23 24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 25;; Pipelines 26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 27 28;; This is a 7-stage pipelines: 29;; 30;; MD | MI | ME1 | ME2 | ME3 | ME4 | MW 31;; 32;; There are various bypasses modelled to a greater or lesser extent. 33;; 34;; Latencies in this file correspond to the number of cycles after 35;; the issue stage that it takes for the result of the instruction to 36;; be computed, or for its side-effects to occur. 37 38(define_cpu_unit "mf_iwmmxt_MD" "marvell_f_iwmmxt") 39(define_cpu_unit "mf_iwmmxt_MI" "marvell_f_iwmmxt") 40(define_cpu_unit "mf_iwmmxt_ME1" "marvell_f_iwmmxt") 41(define_cpu_unit "mf_iwmmxt_ME2" "marvell_f_iwmmxt") 42(define_cpu_unit "mf_iwmmxt_ME3" "marvell_f_iwmmxt") 43(define_cpu_unit "mf_iwmmxt_ME4" "marvell_f_iwmmxt") 44(define_cpu_unit "mf_iwmmxt_MW" "marvell_f_iwmmxt") 45 46(define_reservation "mf_iwmmxt_ME" 47 "mf_iwmmxt_ME1,mf_iwmmxt_ME2,mf_iwmmxt_ME3,mf_iwmmxt_ME4" 48) 49 50(define_reservation "mf_iwmmxt_pipeline" 51 "mf_iwmmxt_MD, mf_iwmmxt_MI, mf_iwmmxt_ME, mf_iwmmxt_MW" 52) 53 54;; An attribute to indicate whether our reservations are applicable. 55(define_attr "marvell_f_iwmmxt" "yes,no" 56 (const (if_then_else (symbol_ref "arm_arch_iwmmxt") 57 (const_string "yes") (const_string "no")))) 58 59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 60;; instruction classes 61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 62 63;; An attribute appended to instructions for classification 64 65(define_attr "wmmxt_shift" "yes,no" 66 (if_then_else (eq_attr "type" "wmmx_wror, wmmx_wsll, wmmx_wsra, wmmx_wsrl") 67 (const_string "yes") (const_string "no")) 68) 69 70(define_attr "wmmxt_pack" "yes,no" 71 (if_then_else (eq_attr "type" "wmmx_waligni, wmmx_walignr, wmmx_wmerge,\ 72 wmmx_wpack, wmmx_wshufh, wmmx_wunpckeh,\ 73 wmmx_wunpckih, wmmx_wunpckel, wmmx_wunpckil") 74 (const_string "yes") (const_string "no")) 75) 76 77(define_attr "wmmxt_mult_c1" "yes,no" 78 (if_then_else (eq_attr "type" "wmmx_wmac, wmmx_wmadd, wmmx_wmiaxy,\ 79 wmmx_wmiawxy, wmmx_wmulw, wmmx_wqmiaxy,\ 80 wmmx_wqmulwm") 81 (const_string "yes") (const_string "no")) 82) 83 84(define_attr "wmmxt_mult_c2" "yes,no" 85 (if_then_else (eq_attr "type" "wmmx_wmul, wmmx_wqmulm") 86 (const_string "yes") (const_string "no")) 87) 88 89(define_attr "wmmxt_alu_c1" "yes,no" 90 (if_then_else (eq_attr "type" "wmmx_wabs, wmmx_wabsdiff, wmmx_wand,\ 91 wmmx_wandn, wmmx_wmov, wmmx_wor, wmmx_wxor") 92 (const_string "yes") (const_string "no")) 93) 94 95(define_attr "wmmxt_alu_c2" "yes,no" 96 (if_then_else (eq_attr "type" "wmmx_wacc, wmmx_wadd, wmmx_waddsubhx,\ 97 wmmx_wavg2, wmmx_wavg4, wmmx_wcmpeq,\ 98 wmmx_wcmpgt, wmmx_wmax, wmmx_wmin,\ 99 wmmx_wsub, wmmx_waddbhus, wmmx_wsubaddhx") 100 (const_string "yes") (const_string "no")) 101) 102 103(define_attr "wmmxt_alu_c3" "yes,no" 104 (if_then_else (eq_attr "type" "wmmx_wsad") 105 (const_string "yes") (const_string "no")) 106) 107 108(define_attr "wmmxt_transfer_c1" "yes,no" 109 (if_then_else (eq_attr "type" "wmmx_tbcst, wmmx_tinsr,\ 110 wmmx_tmcr, wmmx_tmcrr") 111 (const_string "yes") (const_string "no")) 112) 113 114(define_attr "wmmxt_transfer_c2" "yes,no" 115 (if_then_else (eq_attr "type" "wmmx_textrm, wmmx_tmovmsk,\ 116 wmmx_tmrc, wmmx_tmrrc") 117 (const_string "yes") (const_string "no")) 118) 119 120(define_attr "wmmxt_transfer_c3" "yes,no" 121 (if_then_else (eq_attr "type" "wmmx_tmia, wmmx_tmiaph, wmmx_tmiaxy") 122 (const_string "yes") (const_string "no")) 123) 124 125;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 126;; Main description 127;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 128 129(define_insn_reservation "marvell_f_iwmmxt_alu_c1" 1 130 (and (eq_attr "marvell_f_iwmmxt" "yes") 131 (eq_attr "wmmxt_alu_c1" "yes")) 132 "mf_iwmmxt_pipeline") 133 134(define_insn_reservation "marvell_f_iwmmxt_pack" 1 135 (and (eq_attr "marvell_f_iwmmxt" "yes") 136 (eq_attr "wmmxt_pack" "yes")) 137 "mf_iwmmxt_pipeline") 138 139(define_insn_reservation "marvell_f_iwmmxt_shift" 1 140 (and (eq_attr "marvell_f_iwmmxt" "yes") 141 (eq_attr "wmmxt_shift" "yes")) 142 "mf_iwmmxt_pipeline") 143 144(define_insn_reservation "marvell_f_iwmmxt_transfer_c1" 1 145 (and (eq_attr "marvell_f_iwmmxt" "yes") 146 (eq_attr "wmmxt_transfer_c1" "yes")) 147 "mf_iwmmxt_pipeline") 148 149(define_insn_reservation "marvell_f_iwmmxt_transfer_c2" 5 150 (and (eq_attr "marvell_f_iwmmxt" "yes") 151 (eq_attr "wmmxt_transfer_c2" "yes")) 152 "mf_iwmmxt_pipeline") 153 154(define_insn_reservation "marvell_f_iwmmxt_alu_c2" 2 155 (and (eq_attr "marvell_f_iwmmxt" "yes") 156 (eq_attr "wmmxt_alu_c2" "yes")) 157 "mf_iwmmxt_pipeline") 158 159(define_insn_reservation "marvell_f_iwmmxt_alu_c3" 3 160 (and (eq_attr "marvell_f_iwmmxt" "yes") 161 (eq_attr "wmmxt_alu_c3" "yes")) 162 "mf_iwmmxt_pipeline") 163 164(define_insn_reservation "marvell_f_iwmmxt_transfer_c3" 4 165 (and (eq_attr "marvell_f_iwmmxt" "yes") 166 (eq_attr "wmmxt_transfer_c3" "yes")) 167 "mf_iwmmxt_pipeline") 168 169(define_insn_reservation "marvell_f_iwmmxt_mult_c1" 4 170 (and (eq_attr "marvell_f_iwmmxt" "yes") 171 (eq_attr "wmmxt_mult_c1" "yes")) 172 "mf_iwmmxt_pipeline") 173 174;There is a forwarding path from ME3 stage 175(define_insn_reservation "marvell_f_iwmmxt_mult_c2" 3 176 (and (eq_attr "marvell_f_iwmmxt" "yes") 177 (eq_attr "wmmxt_mult_c2" "yes")) 178 "mf_iwmmxt_pipeline") 179 180(define_insn_reservation "marvell_f_iwmmxt_wstr" 0 181 (and (eq_attr "marvell_f_iwmmxt" "yes") 182 (eq_attr "type" "wmmx_wstr")) 183 "mf_iwmmxt_pipeline") 184 185;There is a forwarding path from MW stage 186(define_insn_reservation "marvell_f_iwmmxt_wldr" 5 187 (and (eq_attr "marvell_f_iwmmxt" "yes") 188 (eq_attr "type" "wmmx_wldr")) 189 "mf_iwmmxt_pipeline") 190