]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
MIPS Technologies, Inc.
authorSandra Loosemore <sandra@codesourcery.com>
Wed, 15 Aug 2012 23:56:52 +0000 (19:56 -0400)
committerSandra Loosemore <sandra@gcc.gnu.org>
Wed, 15 Aug 2012 23:56:52 +0000 (19:56 -0400)
2012-08-15  Sandra Loosemore  <sandra@codesourcery.com>
    Maxim Kuvyrkov  <maxim@codesourcery.com>
    Julian Brown  <julian@codesourcery.com>
    MIPS Technologies, Inc.

gcc/
* config/mips/mips.md (dspmac, dspmacsat, accext, accmod, dspalu)
(dspalusat): Add insn types.
* config/mips/mips-dsp.md (add<DSPV:mode>3)
(mips_add<DSP:dspfmt1>_s_<DSP:dspfmt2>)
(sub<DSPV:mode>3, mips_sub<DSP:dspfmt1>_s_<DSP:dspfmt2>, mips_addsc)
(mips_addwc, mips_modsub, mips_raddu_w_qb, mips_absq_s_<DSPQ:dspfmt2>)
(mips_precrq_qb_ph, mips_precrq_ph_w, mips_precrq_rs_ph_w)
(mips_precrqu_s_qb_ph, mips_preceq_w_phl, mips_preceq_w_phr)
(mips_precequ_ph_qbl, mips_precequ_ph_qbr, mips_precequ_ph_qbla)
(mips_precequ_ph_qbra, mips_preceu_ph_qbl, mips_preceu_ph_qbr)
(mips_preceu_ph_qbla, mips_preceu_ph_qbra, mips_shll_<DSPV:dspfmt2>)
(mips_shll_s_<DSPQ:dspfmt2>, mips_shll_s_<DSPQ:dspfmt2>, mips_shrl_qb)
(mips_shra_ph, mips_shra_r_<DSPQ:dspfmt2>, mips_bitrev, mips_insv)
(mips_repl_qb, mips_repl_ph)
(mips_cmp<DSPV:dspfmt1_1>_eq_<DSPV:dspfmt2>)
(mips_cmp<DSPV:dspfmt1_1>_lt_<DSPV:dspfmt2>)
(mips_cmp<DSPV:dspfmt1_1>_le_<DSPV:dspfmt2>, mips_cmpgu_eq_qb)
(mips_cmpgu_lt_qb, mips_cmpgu_le_qb, mips_pick_<DSPV:dspfmt2>)
(mips_packrl_ph, mips_wrdsp, mips_rddsp): Change type to dspalu.
(mips_dpau_h_qbl, mips_dpau_h_qbr, mips_dpsu_h_qbl, mips_dpsu_h_qbr)
(mips_dpaq_s_w_ph, mips_dpsq_s_w_ph, mips_mulsaq_s_w_ph)
(mips_maq_s_w_phl, mips_maq_s_w_phr, mips_maq_sa_w_phr): Set type to
dspmac.
(mips_dpaq_sa_l_w, mips_dpsq_sa_l_w, mips_maq_sa_w_phl): Set type to
dspmacsat.
(mips_extr_w, mips_extr_r_w, mips_extr_rs_w, mips_extp, mips_extpdp):
Set type to accext.
(mips_shilo, mips_mthlip): Set type to accmod.
* config/mips/mips-dspr2.md (mips_absq_s_qb, mips_addu_s_ph)
(mips_adduh_r_qb): Set type to dspalusat.
(mips_addu_ph, mips_adduh_qb, mips_append, mips_balign)
(mips_cmpgdu_eq_qb, mips_cmpgdu_lt_qb, mips_cmpgdu_le_qb)
(mips_precr_qb_ph, mips_precr_sra_ph_w, mips_precr_sra_r_ph_w)
(mips_prepend, mips_shra_qb, mips_shra_r_qb, mips_shrl_ph)
(mips_subu_ph, mips_subuh_qb, mips_subuh_r_qb, mips_addqh_ph)
(mips_addqh_r_ph, mips_addqh_w, mips_addqh_r_w, mips_subqh_ph)
(mips_subqh_r_ph, mips_subqh_w, mips_subqh_r_w): Set type to dspalu.
(mips_dpa_w_ph, mips_dps_w_ph, mips_mulsa_w_ph, mips_dpax_w_ph)
(mips_dpsx_w_ph, mips_dpaqx_s_w_ph, mips_dpsqx_s_w_ph): Set type to
dspmac.  Set accum_in attribute.
(mips_subu_s_ph): Set type to dspalusat.
(mips_dpaqx_sa_w_ph, mips_dpsqx_sa_w_ph): Set type to dspmacsat.
Set accum_in attribute.
* config/mips/mips-protos.h (mips_dspalu_bypass_p): Add prototype.
* config/mips/mips.c (dspalu_bypass_table): New.
(mips_dspalu_bypass_p): New.
* config/mips/24k.md (r24k_dsp_alu, r24k_dsp_mac, r24k_dsp_mac_sat)
(r24k_dsp_acc_ext, r24k_dsp_acc_mod): New insn reservations.
(r24k_int_mult, r24k_int_mthilo, r24k_dsp_mac, r24k_dsp_mac_sat)
(r24k_dsp_acc_ext, r24k_dsp_acc_mod, r24k_dsp_alu): New bypasses.
* config/mips/74k.md (r74k_dsp_alu, r74k_dsp_alu_sat, r74k_dsp_mac)
(r74k_dsp_mac_sat, r74k_dsp_acc_ext, r74k_dsp_acc_mod): New insn
reservations.
(r74k_dsp_mac, r74k_dsp_mac_sat, r74k_int_mult, r74k_int_mul3)
(r74k_dsp_mac, r74k_dsp_mac_sat): New bypasses.

Co-Authored-By: Julian Brown <julian@codesourcery.com>
Co-Authored-By: Maxim Kuvyrkov <maxim@codesourcery.com>
From-SVN: r190423

gcc/ChangeLog
gcc/config/mips/24k.md
gcc/config/mips/74k.md
gcc/config/mips/mips-dsp.md
gcc/config/mips/mips-dspr2.md
gcc/config/mips/mips-protos.h
gcc/config/mips/mips.c
gcc/config/mips/mips.md

