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