profile-fr400.c revision 1.9.2.1 1 1.1 christos /* frv simulator fr400 dependent profiling code.
2 1.1 christos
3 1.9.2.1 perseant Copyright (C) 2001-2023 Free Software Foundation, Inc.
4 1.1 christos Contributed by Red Hat
5 1.1 christos
6 1.1 christos This file is part of the GNU simulators.
7 1.1 christos
8 1.1 christos This program is free software; you can redistribute it and/or modify
9 1.1 christos it under the terms of the GNU General Public License as published by
10 1.1 christos the Free Software Foundation; either version 3 of the License, or
11 1.1 christos (at your option) any later version.
12 1.1 christos
13 1.1 christos This program is distributed in the hope that it will be useful,
14 1.1 christos but WITHOUT ANY WARRANTY; without even the implied warranty of
15 1.1 christos MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 1.1 christos GNU General Public License for more details.
17 1.1 christos
18 1.1 christos You should have received a copy of the GNU General Public License
19 1.9.2.1 perseant along with this program. If not, see <http://www.gnu.org/licenses/>. */
20 1.9.2.1 perseant
21 1.9.2.1 perseant /* This must come before any other includes. */
22 1.9.2.1 perseant #include "defs.h"
23 1.1 christos
24 1.1 christos #define WANT_CPU
25 1.1 christos #define WANT_CPU_FRVBF
26 1.1 christos
27 1.1 christos #include "sim-main.h"
28 1.1 christos #include "bfd.h"
29 1.1 christos
30 1.1 christos #if WITH_PROFILE_MODEL_P
31 1.1 christos
32 1.1 christos #include "profile.h"
33 1.1 christos #include "profile-fr400.h"
34 1.1 christos
35 1.1 christos /* These functions get and set flags representing the use of
36 1.1 christos registers/resources. */
37 1.1 christos static void set_use_not_fp_load (SIM_CPU *, INT);
38 1.1 christos static void set_use_not_media_p4 (SIM_CPU *, INT);
39 1.1 christos static void set_use_not_media_p6 (SIM_CPU *, INT);
40 1.1 christos
41 1.1 christos static void set_acc_use_not_media_p2 (SIM_CPU *, INT);
42 1.1 christos static void set_acc_use_not_media_p4 (SIM_CPU *, INT);
43 1.1 christos
44 1.1 christos void
45 1.1 christos fr400_reset_gr_flags (SIM_CPU *cpu, INT fr)
46 1.1 christos {
47 1.1 christos set_use_not_gr_complex (cpu, fr);
48 1.1 christos }
49 1.1 christos
50 1.1 christos void
51 1.1 christos fr400_reset_fr_flags (SIM_CPU *cpu, INT fr)
52 1.1 christos {
53 1.1 christos set_use_not_fp_load (cpu, fr);
54 1.1 christos set_use_not_media_p4 (cpu, fr);
55 1.1 christos set_use_not_media_p6 (cpu, fr);
56 1.1 christos }
57 1.1 christos
58 1.1 christos void
59 1.1 christos fr400_reset_acc_flags (SIM_CPU *cpu, INT acc)
60 1.1 christos {
61 1.1 christos set_acc_use_not_media_p2 (cpu, acc);
62 1.1 christos set_acc_use_not_media_p4 (cpu, acc);
63 1.1 christos }
64 1.1 christos
65 1.1 christos static void
66 1.1 christos set_use_is_fp_load (SIM_CPU *cpu, INT fr, INT fr_double)
67 1.1 christos {
68 1.1 christos MODEL_FR400_DATA *d = CPU_MODEL_DATA (cpu);
69 1.1 christos if (fr != -1)
70 1.1 christos {
71 1.1 christos fr400_reset_fr_flags (cpu, fr);
72 1.1 christos d->cur_fp_load |= (((DI)1) << fr);
73 1.1 christos }
74 1.1 christos if (fr_double != -1)
75 1.1 christos {
76 1.1 christos fr400_reset_fr_flags (cpu, fr_double);
77 1.1 christos d->cur_fp_load |= (((DI)1) << fr_double);
78 1.1 christos if (fr_double < 63)
79 1.1 christos {
80 1.1 christos fr400_reset_fr_flags (cpu, fr_double + 1);
81 1.1 christos d->cur_fp_load |= (((DI)1) << (fr_double + 1));
82 1.1 christos }
83 1.1 christos }
84 1.1 christos
85 1.1 christos }
86 1.1 christos
87 1.1 christos static void
88 1.1 christos set_use_not_fp_load (SIM_CPU *cpu, INT fr)
89 1.1 christos {
90 1.1 christos MODEL_FR400_DATA *d = CPU_MODEL_DATA (cpu);
91 1.1 christos if (fr != -1)
92 1.1 christos d->cur_fp_load &= ~(((DI)1) << fr);
93 1.1 christos }
94 1.1 christos
95 1.1 christos static int
96 1.1 christos use_is_fp_load (SIM_CPU *cpu, INT fr)
97 1.1 christos {
98 1.1 christos MODEL_FR400_DATA *d = CPU_MODEL_DATA (cpu);
99 1.1 christos if (fr != -1)
100 1.1 christos return (d->prev_fp_load >> fr) & 1;
101 1.1 christos return 0;
102 1.1 christos }
103 1.1 christos
104 1.1 christos static void
105 1.1 christos set_acc_use_is_media_p2 (SIM_CPU *cpu, INT acc)
106 1.1 christos {
107 1.1 christos MODEL_FR400_DATA *d = CPU_MODEL_DATA (cpu);
108 1.1 christos if (acc != -1)
109 1.1 christos {
110 1.1 christos fr400_reset_acc_flags (cpu, acc);
111 1.1 christos d->cur_acc_p2 |= (((DI)1) << acc);
112 1.1 christos }
113 1.1 christos }
114 1.1 christos
115 1.1 christos static void
116 1.1 christos set_acc_use_not_media_p2 (SIM_CPU *cpu, INT acc)
117 1.1 christos {
118 1.1 christos MODEL_FR400_DATA *d = CPU_MODEL_DATA (cpu);
119 1.1 christos if (acc != -1)
120 1.1 christos d->cur_acc_p2 &= ~(((DI)1) << acc);
121 1.1 christos }
122 1.1 christos
123 1.1 christos static int
124 1.1 christos acc_use_is_media_p2 (SIM_CPU *cpu, INT acc)
125 1.1 christos {
126 1.1 christos MODEL_FR400_DATA *d = CPU_MODEL_DATA (cpu);
127 1.1 christos if (acc != -1)
128 1.1 christos return d->cur_acc_p2 & (((DI)1) << acc);
129 1.1 christos return 0;
130 1.1 christos }
131 1.1 christos
132 1.1 christos static void
133 1.1 christos set_use_is_media_p4 (SIM_CPU *cpu, INT fr)
134 1.1 christos {
135 1.1 christos MODEL_FR400_DATA *d = CPU_MODEL_DATA (cpu);
136 1.1 christos if (fr != -1)
137 1.1 christos {
138 1.1 christos fr400_reset_fr_flags (cpu, fr);
139 1.1 christos d->cur_fr_p4 |= (((DI)1) << fr);
140 1.1 christos }
141 1.1 christos }
142 1.1 christos
143 1.1 christos static void
144 1.1 christos set_use_not_media_p4 (SIM_CPU *cpu, INT fr)
145 1.1 christos {
146 1.1 christos MODEL_FR400_DATA *d = CPU_MODEL_DATA (cpu);
147 1.1 christos if (fr != -1)
148 1.1 christos d->cur_fr_p4 &= ~(((DI)1) << fr);
149 1.1 christos }
150 1.1 christos
151 1.1 christos static int
152 1.1 christos use_is_media_p4 (SIM_CPU *cpu, INT fr)
153 1.1 christos {
154 1.1 christos MODEL_FR400_DATA *d = CPU_MODEL_DATA (cpu);
155 1.1 christos if (fr != -1)
156 1.1 christos return d->cur_fr_p4 & (((DI)1) << fr);
157 1.1 christos return 0;
158 1.1 christos }
159 1.1 christos
160 1.1 christos static void
161 1.1 christos set_acc_use_is_media_p4 (SIM_CPU *cpu, INT acc)
162 1.1 christos {
163 1.1 christos MODEL_FR400_DATA *d = CPU_MODEL_DATA (cpu);
164 1.1 christos if (acc != -1)
165 1.1 christos {
166 1.1 christos fr400_reset_acc_flags (cpu, acc);
167 1.1 christos d->cur_acc_p4 |= (((DI)1) << acc);
168 1.1 christos }
169 1.1 christos }
170 1.1 christos
171 1.1 christos static void
172 1.1 christos set_acc_use_not_media_p4 (SIM_CPU *cpu, INT acc)
173 1.1 christos {
174 1.1 christos MODEL_FR400_DATA *d = CPU_MODEL_DATA (cpu);
175 1.1 christos if (acc != -1)
176 1.1 christos d->cur_acc_p4 &= ~(((DI)1) << acc);
177 1.1 christos }
178 1.1 christos
179 1.9.2.1 perseant #if 0
180 1.1 christos static int
181 1.1 christos acc_use_is_media_p4 (SIM_CPU *cpu, INT acc)
182 1.1 christos {
183 1.1 christos MODEL_FR400_DATA *d = CPU_MODEL_DATA (cpu);
184 1.1 christos if (acc != -1)
185 1.1 christos return d->cur_acc_p4 & (((DI)1) << acc);
186 1.1 christos return 0;
187 1.1 christos }
188 1.9.2.1 perseant #endif
189 1.1 christos
190 1.1 christos static void
191 1.1 christos set_use_is_media_p6 (SIM_CPU *cpu, INT fr)
192 1.1 christos {
193 1.1 christos MODEL_FR400_DATA *d = CPU_MODEL_DATA (cpu);
194 1.1 christos if (fr != -1)
195 1.1 christos {
196 1.1 christos fr400_reset_fr_flags (cpu, fr);
197 1.1 christos d->cur_fr_p6 |= (((DI)1) << fr);
198 1.1 christos }
199 1.1 christos }
200 1.1 christos
201 1.1 christos static void
202 1.1 christos set_use_not_media_p6 (SIM_CPU *cpu, INT fr)
203 1.1 christos {
204 1.1 christos MODEL_FR400_DATA *d = CPU_MODEL_DATA (cpu);
205 1.1 christos if (fr != -1)
206 1.1 christos d->cur_fr_p6 &= ~(((DI)1) << fr);
207 1.1 christos }
208 1.1 christos
209 1.1 christos static int
210 1.1 christos use_is_media_p6 (SIM_CPU *cpu, INT fr)
211 1.1 christos {
212 1.1 christos MODEL_FR400_DATA *d = CPU_MODEL_DATA (cpu);
213 1.1 christos if (fr != -1)
214 1.1 christos return d->cur_fr_p6 & (((DI)1) << fr);
215 1.1 christos return 0;
216 1.1 christos }
217 1.1 christos
218 1.1 christos /* Initialize cycle counting for an insn.
219 1.1 christos FIRST_P is non-zero if this is the first insn in a set of parallel
220 1.1 christos insns. */
221 1.1 christos void
222 1.1 christos fr400_model_insn_before (SIM_CPU *cpu, int first_p)
223 1.1 christos {
224 1.1 christos if (first_p)
225 1.1 christos {
226 1.1 christos MODEL_FR400_DATA *d = CPU_MODEL_DATA (cpu);
227 1.1 christos FRV_PROFILE_STATE *ps = CPU_PROFILE_STATE (cpu);
228 1.1 christos ps->cur_gr_complex = ps->prev_gr_complex;
229 1.1 christos d->cur_fp_load = d->prev_fp_load;
230 1.1 christos d->cur_fr_p4 = d->prev_fr_p4;
231 1.1 christos d->cur_fr_p6 = d->prev_fr_p6;
232 1.1 christos d->cur_acc_p2 = d->prev_acc_p2;
233 1.1 christos d->cur_acc_p4 = d->prev_acc_p4;
234 1.1 christos }
235 1.1 christos }
236 1.1 christos
237 1.1 christos /* Record the cycles computed for an insn.
238 1.1 christos LAST_P is non-zero if this is the last insn in a set of parallel insns,
239 1.1 christos and we update the total cycle count.
240 1.1 christos CYCLES is the cycle count of the insn. */
241 1.1 christos void
242 1.1 christos fr400_model_insn_after (SIM_CPU *cpu, int last_p, int cycles)
243 1.1 christos {
244 1.1 christos if (last_p)
245 1.1 christos {
246 1.1 christos MODEL_FR400_DATA *d = CPU_MODEL_DATA (cpu);
247 1.1 christos FRV_PROFILE_STATE *ps = CPU_PROFILE_STATE (cpu);
248 1.1 christos ps->prev_gr_complex = ps->cur_gr_complex;
249 1.1 christos d->prev_fp_load = d->cur_fp_load;
250 1.1 christos d->prev_fr_p4 = d->cur_fr_p4;
251 1.1 christos d->prev_fr_p6 = d->cur_fr_p6;
252 1.1 christos d->prev_acc_p2 = d->cur_acc_p2;
253 1.1 christos d->prev_acc_p4 = d->cur_acc_p4;
254 1.1 christos }
255 1.1 christos }
256 1.1 christos
257 1.1 christos int
258 1.1 christos frvbf_model_fr400_u_exec (SIM_CPU *cpu, const IDESC *idesc,
259 1.1 christos int unit_num, int referenced)
260 1.1 christos {
261 1.1 christos return idesc->timing->units[unit_num].done;
262 1.1 christos }
263 1.1 christos
264 1.1 christos int
265 1.1 christos frvbf_model_fr400_u_integer (SIM_CPU *cpu, const IDESC *idesc,
266 1.1 christos int unit_num, int referenced,
267 1.1 christos INT in_GRi, INT in_GRj, INT out_GRk,
268 1.1 christos INT out_ICCi_1)
269 1.1 christos {
270 1.1 christos /* Modelling for this unit is the same as for fr500. */
271 1.1 christos return frvbf_model_fr500_u_integer (cpu, idesc, unit_num, referenced,
272 1.1 christos in_GRi, in_GRj, out_GRk, out_ICCi_1);
273 1.1 christos }
274 1.1 christos
275 1.1 christos int
276 1.1 christos frvbf_model_fr400_u_imul (SIM_CPU *cpu, const IDESC *idesc,
277 1.1 christos int unit_num, int referenced,
278 1.1 christos INT in_GRi, INT in_GRj, INT out_GRk, INT out_ICCi_1)
279 1.1 christos {
280 1.1 christos /* Modelling for this unit is the same as for fr500. */
281 1.1 christos return frvbf_model_fr500_u_imul (cpu, idesc, unit_num, referenced,
282 1.1 christos in_GRi, in_GRj, out_GRk, out_ICCi_1);
283 1.1 christos }
284 1.1 christos
285 1.1 christos int
286 1.1 christos frvbf_model_fr400_u_idiv (SIM_CPU *cpu, const IDESC *idesc,
287 1.1 christos int unit_num, int referenced,
288 1.1 christos INT in_GRi, INT in_GRj, INT out_GRk, INT out_ICCi_1)
289 1.1 christos {
290 1.1 christos int cycles;
291 1.1 christos FRV_VLIW *vliw;
292 1.1 christos int slot;
293 1.1 christos
294 1.1 christos /* icc0-icc4 are the upper 4 fields of the CCR. */
295 1.1 christos if (out_ICCi_1 >= 0)
296 1.1 christos out_ICCi_1 += 4;
297 1.1 christos
298 1.1 christos vliw = CPU_VLIW (cpu);
299 1.1 christos slot = vliw->next_slot - 1;
300 1.1 christos slot = (*vliw->current_vliw)[slot] - UNIT_I0;
301 1.1 christos
302 1.1 christos if (model_insn == FRV_INSN_MODEL_PASS_1)
303 1.1 christos {
304 1.1 christos /* The entire VLIW insn must wait if there is a dependency on a register
305 1.1 christos which is not ready yet.
306 1.1 christos The latency of the registers may be less than previously recorded,
307 1.1 christos depending on how they were used previously.
308 1.1 christos See Table 13-8 in the LSI. */
309 1.1 christos if (in_GRi != out_GRk && in_GRi >= 0)
310 1.1 christos {
311 1.1 christos if (use_is_gr_complex (cpu, in_GRi))
312 1.1 christos decrease_GR_busy (cpu, in_GRi, 1);
313 1.1 christos }
314 1.1 christos if (in_GRj != out_GRk && in_GRj != in_GRi && in_GRj >= 0)
315 1.1 christos {
316 1.1 christos if (use_is_gr_complex (cpu, in_GRj))
317 1.1 christos decrease_GR_busy (cpu, in_GRj, 1);
318 1.1 christos }
319 1.1 christos vliw_wait_for_GR (cpu, in_GRi);
320 1.1 christos vliw_wait_for_GR (cpu, in_GRj);
321 1.1 christos vliw_wait_for_GR (cpu, out_GRk);
322 1.1 christos vliw_wait_for_CCR (cpu, out_ICCi_1);
323 1.1 christos vliw_wait_for_idiv_resource (cpu, slot);
324 1.1 christos handle_resource_wait (cpu);
325 1.1 christos load_wait_for_GR (cpu, in_GRi);
326 1.1 christos load_wait_for_GR (cpu, in_GRj);
327 1.1 christos load_wait_for_GR (cpu, out_GRk);
328 1.1 christos trace_vliw_wait_cycles (cpu);
329 1.1 christos return 0;
330 1.1 christos }
331 1.1 christos
332 1.1 christos /* GRk has a latency of 19 cycles! */
333 1.1 christos cycles = idesc->timing->units[unit_num].done;
334 1.1 christos update_GR_latency (cpu, out_GRk, cycles + 19);
335 1.1 christos set_use_is_gr_complex (cpu, out_GRk);
336 1.1 christos
337 1.1 christos /* ICCi_1 has a latency of 18 cycles. */
338 1.1 christos update_CCR_latency (cpu, out_ICCi_1, cycles + 18);
339 1.1 christos
340 1.1 christos /* the idiv resource has a latency of 18 cycles! */
341 1.1 christos update_idiv_resource_latency (cpu, slot, cycles + 18);
342 1.1 christos
343 1.1 christos return cycles;
344 1.1 christos }
345 1.1 christos
346 1.1 christos int
347 1.1 christos frvbf_model_fr400_u_branch (SIM_CPU *cpu, const IDESC *idesc,
348 1.1 christos int unit_num, int referenced,
349 1.1 christos INT in_GRi, INT in_GRj,
350 1.1 christos INT in_ICCi_2, INT in_ICCi_3)
351 1.1 christos {
352 1.1 christos #define BRANCH_PREDICTED(ps) ((ps)->branch_hint & 2)
353 1.1 christos FRV_PROFILE_STATE *ps;
354 1.1 christos int cycles;
355 1.1 christos
356 1.1 christos if (model_insn == FRV_INSN_MODEL_PASS_1)
357 1.1 christos {
358 1.1 christos /* Modelling for this unit is the same as for fr500 in pass 1. */
359 1.1 christos return frvbf_model_fr500_u_branch (cpu, idesc, unit_num, referenced,
360 1.1 christos in_GRi, in_GRj, in_ICCi_2, in_ICCi_3);
361 1.1 christos }
362 1.1 christos
363 1.1 christos cycles = idesc->timing->units[unit_num].done;
364 1.1 christos
365 1.1 christos /* Compute the branch penalty, based on the the prediction and the out
366 1.1 christos come. When counting branches taken or not taken, don't consider branches
367 1.1 christos after the first taken branch in a vliw insn. */
368 1.1 christos ps = CPU_PROFILE_STATE (cpu);
369 1.1 christos if (! ps->vliw_branch_taken)
370 1.1 christos {
371 1.1 christos int penalty;
372 1.1 christos /* (1 << 4): The pc is the 5th element in inputs, outputs.
373 1.1 christos ??? can be cleaned up */
374 1.1 christos PROFILE_DATA *p = CPU_PROFILE_DATA (cpu);
375 1.1 christos int taken = (referenced & (1 << 4)) != 0;
376 1.1 christos if (taken)
377 1.1 christos {
378 1.1 christos ++PROFILE_MODEL_TAKEN_COUNT (p);
379 1.1 christos ps->vliw_branch_taken = 1;
380 1.1 christos if (BRANCH_PREDICTED (ps))
381 1.1 christos penalty = 1;
382 1.1 christos else
383 1.1 christos penalty = 3;
384 1.1 christos }
385 1.1 christos else
386 1.1 christos {
387 1.1 christos ++PROFILE_MODEL_UNTAKEN_COUNT (p);
388 1.1 christos if (BRANCH_PREDICTED (ps))
389 1.1 christos penalty = 3;
390 1.1 christos else
391 1.1 christos penalty = 0;
392 1.1 christos }
393 1.1 christos if (penalty > 0)
394 1.1 christos {
395 1.1 christos /* Additional 1 cycle penalty if the branch address is not 8 byte
396 1.1 christos aligned. */
397 1.1 christos if (ps->branch_address & 7)
398 1.1 christos ++penalty;
399 1.1 christos update_branch_penalty (cpu, penalty);
400 1.1 christos PROFILE_MODEL_CTI_STALL_CYCLES (p) += penalty;
401 1.1 christos }
402 1.1 christos }
403 1.1 christos
404 1.1 christos return cycles;
405 1.1 christos }
406 1.1 christos
407 1.1 christos int
408 1.1 christos frvbf_model_fr400_u_trap (SIM_CPU *cpu, const IDESC *idesc,
409 1.1 christos int unit_num, int referenced,
410 1.1 christos INT in_GRi, INT in_GRj,
411 1.1 christos INT in_ICCi_2, INT in_FCCi_2)
412 1.1 christos {
413 1.1 christos /* Modelling for this unit is the same as for fr500. */
414 1.1 christos return frvbf_model_fr500_u_trap (cpu, idesc, unit_num, referenced,
415 1.1 christos in_GRi, in_GRj, in_ICCi_2, in_FCCi_2);
416 1.1 christos }
417 1.1 christos
418 1.1 christos int
419 1.1 christos frvbf_model_fr400_u_check (SIM_CPU *cpu, const IDESC *idesc,
420 1.1 christos int unit_num, int referenced,
421 1.1 christos INT in_ICCi_3, INT in_FCCi_3)
422 1.1 christos {
423 1.1 christos /* Modelling for this unit is the same as for fr500. */
424 1.1 christos return frvbf_model_fr500_u_check (cpu, idesc, unit_num, referenced,
425 1.1 christos in_ICCi_3, in_FCCi_3);
426 1.1 christos }
427 1.1 christos
428 1.1 christos int
429 1.1 christos frvbf_model_fr400_u_set_hilo (SIM_CPU *cpu, const IDESC *idesc,
430 1.1 christos int unit_num, int referenced,
431 1.1 christos INT out_GRkhi, INT out_GRklo)
432 1.1 christos {
433 1.1 christos /* Modelling for this unit is the same as for fr500. */
434 1.1 christos return frvbf_model_fr500_u_set_hilo (cpu, idesc, unit_num, referenced,
435 1.1 christos out_GRkhi, out_GRklo);
436 1.1 christos }
437 1.1 christos
438 1.1 christos int
439 1.1 christos frvbf_model_fr400_u_gr_load (SIM_CPU *cpu, const IDESC *idesc,
440 1.1 christos int unit_num, int referenced,
441 1.1 christos INT in_GRi, INT in_GRj,
442 1.1 christos INT out_GRk, INT out_GRdoublek)
443 1.1 christos {
444 1.1 christos /* Modelling for this unit is the same as for fr500. */
445 1.1 christos return frvbf_model_fr500_u_gr_load (cpu, idesc, unit_num, referenced,
446 1.1 christos in_GRi, in_GRj, out_GRk, out_GRdoublek);
447 1.1 christos }
448 1.1 christos
449 1.1 christos int
450 1.1 christos frvbf_model_fr400_u_gr_store (SIM_CPU *cpu, const IDESC *idesc,
451 1.1 christos int unit_num, int referenced,
452 1.1 christos INT in_GRi, INT in_GRj,
453 1.1 christos INT in_GRk, INT in_GRdoublek)
454 1.1 christos {
455 1.1 christos /* Modelling for this unit is the same as for fr500. */
456 1.1 christos return frvbf_model_fr500_u_gr_store (cpu, idesc, unit_num, referenced,
457 1.1 christos in_GRi, in_GRj, in_GRk, in_GRdoublek);
458 1.1 christos }
459 1.1 christos
460 1.1 christos int
461 1.1 christos frvbf_model_fr400_u_fr_load (SIM_CPU *cpu, const IDESC *idesc,
462 1.1 christos int unit_num, int referenced,
463 1.1 christos INT in_GRi, INT in_GRj,
464 1.1 christos INT out_FRk, INT out_FRdoublek)
465 1.1 christos {
466 1.1 christos int cycles;
467 1.1 christos
468 1.1 christos if (model_insn == FRV_INSN_MODEL_PASS_1)
469 1.1 christos {
470 1.1 christos /* Pass 1 is the same as for fr500. */
471 1.1 christos return frvbf_model_fr500_u_fr_load (cpu, idesc, unit_num, referenced,
472 1.1 christos in_GRi, in_GRj, out_FRk,
473 1.1 christos out_FRdoublek);
474 1.1 christos }
475 1.1 christos
476 1.1 christos cycles = idesc->timing->units[unit_num].done;
477 1.1 christos
478 1.1 christos /* The latency of FRk for a load will depend on how long it takes to retrieve
479 1.1 christos the the data from the cache or memory. */
480 1.1 christos update_FR_latency_for_load (cpu, out_FRk, cycles);
481 1.1 christos update_FRdouble_latency_for_load (cpu, out_FRdoublek, cycles);
482 1.1 christos
483 1.1 christos set_use_is_fp_load (cpu, out_FRk, out_FRdoublek);
484 1.1 christos
485 1.1 christos return cycles;
486 1.1 christos }
487 1.1 christos
488 1.1 christos int
489 1.1 christos frvbf_model_fr400_u_fr_store (SIM_CPU *cpu, const IDESC *idesc,
490 1.1 christos int unit_num, int referenced,
491 1.1 christos INT in_GRi, INT in_GRj,
492 1.1 christos INT in_FRk, INT in_FRdoublek)
493 1.1 christos {
494 1.1 christos int cycles;
495 1.1 christos
496 1.1 christos if (model_insn == FRV_INSN_MODEL_PASS_1)
497 1.1 christos {
498 1.1 christos /* The entire VLIW insn must wait if there is a dependency on a register
499 1.1 christos which is not ready yet.
500 1.1 christos The latency of the registers may be less than previously recorded,
501 1.1 christos depending on how they were used previously.
502 1.1 christos See Table 13-8 in the LSI. */
503 1.1 christos if (in_GRi >= 0)
504 1.1 christos {
505 1.1 christos if (use_is_gr_complex (cpu, in_GRi))
506 1.1 christos decrease_GR_busy (cpu, in_GRi, 1);
507 1.1 christos }
508 1.1 christos if (in_GRj != in_GRi && in_GRj >= 0)
509 1.1 christos {
510 1.1 christos if (use_is_gr_complex (cpu, in_GRj))
511 1.1 christos decrease_GR_busy (cpu, in_GRj, 1);
512 1.1 christos }
513 1.1 christos if (in_FRk >= 0)
514 1.1 christos {
515 1.1 christos if (use_is_media_p4 (cpu, in_FRk) || use_is_media_p6 (cpu, in_FRk))
516 1.1 christos decrease_FR_busy (cpu, in_FRk, 1);
517 1.1 christos else
518 1.1 christos enforce_full_fr_latency (cpu, in_FRk);
519 1.1 christos }
520 1.1 christos vliw_wait_for_GR (cpu, in_GRi);
521 1.1 christos vliw_wait_for_GR (cpu, in_GRj);
522 1.1 christos vliw_wait_for_FR (cpu, in_FRk);
523 1.1 christos vliw_wait_for_FRdouble (cpu, in_FRdoublek);
524 1.1 christos handle_resource_wait (cpu);
525 1.1 christos load_wait_for_GR (cpu, in_GRi);
526 1.1 christos load_wait_for_GR (cpu, in_GRj);
527 1.1 christos load_wait_for_FR (cpu, in_FRk);
528 1.1 christos load_wait_for_FRdouble (cpu, in_FRdoublek);
529 1.1 christos trace_vliw_wait_cycles (cpu);
530 1.1 christos return 0;
531 1.1 christos }
532 1.1 christos
533 1.1 christos cycles = idesc->timing->units[unit_num].done;
534 1.1 christos
535 1.1 christos return cycles;
536 1.1 christos }
537 1.1 christos
538 1.1 christos int
539 1.1 christos frvbf_model_fr400_u_swap (SIM_CPU *cpu, const IDESC *idesc,
540 1.1 christos int unit_num, int referenced,
541 1.1 christos INT in_GRi, INT in_GRj, INT out_GRk)
542 1.1 christos {
543 1.1 christos /* Modelling for this unit is the same as for fr500. */
544 1.1 christos return frvbf_model_fr500_u_swap (cpu, idesc, unit_num, referenced,
545 1.1 christos in_GRi, in_GRj, out_GRk);
546 1.1 christos }
547 1.1 christos
548 1.1 christos int
549 1.1 christos frvbf_model_fr400_u_fr2gr (SIM_CPU *cpu, const IDESC *idesc,
550 1.1 christos int unit_num, int referenced,
551 1.1 christos INT in_FRk, INT out_GRj)
552 1.1 christos {
553 1.1 christos int cycles;
554 1.1 christos
555 1.1 christos if (model_insn == FRV_INSN_MODEL_PASS_1)
556 1.1 christos {
557 1.1 christos /* The entire VLIW insn must wait if there is a dependency on a register
558 1.1 christos which is not ready yet.
559 1.1 christos The latency of the registers may be less than previously recorded,
560 1.1 christos depending on how they were used previously.
561 1.1 christos See Table 13-8 in the LSI. */
562 1.1 christos if (in_FRk >= 0)
563 1.1 christos {
564 1.1 christos if (use_is_media_p4 (cpu, in_FRk) || use_is_media_p6 (cpu, in_FRk))
565 1.1 christos decrease_FR_busy (cpu, in_FRk, 1);
566 1.1 christos else
567 1.1 christos enforce_full_fr_latency (cpu, in_FRk);
568 1.1 christos }
569 1.1 christos vliw_wait_for_FR (cpu, in_FRk);
570 1.1 christos vliw_wait_for_GR (cpu, out_GRj);
571 1.1 christos handle_resource_wait (cpu);
572 1.1 christos load_wait_for_FR (cpu, in_FRk);
573 1.1 christos load_wait_for_GR (cpu, out_GRj);
574 1.1 christos trace_vliw_wait_cycles (cpu);
575 1.1 christos return 0;
576 1.1 christos }
577 1.1 christos
578 1.1 christos /* The latency of GRj is 2 cycles. */
579 1.1 christos cycles = idesc->timing->units[unit_num].done;
580 1.1 christos update_GR_latency (cpu, out_GRj, cycles + 2);
581 1.1 christos set_use_is_gr_complex (cpu, out_GRj);
582 1.1 christos
583 1.1 christos return cycles;
584 1.1 christos }
585 1.1 christos
586 1.1 christos int
587 1.1 christos frvbf_model_fr400_u_spr2gr (SIM_CPU *cpu, const IDESC *idesc,
588 1.1 christos int unit_num, int referenced,
589 1.1 christos INT in_spr, INT out_GRj)
590 1.1 christos {
591 1.1 christos /* Modelling for this unit is the same as for fr500. */
592 1.1 christos return frvbf_model_fr500_u_spr2gr (cpu, idesc, unit_num, referenced,
593 1.1 christos in_spr, out_GRj);
594 1.1 christos }
595 1.1 christos
596 1.1 christos int
597 1.1 christos frvbf_model_fr400_u_gr2fr (SIM_CPU *cpu, const IDESC *idesc,
598 1.1 christos int unit_num, int referenced,
599 1.1 christos INT in_GRj, INT out_FRk)
600 1.1 christos {
601 1.1 christos int cycles;
602 1.1 christos
603 1.1 christos if (model_insn == FRV_INSN_MODEL_PASS_1)
604 1.1 christos {
605 1.1 christos /* Pass 1 is the same as for fr500. */
606 1.1 christos frvbf_model_fr500_u_gr2fr (cpu, idesc, unit_num, referenced,
607 1.1 christos in_GRj, out_FRk);
608 1.1 christos }
609 1.1 christos
610 1.1 christos /* The latency of FRk is 1 cycles. */
611 1.1 christos cycles = idesc->timing->units[unit_num].done;
612 1.1 christos update_FR_latency (cpu, out_FRk, cycles + 1);
613 1.1 christos
614 1.1 christos return cycles;
615 1.1 christos }
616 1.1 christos
617 1.1 christos int
618 1.1 christos frvbf_model_fr400_u_gr2spr (SIM_CPU *cpu, const IDESC *idesc,
619 1.1 christos int unit_num, int referenced,
620 1.1 christos INT in_GRj, INT out_spr)
621 1.1 christos {
622 1.1 christos /* Modelling for this unit is the same as for fr500. */
623 1.1 christos return frvbf_model_fr500_u_gr2spr (cpu, idesc, unit_num, referenced,
624 1.1 christos in_GRj, out_spr);
625 1.1 christos }
626 1.1 christos
627 1.1 christos int
628 1.1 christos frvbf_model_fr400_u_media_1 (SIM_CPU *cpu, const IDESC *idesc,
629 1.1 christos int unit_num, int referenced,
630 1.1 christos INT in_FRi, INT in_FRj,
631 1.1 christos INT out_FRk)
632 1.1 christos {
633 1.1 christos int cycles;
634 1.1 christos FRV_PROFILE_STATE *ps;
635 1.1 christos const CGEN_INSN *insn;
636 1.1 christos int busy_adjustment[] = {0, 0};
637 1.1 christos int *fr;
638 1.1 christos
639 1.1 christos if (model_insn == FRV_INSN_MODEL_PASS_1)
640 1.1 christos return 0;
641 1.1 christos
642 1.1 christos /* The preprocessing can execute right away. */
643 1.1 christos cycles = idesc->timing->units[unit_num].done;
644 1.1 christos
645 1.1 christos ps = CPU_PROFILE_STATE (cpu);
646 1.1 christos insn = idesc->idata;
647 1.1 christos
648 1.1 christos /* The latency of the registers may be less than previously recorded,
649 1.1 christos depending on how they were used previously.
650 1.1 christos See Table 13-8 in the LSI. */
651 1.1 christos if (in_FRi >= 0)
652 1.1 christos {
653 1.1 christos if (use_is_fp_load (cpu, in_FRi))
654 1.1 christos {
655 1.1 christos busy_adjustment[0] = 1;
656 1.1 christos decrease_FR_busy (cpu, in_FRi, busy_adjustment[0]);
657 1.1 christos }
658 1.1 christos else
659 1.1 christos enforce_full_fr_latency (cpu, in_FRi);
660 1.1 christos }
661 1.1 christos if (in_FRj >= 0 && in_FRj != in_FRi)
662 1.1 christos {
663 1.1 christos if (use_is_fp_load (cpu, in_FRj))
664 1.1 christos {
665 1.1 christos busy_adjustment[1] = 1;
666 1.1 christos decrease_FR_busy (cpu, in_FRj, busy_adjustment[1]);
667 1.1 christos }
668 1.1 christos else
669 1.1 christos enforce_full_fr_latency (cpu, in_FRj);
670 1.1 christos }
671 1.1 christos
672 1.1 christos /* The post processing must wait if there is a dependency on a FR
673 1.1 christos which is not ready yet. */
674 1.1 christos ps->post_wait = cycles;
675 1.1 christos post_wait_for_FR (cpu, in_FRi);
676 1.1 christos post_wait_for_FR (cpu, in_FRj);
677 1.1 christos post_wait_for_FR (cpu, out_FRk);
678 1.1 christos
679 1.1 christos /* Restore the busy cycles of the registers we used. */
680 1.1 christos fr = ps->fr_busy;
681 1.1 christos if (in_FRi >= 0)
682 1.1 christos fr[in_FRi] += busy_adjustment[0];
683 1.1 christos if (in_FRj >= 0)
684 1.1 christos fr[in_FRj] += busy_adjustment[1];
685 1.1 christos
686 1.1 christos /* The latency of the output register will be at least the latency of the
687 1.1 christos other inputs. Once initiated, post-processing has no latency. */
688 1.1 christos if (out_FRk >= 0)
689 1.1 christos {
690 1.1 christos update_FR_latency (cpu, out_FRk, ps->post_wait);
691 1.1 christos update_FR_ptime (cpu, out_FRk, 0);
692 1.1 christos }
693 1.1 christos
694 1.1 christos return cycles;
695 1.1 christos }
696 1.1 christos
697 1.1 christos int
698 1.1 christos frvbf_model_fr400_u_media_1_quad (SIM_CPU *cpu, const IDESC *idesc,
699 1.1 christos int unit_num, int referenced,
700 1.1 christos INT in_FRi, INT in_FRj,
701 1.1 christos INT out_FRk)
702 1.1 christos {
703 1.1 christos int cycles;
704 1.1 christos INT dual_FRi;
705 1.1 christos INT dual_FRj;
706 1.1 christos INT dual_FRk;
707 1.1 christos FRV_PROFILE_STATE *ps;
708 1.1 christos int busy_adjustment[] = {0, 0, 0, 0};
709 1.1 christos int *fr;
710 1.1 christos
711 1.1 christos if (model_insn == FRV_INSN_MODEL_PASS_1)
712 1.1 christos return 0;
713 1.1 christos
714 1.1 christos /* The preprocessing can execute right away. */
715 1.1 christos cycles = idesc->timing->units[unit_num].done;
716 1.1 christos
717 1.1 christos ps = CPU_PROFILE_STATE (cpu);
718 1.1 christos dual_FRi = DUAL_REG (in_FRi);
719 1.1 christos dual_FRj = DUAL_REG (in_FRj);
720 1.1 christos dual_FRk = DUAL_REG (out_FRk);
721 1.1 christos
722 1.1 christos /* The latency of the registers may be less than previously recorded,
723 1.1 christos depending on how they were used previously.
724 1.1 christos See Table 13-8 in the LSI. */
725 1.1 christos if (use_is_fp_load (cpu, in_FRi))
726 1.1 christos {
727 1.1 christos busy_adjustment[0] = 1;
728 1.1 christos decrease_FR_busy (cpu, in_FRi, busy_adjustment[0]);
729 1.1 christos }
730 1.1 christos else
731 1.1 christos enforce_full_fr_latency (cpu, in_FRi);
732 1.1 christos if (dual_FRi >= 0 && use_is_fp_load (cpu, dual_FRi))
733 1.1 christos {
734 1.1 christos busy_adjustment[1] = 1;
735 1.1 christos decrease_FR_busy (cpu, dual_FRi, busy_adjustment[1]);
736 1.1 christos }
737 1.1 christos else
738 1.1 christos enforce_full_fr_latency (cpu, dual_FRi);
739 1.1 christos if (in_FRj != in_FRi)
740 1.1 christos {
741 1.1 christos if (use_is_fp_load (cpu, in_FRj))
742 1.1 christos {
743 1.1 christos busy_adjustment[2] = 1;
744 1.1 christos decrease_FR_busy (cpu, in_FRj, busy_adjustment[2]);
745 1.1 christos }
746 1.1 christos else
747 1.1 christos enforce_full_fr_latency (cpu, in_FRj);
748 1.1 christos if (dual_FRj >= 0 && use_is_fp_load (cpu, dual_FRj))
749 1.1 christos {
750 1.1 christos busy_adjustment[3] = 1;
751 1.1 christos decrease_FR_busy (cpu, dual_FRj, busy_adjustment[3]);
752 1.1 christos }
753 1.1 christos else
754 1.1 christos enforce_full_fr_latency (cpu, dual_FRj);
755 1.1 christos }
756 1.1 christos
757 1.1 christos /* The post processing must wait if there is a dependency on a FR
758 1.1 christos which is not ready yet. */
759 1.1 christos ps->post_wait = cycles;
760 1.1 christos post_wait_for_FR (cpu, in_FRi);
761 1.1 christos post_wait_for_FR (cpu, dual_FRi);
762 1.1 christos post_wait_for_FR (cpu, in_FRj);
763 1.1 christos post_wait_for_FR (cpu, dual_FRj);
764 1.1 christos post_wait_for_FR (cpu, out_FRk);
765 1.1 christos post_wait_for_FR (cpu, dual_FRk);
766 1.1 christos
767 1.1 christos /* Restore the busy cycles of the registers we used. */
768 1.1 christos fr = ps->fr_busy;
769 1.1 christos fr[in_FRi] += busy_adjustment[0];
770 1.1 christos if (dual_FRi >= 0)
771 1.1 christos fr[dual_FRi] += busy_adjustment[1];
772 1.1 christos fr[in_FRj] += busy_adjustment[2];
773 1.1 christos if (dual_FRj >= 0)
774 1.1 christos fr[dual_FRj] += busy_adjustment[3];
775 1.1 christos
776 1.1 christos /* The latency of the output register will be at least the latency of the
777 1.1 christos other inputs. */
778 1.1 christos update_FR_latency (cpu, out_FRk, ps->post_wait);
779 1.1 christos
780 1.1 christos /* Once initiated, post-processing has no latency. */
781 1.1 christos update_FR_ptime (cpu, out_FRk, 0);
782 1.1 christos
783 1.1 christos if (dual_FRk >= 0)
784 1.1 christos {
785 1.1 christos update_FR_latency (cpu, dual_FRk, ps->post_wait);
786 1.1 christos update_FR_ptime (cpu, dual_FRk, 0);
787 1.1 christos }
788 1.1 christos
789 1.1 christos return cycles;
790 1.1 christos }
791 1.1 christos
792 1.1 christos int
793 1.1 christos frvbf_model_fr400_u_media_hilo (SIM_CPU *cpu, const IDESC *idesc,
794 1.1 christos int unit_num, int referenced,
795 1.1 christos INT out_FRkhi, INT out_FRklo)
796 1.1 christos {
797 1.1 christos int cycles;
798 1.1 christos FRV_PROFILE_STATE *ps;
799 1.1 christos
800 1.1 christos if (model_insn == FRV_INSN_MODEL_PASS_1)
801 1.1 christos return 0;
802 1.1 christos
803 1.1 christos /* The preprocessing can execute right away. */
804 1.1 christos cycles = idesc->timing->units[unit_num].done;
805 1.1 christos
806 1.1 christos ps = CPU_PROFILE_STATE (cpu);
807 1.1 christos
808 1.1 christos /* The post processing must wait if there is a dependency on a FR
809 1.1 christos which is not ready yet. */
810 1.1 christos ps->post_wait = cycles;
811 1.1 christos post_wait_for_FR (cpu, out_FRkhi);
812 1.1 christos post_wait_for_FR (cpu, out_FRklo);
813 1.1 christos
814 1.1 christos /* The latency of the output register will be at least the latency of the
815 1.1 christos other inputs. Once initiated, post-processing has no latency. */
816 1.1 christos if (out_FRkhi >= 0)
817 1.1 christos {
818 1.1 christos update_FR_latency (cpu, out_FRkhi, ps->post_wait);
819 1.1 christos update_FR_ptime (cpu, out_FRkhi, 0);
820 1.1 christos }
821 1.1 christos if (out_FRklo >= 0)
822 1.1 christos {
823 1.1 christos update_FR_latency (cpu, out_FRklo, ps->post_wait);
824 1.1 christos update_FR_ptime (cpu, out_FRklo, 0);
825 1.1 christos }
826 1.1 christos
827 1.1 christos return cycles;
828 1.1 christos }
829 1.1 christos
830 1.1 christos int
831 1.1 christos frvbf_model_fr400_u_media_2 (SIM_CPU *cpu, const IDESC *idesc,
832 1.1 christos int unit_num, int referenced,
833 1.1 christos INT in_FRi, INT in_FRj,
834 1.1 christos INT out_ACC40Sk, INT out_ACC40Uk)
835 1.1 christos {
836 1.1 christos int cycles;
837 1.1 christos INT dual_ACC40Sk;
838 1.1 christos INT dual_ACC40Uk;
839 1.1 christos FRV_PROFILE_STATE *ps;
840 1.1 christos int busy_adjustment[] = {0, 0, 0, 0, 0, 0};
841 1.1 christos int *fr;
842 1.1 christos int *acc;
843 1.1 christos
844 1.1 christos if (model_insn == FRV_INSN_MODEL_PASS_1)
845 1.1 christos return 0;
846 1.1 christos
847 1.1 christos /* The preprocessing can execute right away. */
848 1.1 christos cycles = idesc->timing->units[unit_num].done;
849 1.1 christos
850 1.1 christos ps = CPU_PROFILE_STATE (cpu);
851 1.1 christos dual_ACC40Sk = DUAL_REG (out_ACC40Sk);
852 1.1 christos dual_ACC40Uk = DUAL_REG (out_ACC40Uk);
853 1.1 christos
854 1.1 christos /* The latency of the registers may be less than previously recorded,
855 1.1 christos depending on how they were used previously.
856 1.1 christos See Table 13-8 in the LSI. */
857 1.1 christos if (in_FRi >= 0)
858 1.1 christos {
859 1.1 christos if (use_is_fp_load (cpu, in_FRi))
860 1.1 christos {
861 1.1 christos busy_adjustment[0] = 1;
862 1.1 christos decrease_FR_busy (cpu, in_FRi, busy_adjustment[0]);
863 1.1 christos }
864 1.1 christos else
865 1.1 christos enforce_full_fr_latency (cpu, in_FRi);
866 1.1 christos }
867 1.1 christos if (in_FRj >= 0 && in_FRj != in_FRi)
868 1.1 christos {
869 1.1 christos if (use_is_fp_load (cpu, in_FRj))
870 1.1 christos {
871 1.1 christos busy_adjustment[1] = 1;
872 1.1 christos decrease_FR_busy (cpu, in_FRj, busy_adjustment[1]);
873 1.1 christos }
874 1.1 christos else
875 1.1 christos enforce_full_fr_latency (cpu, in_FRj);
876 1.1 christos }
877 1.1 christos if (out_ACC40Sk >= 0)
878 1.1 christos {
879 1.1 christos if (acc_use_is_media_p2 (cpu, out_ACC40Sk))
880 1.1 christos {
881 1.1 christos busy_adjustment[2] = 1;
882 1.1 christos decrease_ACC_busy (cpu, out_ACC40Sk, busy_adjustment[2]);
883 1.1 christos }
884 1.1 christos }
885 1.1 christos if (dual_ACC40Sk >= 0)
886 1.1 christos {
887 1.1 christos if (acc_use_is_media_p2 (cpu, dual_ACC40Sk))
888 1.1 christos {
889 1.1 christos busy_adjustment[3] = 1;
890 1.1 christos decrease_ACC_busy (cpu, dual_ACC40Sk, busy_adjustment[3]);
891 1.1 christos }
892 1.1 christos }
893 1.1 christos if (out_ACC40Uk >= 0)
894 1.1 christos {
895 1.1 christos if (acc_use_is_media_p2 (cpu, out_ACC40Uk))
896 1.1 christos {
897 1.1 christos busy_adjustment[4] = 1;
898 1.1 christos decrease_ACC_busy (cpu, out_ACC40Uk, busy_adjustment[4]);
899 1.1 christos }
900 1.1 christos }
901 1.1 christos if (dual_ACC40Uk >= 0)
902 1.1 christos {
903 1.1 christos if (acc_use_is_media_p2 (cpu, dual_ACC40Uk))
904 1.1 christos {
905 1.1 christos busy_adjustment[5] = 1;
906 1.1 christos decrease_ACC_busy (cpu, dual_ACC40Uk, busy_adjustment[5]);
907 1.1 christos }
908 1.1 christos }
909 1.1 christos
910 1.1 christos /* The post processing must wait if there is a dependency on a FR
911 1.1 christos which is not ready yet. */
912 1.1 christos ps->post_wait = cycles;
913 1.1 christos post_wait_for_FR (cpu, in_FRi);
914 1.1 christos post_wait_for_FR (cpu, in_FRj);
915 1.1 christos post_wait_for_ACC (cpu, out_ACC40Sk);
916 1.1 christos post_wait_for_ACC (cpu, dual_ACC40Sk);
917 1.1 christos post_wait_for_ACC (cpu, out_ACC40Uk);
918 1.1 christos post_wait_for_ACC (cpu, dual_ACC40Uk);
919 1.1 christos
920 1.1 christos /* Restore the busy cycles of the registers we used. */
921 1.1 christos fr = ps->fr_busy;
922 1.1 christos acc = ps->acc_busy;
923 1.1 christos fr[in_FRi] += busy_adjustment[0];
924 1.1 christos fr[in_FRj] += busy_adjustment[1];
925 1.1 christos if (out_ACC40Sk >= 0)
926 1.1 christos acc[out_ACC40Sk] += busy_adjustment[2];
927 1.1 christos if (dual_ACC40Sk >= 0)
928 1.1 christos acc[dual_ACC40Sk] += busy_adjustment[3];
929 1.1 christos if (out_ACC40Uk >= 0)
930 1.1 christos acc[out_ACC40Uk] += busy_adjustment[4];
931 1.1 christos if (dual_ACC40Uk >= 0)
932 1.1 christos acc[dual_ACC40Uk] += busy_adjustment[5];
933 1.1 christos
934 1.1 christos /* The latency of the output register will be at least the latency of the
935 1.1 christos other inputs. Once initiated, post-processing will take 1 cycles. */
936 1.1 christos if (out_ACC40Sk >= 0)
937 1.1 christos {
938 1.1 christos update_ACC_latency (cpu, out_ACC40Sk, ps->post_wait + 1);
939 1.1 christos set_acc_use_is_media_p2 (cpu, out_ACC40Sk);
940 1.1 christos }
941 1.1 christos if (dual_ACC40Sk >= 0)
942 1.1 christos {
943 1.1 christos update_ACC_latency (cpu, dual_ACC40Sk, ps->post_wait + 1);
944 1.1 christos set_acc_use_is_media_p2 (cpu, dual_ACC40Sk);
945 1.1 christos }
946 1.1 christos if (out_ACC40Uk >= 0)
947 1.1 christos {
948 1.1 christos update_ACC_latency (cpu, out_ACC40Uk, ps->post_wait + 1);
949 1.1 christos set_acc_use_is_media_p2 (cpu, out_ACC40Uk);
950 1.1 christos }
951 1.1 christos if (dual_ACC40Uk >= 0)
952 1.1 christos {
953 1.1 christos update_ACC_latency (cpu, dual_ACC40Uk, ps->post_wait + 1);
954 1.1 christos set_acc_use_is_media_p2 (cpu, dual_ACC40Uk);
955 1.1 christos }
956 1.1 christos
957 1.1 christos return cycles;
958 1.1 christos }
959 1.1 christos
960 1.1 christos int
961 1.1 christos frvbf_model_fr400_u_media_2_quad (SIM_CPU *cpu, const IDESC *idesc,
962 1.1 christos int unit_num, int referenced,
963 1.1 christos INT in_FRi, INT in_FRj,
964 1.1 christos INT out_ACC40Sk, INT out_ACC40Uk)
965 1.1 christos {
966 1.1 christos int cycles;
967 1.1 christos INT dual_FRi;
968 1.1 christos INT dual_FRj;
969 1.1 christos INT ACC40Sk_1;
970 1.1 christos INT ACC40Sk_2;
971 1.1 christos INT ACC40Sk_3;
972 1.1 christos INT ACC40Uk_1;
973 1.1 christos INT ACC40Uk_2;
974 1.1 christos INT ACC40Uk_3;
975 1.1 christos FRV_PROFILE_STATE *ps;
976 1.1 christos int busy_adjustment[] = {0, 0, 0, 0, 0, 0, 0 ,0};
977 1.1 christos int *fr;
978 1.1 christos int *acc;
979 1.1 christos
980 1.1 christos if (model_insn == FRV_INSN_MODEL_PASS_1)
981 1.1 christos return 0;
982 1.1 christos
983 1.1 christos /* The preprocessing can execute right away. */
984 1.1 christos cycles = idesc->timing->units[unit_num].done;
985 1.1 christos
986 1.1 christos dual_FRi = DUAL_REG (in_FRi);
987 1.1 christos dual_FRj = DUAL_REG (in_FRj);
988 1.1 christos ACC40Sk_1 = DUAL_REG (out_ACC40Sk);
989 1.1 christos ACC40Sk_2 = DUAL_REG (ACC40Sk_1);
990 1.1 christos ACC40Sk_3 = DUAL_REG (ACC40Sk_2);
991 1.1 christos ACC40Uk_1 = DUAL_REG (out_ACC40Uk);
992 1.1 christos ACC40Uk_2 = DUAL_REG (ACC40Uk_1);
993 1.1 christos ACC40Uk_3 = DUAL_REG (ACC40Uk_2);
994 1.1 christos
995 1.1 christos ps = CPU_PROFILE_STATE (cpu);
996 1.1 christos /* The latency of the registers may be less than previously recorded,
997 1.1 christos depending on how they were used previously.
998 1.1 christos See Table 13-8 in the LSI. */
999 1.1 christos if (use_is_fp_load (cpu, in_FRi))
1000 1.1 christos {
1001 1.1 christos busy_adjustment[0] = 1;
1002 1.1 christos decrease_FR_busy (cpu, in_FRi, busy_adjustment[0]);
1003 1.1 christos }
1004 1.1 christos else
1005 1.1 christos enforce_full_fr_latency (cpu, in_FRi);
1006 1.1 christos if (dual_FRi >= 0 && use_is_fp_load (cpu, dual_FRi))
1007 1.1 christos {
1008 1.1 christos busy_adjustment[1] = 1;
1009 1.1 christos decrease_FR_busy (cpu, dual_FRi, busy_adjustment[1]);
1010 1.1 christos }
1011 1.1 christos else
1012 1.1 christos enforce_full_fr_latency (cpu, dual_FRi);
1013 1.1 christos if (in_FRj != in_FRi)
1014 1.1 christos {
1015 1.1 christos if (use_is_fp_load (cpu, in_FRj))
1016 1.1 christos {
1017 1.1 christos busy_adjustment[2] = 1;
1018 1.1 christos decrease_FR_busy (cpu, in_FRj, busy_adjustment[2]);
1019 1.1 christos }
1020 1.1 christos else
1021 1.1 christos enforce_full_fr_latency (cpu, in_FRj);
1022 1.1 christos if (dual_FRj >= 0 && use_is_fp_load (cpu, dual_FRj))
1023 1.1 christos {
1024 1.1 christos busy_adjustment[3] = 1;
1025 1.1 christos decrease_FR_busy (cpu, dual_FRj, busy_adjustment[3]);
1026 1.1 christos }
1027 1.1 christos else
1028 1.1 christos enforce_full_fr_latency (cpu, dual_FRj);
1029 1.1 christos }
1030 1.1 christos if (out_ACC40Sk >= 0)
1031 1.1 christos {
1032 1.1 christos if (acc_use_is_media_p2 (cpu, out_ACC40Sk))
1033 1.1 christos {
1034 1.1 christos busy_adjustment[4] = 1;
1035 1.1 christos decrease_ACC_busy (cpu, out_ACC40Sk, busy_adjustment[4]);
1036 1.1 christos }
1037 1.1 christos if (ACC40Sk_1 >= 0)
1038 1.1 christos {
1039 1.1 christos if (acc_use_is_media_p2 (cpu, ACC40Sk_1))
1040 1.1 christos {
1041 1.1 christos busy_adjustment[5] = 1;
1042 1.1 christos decrease_ACC_busy (cpu, ACC40Sk_1, busy_adjustment[5]);
1043 1.1 christos }
1044 1.1 christos }
1045 1.1 christos if (ACC40Sk_2 >= 0)
1046 1.1 christos {
1047 1.1 christos if (acc_use_is_media_p2 (cpu, ACC40Sk_2))
1048 1.1 christos {
1049 1.1 christos busy_adjustment[6] = 1;
1050 1.1 christos decrease_ACC_busy (cpu, ACC40Sk_2, busy_adjustment[6]);
1051 1.1 christos }
1052 1.1 christos }
1053 1.1 christos if (ACC40Sk_3 >= 0)
1054 1.1 christos {
1055 1.1 christos if (acc_use_is_media_p2 (cpu, ACC40Sk_3))
1056 1.1 christos {
1057 1.1 christos busy_adjustment[7] = 1;
1058 1.1 christos decrease_ACC_busy (cpu, ACC40Sk_3, busy_adjustment[7]);
1059 1.1 christos }
1060 1.1 christos }
1061 1.1 christos }
1062 1.1 christos else if (out_ACC40Uk >= 0)
1063 1.1 christos {
1064 1.1 christos if (acc_use_is_media_p2 (cpu, out_ACC40Uk))
1065 1.1 christos {
1066 1.1 christos busy_adjustment[4] = 1;
1067 1.1 christos decrease_ACC_busy (cpu, out_ACC40Uk, busy_adjustment[4]);
1068 1.1 christos }
1069 1.1 christos if (ACC40Uk_1 >= 0)
1070 1.1 christos {
1071 1.1 christos if (acc_use_is_media_p2 (cpu, ACC40Uk_1))
1072 1.1 christos {
1073 1.1 christos busy_adjustment[5] = 1;
1074 1.1 christos decrease_ACC_busy (cpu, ACC40Uk_1, busy_adjustment[5]);
1075 1.1 christos }
1076 1.1 christos }
1077 1.1 christos if (ACC40Uk_2 >= 0)
1078 1.1 christos {
1079 1.1 christos if (acc_use_is_media_p2 (cpu, ACC40Uk_2))
1080 1.1 christos {
1081 1.1 christos busy_adjustment[6] = 1;
1082 1.1 christos decrease_ACC_busy (cpu, ACC40Uk_2, busy_adjustment[6]);
1083 1.1 christos }
1084 1.1 christos }
1085 1.1 christos if (ACC40Uk_3 >= 0)
1086 1.1 christos {
1087 1.1 christos if (acc_use_is_media_p2 (cpu, ACC40Uk_3))
1088 1.1 christos {
1089 1.1 christos busy_adjustment[7] = 1;
1090 1.1 christos decrease_ACC_busy (cpu, ACC40Uk_3, busy_adjustment[7]);
1091 1.1 christos }
1092 1.1 christos }
1093 1.1 christos }
1094 1.1 christos
1095 1.1 christos /* The post processing must wait if there is a dependency on a FR
1096 1.1 christos which is not ready yet. */
1097 1.1 christos ps->post_wait = cycles;
1098 1.1 christos post_wait_for_FR (cpu, in_FRi);
1099 1.1 christos post_wait_for_FR (cpu, dual_FRi);
1100 1.1 christos post_wait_for_FR (cpu, in_FRj);
1101 1.1 christos post_wait_for_FR (cpu, dual_FRj);
1102 1.1 christos post_wait_for_ACC (cpu, out_ACC40Sk);
1103 1.1 christos post_wait_for_ACC (cpu, ACC40Sk_1);
1104 1.1 christos post_wait_for_ACC (cpu, ACC40Sk_2);
1105 1.1 christos post_wait_for_ACC (cpu, ACC40Sk_3);
1106 1.1 christos post_wait_for_ACC (cpu, out_ACC40Uk);
1107 1.1 christos post_wait_for_ACC (cpu, ACC40Uk_1);
1108 1.1 christos post_wait_for_ACC (cpu, ACC40Uk_2);
1109 1.1 christos post_wait_for_ACC (cpu, ACC40Uk_3);
1110 1.1 christos
1111 1.1 christos /* Restore the busy cycles of the registers we used. */
1112 1.1 christos fr = ps->fr_busy;
1113 1.1 christos acc = ps->acc_busy;
1114 1.1 christos fr[in_FRi] += busy_adjustment[0];
1115 1.1 christos if (dual_FRi >= 0)
1116 1.1 christos fr[dual_FRi] += busy_adjustment[1];
1117 1.1 christos fr[in_FRj] += busy_adjustment[2];
1118 1.1 christos if (dual_FRj > 0)
1119 1.1 christos fr[dual_FRj] += busy_adjustment[3];
1120 1.1 christos if (out_ACC40Sk >= 0)
1121 1.1 christos {
1122 1.1 christos acc[out_ACC40Sk] += busy_adjustment[4];
1123 1.1 christos if (ACC40Sk_1 >= 0)
1124 1.1 christos acc[ACC40Sk_1] += busy_adjustment[5];
1125 1.1 christos if (ACC40Sk_2 >= 0)
1126 1.1 christos acc[ACC40Sk_2] += busy_adjustment[6];
1127 1.1 christos if (ACC40Sk_3 >= 0)
1128 1.1 christos acc[ACC40Sk_3] += busy_adjustment[7];
1129 1.1 christos }
1130 1.1 christos else if (out_ACC40Uk >= 0)
1131 1.1 christos {
1132 1.1 christos acc[out_ACC40Uk] += busy_adjustment[4];
1133 1.1 christos if (ACC40Uk_1 >= 0)
1134 1.1 christos acc[ACC40Uk_1] += busy_adjustment[5];
1135 1.1 christos if (ACC40Uk_2 >= 0)
1136 1.1 christos acc[ACC40Uk_2] += busy_adjustment[6];
1137 1.1 christos if (ACC40Uk_3 >= 0)
1138 1.1 christos acc[ACC40Uk_3] += busy_adjustment[7];
1139 1.1 christos }
1140 1.1 christos
1141 1.1 christos /* The latency of the output register will be at least the latency of the
1142 1.1 christos other inputs. Once initiated, post-processing will take 1 cycle. */
1143 1.1 christos if (out_ACC40Sk >= 0)
1144 1.1 christos {
1145 1.1 christos update_ACC_latency (cpu, out_ACC40Sk, ps->post_wait + 1);
1146 1.1 christos
1147 1.1 christos set_acc_use_is_media_p2 (cpu, out_ACC40Sk);
1148 1.1 christos if (ACC40Sk_1 >= 0)
1149 1.1 christos {
1150 1.1 christos update_ACC_latency (cpu, ACC40Sk_1, ps->post_wait + 1);
1151 1.1 christos
1152 1.1 christos set_acc_use_is_media_p2 (cpu, ACC40Sk_1);
1153 1.1 christos }
1154 1.1 christos if (ACC40Sk_2 >= 0)
1155 1.1 christos {
1156 1.1 christos update_ACC_latency (cpu, ACC40Sk_2, ps->post_wait + 1);
1157 1.1 christos
1158 1.1 christos set_acc_use_is_media_p2 (cpu, ACC40Sk_2);
1159 1.1 christos }
1160 1.1 christos if (ACC40Sk_3 >= 0)
1161 1.1 christos {
1162 1.1 christos update_ACC_latency (cpu, ACC40Sk_3, ps->post_wait + 1);
1163 1.1 christos
1164 1.1 christos set_acc_use_is_media_p2 (cpu, ACC40Sk_3);
1165 1.1 christos }
1166 1.1 christos }
1167 1.1 christos else if (out_ACC40Uk >= 0)
1168 1.1 christos {
1169 1.1 christos update_ACC_latency (cpu, out_ACC40Uk, ps->post_wait + 1);
1170 1.1 christos
1171 1.1 christos set_acc_use_is_media_p2 (cpu, out_ACC40Uk);
1172 1.1 christos if (ACC40Uk_1 >= 0)
1173 1.1 christos {
1174 1.1 christos update_ACC_latency (cpu, ACC40Uk_1, ps->post_wait + 1);
1175 1.1 christos
1176 1.1 christos set_acc_use_is_media_p2 (cpu, ACC40Uk_1);
1177 1.1 christos }
1178 1.1 christos if (ACC40Uk_2 >= 0)
1179 1.1 christos {
1180 1.1 christos update_ACC_latency (cpu, ACC40Uk_2, ps->post_wait + 1);
1181 1.1 christos
1182 1.1 christos set_acc_use_is_media_p2 (cpu, ACC40Uk_2);
1183 1.1 christos }
1184 1.1 christos if (ACC40Uk_3 >= 0)
1185 1.1 christos {
1186 1.1 christos update_ACC_latency (cpu, ACC40Uk_3, ps->post_wait + 1);
1187 1.1 christos
1188 1.1 christos set_acc_use_is_media_p2 (cpu, ACC40Uk_3);
1189 1.1 christos }
1190 1.1 christos }
1191 1.1 christos
1192 1.1 christos return cycles;
1193 1.1 christos }
1194 1.1 christos
1195 1.1 christos int
1196 1.1 christos frvbf_model_fr400_u_media_2_acc (SIM_CPU *cpu, const IDESC *idesc,
1197 1.1 christos int unit_num, int referenced,
1198 1.1 christos INT in_ACC40Si, INT out_ACC40Sk)
1199 1.1 christos {
1200 1.1 christos int cycles;
1201 1.1 christos INT ACC40Si_1;
1202 1.1 christos FRV_PROFILE_STATE *ps;
1203 1.1 christos int busy_adjustment[] = {0, 0, 0};
1204 1.1 christos int *acc;
1205 1.1 christos
1206 1.1 christos if (model_insn == FRV_INSN_MODEL_PASS_1)
1207 1.1 christos return 0;
1208 1.1 christos
1209 1.1 christos /* The preprocessing can execute right away. */
1210 1.1 christos cycles = idesc->timing->units[unit_num].done;
1211 1.1 christos
1212 1.1 christos ACC40Si_1 = DUAL_REG (in_ACC40Si);
1213 1.1 christos
1214 1.1 christos ps = CPU_PROFILE_STATE (cpu);
1215 1.1 christos /* The latency of the registers may be less than previously recorded,
1216 1.1 christos depending on how they were used previously.
1217 1.1 christos See Table 13-8 in the LSI. */
1218 1.1 christos if (acc_use_is_media_p2 (cpu, in_ACC40Si))
1219 1.1 christos {
1220 1.1 christos busy_adjustment[0] = 1;
1221 1.1 christos decrease_ACC_busy (cpu, in_ACC40Si, busy_adjustment[0]);
1222 1.1 christos }
1223 1.1 christos if (ACC40Si_1 >= 0 && acc_use_is_media_p2 (cpu, ACC40Si_1))
1224 1.1 christos {
1225 1.1 christos busy_adjustment[1] = 1;
1226 1.1 christos decrease_ACC_busy (cpu, ACC40Si_1, busy_adjustment[1]);
1227 1.1 christos }
1228 1.1 christos if (out_ACC40Sk != in_ACC40Si && out_ACC40Sk != ACC40Si_1
1229 1.1 christos && acc_use_is_media_p2 (cpu, out_ACC40Sk))
1230 1.1 christos {
1231 1.1 christos busy_adjustment[2] = 1;
1232 1.1 christos decrease_ACC_busy (cpu, out_ACC40Sk, busy_adjustment[2]);
1233 1.1 christos }
1234 1.1 christos
1235 1.1 christos /* The post processing must wait if there is a dependency on a register
1236 1.1 christos which is not ready yet. */
1237 1.1 christos ps->post_wait = cycles;
1238 1.1 christos post_wait_for_ACC (cpu, in_ACC40Si);
1239 1.1 christos post_wait_for_ACC (cpu, ACC40Si_1);
1240 1.1 christos post_wait_for_ACC (cpu, out_ACC40Sk);
1241 1.1 christos
1242 1.1 christos /* Restore the busy cycles of the registers we used. */
1243 1.1 christos acc = ps->acc_busy;
1244 1.1 christos acc[in_ACC40Si] += busy_adjustment[0];
1245 1.1 christos if (ACC40Si_1 >= 0)
1246 1.1 christos acc[ACC40Si_1] += busy_adjustment[1];
1247 1.1 christos acc[out_ACC40Sk] += busy_adjustment[2];
1248 1.1 christos
1249 1.1 christos /* The latency of the output register will be at least the latency of the
1250 1.1 christos other inputs. Once initiated, post-processing will take 1 cycle. */
1251 1.1 christos update_ACC_latency (cpu, out_ACC40Sk, ps->post_wait + 1);
1252 1.1 christos set_acc_use_is_media_p2 (cpu, out_ACC40Sk);
1253 1.1 christos
1254 1.1 christos return cycles;
1255 1.1 christos }
1256 1.1 christos
1257 1.1 christos int
1258 1.1 christos frvbf_model_fr400_u_media_2_acc_dual (SIM_CPU *cpu, const IDESC *idesc,
1259 1.1 christos int unit_num, int referenced,
1260 1.1 christos INT in_ACC40Si, INT out_ACC40Sk)
1261 1.1 christos {
1262 1.1 christos int cycles;
1263 1.1 christos INT ACC40Si_1;
1264 1.1 christos INT ACC40Si_2;
1265 1.1 christos INT ACC40Si_3;
1266 1.1 christos INT ACC40Sk_1;
1267 1.1 christos FRV_PROFILE_STATE *ps;
1268 1.1 christos int busy_adjustment[] = {0, 0, 0, 0, 0, 0};
1269 1.1 christos int *acc;
1270 1.1 christos
1271 1.1 christos if (model_insn == FRV_INSN_MODEL_PASS_1)
1272 1.1 christos return 0;
1273 1.1 christos
1274 1.1 christos /* The preprocessing can execute right away. */
1275 1.1 christos cycles = idesc->timing->units[unit_num].done;
1276 1.1 christos
1277 1.1 christos ACC40Si_1 = DUAL_REG (in_ACC40Si);
1278 1.1 christos ACC40Si_2 = DUAL_REG (ACC40Si_1);
1279 1.1 christos ACC40Si_3 = DUAL_REG (ACC40Si_2);
1280 1.1 christos ACC40Sk_1 = DUAL_REG (out_ACC40Sk);
1281 1.1 christos
1282 1.1 christos ps = CPU_PROFILE_STATE (cpu);
1283 1.1 christos /* The latency of the registers may be less than previously recorded,
1284 1.1 christos depending on how they were used previously.
1285 1.1 christos See Table 13-8 in the LSI. */
1286 1.1 christos if (acc_use_is_media_p2 (cpu, in_ACC40Si))
1287 1.1 christos {
1288 1.1 christos busy_adjustment[0] = 1;
1289 1.1 christos decrease_ACC_busy (cpu, in_ACC40Si, busy_adjustment[0]);
1290 1.1 christos }
1291 1.1 christos if (ACC40Si_1 >= 0 && acc_use_is_media_p2 (cpu, ACC40Si_1))
1292 1.1 christos {
1293 1.1 christos busy_adjustment[1] = 1;
1294 1.1 christos decrease_ACC_busy (cpu, ACC40Si_1, busy_adjustment[1]);
1295 1.1 christos }
1296 1.1 christos if (ACC40Si_2 >= 0 && acc_use_is_media_p2 (cpu, ACC40Si_2))
1297 1.1 christos {
1298 1.1 christos busy_adjustment[2] = 1;
1299 1.1 christos decrease_ACC_busy (cpu, ACC40Si_2, busy_adjustment[2]);
1300 1.1 christos }
1301 1.1 christos if (ACC40Si_3 >= 0 && acc_use_is_media_p2 (cpu, ACC40Si_3))
1302 1.1 christos {
1303 1.1 christos busy_adjustment[3] = 1;
1304 1.1 christos decrease_ACC_busy (cpu, ACC40Si_3, busy_adjustment[3]);
1305 1.1 christos }
1306 1.1 christos if (out_ACC40Sk != in_ACC40Si && out_ACC40Sk != ACC40Si_1
1307 1.1 christos && out_ACC40Sk != ACC40Si_2 && out_ACC40Sk != ACC40Si_3)
1308 1.1 christos {
1309 1.1 christos if (acc_use_is_media_p2 (cpu, out_ACC40Sk))
1310 1.1 christos {
1311 1.1 christos busy_adjustment[4] = 1;
1312 1.1 christos decrease_ACC_busy (cpu, out_ACC40Sk, busy_adjustment[4]);
1313 1.1 christos }
1314 1.1 christos }
1315 1.1 christos if (ACC40Sk_1 != in_ACC40Si && ACC40Sk_1 != ACC40Si_1
1316 1.1 christos && ACC40Sk_1 != ACC40Si_2 && ACC40Sk_1 != ACC40Si_3)
1317 1.1 christos {
1318 1.1 christos if (acc_use_is_media_p2 (cpu, ACC40Sk_1))
1319 1.1 christos {
1320 1.1 christos busy_adjustment[5] = 1;
1321 1.1 christos decrease_ACC_busy (cpu, ACC40Sk_1, busy_adjustment[5]);
1322 1.1 christos }
1323 1.1 christos }
1324 1.1 christos
1325 1.1 christos /* The post processing must wait if there is a dependency on a register
1326 1.1 christos which is not ready yet. */
1327 1.1 christos ps->post_wait = cycles;
1328 1.1 christos post_wait_for_ACC (cpu, in_ACC40Si);
1329 1.1 christos post_wait_for_ACC (cpu, ACC40Si_1);
1330 1.1 christos post_wait_for_ACC (cpu, ACC40Si_2);
1331 1.1 christos post_wait_for_ACC (cpu, ACC40Si_3);
1332 1.1 christos post_wait_for_ACC (cpu, out_ACC40Sk);
1333 1.1 christos post_wait_for_ACC (cpu, ACC40Sk_1);
1334 1.1 christos
1335 1.1 christos /* Restore the busy cycles of the registers we used. */
1336 1.1 christos acc = ps->acc_busy;
1337 1.1 christos acc[in_ACC40Si] += busy_adjustment[0];
1338 1.1 christos if (ACC40Si_1 >= 0)
1339 1.1 christos acc[ACC40Si_1] += busy_adjustment[1];
1340 1.1 christos if (ACC40Si_2 >= 0)
1341 1.1 christos acc[ACC40Si_2] += busy_adjustment[2];
1342 1.1 christos if (ACC40Si_3 >= 0)
1343 1.1 christos acc[ACC40Si_3] += busy_adjustment[3];
1344 1.1 christos acc[out_ACC40Sk] += busy_adjustment[4];
1345 1.1 christos if (ACC40Sk_1 >= 0)
1346 1.1 christos acc[ACC40Sk_1] += busy_adjustment[5];
1347 1.1 christos
1348 1.1 christos /* The latency of the output register will be at least the latency of the
1349 1.1 christos other inputs. Once initiated, post-processing will take 1 cycle. */
1350 1.1 christos update_ACC_latency (cpu, out_ACC40Sk, ps->post_wait + 1);
1351 1.1 christos set_acc_use_is_media_p2 (cpu, out_ACC40Sk);
1352 1.1 christos if (ACC40Sk_1 >= 0)
1353 1.1 christos {
1354 1.1 christos update_ACC_latency (cpu, ACC40Sk_1, ps->post_wait + 1);
1355 1.1 christos set_acc_use_is_media_p2 (cpu, ACC40Sk_1);
1356 1.1 christos }
1357 1.1 christos
1358 1.1 christos return cycles;
1359 1.1 christos }
1360 1.1 christos
1361 1.1 christos int
1362 1.1 christos frvbf_model_fr400_u_media_2_add_sub (SIM_CPU *cpu, const IDESC *idesc,
1363 1.1 christos int unit_num, int referenced,
1364 1.1 christos INT in_ACC40Si, INT out_ACC40Sk)
1365 1.1 christos {
1366 1.1 christos int cycles;
1367 1.1 christos INT ACC40Si_1;
1368 1.1 christos INT ACC40Sk_1;
1369 1.1 christos FRV_PROFILE_STATE *ps;
1370 1.1 christos int busy_adjustment[] = {0, 0, 0, 0};
1371 1.1 christos int *acc;
1372 1.1 christos
1373 1.1 christos if (model_insn == FRV_INSN_MODEL_PASS_1)
1374 1.1 christos return 0;
1375 1.1 christos
1376 1.1 christos /* The preprocessing can execute right away. */
1377 1.1 christos cycles = idesc->timing->units[unit_num].done;
1378 1.1 christos
1379 1.1 christos ACC40Si_1 = DUAL_REG (in_ACC40Si);
1380 1.1 christos ACC40Sk_1 = DUAL_REG (out_ACC40Sk);
1381 1.1 christos
1382 1.1 christos ps = CPU_PROFILE_STATE (cpu);
1383 1.1 christos /* The latency of the registers may be less than previously recorded,
1384 1.1 christos depending on how they were used previously.
1385 1.1 christos See Table 13-8 in the LSI. */
1386 1.1 christos if (acc_use_is_media_p2 (cpu, in_ACC40Si))
1387 1.1 christos {
1388 1.1 christos busy_adjustment[0] = 1;
1389 1.1 christos decrease_ACC_busy (cpu, in_ACC40Si, busy_adjustment[0]);
1390 1.1 christos }
1391 1.1 christos if (ACC40Si_1 >= 0 && acc_use_is_media_p2 (cpu, ACC40Si_1))
1392 1.1 christos {
1393 1.1 christos busy_adjustment[1] = 1;
1394 1.1 christos decrease_ACC_busy (cpu, ACC40Si_1, busy_adjustment[1]);
1395 1.1 christos }
1396 1.1 christos if (out_ACC40Sk != in_ACC40Si && out_ACC40Sk != ACC40Si_1)
1397 1.1 christos {
1398 1.1 christos if (acc_use_is_media_p2 (cpu, out_ACC40Sk))
1399 1.1 christos {
1400 1.1 christos busy_adjustment[2] = 1;
1401 1.1 christos decrease_ACC_busy (cpu, out_ACC40Sk, busy_adjustment[2]);
1402 1.1 christos }
1403 1.1 christos }
1404 1.1 christos if (ACC40Sk_1 != in_ACC40Si && ACC40Sk_1 != ACC40Si_1)
1405 1.1 christos {
1406 1.1 christos if (acc_use_is_media_p2 (cpu, ACC40Sk_1))
1407 1.1 christos {
1408 1.1 christos busy_adjustment[3] = 1;
1409 1.1 christos decrease_ACC_busy (cpu, ACC40Sk_1, busy_adjustment[3]);
1410 1.1 christos }
1411 1.1 christos }
1412 1.1 christos
1413 1.1 christos /* The post processing must wait if there is a dependency on a register
1414 1.1 christos which is not ready yet. */
1415 1.1 christos ps->post_wait = cycles;
1416 1.1 christos post_wait_for_ACC (cpu, in_ACC40Si);
1417 1.1 christos post_wait_for_ACC (cpu, ACC40Si_1);
1418 1.1 christos post_wait_for_ACC (cpu, out_ACC40Sk);
1419 1.1 christos post_wait_for_ACC (cpu, ACC40Sk_1);
1420 1.1 christos
1421 1.1 christos /* Restore the busy cycles of the registers we used. */
1422 1.1 christos acc = ps->acc_busy;
1423 1.1 christos acc[in_ACC40Si] += busy_adjustment[0];
1424 1.1 christos if (ACC40Si_1 >= 0)
1425 1.1 christos acc[ACC40Si_1] += busy_adjustment[1];
1426 1.1 christos acc[out_ACC40Sk] += busy_adjustment[2];
1427 1.1 christos if (ACC40Sk_1 >= 0)
1428 1.1 christos acc[ACC40Sk_1] += busy_adjustment[3];
1429 1.1 christos
1430 1.1 christos /* The latency of the output register will be at least the latency of the
1431 1.1 christos other inputs. Once initiated, post-processing will take 1 cycle. */
1432 1.1 christos update_ACC_latency (cpu, out_ACC40Sk, ps->post_wait + 1);
1433 1.1 christos set_acc_use_is_media_p2 (cpu, out_ACC40Sk);
1434 1.1 christos if (ACC40Sk_1 >= 0)
1435 1.1 christos {
1436 1.1 christos update_ACC_latency (cpu, ACC40Sk_1, ps->post_wait + 1);
1437 1.1 christos set_acc_use_is_media_p2 (cpu, ACC40Sk_1);
1438 1.1 christos }
1439 1.1 christos
1440 1.1 christos return cycles;
1441 1.1 christos }
1442 1.1 christos
1443 1.1 christos int
1444 1.1 christos frvbf_model_fr400_u_media_2_add_sub_dual (SIM_CPU *cpu, const IDESC *idesc,
1445 1.1 christos int unit_num, int referenced,
1446 1.1 christos INT in_ACC40Si, INT out_ACC40Sk)
1447 1.1 christos {
1448 1.1 christos int cycles;
1449 1.1 christos INT ACC40Si_1;
1450 1.1 christos INT ACC40Si_2;
1451 1.1 christos INT ACC40Si_3;
1452 1.1 christos INT ACC40Sk_1;
1453 1.1 christos INT ACC40Sk_2;
1454 1.1 christos INT ACC40Sk_3;
1455 1.1 christos FRV_PROFILE_STATE *ps;
1456 1.1 christos int busy_adjustment[] = {0, 0, 0, 0, 0, 0, 0, 0};
1457 1.1 christos int *acc;
1458 1.1 christos
1459 1.1 christos if (model_insn == FRV_INSN_MODEL_PASS_1)
1460 1.1 christos return 0;
1461 1.1 christos
1462 1.1 christos /* The preprocessing can execute right away. */
1463 1.1 christos cycles = idesc->timing->units[unit_num].done;
1464 1.1 christos
1465 1.1 christos ACC40Si_1 = DUAL_REG (in_ACC40Si);
1466 1.1 christos ACC40Si_2 = DUAL_REG (ACC40Si_1);
1467 1.1 christos ACC40Si_3 = DUAL_REG (ACC40Si_2);
1468 1.1 christos ACC40Sk_1 = DUAL_REG (out_ACC40Sk);
1469 1.1 christos ACC40Sk_2 = DUAL_REG (ACC40Sk_1);
1470 1.1 christos ACC40Sk_3 = DUAL_REG (ACC40Sk_2);
1471 1.1 christos
1472 1.1 christos ps = CPU_PROFILE_STATE (cpu);
1473 1.1 christos /* The latency of the registers may be less than previously recorded,
1474 1.1 christos depending on how they were used previously.
1475 1.1 christos See Table 13-8 in the LSI. */
1476 1.1 christos if (acc_use_is_media_p2 (cpu, in_ACC40Si))
1477 1.1 christos {
1478 1.1 christos busy_adjustment[0] = 1;
1479 1.1 christos decrease_ACC_busy (cpu, in_ACC40Si, busy_adjustment[0]);
1480 1.1 christos }
1481 1.1 christos if (ACC40Si_1 >= 0 && acc_use_is_media_p2 (cpu, ACC40Si_1))
1482 1.1 christos {
1483 1.1 christos busy_adjustment[1] = 1;
1484 1.1 christos decrease_ACC_busy (cpu, ACC40Si_1, busy_adjustment[1]);
1485 1.1 christos }
1486 1.1 christos if (ACC40Si_2 >= 0 && acc_use_is_media_p2 (cpu, ACC40Si_2))
1487 1.1 christos {
1488 1.1 christos busy_adjustment[2] = 1;
1489 1.1 christos decrease_ACC_busy (cpu, ACC40Si_2, busy_adjustment[2]);
1490 1.1 christos }
1491 1.1 christos if (ACC40Si_3 >= 0 && acc_use_is_media_p2 (cpu, ACC40Si_3))
1492 1.1 christos {
1493 1.1 christos busy_adjustment[3] = 1;
1494 1.1 christos decrease_ACC_busy (cpu, ACC40Si_3, busy_adjustment[3]);
1495 1.1 christos }
1496 1.1 christos if (out_ACC40Sk != in_ACC40Si && out_ACC40Sk != ACC40Si_1
1497 1.1 christos && out_ACC40Sk != ACC40Si_2 && out_ACC40Sk != ACC40Si_3)
1498 1.1 christos {
1499 1.1 christos if (acc_use_is_media_p2 (cpu, out_ACC40Sk))
1500 1.1 christos {
1501 1.1 christos busy_adjustment[4] = 1;
1502 1.1 christos decrease_ACC_busy (cpu, out_ACC40Sk, busy_adjustment[4]);
1503 1.1 christos }
1504 1.1 christos }
1505 1.1 christos if (ACC40Sk_1 != in_ACC40Si && ACC40Sk_1 != ACC40Si_1
1506 1.1 christos && ACC40Sk_1 != ACC40Si_2 && ACC40Sk_1 != ACC40Si_3)
1507 1.1 christos {
1508 1.1 christos if (acc_use_is_media_p2 (cpu, ACC40Sk_1))
1509 1.1 christos {
1510 1.1 christos busy_adjustment[5] = 1;
1511 1.1 christos decrease_ACC_busy (cpu, ACC40Sk_1, busy_adjustment[5]);
1512 1.1 christos }
1513 1.1 christos }
1514 1.1 christos if (ACC40Sk_2 != in_ACC40Si && ACC40Sk_2 != ACC40Si_1
1515 1.1 christos && ACC40Sk_2 != ACC40Si_2 && ACC40Sk_2 != ACC40Si_3)
1516 1.1 christos {
1517 1.1 christos if (acc_use_is_media_p2 (cpu, ACC40Sk_2))
1518 1.1 christos {
1519 1.1 christos busy_adjustment[6] = 1;
1520 1.1 christos decrease_ACC_busy (cpu, ACC40Sk_2, busy_adjustment[6]);
1521 1.1 christos }
1522 1.1 christos }
1523 1.1 christos if (ACC40Sk_3 != in_ACC40Si && ACC40Sk_3 != ACC40Si_1
1524 1.1 christos && ACC40Sk_3 != ACC40Si_2 && ACC40Sk_3 != ACC40Si_3)
1525 1.1 christos {
1526 1.1 christos if (acc_use_is_media_p2 (cpu, ACC40Sk_3))
1527 1.1 christos {
1528 1.1 christos busy_adjustment[7] = 1;
1529 1.1 christos decrease_ACC_busy (cpu, ACC40Sk_3, busy_adjustment[7]);
1530 1.1 christos }
1531 1.1 christos }
1532 1.1 christos
1533 1.1 christos /* The post processing must wait if there is a dependency on a register
1534 1.1 christos which is not ready yet. */
1535 1.1 christos ps->post_wait = cycles;
1536 1.1 christos post_wait_for_ACC (cpu, in_ACC40Si);
1537 1.1 christos post_wait_for_ACC (cpu, ACC40Si_1);
1538 1.1 christos post_wait_for_ACC (cpu, ACC40Si_2);
1539 1.1 christos post_wait_for_ACC (cpu, ACC40Si_3);
1540 1.1 christos post_wait_for_ACC (cpu, out_ACC40Sk);
1541 1.1 christos post_wait_for_ACC (cpu, ACC40Sk_1);
1542 1.1 christos post_wait_for_ACC (cpu, ACC40Sk_2);
1543 1.1 christos post_wait_for_ACC (cpu, ACC40Sk_3);
1544 1.1 christos
1545 1.1 christos /* Restore the busy cycles of the registers we used. */
1546 1.1 christos acc = ps->acc_busy;
1547 1.1 christos acc[in_ACC40Si] += busy_adjustment[0];
1548 1.1 christos if (ACC40Si_1 >= 0)
1549 1.1 christos acc[ACC40Si_1] += busy_adjustment[1];
1550 1.1 christos if (ACC40Si_2 >= 0)
1551 1.1 christos acc[ACC40Si_2] += busy_adjustment[2];
1552 1.1 christos if (ACC40Si_3 >= 0)
1553 1.1 christos acc[ACC40Si_3] += busy_adjustment[3];
1554 1.1 christos acc[out_ACC40Sk] += busy_adjustment[4];
1555 1.1 christos if (ACC40Sk_1 >= 0)
1556 1.1 christos acc[ACC40Sk_1] += busy_adjustment[5];
1557 1.1 christos if (ACC40Sk_2 >= 0)
1558 1.1 christos acc[ACC40Sk_2] += busy_adjustment[6];
1559 1.1 christos if (ACC40Sk_3 >= 0)
1560 1.1 christos acc[ACC40Sk_3] += busy_adjustment[7];
1561 1.1 christos
1562 1.1 christos /* The latency of the output register will be at least the latency of the
1563 1.1 christos other inputs. Once initiated, post-processing will take 1 cycle. */
1564 1.1 christos update_ACC_latency (cpu, out_ACC40Sk, ps->post_wait + 1);
1565 1.1 christos set_acc_use_is_media_p2 (cpu, out_ACC40Sk);
1566 1.1 christos if (ACC40Sk_1 >= 0)
1567 1.1 christos {
1568 1.1 christos update_ACC_latency (cpu, ACC40Sk_1, ps->post_wait + 1);
1569 1.1 christos set_acc_use_is_media_p2 (cpu, ACC40Sk_1);
1570 1.1 christos }
1571 1.1 christos if (ACC40Sk_2 >= 0)
1572 1.1 christos {
1573 1.1 christos update_ACC_latency (cpu, ACC40Sk_2, ps->post_wait + 1);
1574 1.1 christos set_acc_use_is_media_p2 (cpu, ACC40Sk_2);
1575 1.1 christos }
1576 1.1 christos if (ACC40Sk_3 >= 0)
1577 1.1 christos {
1578 1.1 christos update_ACC_latency (cpu, ACC40Sk_3, ps->post_wait + 1);
1579 1.1 christos set_acc_use_is_media_p2 (cpu, ACC40Sk_3);
1580 1.1 christos }
1581 1.1 christos
1582 1.1 christos return cycles;
1583 1.1 christos }
1584 1.1 christos
1585 1.1 christos int
1586 1.1 christos frvbf_model_fr400_u_media_3 (SIM_CPU *cpu, const IDESC *idesc,
1587 1.1 christos int unit_num, int referenced,
1588 1.1 christos INT in_FRi, INT in_FRj,
1589 1.1 christos INT out_FRk)
1590 1.1 christos {
1591 1.1 christos /* Modelling is the same as media unit 1. */
1592 1.1 christos return frvbf_model_fr400_u_media_1 (cpu, idesc, unit_num, referenced,
1593 1.1 christos in_FRi, in_FRj, out_FRk);
1594 1.1 christos }
1595 1.1 christos
1596 1.1 christos int
1597 1.1 christos frvbf_model_fr400_u_media_3_dual (SIM_CPU *cpu, const IDESC *idesc,
1598 1.1 christos int unit_num, int referenced,
1599 1.1 christos INT in_FRi, INT out_FRk)
1600 1.1 christos {
1601 1.1 christos int cycles;
1602 1.1 christos INT dual_FRi;
1603 1.1 christos FRV_PROFILE_STATE *ps;
1604 1.1 christos int busy_adjustment[] = {0, 0};
1605 1.1 christos int *fr;
1606 1.1 christos
1607 1.1 christos if (model_insn == FRV_INSN_MODEL_PASS_1)
1608 1.1 christos return 0;
1609 1.1 christos
1610 1.1 christos /* The preprocessing can execute right away. */
1611 1.1 christos cycles = idesc->timing->units[unit_num].done;
1612 1.1 christos
1613 1.1 christos ps = CPU_PROFILE_STATE (cpu);
1614 1.1 christos dual_FRi = DUAL_REG (in_FRi);
1615 1.1 christos
1616 1.1 christos /* The latency of the registers may be less than previously recorded,
1617 1.1 christos depending on how they were used previously.
1618 1.1 christos See Table 13-8 in the LSI. */
1619 1.1 christos if (use_is_fp_load (cpu, in_FRi))
1620 1.1 christos {
1621 1.1 christos busy_adjustment[0] = 1;
1622 1.1 christos decrease_FR_busy (cpu, in_FRi, busy_adjustment[0]);
1623 1.1 christos }
1624 1.1 christos else
1625 1.1 christos enforce_full_fr_latency (cpu, in_FRi);
1626 1.1 christos if (dual_FRi >= 0 && use_is_fp_load (cpu, dual_FRi))
1627 1.1 christos {
1628 1.1 christos busy_adjustment[1] = 1;
1629 1.1 christos decrease_FR_busy (cpu, dual_FRi, busy_adjustment[1]);
1630 1.1 christos }
1631 1.1 christos else
1632 1.1 christos enforce_full_fr_latency (cpu, dual_FRi);
1633 1.1 christos
1634 1.1 christos /* The post processing must wait if there is a dependency on a FR
1635 1.1 christos which is not ready yet. */
1636 1.1 christos ps->post_wait = cycles;
1637 1.1 christos post_wait_for_FR (cpu, in_FRi);
1638 1.1 christos post_wait_for_FR (cpu, dual_FRi);
1639 1.1 christos post_wait_for_FR (cpu, out_FRk);
1640 1.1 christos
1641 1.1 christos /* Restore the busy cycles of the registers we used. */
1642 1.1 christos fr = ps->fr_busy;
1643 1.1 christos fr[in_FRi] += busy_adjustment[0];
1644 1.1 christos if (dual_FRi >= 0)
1645 1.1 christos fr[dual_FRi] += busy_adjustment[1];
1646 1.1 christos
1647 1.1 christos /* The latency of the output register will be at least the latency of the
1648 1.1 christos other inputs. */
1649 1.1 christos update_FR_latency (cpu, out_FRk, ps->post_wait);
1650 1.1 christos
1651 1.1 christos /* Once initiated, post-processing has no latency. */
1652 1.1 christos update_FR_ptime (cpu, out_FRk, 0);
1653 1.1 christos
1654 1.1 christos return cycles;
1655 1.1 christos }
1656 1.1 christos
1657 1.1 christos int
1658 1.1 christos frvbf_model_fr400_u_media_3_quad (SIM_CPU *cpu, const IDESC *idesc,
1659 1.1 christos int unit_num, int referenced,
1660 1.1 christos INT in_FRi, INT in_FRj,
1661 1.1 christos INT out_FRk)
1662 1.1 christos {
1663 1.1 christos /* Modelling is the same as media unit 1. */
1664 1.1 christos return frvbf_model_fr400_u_media_1_quad (cpu, idesc, unit_num, referenced,
1665 1.1 christos in_FRi, in_FRj, out_FRk);
1666 1.1 christos }
1667 1.1 christos
1668 1.1 christos int
1669 1.1 christos frvbf_model_fr400_u_media_4 (SIM_CPU *cpu, const IDESC *idesc,
1670 1.1 christos int unit_num, int referenced,
1671 1.1 christos INT in_ACC40Si, INT in_FRj,
1672 1.1 christos INT out_ACC40Sk, INT out_FRk)
1673 1.1 christos {
1674 1.1 christos int cycles;
1675 1.1 christos FRV_PROFILE_STATE *ps;
1676 1.1 christos const CGEN_INSN *insn;
1677 1.1 christos int busy_adjustment[] = {0};
1678 1.1 christos int *fr;
1679 1.1 christos
1680 1.1 christos if (model_insn == FRV_INSN_MODEL_PASS_1)
1681 1.1 christos return 0;
1682 1.1 christos
1683 1.1 christos /* The preprocessing can execute right away. */
1684 1.1 christos cycles = idesc->timing->units[unit_num].done;
1685 1.1 christos
1686 1.1 christos ps = CPU_PROFILE_STATE (cpu);
1687 1.1 christos insn = idesc->idata;
1688 1.1 christos
1689 1.1 christos /* The latency of the registers may be less than previously recorded,
1690 1.1 christos depending on how they were used previously.
1691 1.1 christos See Table 13-8 in the LSI. */
1692 1.1 christos if (in_FRj >= 0)
1693 1.1 christos {
1694 1.1 christos if (use_is_fp_load (cpu, in_FRj))
1695 1.1 christos {
1696 1.1 christos busy_adjustment[0] = 1;
1697 1.1 christos decrease_FR_busy (cpu, in_FRj, busy_adjustment[0]);
1698 1.1 christos }
1699 1.1 christos else
1700 1.1 christos enforce_full_fr_latency (cpu, in_FRj);
1701 1.1 christos }
1702 1.1 christos
1703 1.1 christos /* The post processing must wait if there is a dependency on a FR
1704 1.1 christos which is not ready yet. */
1705 1.1 christos ps->post_wait = cycles;
1706 1.1 christos post_wait_for_ACC (cpu, in_ACC40Si);
1707 1.1 christos post_wait_for_ACC (cpu, out_ACC40Sk);
1708 1.1 christos post_wait_for_FR (cpu, in_FRj);
1709 1.1 christos post_wait_for_FR (cpu, out_FRk);
1710 1.1 christos
1711 1.1 christos /* Restore the busy cycles of the registers we used. */
1712 1.1 christos fr = ps->fr_busy;
1713 1.1 christos
1714 1.1 christos /* The latency of the output register will be at least the latency of the
1715 1.1 christos other inputs. Once initiated, post-processing will take 1 cycle. */
1716 1.1 christos if (out_FRk >= 0)
1717 1.1 christos {
1718 1.1 christos update_FR_latency (cpu, out_FRk, ps->post_wait);
1719 1.1 christos update_FR_ptime (cpu, out_FRk, 1);
1720 1.1 christos /* Mark this use of the register as media unit 4. */
1721 1.1 christos set_use_is_media_p4 (cpu, out_FRk);
1722 1.1 christos }
1723 1.1 christos else if (out_ACC40Sk >= 0)
1724 1.1 christos {
1725 1.1 christos update_ACC_latency (cpu, out_ACC40Sk, ps->post_wait);
1726 1.1 christos update_ACC_ptime (cpu, out_ACC40Sk, 1);
1727 1.1 christos /* Mark this use of the register as media unit 4. */
1728 1.1 christos set_acc_use_is_media_p4 (cpu, out_ACC40Sk);
1729 1.1 christos }
1730 1.1 christos
1731 1.1 christos return cycles;
1732 1.1 christos }
1733 1.1 christos
1734 1.1 christos int
1735 1.1 christos frvbf_model_fr400_u_media_4_accg (SIM_CPU *cpu, const IDESC *idesc,
1736 1.1 christos int unit_num, int referenced,
1737 1.1 christos INT in_ACCGi, INT in_FRinti,
1738 1.1 christos INT out_ACCGk, INT out_FRintk)
1739 1.1 christos {
1740 1.1 christos /* Modelling is the same as media-4 unit except use accumulator guards
1741 1.1 christos as input instead of accumulators. */
1742 1.1 christos return frvbf_model_fr400_u_media_4 (cpu, idesc, unit_num, referenced,
1743 1.1 christos in_ACCGi, in_FRinti,
1744 1.1 christos out_ACCGk, out_FRintk);
1745 1.1 christos }
1746 1.1 christos
1747 1.1 christos int
1748 1.1 christos frvbf_model_fr400_u_media_4_acc_dual (SIM_CPU *cpu, const IDESC *idesc,
1749 1.1 christos int unit_num, int referenced,
1750 1.1 christos INT in_ACC40Si, INT out_FRk)
1751 1.1 christos {
1752 1.1 christos int cycles;
1753 1.1 christos FRV_PROFILE_STATE *ps;
1754 1.1 christos const CGEN_INSN *insn;
1755 1.1 christos INT ACC40Si_1;
1756 1.1 christos INT FRk_1;
1757 1.1 christos
1758 1.1 christos if (model_insn == FRV_INSN_MODEL_PASS_1)
1759 1.1 christos return 0;
1760 1.1 christos
1761 1.1 christos /* The preprocessing can execute right away. */
1762 1.1 christos cycles = idesc->timing->units[unit_num].done;
1763 1.1 christos
1764 1.1 christos ps = CPU_PROFILE_STATE (cpu);
1765 1.1 christos ACC40Si_1 = DUAL_REG (in_ACC40Si);
1766 1.1 christos FRk_1 = DUAL_REG (out_FRk);
1767 1.1 christos
1768 1.1 christos insn = idesc->idata;
1769 1.1 christos
1770 1.1 christos /* The post processing must wait if there is a dependency on a FR
1771 1.1 christos which is not ready yet. */
1772 1.1 christos ps->post_wait = cycles;
1773 1.1 christos post_wait_for_ACC (cpu, in_ACC40Si);
1774 1.1 christos post_wait_for_ACC (cpu, ACC40Si_1);
1775 1.1 christos post_wait_for_FR (cpu, out_FRk);
1776 1.1 christos post_wait_for_FR (cpu, FRk_1);
1777 1.1 christos
1778 1.1 christos /* The latency of the output register will be at least the latency of the
1779 1.1 christos other inputs. Once initiated, post-processing will take 1 cycle. */
1780 1.1 christos if (out_FRk >= 0)
1781 1.1 christos {
1782 1.1 christos update_FR_latency (cpu, out_FRk, ps->post_wait);
1783 1.1 christos update_FR_ptime (cpu, out_FRk, 1);
1784 1.1 christos /* Mark this use of the register as media unit 4. */
1785 1.1 christos set_use_is_media_p4 (cpu, out_FRk);
1786 1.1 christos }
1787 1.1 christos if (FRk_1 >= 0)
1788 1.1 christos {
1789 1.1 christos update_FR_latency (cpu, FRk_1, ps->post_wait);
1790 1.1 christos update_FR_ptime (cpu, FRk_1, 1);
1791 1.1 christos /* Mark this use of the register as media unit 4. */
1792 1.1 christos set_use_is_media_p4 (cpu, FRk_1);
1793 1.1 christos }
1794 1.1 christos
1795 1.1 christos return cycles;
1796 1.1 christos }
1797 1.1 christos
1798 1.1 christos int
1799 1.1 christos frvbf_model_fr400_u_media_6 (SIM_CPU *cpu, const IDESC *idesc,
1800 1.1 christos int unit_num, int referenced,
1801 1.1 christos INT in_FRi, INT out_FRk)
1802 1.1 christos {
1803 1.1 christos int cycles;
1804 1.1 christos FRV_PROFILE_STATE *ps;
1805 1.1 christos const CGEN_INSN *insn;
1806 1.1 christos int busy_adjustment[] = {0};
1807 1.1 christos int *fr;
1808 1.1 christos
1809 1.1 christos if (model_insn == FRV_INSN_MODEL_PASS_1)
1810 1.1 christos return 0;
1811 1.1 christos
1812 1.1 christos /* The preprocessing can execute right away. */
1813 1.1 christos cycles = idesc->timing->units[unit_num].done;
1814 1.1 christos
1815 1.1 christos ps = CPU_PROFILE_STATE (cpu);
1816 1.1 christos insn = idesc->idata;
1817 1.1 christos
1818 1.1 christos /* The latency of the registers may be less than previously recorded,
1819 1.1 christos depending on how they were used previously.
1820 1.1 christos See Table 13-8 in the LSI. */
1821 1.1 christos if (in_FRi >= 0)
1822 1.1 christos {
1823 1.1 christos if (use_is_fp_load (cpu, in_FRi))
1824 1.1 christos {
1825 1.1 christos busy_adjustment[0] = 1;
1826 1.1 christos decrease_FR_busy (cpu, in_FRi, busy_adjustment[0]);
1827 1.1 christos }
1828 1.1 christos else
1829 1.1 christos enforce_full_fr_latency (cpu, in_FRi);
1830 1.1 christos }
1831 1.1 christos
1832 1.1 christos /* The post processing must wait if there is a dependency on a FR
1833 1.1 christos which is not ready yet. */
1834 1.1 christos ps->post_wait = cycles;
1835 1.1 christos post_wait_for_FR (cpu, in_FRi);
1836 1.1 christos post_wait_for_FR (cpu, out_FRk);
1837 1.1 christos
1838 1.1 christos /* Restore the busy cycles of the registers we used. */
1839 1.1 christos fr = ps->fr_busy;
1840 1.1 christos if (in_FRi >= 0)
1841 1.1 christos fr[in_FRi] += busy_adjustment[0];
1842 1.1 christos
1843 1.1 christos /* The latency of the output register will be at least the latency of the
1844 1.1 christos other inputs. Once initiated, post-processing will take 1 cycle. */
1845 1.1 christos if (out_FRk >= 0)
1846 1.1 christos {
1847 1.1 christos update_FR_latency (cpu, out_FRk, ps->post_wait);
1848 1.1 christos update_FR_ptime (cpu, out_FRk, 1);
1849 1.1 christos
1850 1.1 christos /* Mark this use of the register as media unit 1. */
1851 1.1 christos set_use_is_media_p6 (cpu, out_FRk);
1852 1.1 christos }
1853 1.1 christos
1854 1.1 christos return cycles;
1855 1.1 christos }
1856 1.1 christos
1857 1.1 christos int
1858 1.1 christos frvbf_model_fr400_u_media_7 (SIM_CPU *cpu, const IDESC *idesc,
1859 1.1 christos int unit_num, int referenced,
1860 1.1 christos INT in_FRinti, INT in_FRintj,
1861 1.1 christos INT out_FCCk)
1862 1.1 christos {
1863 1.1 christos int cycles;
1864 1.1 christos FRV_PROFILE_STATE *ps;
1865 1.1 christos int busy_adjustment[] = {0, 0};
1866 1.1 christos int *fr;
1867 1.1 christos
1868 1.1 christos if (model_insn == FRV_INSN_MODEL_PASS_1)
1869 1.1 christos return 0;
1870 1.1 christos
1871 1.1 christos /* The preprocessing can execute right away. */
1872 1.1 christos cycles = idesc->timing->units[unit_num].done;
1873 1.1 christos
1874 1.1 christos /* The post processing must wait if there is a dependency on a FR
1875 1.1 christos which is not ready yet. */
1876 1.1 christos ps = CPU_PROFILE_STATE (cpu);
1877 1.1 christos
1878 1.1 christos /* The latency of the registers may be less than previously recorded,
1879 1.1 christos depending on how they were used previously.
1880 1.1 christos See Table 13-8 in the LSI. */
1881 1.1 christos if (in_FRinti >= 0)
1882 1.1 christos {
1883 1.1 christos if (use_is_fp_load (cpu, in_FRinti))
1884 1.1 christos {
1885 1.1 christos busy_adjustment[0] = 1;
1886 1.1 christos decrease_FR_busy (cpu, in_FRinti, busy_adjustment[0]);
1887 1.1 christos }
1888 1.1 christos else
1889 1.1 christos enforce_full_fr_latency (cpu, in_FRinti);
1890 1.1 christos }
1891 1.1 christos if (in_FRintj >= 0 && in_FRintj != in_FRinti)
1892 1.1 christos {
1893 1.1 christos if (use_is_fp_load (cpu, in_FRintj))
1894 1.1 christos {
1895 1.1 christos busy_adjustment[1] = 1;
1896 1.1 christos decrease_FR_busy (cpu, in_FRintj, busy_adjustment[1]);
1897 1.1 christos }
1898 1.1 christos else
1899 1.1 christos enforce_full_fr_latency (cpu, in_FRintj);
1900 1.1 christos }
1901 1.1 christos
1902 1.1 christos ps->post_wait = cycles;
1903 1.1 christos post_wait_for_FR (cpu, in_FRinti);
1904 1.1 christos post_wait_for_FR (cpu, in_FRintj);
1905 1.1 christos post_wait_for_CCR (cpu, out_FCCk);
1906 1.1 christos
1907 1.1 christos /* Restore the busy cycles of the registers we used. */
1908 1.1 christos fr = ps->fr_busy;
1909 1.1 christos if (in_FRinti >= 0)
1910 1.1 christos fr[in_FRinti] += busy_adjustment[0];
1911 1.1 christos if (in_FRintj >= 0)
1912 1.1 christos fr[in_FRintj] += busy_adjustment[1];
1913 1.1 christos
1914 1.1 christos /* The latency of FCCi_2 will be the latency of the other inputs plus 1
1915 1.1 christos cycle. */
1916 1.1 christos update_CCR_latency (cpu, out_FCCk, ps->post_wait + 1);
1917 1.1 christos
1918 1.1 christos return cycles;
1919 1.1 christos }
1920 1.1 christos
1921 1.1 christos int
1922 1.1 christos frvbf_model_fr400_u_media_dual_expand (SIM_CPU *cpu, const IDESC *idesc,
1923 1.1 christos int unit_num, int referenced,
1924 1.1 christos INT in_FRi,
1925 1.1 christos INT out_FRk)
1926 1.1 christos {
1927 1.1 christos /* Insns using this unit are media-3 class insns, with a dual FRk output. */
1928 1.1 christos int cycles;
1929 1.1 christos INT dual_FRk;
1930 1.1 christos FRV_PROFILE_STATE *ps;
1931 1.1 christos int busy_adjustment[] = {0};
1932 1.1 christos int *fr;
1933 1.1 christos
1934 1.1 christos if (model_insn == FRV_INSN_MODEL_PASS_1)
1935 1.1 christos return 0;
1936 1.1 christos
1937 1.1 christos /* The preprocessing can execute right away. */
1938 1.1 christos cycles = idesc->timing->units[unit_num].done;
1939 1.1 christos
1940 1.1 christos /* If the previous use of the registers was a media op,
1941 1.1 christos then their latency will be less than previously recorded.
1942 1.1 christos See Table 13-13 in the LSI. */
1943 1.1 christos dual_FRk = DUAL_REG (out_FRk);
1944 1.1 christos ps = CPU_PROFILE_STATE (cpu);
1945 1.1 christos if (use_is_fp_load (cpu, in_FRi))
1946 1.1 christos {
1947 1.1 christos busy_adjustment[0] = 1;
1948 1.1 christos decrease_FR_busy (cpu, in_FRi, busy_adjustment[0]);
1949 1.1 christos }
1950 1.1 christos else
1951 1.1 christos enforce_full_fr_latency (cpu, in_FRi);
1952 1.1 christos
1953 1.1 christos /* The post processing must wait if there is a dependency on a FR
1954 1.1 christos which is not ready yet. */
1955 1.1 christos ps->post_wait = cycles;
1956 1.1 christos post_wait_for_FR (cpu, in_FRi);
1957 1.1 christos post_wait_for_FR (cpu, out_FRk);
1958 1.1 christos post_wait_for_FR (cpu, dual_FRk);
1959 1.1 christos
1960 1.1 christos /* Restore the busy cycles of the registers we used. */
1961 1.1 christos fr = ps->fr_busy;
1962 1.1 christos fr[in_FRi] += busy_adjustment[0];
1963 1.1 christos
1964 1.1 christos /* The latency of the output register will be at least the latency of the
1965 1.1 christos other inputs. Once initiated, post-processing has no latency. */
1966 1.1 christos update_FR_latency (cpu, out_FRk, ps->post_wait);
1967 1.1 christos update_FR_ptime (cpu, out_FRk, 0);
1968 1.1 christos
1969 1.1 christos if (dual_FRk >= 0)
1970 1.1 christos {
1971 1.1 christos update_FR_latency (cpu, dual_FRk, ps->post_wait);
1972 1.1 christos update_FR_ptime (cpu, dual_FRk, 0);
1973 1.1 christos }
1974 1.1 christos
1975 1.1 christos return cycles;
1976 1.1 christos }
1977 1.1 christos
1978 1.1 christos int
1979 1.1 christos frvbf_model_fr400_u_media_dual_htob (SIM_CPU *cpu, const IDESC *idesc,
1980 1.1 christos int unit_num, int referenced,
1981 1.1 christos INT in_FRj,
1982 1.1 christos INT out_FRk)
1983 1.1 christos {
1984 1.1 christos /* Insns using this unit are media-3 class insns, with a dual FRj input. */
1985 1.1 christos int cycles;
1986 1.1 christos INT dual_FRj;
1987 1.1 christos FRV_PROFILE_STATE *ps;
1988 1.1 christos int busy_adjustment[] = {0, 0};
1989 1.1 christos int *fr;
1990 1.1 christos
1991 1.1 christos if (model_insn == FRV_INSN_MODEL_PASS_1)
1992 1.1 christos return 0;
1993 1.1 christos
1994 1.1 christos /* The preprocessing can execute right away. */
1995 1.1 christos cycles = idesc->timing->units[unit_num].done;
1996 1.1 christos
1997 1.1 christos /* If the previous use of the registers was a media op,
1998 1.1 christos then their latency will be less than previously recorded.
1999 1.1 christos See Table 13-13 in the LSI. */
2000 1.1 christos dual_FRj = DUAL_REG (in_FRj);
2001 1.1 christos ps = CPU_PROFILE_STATE (cpu);
2002 1.1 christos if (use_is_fp_load (cpu, in_FRj))
2003 1.1 christos {
2004 1.1 christos busy_adjustment[0] = 1;
2005 1.1 christos decrease_FR_busy (cpu, in_FRj, busy_adjustment[0]);
2006 1.1 christos }
2007 1.1 christos else
2008 1.1 christos enforce_full_fr_latency (cpu, in_FRj);
2009 1.1 christos if (dual_FRj >= 0)
2010 1.1 christos {
2011 1.1 christos if (use_is_fp_load (cpu, dual_FRj))
2012 1.1 christos {
2013 1.1 christos busy_adjustment[1] = 1;
2014 1.1 christos decrease_FR_busy (cpu, dual_FRj, busy_adjustment[1]);
2015 1.1 christos }
2016 1.1 christos else
2017 1.1 christos enforce_full_fr_latency (cpu, dual_FRj);
2018 1.1 christos }
2019 1.1 christos
2020 1.1 christos /* The post processing must wait if there is a dependency on a FR
2021 1.1 christos which is not ready yet. */
2022 1.1 christos ps->post_wait = cycles;
2023 1.1 christos post_wait_for_FR (cpu, in_FRj);
2024 1.1 christos post_wait_for_FR (cpu, dual_FRj);
2025 1.1 christos post_wait_for_FR (cpu, out_FRk);
2026 1.1 christos
2027 1.1 christos /* Restore the busy cycles of the registers we used. */
2028 1.1 christos fr = ps->fr_busy;
2029 1.1 christos fr[in_FRj] += busy_adjustment[0];
2030 1.1 christos if (dual_FRj >= 0)
2031 1.1 christos fr[dual_FRj] += busy_adjustment[1];
2032 1.1 christos
2033 1.1 christos /* The latency of the output register will be at least the latency of the
2034 1.1 christos other inputs. */
2035 1.1 christos update_FR_latency (cpu, out_FRk, ps->post_wait);
2036 1.1 christos
2037 1.1 christos /* Once initiated, post-processing has no latency. */
2038 1.1 christos update_FR_ptime (cpu, out_FRk, 0);
2039 1.1 christos
2040 1.1 christos return cycles;
2041 1.1 christos }
2042 1.1 christos
2043 1.1 christos int
2044 1.1 christos frvbf_model_fr400_u_ici (SIM_CPU *cpu, const IDESC *idesc,
2045 1.1 christos int unit_num, int referenced,
2046 1.1 christos INT in_GRi, INT in_GRj)
2047 1.1 christos {
2048 1.1 christos /* Modelling for this unit is the same as for fr500. */
2049 1.1 christos return frvbf_model_fr500_u_ici (cpu, idesc, unit_num, referenced,
2050 1.1 christos in_GRi, in_GRj);
2051 1.1 christos }
2052 1.1 christos
2053 1.1 christos int
2054 1.1 christos frvbf_model_fr400_u_dci (SIM_CPU *cpu, const IDESC *idesc,
2055 1.1 christos int unit_num, int referenced,
2056 1.1 christos INT in_GRi, INT in_GRj)
2057 1.1 christos {
2058 1.1 christos /* Modelling for this unit is the same as for fr500. */
2059 1.1 christos return frvbf_model_fr500_u_dci (cpu, idesc, unit_num, referenced,
2060 1.1 christos in_GRi, in_GRj);
2061 1.1 christos }
2062 1.1 christos
2063 1.1 christos int
2064 1.1 christos frvbf_model_fr400_u_dcf (SIM_CPU *cpu, const IDESC *idesc,
2065 1.1 christos int unit_num, int referenced,
2066 1.1 christos INT in_GRi, INT in_GRj)
2067 1.1 christos {
2068 1.1 christos /* Modelling for this unit is the same as for fr500. */
2069 1.1 christos return frvbf_model_fr500_u_dcf (cpu, idesc, unit_num, referenced,
2070 1.1 christos in_GRi, in_GRj);
2071 1.1 christos }
2072 1.1 christos
2073 1.1 christos int
2074 1.1 christos frvbf_model_fr400_u_icpl (SIM_CPU *cpu, const IDESC *idesc,
2075 1.1 christos int unit_num, int referenced,
2076 1.1 christos INT in_GRi, INT in_GRj)
2077 1.1 christos {
2078 1.1 christos /* Modelling for this unit is the same as for fr500. */
2079 1.1 christos return frvbf_model_fr500_u_icpl (cpu, idesc, unit_num, referenced,
2080 1.1 christos in_GRi, in_GRj);
2081 1.1 christos }
2082 1.1 christos
2083 1.1 christos int
2084 1.1 christos frvbf_model_fr400_u_dcpl (SIM_CPU *cpu, const IDESC *idesc,
2085 1.1 christos int unit_num, int referenced,
2086 1.1 christos INT in_GRi, INT in_GRj)
2087 1.1 christos {
2088 1.1 christos /* Modelling for this unit is the same as for fr500. */
2089 1.1 christos return frvbf_model_fr500_u_dcpl (cpu, idesc, unit_num, referenced,
2090 1.1 christos in_GRi, in_GRj);
2091 1.1 christos }
2092 1.1 christos
2093 1.1 christos int
2094 1.1 christos frvbf_model_fr400_u_icul (SIM_CPU *cpu, const IDESC *idesc,
2095 1.1 christos int unit_num, int referenced,
2096 1.1 christos INT in_GRi, INT in_GRj)
2097 1.1 christos {
2098 1.1 christos /* Modelling for this unit is the same as for fr500. */
2099 1.1 christos return frvbf_model_fr500_u_icul (cpu, idesc, unit_num, referenced,
2100 1.1 christos in_GRi, in_GRj);
2101 1.1 christos }
2102 1.1 christos
2103 1.1 christos int
2104 1.1 christos frvbf_model_fr400_u_dcul (SIM_CPU *cpu, const IDESC *idesc,
2105 1.1 christos int unit_num, int referenced,
2106 1.1 christos INT in_GRi, INT in_GRj)
2107 1.1 christos {
2108 1.1 christos /* Modelling for this unit is the same as for fr500. */
2109 1.1 christos return frvbf_model_fr500_u_dcul (cpu, idesc, unit_num, referenced,
2110 1.1 christos in_GRi, in_GRj);
2111 1.1 christos }
2112 1.1 christos
2113 1.1 christos int
2114 1.1 christos frvbf_model_fr400_u_barrier (SIM_CPU *cpu, const IDESC *idesc,
2115 1.1 christos int unit_num, int referenced)
2116 1.1 christos {
2117 1.1 christos /* Modelling for this unit is the same as for fr500. */
2118 1.1 christos return frvbf_model_fr500_u_barrier (cpu, idesc, unit_num, referenced);
2119 1.1 christos }
2120 1.1 christos
2121 1.1 christos int
2122 1.1 christos frvbf_model_fr400_u_membar (SIM_CPU *cpu, const IDESC *idesc,
2123 1.1 christos int unit_num, int referenced)
2124 1.1 christos {
2125 1.1 christos /* Modelling for this unit is the same as for fr500. */
2126 1.1 christos return frvbf_model_fr500_u_membar (cpu, idesc, unit_num, referenced);
2127 1.1 christos }
2128 1.1 christos
2129 1.1 christos #endif /* WITH_PROFILE_MODEL_P */
2130