index 12cecd51059828457c4e7175abaf6030720c9ae7..1f990cff88b0bac1b2a577833ca823765d6e1236 100644 (file)
@@ -1,3 +1,65 @@
+2012-08-15  Sandra Loosemore  <sandra@codesourcery.com>
+           Maxim Kuvyrkov  <maxim@codesourcery.com>
+           Julian Brown  <julian@codesourcery.com>
+           MIPS Technologies, Inc.
+
+       gcc/
+       * config/mips/mips.md (dspmac, dspmacsat, accext, accmod, dspalu)
+       (dspalusat): Add insn types.
+       * config/mips/mips-dsp.md (add<DSPV:mode>3)
+       (mips_add<DSP:dspfmt1>_s_<DSP:dspfmt2>)
+       (sub<DSPV:mode>3, mips_sub<DSP:dspfmt1>_s_<DSP:dspfmt2>, mips_addsc)
+       (mips_addwc, mips_modsub, mips_raddu_w_qb, mips_absq_s_<DSPQ:dspfmt2>)
+       (mips_precrq_qb_ph, mips_precrq_ph_w, mips_precrq_rs_ph_w)
+       (mips_precrqu_s_qb_ph, mips_preceq_w_phl, mips_preceq_w_phr)
+       (mips_precequ_ph_qbl, mips_precequ_ph_qbr, mips_precequ_ph_qbla)
+       (mips_precequ_ph_qbra, mips_preceu_ph_qbl, mips_preceu_ph_qbr)
+       (mips_preceu_ph_qbla, mips_preceu_ph_qbra, mips_shll_<DSPV:dspfmt2>)
+       (mips_shll_s_<DSPQ:dspfmt2>, mips_shll_s_<DSPQ:dspfmt2>, mips_shrl_qb)
+       (mips_shra_ph, mips_shra_r_<DSPQ:dspfmt2>, mips_bitrev, mips_insv)
+       (mips_repl_qb, mips_repl_ph)
+       (mips_cmp<DSPV:dspfmt1_1>_eq_<DSPV:dspfmt2>)
+       (mips_cmp<DSPV:dspfmt1_1>_lt_<DSPV:dspfmt2>)
+       (mips_cmp<DSPV:dspfmt1_1>_le_<DSPV:dspfmt2>, mips_cmpgu_eq_qb)
+       (mips_cmpgu_lt_qb, mips_cmpgu_le_qb, mips_pick_<DSPV:dspfmt2>)
+       (mips_packrl_ph, mips_wrdsp, mips_rddsp): Change type to dspalu.
+       (mips_dpau_h_qbl, mips_dpau_h_qbr, mips_dpsu_h_qbl, mips_dpsu_h_qbr)
+       (mips_dpaq_s_w_ph, mips_dpsq_s_w_ph, mips_mulsaq_s_w_ph)
+       (mips_maq_s_w_phl, mips_maq_s_w_phr, mips_maq_sa_w_phr): Set type to
+       dspmac.
+       (mips_dpaq_sa_l_w, mips_dpsq_sa_l_w, mips_maq_sa_w_phl): Set type to
+       dspmacsat.
+       (mips_extr_w, mips_extr_r_w, mips_extr_rs_w, mips_extp, mips_extpdp):
+       Set type to accext.
+       (mips_shilo, mips_mthlip): Set type to accmod.
+       * config/mips/mips-dspr2.md (mips_absq_s_qb, mips_addu_s_ph)
+       (mips_adduh_r_qb): Set type to dspalusat.
+       (mips_addu_ph, mips_adduh_qb, mips_append, mips_balign)
+       (mips_cmpgdu_eq_qb, mips_cmpgdu_lt_qb, mips_cmpgdu_le_qb)
+       (mips_precr_qb_ph, mips_precr_sra_ph_w, mips_precr_sra_r_ph_w)
+       (mips_prepend, mips_shra_qb, mips_shra_r_qb, mips_shrl_ph)
+       (mips_subu_ph, mips_subuh_qb, mips_subuh_r_qb, mips_addqh_ph)
+       (mips_addqh_r_ph, mips_addqh_w, mips_addqh_r_w, mips_subqh_ph)
+       (mips_subqh_r_ph, mips_subqh_w, mips_subqh_r_w): Set type to dspalu.
+       (mips_dpa_w_ph, mips_dps_w_ph, mips_mulsa_w_ph, mips_dpax_w_ph)
+       (mips_dpsx_w_ph, mips_dpaqx_s_w_ph, mips_dpsqx_s_w_ph): Set type to
+       dspmac.  Set accum_in attribute.
+       (mips_subu_s_ph): Set type to dspalusat. 
+       (mips_dpaqx_sa_w_ph, mips_dpsqx_sa_w_ph): Set type to dspmacsat.
+       Set accum_in attribute.
+       * config/mips/mips-protos.h (mips_dspalu_bypass_p): Add prototype.
+       * config/mips/mips.c (dspalu_bypass_table): New.
+       (mips_dspalu_bypass_p): New.
+       * config/mips/24k.md (r24k_dsp_alu, r24k_dsp_mac, r24k_dsp_mac_sat)
+       (r24k_dsp_acc_ext, r24k_dsp_acc_mod): New insn reservations.
+       (r24k_int_mult, r24k_int_mthilo, r24k_dsp_mac, r24k_dsp_mac_sat)
+       (r24k_dsp_acc_ext, r24k_dsp_acc_mod, r24k_dsp_alu): New bypasses.
+       * config/mips/74k.md (r74k_dsp_alu, r74k_dsp_alu_sat, r74k_dsp_mac)
+       (r74k_dsp_mac_sat, r74k_dsp_acc_ext, r74k_dsp_acc_mod): New insn
+       reservations.
+       (r74k_dsp_mac, r74k_dsp_mac_sat, r74k_int_mult, r74k_int_mul3)
+       (r74k_dsp_mac, r74k_dsp_mac_sat): New bypasses.
+
 2012-08-15  Ulrich Weigand  <Ulrich.Weigand@de.ibm.com>
 
        * config/spu/spu.c: Include "cfgloop.h".
index 72ae6835e665a4c652022b00cd9fbfc1bf81e0b3..3860d1eef0dc7b06dfc59f15524c3b48acb4763e 100644 (file)
 (define_bypass 2 "r24k_int_multi" "r24k_int_prefetch")
 
 
+;; --------------------------------------------------------------
+;; DSP instructions
+;; --------------------------------------------------------------
+
+;; absq, addq, addsc, addu, addwc, bitrev, cmp, cmpgu, cmpu, insv, modsub,
+;; packrl, pick, preceq, preceu, precequ, precrq, precrqu, raddu, rddsp, repl,
+;; replv, shll, shllv, shra, shrav, shrl, shrlv, subq, subu, wrdsp
+(define_insn_reservation "r24k_dsp_alu" 2
+  (and (eq_attr "cpu" "24kc,24kf2_1,24kf1_1")
+       (eq_attr "type" "dspalu,dspalusat"))
+  "r24k_iss+r24k_ixu_arith")
+
+;; dpaq_s, dpau, dpsq_s, dpsu, maq_s, mulsaq
+(define_insn_reservation "r24k_dsp_mac" 1
+  (and (eq_attr "cpu" "24kc,24kf2_1,24kf1_1")
+       (eq_attr "type" "dspmac"))
+  "r24k_iss+(r24k_mul3a|r24k_mul3b|r24k_mul3c)")
+
+;; dpaq_sa, dpsq_sa, maq_sa
+(define_insn_reservation "r24k_dsp_mac_sat" 1
+  (and (eq_attr "cpu" "24kc,24kf2_1,24kf1_1")
+       (eq_attr "type" "dspmacsat"))
+  "r24k_iss+(r24k_mul3a|r24k_mul3b|r24k_mul3c)")
+
+;; extp, extpdp, extpdpv, extpv, extr, extrv
+(define_insn_reservation "r24k_dsp_acc_ext" 5
+  (and (eq_attr "cpu" "24kc,24kf2_1,24kf1_1")
+       (eq_attr "type" "accext"))
+  "r24k_iss+(r24k_mul3a|r24k_mul3b|r24k_mul3c)")
+
+;; mthlip, shilo, shilov
+(define_insn_reservation "r24k_dsp_acc_mod" 1
+  (and (eq_attr "cpu" "24kc,24kf2_1,24kf1_1")
+       (eq_attr "type" "accmod"))
+  "r24k_iss+(r24k_mul3a|r24k_mul3b|r24k_mul3c)")
+
+
+;; mult/madd->dsp_acc_ext : 4 cycles
+;; mult/madd->dsp_acc_mod : 4 cycles
+(define_bypass 4 "r24k_int_mult" "r24k_dsp_acc_ext")
+(define_bypass 4 "r24k_int_mult" "r24k_dsp_acc_mod")
+
+;; mthilo->dsp_acc_ext : 4 cycles
+;; mthilo->dsp_acc_ext : 4 cycles
+(define_bypass 4 "r24k_int_mthilo" "r24k_dsp_acc_ext")
+(define_bypass 4 "r24k_int_mthilo" "r24k_dsp_acc_mod")
+
+;; dsp_mac->next use    : 1 cycles (default)
+;; dsp_mac->dsp_acc_ext : 4 cycles
+;; dsp_mac->dsp_acc_mod : 4 cycles
+(define_bypass 4 "r24k_dsp_mac" "r24k_dsp_acc_ext")
+(define_bypass 4 "r24k_dsp_mac" "r24k_dsp_acc_mod")
+
+;; dsp_mac_sat->next use    : 1 cycles (default)
+;; dsp_mac_sat->mult/madd   : 2 cycles
+;; dsp_mac_sat->dsp_mac     : 2 cycles
+;; dsp_mac_sat->dsp_mac_sat : 2 cycles
+;; dsp_mac_sat->dsp_acc_ext : 4 cycles
+;; dsp_mac_sat->dsp_acc_mod : 4 cycles
+(define_bypass 2 "r24k_dsp_mac_sat" "r24k_int_mult")
+(define_bypass 2 "r24k_dsp_mac_sat" "r24k_dsp_mac")
+(define_bypass 2 "r24k_dsp_mac_sat" "r24k_dsp_mac_sat")
+(define_bypass 4 "r24k_dsp_mac_sat" "r24k_dsp_acc_ext")
+(define_bypass 4 "r24k_dsp_mac_sat" "r24k_dsp_acc_mod")
+
+;; dsp_acc_ext->next use : 5 cycles (default)
+;; dsp_acc_ext->l/s base : 6 cycles
+;; dsp_acc_ext->prefetch : 6 cycles
+(define_bypass 6 "r24k_dsp_acc_ext" "r24k_int_load")
+(define_bypass 6 "r24k_dsp_acc_ext" "r24k_int_store"
+  "!mips_store_data_bypass_p")
+(define_bypass 6 "r24k_dsp_acc_ext" "r24k_int_prefetch")
+
+;; dsp_acc_mod->next use    : 1 cycles (default)
+;; dsp_acc_mod->mult/madd   : 2 cycles
+;; dsp_acc_mod->dsp_mac     : 2 cycles
+;; dsp_acc_mod->dsp_mac_sat : 2 cycles
+;; dsp_acc_mod->dsp_acc_ext : 4 cycles
+;; dsp_acc_mod->dsp_acc_mod : 4 cycles
+(define_bypass 2 "r24k_dsp_acc_mod" "r24k_int_mult")
+(define_bypass 2 "r24k_dsp_acc_mod" "r24k_dsp_mac")
+(define_bypass 2 "r24k_dsp_acc_mod" "r24k_dsp_mac_sat")
+(define_bypass 4 "r24k_dsp_acc_mod" "r24k_dsp_acc_ext")
+(define_bypass 4 "r24k_dsp_acc_mod" "r24k_dsp_acc_mod")
+
+;; dspalu->next use : 2 cycles (default)
+;; dspalu->l/s base : 3 cycles
+;; dspalu->prefetch : 3 cycles
+;; some pairs of dspalu (addsc/addwc, cmp/pick, wrdsp/insv) : 1 cycle
+(define_bypass 3 "r24k_dsp_alu" "r24k_int_load")
+(define_bypass 3 "r24k_dsp_alu" "r24k_int_store" "!mips_store_data_bypass_p")
+(define_bypass 3 "r24k_dsp_alu" "r24k_int_prefetch")
+(define_bypass 1 "r24k_dsp_alu" "r24k_dsp_alu" "mips_dspalu_bypass_p")
+
+
 ;; --------------------------------------------------------------
 ;; Floating Point Instructions
 ;; --------------------------------------------------------------
