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