| ;; Scheduling description for TI C6X. |
| ;; Copyright (C) 2010-2015 Free Software Foundation, Inc. |
| ;; Contributed by Bernd Schmidt <bernds@codesourcery.com> |
| ;; Contributed by CodeSourcery. |
| ;; |
| ;; This file is part of GCC. |
| ;; |
| ;; GCC is free software; you can redistribute it and/or modify |
| ;; it under the terms of the GNU General Public License as published by |
| ;; the Free Software Foundation; either version 3, or (at your option) |
| ;; any later version. |
| ;; |
| ;; GCC is distributed in the hope that it will be useful, |
| ;; but WITHOUT ANY WARRANTY; without even the implied warranty of |
| ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| ;; GNU General Public License for more details. |
| ;; |
| ;; You should have received a copy of the GNU General Public License |
| ;; along with GCC; see the file COPYING3. If not see |
| ;; <http://www.gnu.org/licenses/>. |
| |
| ;; Input file for gensched.sh We process this file multiple times, |
| ;; replacing _N_ with either 1 or 2 for each of the sides of the |
| ;; machine, and _RF_ correspondingly with "a" or "b". _CROSS_ and |
| ;; _CUNIT_ are replaced with yes/no and the appropriate reservation. |
| |
| (define_insn_reservation "load_d_N__CROSS_" 5 |
| (and (eq_attr "type" "load") |
| (and (eq_attr "cross" "_CROSS_") |
| (and (eq_attr "units" "d_addr") |
| (eq_attr "addr_regfile" "_RF_")))) |
| "d_N_+t_NX_") |
| |
| (define_insn_reservation "store_d_N__CROSS_" 1 |
| (and (eq_attr "type" "store") |
| (and (eq_attr "cross" "_CROSS_") |
| (and (eq_attr "units" "d_addr") |
| (eq_attr "addr_regfile" "_RF_")))) |
| "d_N_+t_NX_") |
| |
| (define_insn_reservation "loadn_d_N__CROSS_" 5 |
| (and (eq_attr "type" "loadn") |
| (and (eq_attr "cross" "_CROSS_") |
| (and (eq_attr "units" "d_addr") |
| (eq_attr "addr_regfile" "_RF_")))) |
| "d_N_+t1+t2") |
| |
| (define_insn_reservation "storen_d_N__CROSS_" 1 |
| (and (eq_attr "type" "storen") |
| (and (eq_attr "cross" "_CROSS_") |
| (and (eq_attr "units" "d_addr") |
| (eq_attr "addr_regfile" "_RF_")))) |
| "d_N_+t1+t2") |
| |
| (define_insn_reservation "single_d_N__CROSS_" 1 |
| (and (eq_attr "type" "single") |
| (and (eq_attr "cross" "_CROSS_") |
| (and (eq_attr "units" "d") |
| (eq_attr "dest_regfile" "_RF_")))) |
| "d_N__CUNIT_") |
| |
| (define_insn_reservation "single_l_N__CROSS_" 1 |
| (and (eq_attr "type" "single") |
| (and (eq_attr "cross" "_CROSS_") |
| (and (eq_attr "units" "l") |
| (eq_attr "dest_regfile" "_RF_")))) |
| "l_N_+l_N_w_CUNIT_") |
| |
| (define_insn_reservation "fp4_l_N__CROSS_" 4 |
| (and (eq_attr "type" "fp4") |
| (and (eq_attr "cross" "_CROSS_") |
| (and (eq_attr "units" "l") |
| (eq_attr "dest_regfile" "_RF_")))) |
| "l_N__CUNIT_,nothing*2,l_N_w") |
| |
| (define_insn_reservation "intdp_l_N__CROSS_" 5 |
| (and (eq_attr "type" "intdp") |
| (and (eq_attr "cross" "_CROSS_") |
| (and (eq_attr "units" "l") |
| (eq_attr "dest_regfile" "_RF_")))) |
| "l_N__CUNIT_,nothing*2,l_N_w*2") |
| |
| (define_insn_reservation "adddp_l_N__CROSS_" 7 |
| (and (eq_attr "type" "adddp") |
| (and (eq_attr "cross" "_CROSS_") |
| (and (eq_attr "units" "l") |
| (eq_attr "dest_regfile" "_RF_")))) |
| "(l_N__CUNIT_)*2,nothing*3,l_N_w*2") |
| |
| (define_insn_reservation "branch_s_N__CROSS_" 6 |
| (and (eq_attr "type" "branch") |
| (and (eq_attr "cross" "_CROSS_") |
| (and (eq_attr "units" "s") |
| (eq_attr "dest_regfile" "_RF_")))) |
| "(s_N_+s_N_w)_CUNIT_+br1") |
| |
| (define_insn_reservation "call_addkpc_s_N__CROSS_" 6 |
| (and (eq_attr "type" "call") |
| (and (ne (symbol_ref "TARGET_INSNS_64") (const_int 0)) |
| (and (eq_attr "cross" "_CROSS_") |
| (and (eq_attr "units" "s") |
| (eq_attr "dest_regfile" "_RF_"))))) |
| "(s_N_+s_N_w)_CUNIT_+br1,s2+br0+br1") |
| |
| (define_insn_reservation "call_mvk_s_N__CROSS_" 6 |
| (and (eq_attr "type" "call") |
| (and (eq (symbol_ref "TARGET_INSNS_64") (const_int 0)) |
| (and (eq_attr "cross" "_CROSS_") |
| (and (eq_attr "units" "s") |
| (eq_attr "dest_regfile" "_RF_"))))) |
| "(s_N_+s_N_w)_CUNIT_+br1,s2,s2") |
| |
| (define_insn_reservation "single_s_N__CROSS_" 1 |
| (and (eq_attr "type" "single") |
| (and (eq_attr "cross" "_CROSS_") |
| (and (eq_attr "units" "s") |
| (eq_attr "dest_regfile" "_RF_")))) |
| "(s_N_+s_N_w)_CUNIT_") |
| |
| (define_insn_reservation "cmpdp_s_N__CROSS_" 2 |
| (and (eq_attr "type" "cmpdp") |
| (and (eq_attr "cross" "_CROSS_") |
| (and (eq_attr "units" "s") |
| (eq_attr "dest_regfile" "_RF_")))) |
| "s_N__CUNIT_,(s_N__CUNIT_)+s_N_w") |
| |
| (define_insn_reservation "dp2_s_N__CROSS_" 2 |
| (and (eq_attr "type" "dp2") |
| (and (eq_attr "cross" "_CROSS_") |
| (and (eq_attr "units" "s") |
| (eq_attr "dest_regfile" "_RF_")))) |
| "s_N_+s_N_w_CUNIT_,s_N_w") |
| |
| (define_insn_reservation "fp4_s_N__CROSS_" 4 |
| (and (eq_attr "type" "fp4") |
| (and (eq_attr "cross" "_CROSS_") |
| (and (eq_attr "units" "s") |
| (eq_attr "dest_regfile" "_RF_")))) |
| "s_N__CUNIT_,nothing*2,s_N_w") |
| |
| (define_insn_reservation "mvilc4_s_N__CROSS_" 4 |
| (and (eq_attr "type" "mvilc") |
| (and (eq_attr "cross" "_CROSS_") |
| (and (eq_attr "units" "s") |
| (eq_attr "dest_regfile" "_RF_")))) |
| "(s_N_+s_N_w)_CUNIT_") |
| |
| (define_insn_reservation "single_dl_N__CROSS_" 1 |
| (and (eq_attr "type" "single") |
| (and (eq_attr "cross" "_CROSS_") |
| (and (eq_attr "units" "dl") |
| (eq_attr "dest_regfile" "_RF_")))) |
| "(d_N_|(l_N_+l_N_w))_CUNIT_") |
| |
| (define_insn_reservation "single_ds_N__CROSS_" 1 |
| (and (eq_attr "type" "single") |
| (and (eq_attr "cross" "_CROSS_") |
| (and (eq_attr "units" "ds") |
| (eq_attr "dest_regfile" "_RF_")))) |
| "(d_N_|(s_N_+s_N_w))_CUNIT_") |
| |
| (define_insn_reservation "single_ls_N__CROSS_" 1 |
| (and (eq_attr "type" "single") |
| (and (eq_attr "cross" "_CROSS_") |
| (and (eq_attr "units" "ls") |
| (eq_attr "dest_regfile" "_RF_")))) |
| "((l_N_+l_N_w)|(s_N_+s_N_w))_CUNIT_") |
| |
| (define_insn_reservation "dp2_l_N__CROSS_" 2 |
| (and (eq_attr "type" "dp2") |
| (and (eq_attr "cross" "_CROSS_") |
| (and (eq_attr "units" "l") |
| (eq_attr "dest_regfile" "_RF_")))) |
| "l_N_+l_N_w_CUNIT_,l_N_w") |
| |
| (define_insn_reservation "fp4_ls_N__CROSS_" 4 |
| (and (eq_attr "type" "fp4") |
| (and (eq_attr "cross" "_CROSS_") |
| (and (eq_attr "units" "ls") |
| (eq_attr "dest_regfile" "_RF_")))) |
| "(fps_N_+s_N__CUNIT_,nothing*2,s_N_w)|(fpl_N_+l_N__CUNIT_,nothing*2,l_N_w)") |
| |
| (define_insn_reservation "adddp_ls_N__CROSS_" 7 |
| (and (eq_attr "type" "adddp") |
| (and (eq_attr "cross" "_CROSS_") |
| (and (eq_attr "units" "ls") |
| (eq_attr "dest_regfile" "_RF_")))) |
| "(adddps_N_+(s_N__CUNIT_)*2,nothing*3,s_N_w*2)|(adddpl_N_+(l_N__CUNIT_)*2,nothing*3,l_N_w*2)") |
| |
| (define_insn_reservation "single_dls_N__CROSS_" 1 |
| (and (eq_attr "type" "single") |
| (and (eq_attr "cross" "_CROSS_") |
| (and (eq_attr "units" "dls") |
| (eq_attr "dest_regfile" "_RF_")))) |
| "(d_N_|(l_N_+l_N_w)|(s_N_+s_N_w))_CUNIT_") |
| |
| (define_insn_reservation "mpy2_m_N__CROSS_" 2 |
| (and (eq_attr "type" "mpy2") |
| (and (eq_attr "cross" "_CROSS_") |
| (and (eq_attr "units" "m") |
| (eq_attr "dest_regfile" "_RF_")))) |
| "m_N__CUNIT_,m_N_w") |
| |
| (define_insn_reservation "mpy4_m_N__CROSS_" 4 |
| (and (eq_attr "type" "mpy4") |
| (and (eq_attr "cross" "_CROSS_") |
| (and (eq_attr "units" "m") |
| (eq_attr "dest_regfile" "_RF_")))) |
| "m_N__CUNIT_,nothing,nothing,m_N_w") |
| |
| (define_insn_reservation "mpydp_m_N__CROSS_" 10 |
| (and (eq_attr "type" "mpydp") |
| (and (eq_attr "cross" "_CROSS_") |
| (and (eq_attr "units" "m") |
| (eq_attr "dest_regfile" "_RF_")))) |
| "(m_N__CUNIT_)*4,nothing*4,m_N_w*2") |
| |
| (define_insn_reservation "mpyspdp_m_N__CROSS_" 7 |
| (and (eq_attr "type" "mpyspdp") |
| (and (eq_attr "cross" "_CROSS_") |
| (and (eq_attr "units" "m") |
| (eq_attr "dest_regfile" "_RF_")))) |
| "(m_N__CUNIT_)*2,nothing*3,m_N_w*2") |
| |
| (define_insn_reservation "mpysp2dp_m_N__CROSS_" 5 |
| (and (eq_attr "type" "mpysp2dp") |
| (and (eq_attr "cross" "_CROSS_") |
| (and (eq_attr "units" "m") |
| (eq_attr "dest_regfile" "_RF_")))) |
| "m_N__CUNIT_,nothing*2,m_N_w*2") |