index 4a9cb65ae007e5d7109ed9d18907acb1ab04c392..721834c7d9ef012d84d28d00d4af9e8657b3c839 100644 (file)
 (define_bypass 1 "r74k_int_madd" "r74k_int_madd"
   "mips_linked_madd_p")
 
+
+;; --------------------------------------------------------------
+;; DSP instructions
+;; --------------------------------------------------------------
+
+;; Non-saturating insn have the same latency as normal ALU operations,
+(define_insn_reservation "r74k_dsp_alu" 2
+  (and (eq_attr "cpu" "74kc,74kf2_1,74kf1_1,74kf3_2")
+       (eq_attr "type" "dspalu"))
+  "r74k_alu")
+
+;; Saturating insn takes an extra cycle.
+(define_insn_reservation "r74k_dsp_alu_sat" 3
+  (and (eq_attr "cpu" "74kc,74kf2_1,74kf1_1,74kf3_2")
+       (eq_attr "type" "dspalusat"))
+  "r74k_alu")
+
+;; dpaq_s, dpau, dpsq_s, dpsu, maq_s, mulsaq
+;; - delivers result to hi/lo in 6 cycle (bypass at M4)
+(define_insn_reservation "r74k_dsp_mac" 6
+  (and (eq_attr "cpu" "74kc,74kf2_1,74kf1_1,74kf3_2")
+       (eq_attr "type" "dspmac"))
+  "r74k_alu+r74k_mul")
+
+;; dpaq_sa, dpsq_sa, maq_sa
+;; - delivers result to hi/lo in 7 cycle (bypass at WB)
+(define_insn_reservation "r74k_dsp_mac_sat" 7
+  (and (eq_attr "cpu" "74kc,74kf2_1,74kf1_1,74kf3_2")
+       (eq_attr "type" "dspmacsat"))
+  "r74k_alu+r74k_mul")
+
+;; extp, extpdp, extpdpv, extpv, extr, extrv
+;; - same latency as "mul"
+(define_insn_reservation "r74k_dsp_acc_ext" 7
+  (and (eq_attr "cpu" "74kc,74kf2_1,74kf1_1,74kf3_2")
+       (eq_attr "type" "accext"))
+  "r74k_alu+r74k_mul")
+
+;; mthlip, shilo, shilov
+;; - same latency as "mul"
+(define_insn_reservation "r74k_dsp_acc_mod" 7
+  (and (eq_attr "cpu" "74kc,74kf2_1,74kf1_1,74kf3_2")
+       (eq_attr "type" "accmod"))
+  "r74k_alu+r74k_mul")
+
+;; dspalu   ->load/store base
+;; dspalusat->load/store base
+;; - we should never see these in real life.
+
+;; dsp_mac->dsp_mac     : 1 cycles (repeat rate of 1)
+;; dsp_mac->dsp_mac_sat : 1 cycles (repeat rate of 1)
+(define_bypass 1 "r74k_dsp_mac" "r74k_dsp_mac")
+(define_bypass 1 "r74k_dsp_mac" "r74k_dsp_mac_sat")
+
+;; dsp_mac_sat->dsp_mac_sat : 2 cycles (repeat rate of 2)
+;; dsp_mac_sat->dsp_mac     : 2 cycles (repeat rate of 2)
+(define_bypass 2 "r74k_dsp_mac_sat" "r74k_dsp_mac_sat")
+(define_bypass 2 "r74k_dsp_mac_sat" "r74k_dsp_mac")
+
+(define_bypass 1 "r74k_int_mult" "r74k_dsp_mac")
+(define_bypass 1 "r74k_int_mult" "r74k_dsp_mac_sat")
+
+(define_bypass 1 "r74k_int_mul3" "r74k_dsp_mac" "mips_linked_madd_p")
+(define_bypass 1 "r74k_int_mul3" "r74k_dsp_mac_sat" "mips_linked_madd_p")
+
+;; Assuming the following is true (bypass at M4)
+;;  AP AF AM MB M1 M2 M3 M4 WB GR GC
+;;              AP AF AM MB M1 M2 M3 M4 WB GR GC
+;; dsp_mac->dsp_acc_ext : 4 cycles
+;; dsp_mac->dsp_acc_mod : 4 cycles
+(define_bypass 4 "r74k_dsp_mac" "r74k_dsp_acc_ext")
+(define_bypass 4 "r74k_dsp_mac" "r74k_dsp_acc_mod")
+
+;; Assuming the following is true (bypass at WB)
+;;  AP AF AM MB M1 M2 M3 M4 WB GR GC
+;;                 AP AF AM MB M1 M2 M3 M4 WB GR GC
+;; dsp_mac_sat->dsp_acc_ext : 5 cycles
+;; dsp_mac_sat->dsp_acc_mod : 5 cycles
+(define_bypass 5 "r74k_dsp_mac_sat" "r74k_dsp_acc_ext")
+(define_bypass 5 "r74k_dsp_mac_sat" "r74k_dsp_acc_mod")
+
+
 ;; --------------------------------------------------------------
 ;; Floating Point Instructions
 ;; --------------------------------------------------------------
