]>
Commit | Line | Data |
---|---|---|
8fd03515 XQ |
1 | ;; Marvell WMMX2 pipeline description |
2 | ;; Copyright (C) 2011, 2012 Free Software Foundation, Inc. | |
3 | ;; Written by Marvell, 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 | ||
22 | (define_automaton "marvell_f_iwmmxt") | |
23 | ||
24 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | |
25 | ;; Pipelines | |
26 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | |
27 | ||
28 | ;; This is a 7-stage pipelines: | |
29 | ;; | |
30 | ;; MD | MI | ME1 | ME2 | ME3 | ME4 | MW | |
31 | ;; | |
32 | ;; There are various bypasses modelled to a greater or lesser extent. | |
33 | ;; | |
34 | ;; Latencies in this file correspond to the number of cycles after | |
35 | ;; the issue stage that it takes for the result of the instruction to | |
36 | ;; be computed, or for its side-effects to occur. | |
37 | ||
38 | (define_cpu_unit "mf_iwmmxt_MD" "marvell_f_iwmmxt") | |
39 | (define_cpu_unit "mf_iwmmxt_MI" "marvell_f_iwmmxt") | |
40 | (define_cpu_unit "mf_iwmmxt_ME1" "marvell_f_iwmmxt") | |
41 | (define_cpu_unit "mf_iwmmxt_ME2" "marvell_f_iwmmxt") | |
42 | (define_cpu_unit "mf_iwmmxt_ME3" "marvell_f_iwmmxt") | |
43 | (define_cpu_unit "mf_iwmmxt_ME4" "marvell_f_iwmmxt") | |
44 | (define_cpu_unit "mf_iwmmxt_MW" "marvell_f_iwmmxt") | |
45 | ||
46 | (define_reservation "mf_iwmmxt_ME" | |
47 | "mf_iwmmxt_ME1,mf_iwmmxt_ME2,mf_iwmmxt_ME3,mf_iwmmxt_ME4" | |
48 | ) | |
49 | ||
50 | (define_reservation "mf_iwmmxt_pipeline" | |
51 | "mf_iwmmxt_MD, mf_iwmmxt_MI, mf_iwmmxt_ME, mf_iwmmxt_MW" | |
52 | ) | |
53 | ||
54 | ;; An attribute to indicate whether our reservations are applicable. | |
55 | (define_attr "marvell_f_iwmmxt" "yes,no" | |
56 | (const (if_then_else (symbol_ref "arm_arch_iwmmxt") | |
57 | (const_string "yes") (const_string "no")))) | |
58 | ||
59 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | |
60 | ;; instruction classes | |
61 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | |
62 | ||
63 | ;; An attribute appended to instructions for classification | |
64 | ||
65 | (define_attr "wmmxt_shift" "yes,no" | |
66 | (if_then_else (eq_attr "wtype" "wror, wsll, wsra, wsrl") | |
67 | (const_string "yes") (const_string "no")) | |
68 | ) | |
69 | ||
70 | (define_attr "wmmxt_pack" "yes,no" | |
71 | (if_then_else (eq_attr "wtype" "waligni, walignr, wmerge, wpack, wshufh, wunpckeh, wunpckih, wunpckel, wunpckil") | |
72 | (const_string "yes") (const_string "no")) | |
73 | ) | |
74 | ||
75 | (define_attr "wmmxt_mult_c1" "yes,no" | |
76 | (if_then_else (eq_attr "wtype" "wmac, wmadd, wmiaxy, wmiawxy, wmulw, wqmiaxy, wqmulwm") | |
77 | (const_string "yes") (const_string "no")) | |
78 | ) | |
79 | ||
80 | (define_attr "wmmxt_mult_c2" "yes,no" | |
81 | (if_then_else (eq_attr "wtype" "wmul, wqmulm") | |
82 | (const_string "yes") (const_string "no")) | |
83 | ) | |
84 | ||
85 | (define_attr "wmmxt_alu_c1" "yes,no" | |
86 | (if_then_else (eq_attr "wtype" "wabs, wabsdiff, wand, wandn, wmov, wor, wxor") | |
87 | (const_string "yes") (const_string "no")) | |
88 | ) | |
89 | ||
90 | (define_attr "wmmxt_alu_c2" "yes,no" | |
91 | (if_then_else (eq_attr "wtype" "wacc, wadd, waddsubhx, wavg2, wavg4, wcmpeq, wcmpgt, wmax, wmin, wsub, waddbhus, wsubaddhx") | |
92 | (const_string "yes") (const_string "no")) | |
93 | ) | |
94 | ||
95 | (define_attr "wmmxt_alu_c3" "yes,no" | |
96 | (if_then_else (eq_attr "wtype" "wsad") | |
97 | (const_string "yes") (const_string "no")) | |
98 | ) | |
99 | ||
100 | (define_attr "wmmxt_transfer_c1" "yes,no" | |
101 | (if_then_else (eq_attr "wtype" "tbcst, tinsr, tmcr, tmcrr") | |
102 | (const_string "yes") (const_string "no")) | |
103 | ) | |
104 | ||
105 | (define_attr "wmmxt_transfer_c2" "yes,no" | |
106 | (if_then_else (eq_attr "wtype" "textrm, tmovmsk, tmrc, tmrrc") | |
107 | (const_string "yes") (const_string "no")) | |
108 | ) | |
109 | ||
110 | (define_attr "wmmxt_transfer_c3" "yes,no" | |
111 | (if_then_else (eq_attr "wtype" "tmia, tmiaph, tmiaxy") | |
112 | (const_string "yes") (const_string "no")) | |
113 | ) | |
114 | ||
115 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | |
116 | ;; Main description | |
117 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | |
118 | ||
119 | (define_insn_reservation "marvell_f_iwmmxt_alu_c1" 1 | |
120 | (and (eq_attr "marvell_f_iwmmxt" "yes") | |
121 | (eq_attr "wmmxt_alu_c1" "yes")) | |
122 | "mf_iwmmxt_pipeline") | |
123 | ||
124 | (define_insn_reservation "marvell_f_iwmmxt_pack" 1 | |
125 | (and (eq_attr "marvell_f_iwmmxt" "yes") | |
126 | (eq_attr "wmmxt_pack" "yes")) | |
127 | "mf_iwmmxt_pipeline") | |
128 | ||
129 | (define_insn_reservation "marvell_f_iwmmxt_shift" 1 | |
130 | (and (eq_attr "marvell_f_iwmmxt" "yes") | |
131 | (eq_attr "wmmxt_shift" "yes")) | |
132 | "mf_iwmmxt_pipeline") | |
133 | ||
134 | (define_insn_reservation "marvell_f_iwmmxt_transfer_c1" 1 | |
135 | (and (eq_attr "marvell_f_iwmmxt" "yes") | |
136 | (eq_attr "wmmxt_transfer_c1" "yes")) | |
137 | "mf_iwmmxt_pipeline") | |
138 | ||
139 | (define_insn_reservation "marvell_f_iwmmxt_transfer_c2" 5 | |
140 | (and (eq_attr "marvell_f_iwmmxt" "yes") | |
141 | (eq_attr "wmmxt_transfer_c2" "yes")) | |
142 | "mf_iwmmxt_pipeline") | |
143 | ||
144 | (define_insn_reservation "marvell_f_iwmmxt_alu_c2" 2 | |
145 | (and (eq_attr "marvell_f_iwmmxt" "yes") | |
146 | (eq_attr "wmmxt_alu_c2" "yes")) | |
147 | "mf_iwmmxt_pipeline") | |
148 | ||
149 | (define_insn_reservation "marvell_f_iwmmxt_alu_c3" 3 | |
150 | (and (eq_attr "marvell_f_iwmmxt" "yes") | |
151 | (eq_attr "wmmxt_alu_c3" "yes")) | |
152 | "mf_iwmmxt_pipeline") | |
153 | ||
154 | (define_insn_reservation "marvell_f_iwmmxt_transfer_c3" 4 | |
155 | (and (eq_attr "marvell_f_iwmmxt" "yes") | |
156 | (eq_attr "wmmxt_transfer_c3" "yes")) | |
157 | "mf_iwmmxt_pipeline") | |
158 | ||
159 | (define_insn_reservation "marvell_f_iwmmxt_mult_c1" 4 | |
160 | (and (eq_attr "marvell_f_iwmmxt" "yes") | |
161 | (eq_attr "wmmxt_mult_c1" "yes")) | |
162 | "mf_iwmmxt_pipeline") | |
163 | ||
164 | ;There is a forwarding path from ME3 stage | |
165 | (define_insn_reservation "marvell_f_iwmmxt_mult_c2" 3 | |
166 | (and (eq_attr "marvell_f_iwmmxt" "yes") | |
167 | (eq_attr "wmmxt_mult_c2" "yes")) | |
168 | "mf_iwmmxt_pipeline") | |
169 | ||
170 | (define_insn_reservation "marvell_f_iwmmxt_wstr" 0 | |
171 | (and (eq_attr "marvell_f_iwmmxt" "yes") | |
172 | (eq_attr "wtype" "wstr")) | |
173 | "mf_iwmmxt_pipeline") | |
174 | ||
175 | ;There is a forwarding path from MW stage | |
176 | (define_insn_reservation "marvell_f_iwmmxt_wldr" 5 | |
177 | (and (eq_attr "marvell_f_iwmmxt" "yes") | |
178 | (eq_attr "wtype" "wldr")) | |
179 | "mf_iwmmxt_pipeline") |