1;; DFA-based pipeline description for P5600.
2;;
3;; Copyright (C) 2007-2015 Free Software Foundation, 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(define_automaton "p5600_agen_alq_pipe, p5600_fpu_pipe")
22
23;; The address generation queue (AGQ) has AL2, CTISTD and LDSTA pipes
24(define_cpu_unit "p5600_agq, p5600_al2, p5600_ctistd, p5600_ldsta,
25		  p5600_gpdiv" "p5600_agen_alq_pipe")
26
27;; The arithmetic-logic-unit queue (ALQ) has ALU pipe
28(define_cpu_unit "p5600_alq, p5600_alu" "p5600_agen_alq_pipe")
29
30;; The floating-point-unit queue (FPQ) has short and long pipes
31(define_cpu_unit "p5600_fpu_short, p5600_fpu_long" "p5600_fpu_pipe")
32
33;; Short FPU pipeline
34(define_cpu_unit "p5600_fpu_store" "p5600_fpu_pipe")
35
36;; Long FPU pipeline
37(define_cpu_unit "p5600_fpu_apu" "p5600_fpu_pipe")
38
39(define_reservation "p5600_agq_al2" "p5600_agq, p5600_al2")
40(define_reservation "p5600_agq_ctistd" "p5600_agq, p5600_ctistd")
41(define_reservation "p5600_agq_ldsta" "p5600_agq, p5600_ldsta")
42(define_reservation "p5600_alq_alu" "p5600_alq, p5600_alu")
43
44;;
45;; FPU pipe
46;;
47
48;; fadd, fsub
49(define_insn_reservation "p5600_fpu_fadd" 4
50  (and (eq_attr "cpu" "p5600")
51       (eq_attr "type" "fadd,fabs,fneg"))
52  "p5600_fpu_long, p5600_fpu_apu")
53
54;; fabs, fneg, fcmp
55(define_insn_reservation "p5600_fpu_fabs" 2
56  (and (eq_attr "cpu" "p5600")
57       (eq_attr "type" "fabs,fneg,fcmp,fmove"))
58  "p5600_fpu_short, p5600_fpu_apu")
59
60;; fload
61(define_insn_reservation "p5600_fpu_fload" 8
62  (and (eq_attr "cpu" "p5600")
63       (eq_attr "type" "fpload,fpidxload"))
64  "p5600_fpu_long, p5600_fpu_apu")
65
66;; fstore
67(define_insn_reservation "p5600_fpu_fstore" 1
68  (and (eq_attr "cpu" "p5600")
69       (eq_attr "type" "fpstore,fpidxstore"))
70  "p5600_fpu_short, p5600_fpu_apu")
71
72;; fmadd
73(define_insn_reservation "p5600_fpu_fmadd" 9
74  (and (eq_attr "cpu" "p5600")
75       (eq_attr "type" "fmadd"))
76  "p5600_fpu_long, p5600_fpu_apu")
77
78;; fmul
79(define_insn_reservation "p5600_fpu_fmul" 5
80  (and (eq_attr "cpu" "p5600")
81       (eq_attr "type" "fmul"))
82  "p5600_fpu_long, p5600_fpu_apu")
83
84;; fdiv, fsqrt
85(define_insn_reservation "p5600_fpu_div" 17
86  (and (eq_attr "cpu" "p5600")
87       (eq_attr "type" "fdiv,frdiv,fsqrt,frsqrt"))
88  "p5600_fpu_long, p5600_fpu_apu*17")
89
90;; fcvt
91(define_insn_reservation "p5600_fpu_fcvt" 4
92  (and (eq_attr "cpu" "p5600")
93       (eq_attr "type" "fcvt"))
94  "p5600_fpu_long, p5600_fpu_apu")
95
96;; mtc
97(define_insn_reservation "p5600_fpu_fmtc" 7
98  (and (eq_attr "cpu" "p5600")
99       (eq_attr "type" "mtc"))
100  "p5600_fpu_short, p5600_fpu_store")
101
102;; mfc
103(define_insn_reservation "p5600_fpu_fmfc" 4
104  (and (eq_attr "cpu" "p5600")
105       (eq_attr "type" "mfc"))
106  "p5600_fpu_short, p5600_fpu_store")
107
108;; madd/msub feeding into the add source
109;; madd.fmt dst, x, y, z -> madd.fmt a, dst, b, c 5 cycles
110(define_bypass 5 "p5600_fpu_fmadd" "p5600_fpu_fmadd" "mips_fmadd_bypass")
111
112;;
113;; Integer pipe
114;;
115
116;; and
117(define_insn_reservation "p5600_int_and" 1
118  (and (eq_attr "cpu" "p5600")
119       (eq_attr "move_type" "logical"))
120  "p5600_alq_alu")
121
122;; lui
123(define_insn_reservation "p5600_int_lui" 1
124  (and (eq_attr "cpu" "p5600")
125       (eq_attr "move_type" "const"))
126  "p5600_alq_alu")
127
128;; Load lb, lbu, lh, lhu, lq, lw, lw_i2f, lwxs
129(define_insn_reservation "p5600_int_load" 4
130  (and (eq_attr "cpu" "p5600")
131       (eq_attr "move_type" "load"))
132  "p5600_agq_ldsta")
133
134;; store
135(define_insn_reservation "p5600_int_store" 3
136  (and (eq_attr "cpu" "p5600")
137       (eq_attr "move_type" "store"))
138  "p5600_agq_ldsta")
139
140;; andi, sll, srl, seb, seh
141(define_insn_reservation "p5600_int_arith_1" 1
142  (and (eq_attr "cpu" "p5600")
143       (eq_attr "move_type" "andi,sll0,signext"))
144  "p5600_alq_alu | p5600_agq_al2")
145
146;; addi, addiu, ori, xori, add, addu
147(define_insn_reservation "p5600_int_arith_2" 1
148  (and (eq_attr "cpu" "p5600")
149       (eq_attr "alu_type" "add,or,xor"))
150  "p5600_alq_alu | p5600_agq_al2")
151
152;; nor, sub
153(define_insn_reservation "p5600_int_arith_3" 1
154  (and (eq_attr "cpu" "p5600")
155       (eq_attr "alu_type" "nor,sub"))
156  "p5600_alq_alu")
157
158;; srl, sra, rotr, slt, sllv, srlv
159(define_insn_reservation "p5600_int_arith_4" 1
160  (and (eq_attr "cpu" "p5600")
161       (eq_attr "type" "shift,slt,move"))
162  "p5600_alq_alu | p5600_agq_al2")
163
164;; nop
165(define_insn_reservation "p5600_int_nop" 0
166  (and (eq_attr "cpu" "p5600")
167       (eq_attr "type" "nop"))
168  "p5600_agq_al2")
169
170;; clo, clz
171(define_insn_reservation "p5600_int_countbits" 1
172  (and (eq_attr "cpu" "p5600")
173       (eq_attr "type" "clz"))
174  "p5600_agq_al2")
175
176;; Conditional moves
177(define_insn_reservation "p5600_int_condmove" 1
178  (and (eq_attr "cpu" "p5600")
179       (eq_attr "type" "condmove"))
180  "p5600_agq_al2")
181
182;; madd, msub
183(define_insn_reservation "p5600_dsp_mac" 5
184  (and (eq_attr "cpu" "p5600")
185       (eq_attr "type" "imadd"))
186  "p5600_agq_al2")
187
188;; mfhi/lo
189(define_insn_reservation "p5600_dsp_mfhilo" 1
190  (and (eq_attr "cpu" "p5600")
191       (eq_attr "type" "mfhi,mflo"))
192  "p5600_agq_al2")
193
194;; mthi/lo
195(define_insn_reservation "p5600_dsp_mthilo" 5
196  (and (eq_attr "cpu" "p5600")
197       (eq_attr "type" "mthi,mtlo"))
198  "p5600_agq_al2")
199
200;; mult, multu, mul
201(define_insn_reservation "p5600_dsp_mult" 5
202  (and (eq_attr "cpu" "p5600")
203       (eq_attr "type" "imul3,imul"))
204  "p5600_agq_al2")
205
206;; branch and jump
207(define_insn_reservation "p5600_int_branch" 1
208  (and (eq_attr "cpu" "p5600")
209       (eq_attr "type" "branch,jump"))
210  "p5600_agq_ctistd")
211
212;; prefetch
213(define_insn_reservation "p5600_int_prefetch" 3
214  (and (eq_attr "cpu" "p5600")
215       (eq_attr "type" "prefetch,prefetchx"))
216  "p5600_agq_ldsta")
217
218;; divide
219(define_insn_reservation "p5600_int_div" 8
220  (and (eq_attr "cpu" "p5600")
221       (eq_attr "type" "idiv"))
222  "p5600_agq_al2+p5600_gpdiv*8")
223
224;; arith
225(define_insn_reservation "p5600_int_arith_5" 2
226  (and (eq_attr "cpu" "p5600")
227       (eq_attr "type" "arith"))
228  "p5600_agq_al2")
229
230;; call
231(define_insn_reservation "p5600_int_call" 2
232  (and (eq_attr "cpu" "p5600")
233       (eq_attr "jal" "indirect,direct"))
234  "p5600_agq_ctistd")
235