index c2a89e1b5a34dd1712881024ffb1e523f41e46b2..3c23448177f1dd6c5851d8a13f7975104856a065 100644 (file)
          (unspec:CCDSP [(match_dup 1) (match_dup 2)] UNSPEC_ADDQ))])]
   "ISA_HAS_DSP"
   "add<DSPV:dspfmt1>.<DSPV:dspfmt2>\t%0,%1,%2"
-  [(set_attr "type"    "arith")
+  [(set_attr "type"    "dspalu")
    (set_attr "mode"    "SI")])
 
 (define_insn "mips_add<DSP:dspfmt1>_s_<DSP:dspfmt2>"
          (unspec:CCDSP [(match_dup 1) (match_dup 2)] UNSPEC_ADDQ_S))])]
   "ISA_HAS_DSP"
   "add<DSP:dspfmt1>_s.<DSP:dspfmt2>\t%0,%1,%2"
-  [(set_attr "type"    "arith")
+  [(set_attr "type"    "dspalusat")
    (set_attr "mode"    "SI")])
 
 ;; SUBQ*
          (unspec:CCDSP [(match_dup 1) (match_dup 2)] UNSPEC_SUBQ))])]
   "ISA_HAS_DSP"
   "sub<DSPV:dspfmt1>.<DSPV:dspfmt2>\t%0,%1,%2"
-  [(set_attr "type"    "arith")
+  [(set_attr "type"    "dspalu")
    (set_attr "mode"    "SI")])
 
 (define_insn "mips_sub<DSP:dspfmt1>_s_<DSP:dspfmt2>"
          (unspec:CCDSP [(match_dup 1) (match_dup 2)] UNSPEC_SUBQ_S))])]
   "ISA_HAS_DSP"
   "sub<DSP:dspfmt1>_s.<DSP:dspfmt2>\t%0,%1,%2"
-  [(set_attr "type"    "arith")
+  [(set_attr "type"    "dspalusat")
    (set_attr "mode"    "SI")])
 
 ;; ADDSC
          (unspec:CCDSP [(match_dup 1) (match_dup 2)] UNSPEC_ADDSC))])]
   "ISA_HAS_DSP"
   "addsc\t%0,%1,%2"
-  [(set_attr "type"    "arith")
+  [(set_attr "type"    "dspalu")
    (set_attr "mode"    "SI")])
 
 ;; ADDWC
          (unspec:CCDSP [(match_dup 1) (match_dup 2)] UNSPEC_ADDWC))])]
   "ISA_HAS_DSP"
   "addwc\t%0,%1,%2"
-  [(set_attr "type"    "arith")
+  [(set_attr "type"    "dspalu")
    (set_attr "mode"    "SI")])
 
 ;; MODSUB
                   UNSPEC_MODSUB))]
   "ISA_HAS_DSP"
   "modsub\t%0,%1,%2"
-  [(set_attr "type"    "arith")
+  [(set_attr "type"    "dspalu")
    (set_attr "mode"    "SI")])
 
 ;; RADDU*
                   UNSPEC_RADDU_W_QB))]
   "ISA_HAS_DSP"
   "raddu.w.qb\t%0,%1"
-  [(set_attr "type"    "arith")
+  [(set_attr "type"    "dspalu")
    (set_attr "mode"    "SI")])
 
 ;; ABSQ*
          (unspec:CCDSP [(match_dup 1)] UNSPEC_ABSQ_S))])]
   "ISA_HAS_DSP"
   "absq_s.<DSPQ:dspfmt2>\t%0,%1"
-  [(set_attr "type"    "arith")
+  [(set_attr "type"    "dspalusat")
    (set_attr "mode"    "SI")])
 
 ;; PRECRQ*
                     UNSPEC_PRECRQ_QB_PH))]
   "ISA_HAS_DSP"
   "precrq.qb.ph\t%0,%1,%2"
-  [(set_attr "type"    "arith")
+  [(set_attr "type"    "dspalu")
    (set_attr "mode"    "SI")])
 
 (define_insn "mips_precrq_ph_w"
                     UNSPEC_PRECRQ_PH_W))]
   "ISA_HAS_DSP"
   "precrq.ph.w\t%0,%1,%2"
-  [(set_attr "type"    "arith")
+  [(set_attr "type"    "dspalu")
    (set_attr "mode"    "SI")])
 
 (define_insn "mips_precrq_rs_ph_w"
                        UNSPEC_PRECRQ_RS_PH_W))])]
   "ISA_HAS_DSP"
   "precrq_rs.ph.w\t%0,%1,%2"
-  [(set_attr "type"    "arith")
+  [(set_attr "type"    "dspalu")
    (set_attr "mode"    "SI")])
 
 ;; PRECRQU*
                        UNSPEC_PRECRQU_S_QB_PH))])]
   "ISA_HAS_DSP"
   "precrqu_s.qb.ph\t%0,%1,%2"
-  [(set_attr "type"    "arith")
+  [(set_attr "type"    "dspalusat")
    (set_attr "mode"    "SI")])
 
 ;; PRECEQ*
                   UNSPEC_PRECEQ_W_PHL))]
   "ISA_HAS_DSP"
   "preceq.w.phl\t%0,%1"
-  [(set_attr "type"    "arith")
+  [(set_attr "type"    "dspalu")
    (set_attr "mode"    "SI")])
 
 (define_insn "mips_preceq_w_phr"
                   UNSPEC_PRECEQ_W_PHR))]
   "ISA_HAS_DSP"
   "preceq.w.phr\t%0,%1"
-  [(set_attr "type"    "arith")
+  [(set_attr "type"    "dspalu")
    (set_attr "mode"    "SI")])
 
 ;; PRECEQU*
                     UNSPEC_PRECEQU_PH_QBL))]
   "ISA_HAS_DSP"
   "precequ.ph.qbl\t%0,%1"
-  [(set_attr "type"    "arith")
+  [(set_attr "type"    "dspalu")
    (set_attr "mode"    "SI")])
 
 (define_insn "mips_precequ_ph_qbr"
                     UNSPEC_PRECEQU_PH_QBR))]
   "ISA_HAS_DSP"
   "precequ.ph.qbr\t%0,%1"
-  [(set_attr "type"    "arith")
+  [(set_attr "type"    "dspalu")
    (set_attr "mode"    "SI")])
 
 (define_insn "mips_precequ_ph_qbla"
                     UNSPEC_PRECEQU_PH_QBLA))]
   "ISA_HAS_DSP"
   "precequ.ph.qbla\t%0,%1"
-  [(set_attr "type"    "arith")
+  [(set_attr "type"    "dspalu")
    (set_attr "mode"    "SI")])
 
 (define_insn "mips_precequ_ph_qbra"
                     UNSPEC_PRECEQU_PH_QBRA))]
   "ISA_HAS_DSP"
   "precequ.ph.qbra\t%0,%1"
-  [(set_attr "type"    "arith")
+  [(set_attr "type"    "dspalu")
    (set_attr "mode"    "SI")])
 
 ;; PRECEU*
                     UNSPEC_PRECEU_PH_QBL))]
   "ISA_HAS_DSP"
   "preceu.ph.qbl\t%0,%1"
-  [(set_attr "type"    "arith")
+  [(set_attr "type"    "dspalu")
    (set_attr "mode"    "SI")])
 
 (define_insn "mips_preceu_ph_qbr"
                     UNSPEC_PRECEU_PH_QBR))]
   "ISA_HAS_DSP"
   "preceu.ph.qbr\t%0,%1"
-  [(set_attr "type"    "arith")
+  [(set_attr "type"    "dspalu")
    (set_attr "mode"    "SI")])
 
 (define_insn "mips_preceu_ph_qbla"
                     UNSPEC_PRECEU_PH_QBLA))]
   "ISA_HAS_DSP"
   "preceu.ph.qbla\t%0,%1"
