2018-11-09 Richard Biener <rguenther@suse.de>
[official-gcc.git] / gcc / config / arc / arcHS4x.md
blobf804b6be694531e05ebb311b111bf90bcbfe908e
1 ;; DFA scheduling description of the Synopsys DesignWare ARC HS4x cpu
2 ;; for GNU C compiler
3 ;; Copyright (C) 2017 Free Software Foundation, Inc.
5 ;; This file is part of GCC.
7 ;; GCC is free software; you can redistribute it and/or modify
8 ;; it under the terms of the GNU General Public License as published by
9 ;; the Free Software Foundation; either version 3, or (at your option)
10 ;; any later version.
12 ;; GCC is distributed in the hope that it will be useful,
13 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
14 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 ;; GNU General Public License for more details.
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/>.
21 (define_automaton "ARCHS4x")
23 (define_cpu_unit "hs4x_issue0" "ARCHS4x")
24 (define_cpu_unit "hs4x_issue1" "ARCHS4x")
25 (define_cpu_unit "hs4x_ld_st" "ARCHS4x")
26 (define_cpu_unit "hs4x_divrem" "ARCHS4x")
27 (define_cpu_unit "hs4x_mult" "ARCHS4x")
28 (define_cpu_unit "hs4x_x1, hs4x_x2" "ARCHS4x")
29 (define_cpu_unit "hs4x_y1, hs4x_y2" "ARCHS4x")
31 (define_insn_reservation "hs4x_brj_op" 1
32   (and (match_test "TARGET_HS")
33        (eq_attr "tune" "archs4x, archs4xd")
34        (eq_attr "type" "call, call_no_delay_slot, uncond_branch, jump, \
35 branch, brcc,brcc_no_delay_slot, sfunc"))
36   "hs4x_issue0")
38 (define_insn_reservation "hs4x_data_load_op" 4
39   (and (match_test "TARGET_HS")
40        (eq_attr "tune" "archs4x, archs4xd")
41        (eq_attr "type" "load"))
42   "hs4x_issue1 + hs4x_ld_st,hs4x_ld_st")
44 (define_insn_reservation "hs4x_data_store_op" 1
45   (and (match_test "TARGET_HS")
46        (eq_attr "tune" "archs4x, archs4xd")
47        (eq_attr "type" "store"))
48   "hs4x_issue1 + hs4x_ld_st")
50 ;; Advanced ALU
51 (define_insn_reservation "hs4x_adv_alue_op" 4
52   (and (match_test "TARGET_HS")
53        (eq_attr "tune" "archs4x, archs4xd")
54        (eq_attr "type" "cc_arith, two_cycle_core, shift, lr, sr"))
55   "(hs4x_issue0 | hs4x_issue1), hs4x_x1")
57 (define_insn_reservation "hs4x_adv_alul_op" 6
58   (and (match_test "TARGET_HS")
59        (eq_attr "tune" "archs4xd")
60        (eq_attr "type" "cc_arith, two_cycle_core, shift, lr, sr"))
61   "(hs4x_issue0 | hs4x_issue1), nothing*2, hs4x_x2")
63 ;; Basic ALU
64 (define_insn_reservation "hs4x_basic_alue_op" 1
65   (and (match_test "TARGET_HS")
66        (eq_attr "tune" "archs4x, archs4xd")
67        (eq_attr "type" "move, cmove, unary, binary, compare, misc"))
68   "(hs4x_issue0 | hs4x_issue1) + hs4x_y1")
70 (define_insn_reservation "hs4x_basic_alul_op" 4
71   (and (match_test "TARGET_HS")
72        (eq_attr "tune" "archs4x, archs4xd")
73        (eq_attr "type" "move, cmove, unary, binary, compare, misc"))
74   "(hs4x_issue0 | hs4x_issue1), nothing*2, hs4x_y2")
76 (define_insn_reservation "hs4x_divrem_op" 13
77   (and (match_test "TARGET_HS")
78        (eq_attr "tune" "archs4x, archs4xd")
79        (eq_attr "type" "div_rem"))
80   "hs4x_issue0 + hs4x_divrem, (hs4x_divrem)*12")
82 ;;Consider the DSPMPY fast here
83 (define_insn_reservation "hs4x_mul_fast_op" 7
84   (and (match_test "TARGET_HS")
85        (eq_attr "tune_dspmpy" "fast")
86        (eq_attr "type" "mul16_em, multi, umulti"))
87   "hs4x_issue0 + hs4x_mult")
89 (define_insn_reservation "hs4x_mul_slow_op" 8
90   (and (match_test "TARGET_HS")
91        (eq_attr "tune_dspmpy" "slow")
92        (eq_attr "type" "mul16_em, multi, umulti"))
93   "hs4x_issue0 + hs4x_mult")
95 ;; FPU unit
96 (define_insn_reservation "hs4x_fpu_op" 8
97   (and (match_test "TARGET_HS")
98        (eq_attr "tune" "archs4x, archs4xd")
99        (eq_attr "type" "fpu"))
100   "hs4x_issue0")
102 ;; FPU FUSE unit
103 (define_insn_reservation "hs4x_fpu_fuse_op" 12
104   (and (match_test "TARGET_HS")
105        (eq_attr "tune" "archs4x, archs4xd")
106        (eq_attr "type" "fpu_fuse"))
107   "hs4x_issue0")
109 ;; FPU SP SQRT/DIV unit
110 (define_insn_reservation "hs4x_fpu_sdiv_op" 20
111   (and (match_test "TARGET_HS")
112        (eq_attr "tune" "archs4x, archs4xd")
113        (eq_attr "type" "fpu_sdiv"))
114   "hs4x_issue0")
116 ;; FPU DP SQRT/DIV unit
117 (define_insn_reservation "hs4x_fpu_ddiv_op" 34
118   (and (match_test "TARGET_HS")
119        (eq_attr "tune" "archs4x, archs4xd")
120        (eq_attr "type" "fpu_ddiv"))
121   "hs4x_issue0")
123 ;; FPU CVT unit
124 (define_insn_reservation "hs4x_fpu_cvt_op" 5
125   (and (match_test "TARGET_HS")
126        (eq_attr "tune" "archs4x, archs4xd")
127        (eq_attr "type" "fpu_cvt"))
128   "hs4x_issue0")
130 ;; BYPASS Advanced ALU ->
131 (define_bypass 1 "hs4x_adv_alue_op" "hs4x_divrem_op")
132 (define_bypass 1 "hs4x_adv_alue_op" "hs4x_mul_*op")
133 (define_bypass 2 "hs4x_adv_alue_op" "hs4x_adv_alue_op")
134 (define_bypass 1 "hs4x_adv_alue_op" "hs4x_basic_alue_op")
135 (define_bypass 1 "hs4x_adv_alue_op" "hs4x_basic_alul_op")
136 (define_bypass 1 "hs4x_adv_alue_op" "hs4x_data_load_op")
137 (define_bypass 0 "hs4x_adv_alue_op" "hs4x_data_store_op" "store_data_bypass_p")
138 (define_bypass 2 "hs4x_adv_alue_op" "hs4x_data_store_op")
139 (define_bypass 1 "hs4x_adv_alue_op" "hs4x_fpu_*op")
141 (define_bypass 2 "hs4x_adv_alul_op" "hs4x_basic_alul_op")
142 (define_bypass 2 "hs4x_adv_alul_op" "hs4x_adv_alul_op")
143 (define_bypass 2 "hs4x_adv_alul_op" "hs4x_mul_*op")
144 (define_bypass 0 "hs4x_adv_alul_op" "hs4x_data_store_op" "store_data_bypass_p")
145 (define_bypass 4 "hs4x_adv_alul_op" "hs4x_divrem_op")
146 (define_bypass 5 "hs4x_adv_alul_op" "hs4x_fpu_*op")
148 ;; BYPASS Basic ALU ->
149 (define_bypass 0 "hs4x_basic_alue_op" "hs4x_data_store_op" "store_data_bypass_p")
151 (define_bypass 1 "hs4x_basic_alul_op" "hs4x_basic_alul_op")
152 (define_bypass 1 "hs4x_basic_alul_op" "hs4x_adv_alul_op")
153 (define_bypass 0 "hs4x_basic_alul_op" "hs4x_data_store_op" "store_data_bypass_p")
154 (define_bypass 1 "hs4x_basic_alul_op" "hs4x_mul_*op")
155 (define_bypass 3 "hs4x_basic_alul_op" "hs4x_divrem_op")
156 (define_bypass 3 "hs4x_basic_alul_op" "hs4x_fpu_*op")
158 ;; BYPASS LD ->
159 (define_bypass 1 "hs4x_data_load_op" "hs4x_basic_alul_op")
160 (define_bypass 1 "hs4x_data_load_op" "hs4x_adv_alul_op")
161 (define_bypass 3 "hs4x_data_load_op" "hs4x_divrem_op")
162 (define_bypass 3 "hs4x_data_load_op" "hs4x_data_load_op")
163 (define_bypass 3 "hs4x_data_load_op" "hs4x_mul_*op")
164 (define_bypass 0 "hs4x_data_load_op" "hs4x_data_store_op" "store_data_bypass_p")
165 (define_bypass 3 "hs4x_data_load_op" "hs4x_fpu_*op")
167 ;; BYPASS FAST MPY ->
168 (define_bypass 4 "hs4x_mul_fast_op" "hs4x_basic_alul_op")
169 (define_bypass 4 "hs4x_mul_fast_op" "hs4x_adv_alul_op")
170 (define_bypass 4 "hs4x_mul_fast_op" "hs4x_mul_fast_op")
171 (define_bypass 6 "hs4x_mul_fast_op" "hs4x_divrem_op")
172 (define_bypass 0 "hs4x_mul_fast_op" "hs4x_data_store_op" "store_data_bypass_p")
173 (define_bypass 6 "hs4x_mul_fast_op" "hs4x_fpu_*op")
175 ;; BYPASS SLOW MPY ->
176 (define_bypass 5 "hs4x_mul_slow_op" "hs4x_basic_alul_op")
177 (define_bypass 5 "hs4x_mul_slow_op" "hs4x_adv_alul_op")
178 (define_bypass 5 "hs4x_mul_slow_op" "hs4x_mul_slow_op")
179 (define_bypass 7 "hs4x_mul_slow_op" "hs4x_divrem_op")
180 (define_bypass 0 "hs4x_mul_slow_op" "hs4x_data_store_op" "store_data_bypass_p")
181 (define_bypass 7 "hs4x_mul_slow_op" "hs4x_fpu_*op")
183 ;;BYPASS FPU ->
184 (define_bypass 5 "hs4x_fpu_op" "hs4x_basic_alul_op")
185 (define_bypass 5 "hs4x_fpu_op" "hs4x_adv_alul_op")
186 (define_bypass 5 "hs4x_fpu_op" "hs4x_mul_*op")
187 (define_bypass 7 "hs4x_fpu_op" "hs4x_divrem_op")
188 (define_bypass 5 "hs4x_fpu_op" "hs4x_fpu_*op")
189 (define_bypass 0 "hs4x_fpu_op" "hs4x_data_store_op" "store_data_bypass_p")
191 ;;BYPASS FPU FUSE ->
192 (define_bypass 9  "hs4x_fpu_fuse_op" "hs4x_basic_alul_op")
193 (define_bypass 9  "hs4x_fpu_fuse_op" "hs4x_adv_alul_op")
194 (define_bypass 9  "hs4x_fpu_fuse_op" "hs4x_mul_*op")
195 (define_bypass 11 "hs4x_fpu_fuse_op" "hs4x_divrem_op")
196 (define_bypass 11 "hs4x_fpu_fuse_op" "hs4x_fpu_*op")
197 (define_bypass 0  "hs4x_fpu_fuse_op" "hs4x_data_store_op" "store_data_bypass_p")
199 ;;BYPASS FPU SP DIV ->
200 (define_bypass 16 "hs4x_fpu_sdiv_op" "hs4x_basic_alul_op")
201 (define_bypass 16 "hs4x_fpu_sdiv_op" "hs4x_adv_alul_op")
202 (define_bypass 16 "hs4x_fpu_sdiv_op" "hs4x_mul_*op")
203 (define_bypass 19 "hs4x_fpu_sdiv_op" "hs4x_divrem_op")
204 (define_bypass 19 "hs4x_fpu_sdiv_op" "hs4x_fpu_*op")
205 (define_bypass 0  "hs4x_fpu_sdiv_op" "hs4x_data_store_op" "store_data_bypass_p")
207 ;;BYPASS FPU DP DIV ->
208 (define_bypass 31 "hs4x_fpu_ddiv_op" "hs4x_basic_alul_op")
209 (define_bypass 31 "hs4x_fpu_ddiv_op" "hs4x_adv_alul_op")
210 (define_bypass 31 "hs4x_fpu_ddiv_op" "hs4x_mul_*op")
211 (define_bypass 34 "hs4x_fpu_ddiv_op" "hs4x_divrem_op")
212 (define_bypass 34 "hs4x_fpu_ddiv_op" "hs4x_fpu_*op")
213 (define_bypass 0  "hs4x_fpu_ddiv_op" "hs4x_data_store_op" "store_data_bypass_p")
215 ;;BYPASS FPU CVT ->
216 (define_bypass 1 "hs4x_fpu_cvt_op" "hs4x_basic_alul_op")
217 (define_bypass 1 "hs4x_fpu_cvt_op" "hs4x_adv_alul_op")
218 (define_bypass 1 "hs4x_fpu_cvt_op" "hs4x_mul_*op")
219 (define_bypass 4 "hs4x_fpu_cvt_op" "hs4x_divrem_op")
220 (define_bypass 4 "hs4x_fpu_cvt_op" "hs4x_fpu_*op")
221 (define_bypass 0 "hs4x_fpu_cvt_op" "hs4x_data_store_op" "store_data_bypass_p")