1169689Skan;; DFA-based pipeline description for the RM7000. 2169689Skan;; Copyright (C) 2003, 2004, 2005 Free Software Foundation, Inc. 3169689Skan;; 4169689Skan;; This file is part of GCC. 5169689Skan 6169689Skan;; GCC is free software; you can redistribute it and/or modify it 7169689Skan;; under the terms of the GNU General Public License as published 8169689Skan;; by the Free Software Foundation; either version 2, or (at your 9169689Skan;; option) any later version. 10169689Skan 11169689Skan;; GCC is distributed in the hope that it will be useful, but WITHOUT 12169689Skan;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 13169689Skan;; or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public 14169689Skan;; License for more details. 15169689Skan 16169689Skan;; You should have received a copy of the GNU General Public License 17169689Skan;; along with GCC; see the file COPYING. If not, write to the 18169689Skan;; Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, 19169689Skan;; MA 02110-1301, USA. 20169689Skan 21169689Skan;; ......................... 22169689Skan;; 23169689Skan;; The RM7000 is a dual-issue processor that can bundle instructions as: 24169689Skan;; {arith|load|store}{arith|imul|idiv|branch|float} 25169689Skan;; 26169689Skan;; Reference: 27169689Skan;; "RM7000 Family User Manual, PMC-2002296" 28169689Skan;; 29169689Skan;; ......................... 30169689Skan 31169689Skan;; Use three automata to isolate long latency operations, reducing space. 32169689Skan(define_automaton "rm7000_other, rm7000_fdiv, rm7000_idiv") 33169689Skan 34169689Skan;; 35169689Skan;; Describe the resources. 36169689Skan;; 37169689Skan 38169689Skan;; Global 39169689Skan(define_cpu_unit "rm7_iss0,rm7_iss1" "rm7000_other") 40169689Skan 41169689Skan;; Integer execution unit (M-Pipe). 42169689Skan(define_cpu_unit "ixum_addsub_agen" "rm7000_other") 43169689Skan 44169689Skan;; Integer execution unit (F-Pipe). 45169689Skan(define_cpu_unit "ixuf_addsub" "rm7000_other") 46169689Skan(define_cpu_unit "ixuf_branch" "rm7000_other") 47169689Skan(define_cpu_unit "ixuf_mpydiv" "rm7000_other") 48169689Skan(define_cpu_unit "ixuf_mpydiv_iter" "rm7000_idiv") 49169689Skan;; Floating-point unit (F-Pipe). 50169689Skan(define_cpu_unit "fxuf_add" "rm7000_other") 51169689Skan(define_cpu_unit "fxuf_mpy" "rm7000_other") 52169689Skan(define_cpu_unit "fxuf_mpy_iter" "rm7000_fdiv") 53169689Skan(define_cpu_unit "fxuf_divsqrt" "rm7000_other") 54169689Skan(define_cpu_unit "fxuf_divsqrt_iter" "rm7000_fdiv") 55169689Skan 56169689Skan(exclusion_set "ixuf_addsub" 57169689Skan "ixuf_branch,ixuf_mpydiv,fxuf_add,fxuf_mpy,fxuf_divsqrt") 58169689Skan(exclusion_set "ixuf_branch" "ixuf_mpydiv,fxuf_add,fxuf_mpy,fxuf_divsqrt") 59169689Skan(exclusion_set "ixuf_mpydiv" "fxuf_add,fxuf_mpy,fxuf_divsqrt") 60169689Skan(exclusion_set "fxuf_add" "fxuf_mpy,fxuf_divsqrt") 61169689Skan(exclusion_set "fxuf_mpy" "fxuf_divsqrt") 62169689Skan 63169689Skan;; After branch any insn cannot be issued. 64169689Skan(absence_set "rm7_iss0,rm7_iss1" "ixuf_branch") 65169689Skan 66169689Skan;; 67169689Skan;; Define reservations for unit name mnemonics or combinations. 68169689Skan;; 69169689Skan 70169689Skan(define_reservation "rm7_iss" "rm7_iss0|rm7_iss1") 71169689Skan(define_reservation "rm7_single_dispatch" "rm7_iss0+rm7_iss1") 72169689Skan 73169689Skan(define_reservation "rm7_iaddsub" "rm7_iss+(ixum_addsub_agen|ixuf_addsub)") 74169689Skan(define_reservation "rm7_imem" "rm7_iss+ixum_addsub_agen") 75169689Skan(define_reservation "rm7_impydiv" "rm7_iss+ixuf_mpydiv") 76169689Skan(define_reservation "rm7_impydiv_iter" "ixuf_mpydiv_iter") 77169689Skan(define_reservation "rm7_branch" "rm7_iss+ixuf_branch") 78169689Skan 79169689Skan(define_reservation "rm7_fpadd" "rm7_iss+fxuf_add") 80169689Skan(define_reservation "rm7_fpmpy" "rm7_iss+fxuf_mpy") 81169689Skan(define_reservation "rm7_fpmpy_iter" "fxuf_mpy_iter") 82169689Skan(define_reservation "rm7_fpdivsqr" "rm7_iss+fxuf_divsqrt") 83169689Skan(define_reservation "rm7_fpdivsqr_iter" "fxuf_divsqrt_iter") 84169689Skan 85169689Skan;; 86169689Skan;; Describe instruction reservations for integer operations. 87169689Skan;; 88169689Skan 89169689Skan(define_insn_reservation "rm7_int_other" 1 90169689Skan (and (eq_attr "cpu" "r7000") 91169689Skan (eq_attr "type" "arith,shift,slt,clz,const,condmove,nop,trap")) 92169689Skan "rm7_iaddsub") 93169689Skan 94169689Skan(define_insn_reservation "rm7_ld" 2 95169689Skan (and (eq_attr "cpu" "r7000") 96169689Skan (eq_attr "type" "load,fpload,fpidxload")) 97169689Skan "rm7_imem") 98169689Skan 99169689Skan(define_insn_reservation "rm7_st" 1 100169689Skan (and (eq_attr "cpu" "r7000") 101169689Skan (eq_attr "type" "store,fpstore,fpidxstore")) 102169689Skan "rm7_imem") 103169689Skan 104169689Skan(define_insn_reservation "rm7_idiv_si" 36 105169689Skan (and (eq_attr "cpu" "r7000") 106169689Skan (and (eq_attr "type" "idiv") 107169689Skan (eq_attr "mode" "SI"))) 108169689Skan "rm7_impydiv+(rm7_impydiv_iter*36)") 109169689Skan 110169689Skan(define_insn_reservation "rm7_idiv_di" 68 111169689Skan (and (eq_attr "cpu" "r7000") 112169689Skan (and (eq_attr "type" "idiv") 113169689Skan (eq_attr "mode" "DI"))) 114169689Skan "rm7_impydiv+(rm7_impydiv_iter*68)") 115169689Skan 116169689Skan(define_insn_reservation "rm7_impy_si_mult" 5 117169689Skan (and (eq_attr "cpu" "r7000") 118169689Skan (and (eq_attr "type" "imul,imadd") 119169689Skan (eq_attr "mode" "SI"))) 120169689Skan "rm7_impydiv+(rm7_impydiv_iter*3)") 121169689Skan 122169689Skan;; There are an additional 2 stall cycles. 123169689Skan(define_insn_reservation "rm7_impy_si_mul" 2 124169689Skan (and (eq_attr "cpu" "r7000") 125169689Skan (and (eq_attr "type" "imul3") 126169689Skan (eq_attr "mode" "SI"))) 127169689Skan "rm7_impydiv") 128169689Skan 129169689Skan(define_insn_reservation "rm7_impy_di" 9 130169689Skan (and (eq_attr "cpu" "r7000") 131169689Skan (and (eq_attr "type" "imul,imul3") 132169689Skan (eq_attr "mode" "DI"))) 133169689Skan "rm7_impydiv+(rm7_impydiv_iter*8)") 134169689Skan 135169689Skan;; Move to/from HI/LO. 136169689Skan(define_insn_reservation "rm7_mthilo" 3 137169689Skan (and (eq_attr "cpu" "r7000") 138169689Skan (eq_attr "type" "mthilo")) 139169689Skan "rm7_impydiv") 140169689Skan 141169689Skan(define_insn_reservation "rm7_mfhilo" 1 142169689Skan (and (eq_attr "cpu" "r7000") 143169689Skan (eq_attr "type" "mfhilo")) 144169689Skan "rm7_impydiv") 145169689Skan 146169689Skan;; Move to/from fp coprocessor. 147169689Skan(define_insn_reservation "rm7_ixfer" 2 148169689Skan (and (eq_attr "cpu" "r7000") 149169689Skan (eq_attr "type" "xfer")) 150169689Skan "rm7_iaddsub") 151169689Skan 152169689Skan(define_insn_reservation "rm7_ibr" 3 153169689Skan (and (eq_attr "cpu" "r7000") 154169689Skan (eq_attr "type" "branch,jump,call")) 155169689Skan "rm7_branch") 156169689Skan 157169689Skan;; 158169689Skan;; Describe instruction reservations for the floating-point operations. 159169689Skan;; 160169689Skan(define_insn_reservation "rm7_fp_quick" 4 161169689Skan (and (eq_attr "cpu" "r7000") 162169689Skan (eq_attr "type" "fneg,fcmp,fabs,fmove")) 163169689Skan "rm7_fpadd") 164169689Skan 165169689Skan(define_insn_reservation "rm7_fp_other" 4 166169689Skan (and (eq_attr "cpu" "r7000") 167169689Skan (eq_attr "type" "fadd")) 168169689Skan "rm7_fpadd") 169169689Skan 170169689Skan(define_insn_reservation "rm7_fp_cvt" 4 171169689Skan (and (eq_attr "cpu" "r7000") 172169689Skan (eq_attr "type" "fcvt")) 173169689Skan "rm7_fpadd") 174169689Skan 175169689Skan(define_insn_reservation "rm7_fp_divsqrt_df" 36 176169689Skan (and (eq_attr "cpu" "r7000") 177169689Skan (and (eq_attr "type" "fdiv,frdiv,fsqrt") 178169689Skan (eq_attr "mode" "DF"))) 179169689Skan "rm7_fpdivsqr+(rm7_fpdivsqr_iter*36)") 180169689Skan 181169689Skan(define_insn_reservation "rm7_fp_divsqrt_sf" 21 182169689Skan (and (eq_attr "cpu" "r7000") 183169689Skan (and (eq_attr "type" "fdiv,frdiv,fsqrt") 184169689Skan (eq_attr "mode" "SF"))) 185169689Skan "rm7_fpdivsqr+(rm7_fpdivsqr_iter*21)") 186169689Skan 187169689Skan(define_insn_reservation "rm7_fp_rsqrt_df" 68 188169689Skan (and (eq_attr "cpu" "r7000") 189169689Skan (and (eq_attr "type" "frsqrt") 190169689Skan (eq_attr "mode" "DF"))) 191169689Skan "rm7_fpdivsqr+(rm7_fpdivsqr_iter*68)") 192169689Skan 193169689Skan(define_insn_reservation "rm7_fp_rsqrt_sf" 38 194169689Skan (and (eq_attr "cpu" "r7000") 195169689Skan (and (eq_attr "type" "frsqrt") 196169689Skan (eq_attr "mode" "SF"))) 197169689Skan "rm7_fpdivsqr+(rm7_fpdivsqr_iter*38)") 198169689Skan 199169689Skan(define_insn_reservation "rm7_fp_mpy_sf" 4 200169689Skan (and (eq_attr "cpu" "r7000") 201169689Skan (and (eq_attr "type" "fmul,fmadd") 202169689Skan (eq_attr "mode" "SF"))) 203169689Skan "rm7_fpmpy+rm7_fpmpy_iter") 204169689Skan 205169689Skan(define_insn_reservation "rm7_fp_mpy_df" 5 206169689Skan (and (eq_attr "cpu" "r7000") 207169689Skan (and (eq_attr "type" "fmul,fmadd") 208169689Skan (eq_attr "mode" "DF"))) 209169689Skan "rm7_fpmpy+(rm7_fpmpy_iter*2)") 210169689Skan 211169689Skan;; Force single-dispatch for unknown or multi. 212169689Skan(define_insn_reservation "rm7_unknown" 1 213169689Skan (and (eq_attr "cpu" "r7000") 214169689Skan (eq_attr "type" "unknown,multi")) 215169689Skan "rm7_single_dispatch") 216