-  [(set_attr "type"    "arith")
+  [(set_attr "type"    "dspalu")
    (set_attr "mode"    "SI")])
 
 (define_insn "mips_preceu_ph_qbra"
                     UNSPEC_PRECEU_PH_QBRA))]
   "ISA_HAS_DSP"
   "preceu.ph.qbra\t%0,%1"
-  [(set_attr "type"    "arith")
+  [(set_attr "type"    "dspalu")
    (set_attr "mode"    "SI")])
 
 ;; Table 2-2. MIPS DSP ASE Instructions: Shift
     }
   return "shllv.<DSPV:dspfmt2>\t%0,%1,%2";
 }
-  [(set_attr "type"    "shift")
+  [(set_attr "type"    "dspalu")
    (set_attr "mode"    "SI")])
 
 (define_insn "mips_shll_s_<DSPQ:dspfmt2>"
     }
   return "shllv_s.<DSPQ:dspfmt2>\t%0,%1,%2";
 }
-  [(set_attr "type"    "shift")
+  [(set_attr "type"    "dspalusat")
    (set_attr "mode"    "SI")])
 
 ;; SHRL*
     }
   return "shrlv.qb\t%0,%1,%2";
 }
-  [(set_attr "type"    "shift")
+  [(set_attr "type"    "dspalu")
    (set_attr "mode"    "SI")])
 
 ;; SHRA*
     }
   return "shrav.ph\t%0,%1,%2";
 }
-  [(set_attr "type"    "shift")
+  [(set_attr "type"    "dspalu")
    (set_attr "mode"    "SI")])
 
 (define_insn "mips_shra_r_<DSPQ:dspfmt2>"
     }
   return "shrav_r.<DSPQ:dspfmt2>\t%0,%1,%2";
 }
-  [(set_attr "type"    "shift")
+  [(set_attr "type"    "dspalu")
    (set_attr "mode"    "SI")])
 
 ;; Table 2-3. MIPS DSP ASE Instructions: Multiply
                   UNSPEC_DPAU_H_QBL))]
   "ISA_HAS_DSP && !TARGET_64BIT"
   "dpau.h.qbl\t%q0,%2,%3"
-  [(set_attr "type"    "imadd")
+  [(set_attr "type"    "dspmac")
    (set_attr "mode"    "SI")])
 
 (define_insn "mips_dpau_h_qbr"
                   UNSPEC_DPAU_H_QBR))]
   "ISA_HAS_DSP && !TARGET_64BIT"
   "dpau.h.qbr\t%q0,%2,%3"
-  [(set_attr "type"    "imadd")
+  [(set_attr "type"    "dspmac")
    (set_attr "mode"    "SI")])
 
 ;; DPSU*
                   UNSPEC_DPSU_H_QBL))]
   "ISA_HAS_DSP && !TARGET_64BIT"
   "dpsu.h.qbl\t%q0,%2,%3"
-  [(set_attr "type"    "imadd")
+  [(set_attr "type"    "dspmac")
    (set_attr "mode"    "SI")])
 
 (define_insn "mips_dpsu_h_qbr"
                   UNSPEC_DPSU_H_QBR))]
   "ISA_HAS_DSP && !TARGET_64BIT"
   "dpsu.h.qbr\t%q0,%2,%3"
-  [(set_attr "type"    "imadd")
+  [(set_attr "type"    "dspmac")
    (set_attr "mode"    "SI")])
 
 ;; DPAQ*
                        UNSPEC_DPAQ_S_W_PH))])]
   "ISA_HAS_DSP && !TARGET_64BIT"
   "dpaq_s.w.ph\t%q0,%2,%3"
-  [(set_attr "type"    "imadd")
+  [(set_attr "type"    "dspmac")
    (set_attr "mode"    "SI")])
 
 ;; DPSQ*
                        UNSPEC_DPSQ_S_W_PH))])]
   "ISA_HAS_DSP && !TARGET_64BIT"
   "dpsq_s.w.ph\t%q0,%2,%3"
-  [(set_attr "type"    "imadd")
+  [(set_attr "type"    "dspmac")
    (set_attr "mode"    "SI")])
 
 ;; MULSAQ*
                        UNSPEC_MULSAQ_S_W_PH))])]
   "ISA_HAS_DSP && !TARGET_64BIT"
   "mulsaq_s.w.ph\t%q0,%2,%3"
-  [(set_attr "type"    "imadd")
+  [(set_attr "type"    "dspmac")
    (set_attr "mode"    "SI")])
 
 ;; DPAQ*
                        UNSPEC_DPAQ_SA_L_W))])]
   "ISA_HAS_DSP && !TARGET_64BIT"
   "dpaq_sa.l.w\t%q0,%2,%3"
-  [(set_attr "type"    "imadd")
+  [(set_attr "type"    "dspmacsat")
    (set_attr "mode"    "SI")])
 
 ;; DPSQ*
                        UNSPEC_DPSQ_SA_L_W))])]
   "ISA_HAS_DSP && !TARGET_64BIT"
   "dpsq_sa.l.w\t%q0,%2,%3"
-  [(set_attr "type"    "imadd")
+  [(set_attr "type"    "dspmacsat")
    (set_attr "mode"    "SI")])
 
 ;; MAQ*
                        UNSPEC_MAQ_S_W_PHL))])]
   "ISA_HAS_DSP && !TARGET_64BIT"
   "maq_s.w.phl\t%q0,%2,%3"
-  [(set_attr "type"    "imadd")
+  [(set_attr "type"    "dspmac")
    (set_attr "mode"    "SI")])
 
 (define_insn "mips_maq_s_w_phr"
                        UNSPEC_MAQ_S_W_PHR))])]
   "ISA_HAS_DSP && !TARGET_64BIT"
   "maq_s.w.phr\t%q0,%2,%3"
-  [(set_attr "type"    "imadd")
+  [(set_attr "type"    "dspmac")
    (set_attr "mode"    "SI")])
 
 ;; MAQ_SA*
                        UNSPEC_MAQ_SA_W_PHL))])]
   "ISA_HAS_DSP && !TARGET_64BIT"
   "maq_sa.w.phl\t%q0,%2,%3"
-  [(set_attr "type"    "imadd")
+  [(set_attr "type"    "dspmacsat")
    (set_attr "mode"    "SI")])
 
 (define_insn "mips_maq_sa_w_phr"
                        UNSPEC_MAQ_SA_W_PHR))])]
   "ISA_HAS_DSP && !TARGET_64BIT"
   "maq_sa.w.phr\t%q0,%2,%3"
-  [(set_attr "type"    "imadd")
+  [(set_attr "type"    "dspmacsat")
    (set_attr "mode"    "SI")])
 
 ;; Table 2-4. MIPS DSP ASE Instructions: General Bit/Manipulation
                   UNSPEC_BITREV))]
   "ISA_HAS_DSP"
   "bitrev\t%0,%1"
-  [(set_attr "type"    "arith")
+  [(set_attr "type"    "dspalu")
    (set_attr "mode"    "SI")])
 
 ;; INSV
                   UNSPEC_INSV))]
   "ISA_HAS_DSP"
   "insv\t%0,%2"
-  [(set_attr "type"    "arith")
+  [(set_attr "type"    "dspalu")
    (set_attr "mode"    "SI")])
 
 ;; REPL*
     }
   return "replv.qb\t%0,%1";
 }
-  [(set_attr "type"    "arith")
+  [(set_attr "type"    "dspalu")
    (set_attr "mode"    "SI")])
 
 (define_insn "mips_repl_ph"
   "@
    repl.ph\t%0,%1
    replv.ph\t%0,%1"
-  [(set_attr "type"    "arith")
+  [(set_attr "type"    "dspalu")
    (set_attr "mode"    "SI")])
 
 ;; Table 2-5. MIPS DSP ASE Instructions: Compare-Pick
                      UNSPEC_CMP_EQ))]
   "ISA_HAS_DSP"
   "cmp<DSPV:dspfmt1_1>.eq.<DSPV:dspfmt2>\t%0,%1"
-  [(set_attr "type"    "arith")
+  [(set_attr "type"    "dspalu")
    (set_attr "mode"    "SI")])
 
 (define_insn "mips_cmp<DSPV:dspfmt1_1>_lt_<DSPV:dspfmt2>"
                      UNSPEC_CMP_LT))]
   "ISA_HAS_DSP"
   "cmp<DSPV:dspfmt1_1>.lt.<DSPV:dspfmt2>\t%0,%1"
-  [(set_attr "type"    "arith")
+  [(set_attr "type"    "dspalu")
    (set_attr "mode"    "SI")])
 
 (define_insn "mips_cmp<DSPV:dspfmt1_1>_le_<DSPV:dspfmt2>"
                      UNSPEC_CMP_LE))]
   "ISA_HAS_DSP"
   "cmp<DSPV:dspfmt1_1>.le.<DSPV:dspfmt2>\t%0,%1"
-  [(set_attr "type"    "arith")
+  [(set_attr "type"    "dspalu")
    (set_attr "mode"    "SI")])
 
 (define_insn "mips_cmpgu_eq_qb"
                   UNSPEC_CMPGU_EQ_QB))]
   "ISA_HAS_DSP"
   "cmpgu.eq.qb\t%0,%1,%2"
-  [(set_attr "type"    "arith")
+  [(set_attr "type"    "dspalu")
    (set_attr "mode"    "SI")])
 
 (define_insn "mips_cmpgu_lt_qb"
                   UNSPEC_CMPGU_LT_QB))]
   "ISA_HAS_DSP"
   "cmpgu.lt.qb\t%0,%1,%2"
-  [(set_attr "type"    "arith")
+  [(set_attr "type"    "dspalu")
    (set_attr "mode"    "SI")])
 
 (define_insn "mips_cmpgu_le_qb"
                   UNSPEC_CMPGU_LE_QB))]
   "ISA_HAS_DSP"
   "cmpgu.le.qb\t%0,%1,%2"
-  [(set_attr "type"    "arith")
+  [(set_attr "type"    "dspalu")
    (set_attr "mode"    "SI")])
 
 ;; PICK*
                     UNSPEC_PICK))]
   "ISA_HAS_DSP"
   "pick.<DSPV:dspfmt2>\t%0,%1,%2"
-  [(set_attr "type"    "arith")
+  [(set_attr "type"    "dspalu")
    (set_attr "mode"    "SI")])
 
 ;; PACKRL*
                     UNSPEC_PACKRL_PH))]
   "ISA_HAS_DSP"
   "packrl.ph\t%0,%1,%2"
-  [(set_attr "type"    "arith")
+  [(set_attr "type"    "dspalu")
    (set_attr "mode"    "SI")])
 
 ;; Table 2-6. MIPS DSP ASE Instructions: Accumulator and DSPControl Access
     }
   return "extrv.w\t%0,%q1,%2";
 }
-  [(set_attr "type"    "mflo")
+  [(set_attr "type"    "accext")
    (set_attr "mode"    "SI")])
 
 (define_insn "mips_extr_r_w"
     }
   return "extrv_r.w\t%0,%q1,%2";
 }
-  [(set_attr "type"    "mflo")
+  [(set_attr "type"    "accext")
    (set_attr "mode"    "SI")])
 
 (define_insn "mips_extr_rs_w"
     }
   return "extrv_rs.w\t%0,%q1,%2";
 }
-  [(set_attr "type"    "mflo")
+  [(set_attr "type"    "accext")
    (set_attr "mode"    "SI")])
 
 ;; EXTR*_S.H
     }
   return "extrv_s.h\t%0,%q1,%2";
 }
-  [(set_attr "type"    "mflo")
+  [(set_attr "type"    "accext")
    (set_attr "mode"    "SI")])
 
 ;; EXTP*
     }
   return "extpv\t%0,%q1,%2";
 }
-  [(set_attr "type"    "mflo")
+  [(set_attr "type"    "accext")
    (set_attr "mode"    "SI")])
 
 (define_insn "mips_extpdp"
     }
   return "extpdpv\t%0,%q1,%2";
 }
-  [(set_attr "type"    "mflo")
+  [(set_attr "type"    "accext")
    (set_attr "mode"    "SI")])
 
 ;; SHILO*
     }
   return "shilov\t%q0,%2";
 }
-  [(set_attr "type"    "mflo")
+  [(set_attr "type"    "accmod")
    (set_attr "mode"    "SI")])
 
 ;; MTHLIP*
                         (reg:CCDSP CCDSP_PO_REGNUM)] UNSPEC_MTHLIP))])]
   "ISA_HAS_DSP && !TARGET_64BIT"
   "mthlip\t%2,%q0"
-  [(set_attr "type"    "mflo")
+  [(set_attr "type"    "accmod")
    (set_attr "mode"    "SI")])
 
 ;; WRDSP
          (unspec:CCDSP [(match_dup 0) (match_dup 1)] UNSPEC_WRDSP))])]
   "ISA_HAS_DSP"
   "wrdsp\t%0,%1"
-  [(set_attr "type"    "arith")
+  [(set_attr "type"    "dspalu")
    (set_attr "mode"    "SI")])
 
 ;; RDDSP
                   UNSPEC_RDDSP))]
   "ISA_HAS_DSP"
   "rddsp\t%0,%1"
-  [(set_attr "type"    "arith")
+  [(set_attr "type"    "dspalu")
    (set_attr "mode"    "SI")])
 
 ;; Table 2-7. MIPS DSP ASE Instructions: Indexed-Load
index 108f51be6c0ffd1e6121242b1602669aeec61821..0d025809907e710caac637c49ef612a2fce52ef9 100644 (file)
@@ -79,7 +79,7 @@
          (unspec:CCDSP [(match_dup 1)] UNSPEC_ABSQ_S_QB))])]
   "ISA_HAS_DSPR2"
   "absq_s.qb\t%0,%z1"
-  [(set_attr "type"    "arith")
+  [(set_attr "type"    "dspalusat")
    (set_attr "mode"    "SI")])
 
 (define_insn "mips_addu_ph"
@@ -91,7 +91,7 @@
          (unspec:CCDSP [(match_dup 1) (match_dup 2)] UNSPEC_ADDU_PH))])]
   "ISA_HAS_DSPR2"
   "addu.ph\t%0,%z1,%z2"
-  [(set_attr "type"    "arith")
+  [(set_attr "type"    "dspalu")
    (set_attr "mode"    "SI")])
 
 (define_insn "mips_addu_s_ph"
          (unspec:CCDSP [(match_dup 1) (match_dup 2)] UNSPEC_ADDU_S_PH))])]
   "ISA_HAS_DSPR2"
   "addu_s.ph\t%0,%z1,%z2"
-  [(set_attr "type"    "arith")
+  [(set_attr "type"    "dspalusat")
    (set_attr "mode"    "SI")])
 
 (define_insn "mips_adduh_qb"
                     UNSPEC_ADDUH_QB))]
   "ISA_HAS_DSPR2"
   "adduh.qb\t%0,%z1,%z2"
-  [(set_attr "type"    "arith")
+  [(set_attr "type"    "dspalu")
    (set_attr "mode"    "SI")])
 
 (define_insn "mips_adduh_r_qb"
                     UNSPEC_ADDUH_R_QB))]
   "ISA_HAS_DSPR2"
   "adduh_r.qb\t%0,%z1,%z2"
-  [(set_attr "type"    "arith")
+  [(set_attr "type"    "dspalusat")
    (set_attr "mode"    "SI")])
 
 (define_insn "mips_append"
     operands[2] = GEN_INT (INTVAL (operands[2]) & 31);
   return "append\t%0,%z2,%3";
 }
-  [(set_attr "type"    "arith")
+  [(set_attr "type"    "dspalu")
    (set_attr "mode"    "SI")])
 
 (define_insn "mips_balign"
     operands[2] = GEN_INT (INTVAL (operands[2]) & 3);
   return "balign\t%0,%z2,%3";
 }
-  [(set_attr "type"    "arith")
+  [(set_attr "type"    "dspalu")
    (set_attr "mode"    "SI")])
 
 (define_insn "mips_cmpgdu_eq_qb"
                        UNSPEC_CMPGDU_EQ_QB))])]
   "ISA_HAS_DSPR2"
   "cmpgdu.eq.qb\t%0,%z1,%z2"
-  [(set_attr "type"    "arith")
+  [(set_attr "type"    "dspalu")
    (set_attr "mode"    "SI")])
 
 (define_insn "mips_cmpgdu_lt_qb"
                        UNSPEC_CMPGDU_LT_QB))])]
   "ISA_HAS_DSPR2"
   "cmpgdu.lt.qb\t%0,%z1,%z2"
-  [(set_attr "type"    "arith")
+  [(set_attr "type"    "dspalu")
    (set_attr "mode"    "SI")])
 
 (define_insn "mips_cmpgdu_le_qb"
                        UNSPEC_CMPGDU_LE_QB))])]
   "ISA_HAS_DSPR2"
   "cmpgdu.le.qb\t%0,%z1,%z2"
-  [(set_attr "type"    "arith")
+  [(set_attr "type"    "dspalu")
    (set_attr "mode"    "SI")])
 
 (define_insn "mips_dpa_w_ph"
                   UNSPEC_DPA_W_PH))]
   "ISA_HAS_DSPR2 && !TARGET_64BIT"
   "dpa.w.ph\t%q0,%z2,%z3"
-  [(set_attr "type"    "imadd")
+  [(set_attr "type"    "dspmac")
+   (set_attr "accum_in" "1")
    (set_attr "mode"    "SI")])
 
 (define_insn "mips_dps_w_ph"
                   UNSPEC_DPS_W_PH))]
   "ISA_HAS_DSPR2 && !TARGET_64BIT"
   "dps.w.ph\t%q0,%z2,%z3"
-  [(set_attr "type"    "imadd")
+  [(set_attr "type"    "dspmac")
+   (set_attr "accum_in" "1")
    (set_attr "mode"    "SI")])
 
 (define_insn "mulv2hi3"
                   UNSPEC_MULSA_W_PH))]
   "ISA_HAS_DSPR2 && !TARGET_64BIT"
   "mulsa.w.ph\t%q0,%z2,%z3"
-  [(set_attr "type"    "imadd")
+  [(set_attr "type"    "dspmac")
+   (set_attr "accum_in" "1")
    (set_attr "mode"    "SI")])
 
 (define_insn "mips_precr_qb_ph"
                     UNSPEC_PRECR_QB_PH))]
   "ISA_HAS_DSPR2"
   "precr.qb.ph\t%0,%z1,%z2"
-  [(set_attr "type"    "arith")
+  [(set_attr "type"    "dspalu")
    (set_attr "mode"    "SI")])
 
 (define_insn "mips_precr_sra_ph_w"
     operands[2] = GEN_INT (INTVAL (operands[2]) & 31);
   return "precr_sra.ph.w\t%0,%z2,%3";
 }
-  [(set_attr "type"    "arith")
+  [(set_attr "type"    "dspalu")
    (set_attr "mode"    "SI")])
 
 (define_insn "mips_precr_sra_r_ph_w"
     operands[2] = GEN_INT (INTVAL (operands[2]) & 31);
   return "precr_sra_r.ph.w\t%0,%z2,%3";
 }
-  [(set_attr "type"    "arith")
+  [(set_attr "type"    "dspalu")
    (set_attr "mode"    "SI")])
 
 (define_insn "mips_prepend"
     operands[3] = GEN_INT (INTVAL (operands[3]) & 31);
   return "prepend\t%0,%z2,%3";
 }
-  [(set_attr "type"    "arith")
+  [(set_attr "type"    "dspalu")
    (set_attr "mode"    "SI")])
 
 (define_insn "mips_shra_qb"
     }
   return "shrav.qb\t%0,%z1,%2";
 }
-  [(set_attr "type"    "shift")
+  [(set_attr "type"    "dspalu")
    (set_attr "mode"    "SI")])
 
 
     }
   return "shrav_r.qb\t%0,%z1,%2";
 }
-  [(set_attr "type"    "shift")
+  [(set_attr "type"    "dspalu")
    (set_attr "mode"    "SI")])
 
 (define_insn "mips_shrl_ph"
     }
   return "shrlv.ph\t%0,%z1,%2";
 }
-  [(set_attr "type"    "shift")
+  [(set_attr "type"    "dspalu")
    (set_attr "mode"    "SI")])
 
 (define_insn "mips_subu_ph"
          (unspec:CCDSP [(match_dup 1) (match_dup 2)] UNSPEC_SUBU_PH))])]
   "ISA_HAS_DSPR2"
   "subu.ph\t%0,%z1,%z2"
-  [(set_attr "type"    "arith")
+  [(set_attr "type"    "dspalu")
    (set_attr "mode"    "SI")])
 
 (define_insn "mips_subu_s_ph"
          (unspec:CCDSP [(match_dup 1) (match_dup 2)] UNSPEC_SUBU_S_PH))])]
   "ISA_HAS_DSPR2"
   "subu_s.ph\t%0,%z1,%z2"
-  [(set_attr "type"    "arith")
+  [(set_attr "type"    "dspalusat")
    (set_attr "mode"    "SI")])
 
 (define_insn "mips_subuh_qb"
                     UNSPEC_SUBUH_QB))]
   "ISA_HAS_DSPR2"
   "subuh.qb\t%0,%z1,%z2"
-  [(set_attr "type"    "arith")
+  [(set_attr "type"    "dspalu")
    (set_attr "mode"    "SI")])
 
 (define_insn "mips_subuh_r_qb"
                     UNSPEC_SUBUH_R_QB))]
   "ISA_HAS_DSPR2"
   "subuh_r.qb\t%0,%z1,%z2"
-  [(set_attr "type"    "arith")
+  [(set_attr "type"    "dspalu")
    (set_attr "mode"    "SI")])
 
 (define_insn "mips_addqh_ph"
                     UNSPEC_ADDQH_PH))]
   "ISA_HAS_DSPR2"
   "addqh.ph\t%0,%z1,%z2"
-  [(set_attr "type"    "arith")
+  [(set_attr "type"    "dspalu")
    (set_attr "mode"    "SI")])
 
 (define_insn "mips_addqh_r_ph"
                     UNSPEC_ADDQH_R_PH))]
   "ISA_HAS_DSPR2"
   "addqh_r.ph\t%0,%z1,%z2"
-  [(set_attr "type"    "arith")
+  [(set_attr "type"    "dspalu")
    (set_attr "mode"    "SI")])
 
 (define_insn "mips_addqh_w"
                   UNSPEC_ADDQH_W))]
   "ISA_HAS_DSPR2"
   "addqh.w\t%0,%z1,%z2"
-  [(set_attr "type"    "arith")
+  [(set_attr "type"    "dspalu")
    (set_attr "mode"    "SI")])
 
 (define_insn "mips_addqh_r_w"
                   UNSPEC_ADDQH_R_W))]
   "ISA_HAS_DSPR2"
   "addqh_r.w\t%0,%z1,%z2"
-  [(set_attr "type"    "arith")
+  [(set_attr "type"    "dspalu")
    (set_attr "mode"    "SI")])
 
 (define_insn "mips_subqh_ph"
                     UNSPEC_SUBQH_PH))]
   "ISA_HAS_DSPR2"
   "subqh.ph\t%0,%z1,%z2"
-  [(set_attr "type"    "arith")
+  [(set_attr "type"    "dspalu")
    (set_attr "mode"    "SI")])
 
 (define_insn "mips_subqh_r_ph"
                     UNSPEC_SUBQH_R_PH))]
   "ISA_HAS_DSPR2"
   "subqh_r.ph\t%0,%z1,%z2"
-  [(set_attr "type"    "arith")
+  [(set_attr "type"    "dspalu")
    (set_attr "mode"    "SI")])
 
 (define_insn "mips_subqh_w"
                   UNSPEC_SUBQH_W))]
   "ISA_HAS_DSPR2"
   "subqh.w\t%0,%z1,%z2"
-  [(set_attr "type"    "arith")
+  [(set_attr "type"    "dspalu")
    (set_attr "mode"    "SI")])
 
 (define_insn "mips_subqh_r_w"
                   UNSPEC_SUBQH_R_W))]
   "ISA_HAS_DSPR2"
   "subqh_r.w\t%0,%z1,%z2"
-  [(set_attr "type"    "arith")
+  [(set_attr "type"    "dspalu")
    (set_attr "mode"    "SI")])
 
 (define_insn "mips_dpax_w_ph"
                   UNSPEC_DPAX_W_PH))]
   "ISA_HAS_DSPR2 && !TARGET_64BIT"
   "dpax.w.ph\t%q0,%z2,%z3"
-  [(set_attr "type"    "imadd")
+  [(set_attr "type"    "dspmac")
+   (set_attr "accum_in" "1")
    (set_attr "mode"    "SI")])
 
 (define_insn "mips_dpsx_w_ph"
                   UNSPEC_DPSX_W_PH))]
   "ISA_HAS_DSPR2 && !TARGET_64BIT"
   "dpsx.w.ph\t%q0,%z2,%z3"
-  [(set_attr "type"    "imadd")
+  [(set_attr "type"    "dspmac")
+   (set_attr "accum_in" "1")
    (set_attr "mode"    "SI")])
 
 (define_insn "mips_dpaqx_s_w_ph"
                        UNSPEC_DPAQX_S_W_PH))])]
   "ISA_HAS_DSPR2 && !TARGET_64BIT"
   "dpaqx_s.w.ph\t%q0,%z2,%z3"
-  [(set_attr "type"    "imadd")
+  [(set_attr "type"    "dspmac")
+   (set_attr "accum_in" "1")
    (set_attr "mode"    "SI")])
 
 (define_insn "mips_dpaqx_sa_w_ph"
                        UNSPEC_DPAQX_SA_W_PH))])]
   "ISA_HAS_DSPR2 && !TARGET_64BIT"
   "dpaqx_sa.w.ph\t%q0,%z2,%z3"
-  [(set_attr "type"    "imadd")
+  [(set_attr "type"    "dspmacsat")
+   (set_attr "accum_in" "1")
    (set_attr "mode"    "SI")])
 
 (define_insn "mips_dpsqx_s_w_ph"
                        UNSPEC_DPSQX_S_W_PH))])]
   "ISA_HAS_DSPR2 && !TARGET_64BIT"
   "dpsqx_s.w.ph\t%q0,%z2,%z3"
-  [(set_attr "type"    "imadd")
+  [(set_attr "type"    "dspmac")
+   (set_attr "accum_in" "1")
    (set_attr "mode"    "SI")])
 
 (define_insn "mips_dpsqx_sa_w_ph"
                        UNSPEC_DPSQX_SA_W_PH))])]
   "ISA_HAS_DSPR2 && !TARGET_64BIT"
   "dpsqx_sa.w.ph\t%q0,%z2,%z3"
-  [(set_attr "type"    "imadd")
+  [(set_attr "type"    "dspmacsat")
+   (set_attr "accum_in" "1")
    (set_attr "mode"    "SI")])
index bae67a83041decfef7fe116f16e12177eacef044..2584bc76c8edd34583e066ca1f021af68e0a4bf3 100644 (file)
@@ -298,6 +298,7 @@ extern const char *mips_output_division (const char *, rtx *);
 extern unsigned int mips_hard_regno_nregs (int, enum machine_mode);
 extern bool mips_linked_madd_p (rtx, rtx);
 extern bool mips_store_data_bypass_p (rtx, rtx);
+extern int mips_dspalu_bypass_p (rtx, rtx);
 extern rtx mips_prefetch_cookie (rtx, rtx);
 
 extern const char *current_section_name (void);
index a8b702de14d21991e53c6255443518c92c31aa88..051f3b304d42b81d9edc905bedfa7d483852d1d5 100644 (file)
@@ -8307,6 +8307,36 @@ mips_dwarf_register_span (rtx reg)
   return NULL_RTX;
 }
 
+/* DSP ALU can bypass data with no delays for the following pairs. */
+enum insn_code dspalu_bypass_table[][2] =
+{
+  {CODE_FOR_mips_addsc, CODE_FOR_mips_addwc},
+  {CODE_FOR_mips_cmpu_eq_qb, CODE_FOR_mips_pick_qb},
+  {CODE_FOR_mips_cmpu_lt_qb, CODE_FOR_mips_pick_qb},
+  {CODE_FOR_mips_cmpu_le_qb, CODE_FOR_mips_pick_qb},
+  {CODE_FOR_mips_cmp_eq_ph, CODE_FOR_mips_pick_ph},
+  {CODE_FOR_mips_cmp_lt_ph, CODE_FOR_mips_pick_ph},
+  {CODE_FOR_mips_cmp_le_ph, CODE_FOR_mips_pick_ph},
+  {CODE_FOR_mips_wrdsp, CODE_FOR_mips_insv}
+};
+
+int
+mips_dspalu_bypass_p (rtx out_insn, rtx in_insn)
+{
+  int i;
+  int num_bypass = ARRAY_SIZE (dspalu_bypass_table);
+  enum insn_code out_icode = (enum insn_code) INSN_CODE (out_insn);
+  enum insn_code in_icode = (enum insn_code) INSN_CODE (in_insn);
+
+  for (i = 0; i < num_bypass; i++)
+    {
+      if (out_icode == dspalu_bypass_table[i][0]
+         && in_icode == dspalu_bypass_table[i][1])
+       return true;
+    }
+
+  return false;
+}
 /* Implement ASM_OUTPUT_ASCII.  */
 
 void
index 9022b0a964eb74d38405bd066a1330f98576c1f2..ca89cc1e3bf03bf528b32b9cfa418bf262a3ab6e 100644 (file)
 ;; frsqrt       floating point reciprocal square root
 ;; frsqrt1      floating point reciprocal square root step1
 ;; frsqrt2      floating point reciprocal square root step2
+;; dspmac       DSP MAC instructions not saturating the accumulator
+;; dspmacsat    DSP MAC instructions that saturate the accumulator
+;; accext       DSP accumulator extract instructions
+;; accmod       DSP accumulator modify instructions
+;; dspalu       DSP ALU instructions not saturating the result
+;; dspalusat    DSP ALU instructions that saturate the result
 ;; multi       multiword sequence (or user asm statements)
 ;; atomic      atomic memory update instruction
 ;; syncloop    memory atomic operation implemented as a sync loop
    prefetch,prefetchx,condmove,mtc,mfc,mthi,mtlo,mfhi,mflo,const,arith,logical,
    shift,slt,signext,clz,pop,trap,imul,imul3,imul3nc,imadd,idiv,idiv3,move,
    fmove,fadd,fmul,fmadd,fdiv,frdiv,frdiv1,frdiv2,fabs,fneg,fcmp,fcvt,fsqrt,
-   frsqrt,frsqrt1,frsqrt2,multi,atomic,syncloop,nop,ghost"
+   frsqrt,frsqrt1,frsqrt2,dspmac,dspmacsat,accext,accmod,dspalu,dspalusat,
+   multi,atomic,syncloop,nop,ghost"
   (cond [(eq_attr "jal" "!unset") (const_string "call")
         (eq_attr "got" "load") (const_string "load")