xref: /netbsd-src/external/gpl3/gdb/dist/sim/frv/profile-fr550.c (revision 479d8f7d843cc1b22d497efdf1f27a50ee8418d4)
1 /* frv simulator fr550 dependent profiling code.
2 
3    Copyright (C) 2003-2016 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 */
22 #define WANT_CPU
23 #define WANT_CPU_FRVBF
24 
25 #include "sim-main.h"
26 #include "bfd.h"
27 
28 #if WITH_PROFILE_MODEL_P
29 
30 #include "profile.h"
31 #include "profile-fr550.h"
32 
33 /* Initialize cycle counting for an insn.
34    FIRST_P is non-zero if this is the first insn in a set of parallel
35    insns.  */
36 void
37 fr550_model_insn_before (SIM_CPU *cpu, int first_p)
38 {
39   if (first_p)
40     {
41       MODEL_FR550_DATA *d = CPU_MODEL_DATA (cpu);
42       d->cur_fr_load      = d->prev_fr_load;
43       d->cur_fr_complex_1 = d->prev_fr_complex_1;
44       d->cur_fr_complex_2 = d->prev_fr_complex_2;
45       d->cur_ccr_complex  = d->prev_ccr_complex;
46       d->cur_acc_mmac     = d->prev_acc_mmac;
47     }
48 }
49 
50 /* Record the cycles computed for an insn.
51    LAST_P is non-zero if this is the last insn in a set of parallel insns,
52    and we update the total cycle count.
53    CYCLES is the cycle count of the insn.  */
54 void
55 fr550_model_insn_after (SIM_CPU *cpu, int last_p, int cycles)
56 {
57   if (last_p)
58     {
59       MODEL_FR550_DATA *d = CPU_MODEL_DATA (cpu);
60       d->prev_fr_load      = d->cur_fr_load;
61       d->prev_fr_complex_1 = d->cur_fr_complex_1;
62       d->prev_fr_complex_2 = d->cur_fr_complex_2;
63       d->prev_ccr_complex  = d->cur_ccr_complex;
64       d->prev_acc_mmac     = d->cur_acc_mmac;
65     }
66 }
67 
68 static void fr550_reset_fr_flags (SIM_CPU *cpu, INT fr);
69 static void fr550_reset_ccr_flags (SIM_CPU *cpu, INT ccr);
70 static void fr550_reset_acc_flags (SIM_CPU *cpu, INT acc);
71 
72 static void
73 set_use_is_fr_load (SIM_CPU *cpu, INT fr)
74 {
75   MODEL_FR550_DATA *d = CPU_MODEL_DATA (cpu);
76   fr550_reset_fr_flags (cpu, (fr));
77   d->cur_fr_load |= (((DI)1) << (fr));
78 }
79 
80 static void
81 set_use_not_fr_load (SIM_CPU *cpu, INT fr)
82 {
83   MODEL_FR550_DATA *d = CPU_MODEL_DATA (cpu);
84   d->cur_fr_load &= ~(((DI)1) << (fr));
85 }
86 
87 static int
88 use_is_fr_load (SIM_CPU *cpu, INT fr)
89 {
90   MODEL_FR550_DATA *d = CPU_MODEL_DATA (cpu);
91   return d->prev_fr_load & (((DI)1) << (fr));
92 }
93 
94 static void
95 set_use_is_fr_complex_1 (SIM_CPU *cpu, INT fr)
96 {
97   MODEL_FR550_DATA *d = CPU_MODEL_DATA (cpu);
98   fr550_reset_fr_flags (cpu, (fr));
99   d->cur_fr_complex_1 |= (((DI)1) << (fr));
100 }
101 
102 static void
103 set_use_not_fr_complex_1 (SIM_CPU *cpu, INT fr)
104 {
105   MODEL_FR550_DATA *d = CPU_MODEL_DATA (cpu);
106   d->cur_fr_complex_1 &= ~(((DI)1) << (fr));
107 }
108 
109 static int
110 use_is_fr_complex_1 (SIM_CPU *cpu, INT fr)
111 {
112   MODEL_FR550_DATA *d = CPU_MODEL_DATA (cpu);
113   return d->prev_fr_complex_1 & (((DI)1) << (fr));
114 }
115 
116 static void
117 set_use_is_fr_complex_2 (SIM_CPU *cpu, INT fr)
118 {
119   MODEL_FR550_DATA *d = CPU_MODEL_DATA (cpu);
120   fr550_reset_fr_flags (cpu, (fr));
121   d->cur_fr_complex_2 |= (((DI)1) << (fr));
122 }
123 
124 static void
125 set_use_not_fr_complex_2 (SIM_CPU *cpu, INT fr)
126 {
127   MODEL_FR550_DATA *d = CPU_MODEL_DATA (cpu);
128   d->cur_fr_complex_2 &= ~(((DI)1) << (fr));
129 }
130 
131 static int
132 use_is_fr_complex_2 (SIM_CPU *cpu, INT fr)
133 {
134   MODEL_FR550_DATA *d = CPU_MODEL_DATA (cpu);
135   return d->prev_fr_complex_2 & (((DI)1) << (fr));
136 }
137 
138 static void
139 set_use_is_ccr_complex (SIM_CPU *cpu, INT ccr)
140 {
141   MODEL_FR550_DATA *d = CPU_MODEL_DATA (cpu);
142   fr550_reset_ccr_flags (cpu, (ccr));
143   d->cur_ccr_complex |= (((SI)1) << (ccr));
144 }
145 
146 static void
147 set_use_not_ccr_complex (SIM_CPU *cpu, INT ccr)
148 {
149   MODEL_FR550_DATA *d = CPU_MODEL_DATA (cpu);
150   d->cur_ccr_complex &= ~(((SI)1) << (ccr));
151 }
152 
153 static int
154 use_is_ccr_complex (SIM_CPU *cpu, INT ccr)
155 {
156   MODEL_FR550_DATA *d = CPU_MODEL_DATA (cpu);
157   return d->prev_ccr_complex & (((SI)1) << (ccr));
158 }
159 
160 static void
161 set_use_is_acc_mmac (SIM_CPU *cpu, INT acc)
162 {
163   MODEL_FR550_DATA *d = CPU_MODEL_DATA (cpu);
164   fr550_reset_acc_flags (cpu, (acc));
165   d->cur_acc_mmac |= (((DI)1) << (acc));
166 }
167 
168 static void
169 set_use_not_acc_mmac (SIM_CPU *cpu, INT acc)
170 {
171   MODEL_FR550_DATA *d = CPU_MODEL_DATA (cpu);
172   d->cur_acc_mmac &= ~(((DI)1) << (acc));
173 }
174 
175 static int
176 use_is_acc_mmac (SIM_CPU *cpu, INT acc)
177 {
178   MODEL_FR550_DATA *d = CPU_MODEL_DATA (cpu);
179   return d->prev_acc_mmac & (((DI)1) << (acc));
180 }
181 
182 static void
183 fr550_reset_fr_flags (SIM_CPU *cpu, INT fr)
184 {
185   set_use_not_fr_load (cpu, fr);
186   set_use_not_fr_complex_1 (cpu, fr);
187   set_use_not_fr_complex_2 (cpu, fr);
188 }
189 
190 static void
191 fr550_reset_ccr_flags (SIM_CPU *cpu, INT ccr)
192 {
193   set_use_not_ccr_complex (cpu, ccr);
194 }
195 
196 static void
197 fr550_reset_acc_flags (SIM_CPU *cpu, INT acc)
198 {
199   set_use_not_acc_mmac (cpu, acc);
200 }
201 
202 /* Detect overlap between two register ranges. Works if one of the registers
203    is -1 with width 1 (i.e. undefined), but not both.  */
204 #define REG_OVERLAP(r1, w1, r2, w2) ( \
205   (r1) + (w1) - 1 >= (r2) && (r2) + (w2) - 1 >= (r1) \
206 )
207 
208 /* Latency of floating point registers may be less than recorded when followed
209    by another floating point insn.  */
210 static void
211 adjust_float_register_busy (SIM_CPU *cpu,
212 			    INT in_FRi, int iwidth,
213 			    INT in_FRj, int jwidth,
214 			    INT out_FRk, int kwidth)
215 {
216   int i;
217   /* The latency of FRk may be less than previously recorded.
218      See Table 14-15 in the LSI.  */
219   if (in_FRi >= 0)
220     {
221       for (i = 0; i < iwidth; ++i)
222 	{
223 	  if (! REG_OVERLAP (in_FRi + i, 1, out_FRk, kwidth))
224 	    if (use_is_fr_load (cpu, in_FRi + i))
225 	      decrease_FR_busy (cpu, in_FRi + i, 1);
226 	    else
227 	      enforce_full_fr_latency (cpu, in_FRi + i);
228 	}
229     }
230 
231   if (in_FRj >= 0)
232     {
233       for (i = 0; i < jwidth; ++i)
234 	{
235 	  if (! REG_OVERLAP (in_FRj + i, 1, in_FRi, iwidth)
236 	      && ! REG_OVERLAP (in_FRj + i, 1, out_FRk, kwidth))
237 	    if (use_is_fr_load (cpu, in_FRj + i))
238 	      decrease_FR_busy (cpu, in_FRj + i, 1);
239 	    else
240 	      enforce_full_fr_latency (cpu, in_FRj + i);
241 	}
242     }
243 
244   if (out_FRk >= 0)
245     {
246       for (i = 0; i < kwidth; ++i)
247 	{
248 	  if (! REG_OVERLAP (out_FRk + i, 1, in_FRi, iwidth)
249 	      && ! REG_OVERLAP (out_FRk + i, 1, in_FRj, jwidth))
250 	    {
251 	      if (use_is_fr_complex_1 (cpu, out_FRk + i))
252 		decrease_FR_busy (cpu, out_FRk + i, 1);
253 	      else if (use_is_fr_complex_2 (cpu, out_FRk + i))
254 		decrease_FR_busy (cpu, out_FRk + i, 2);
255 	      else
256 		enforce_full_fr_latency (cpu, out_FRk + i);
257 	    }
258 	}
259     }
260 }
261 
262 static void
263 restore_float_register_busy (SIM_CPU *cpu,
264 			     INT in_FRi, int iwidth,
265 			     INT in_FRj, int jwidth,
266 			     INT out_FRk, int kwidth)
267 {
268   int i;
269   /* The latency of FRk may be less than previously recorded.
270      See Table 14-15 in the LSI.  */
271   if (in_FRi >= 0)
272     {
273       for (i = 0; i < iwidth; ++i)
274 	{
275 	  if (! REG_OVERLAP (in_FRi + i, 1, out_FRk, kwidth))
276 	    if (use_is_fr_load (cpu, in_FRi + i))
277 	      increase_FR_busy (cpu, in_FRi + i, 1);
278 	}
279     }
280 
281   if (in_FRj >= 0)
282     {
283       for (i = 0; i < jwidth; ++i)
284 	{
285 	  if (! REG_OVERLAP (in_FRj + i, 1, in_FRi, iwidth)
286 	      && ! REG_OVERLAP (in_FRj + i, 1, out_FRk, kwidth))
287 	    if (use_is_fr_load (cpu, in_FRj + i))
288 	      increase_FR_busy (cpu, in_FRj + i, 1);
289 	}
290     }
291 
292   if (out_FRk >= 0)
293     {
294       for (i = 0; i < kwidth; ++i)
295 	{
296 	  if (! REG_OVERLAP (out_FRk + i, 1, in_FRi, iwidth)
297 	      && ! REG_OVERLAP (out_FRk + i, 1, in_FRj, jwidth))
298 	    {
299 	      if (use_is_fr_complex_1 (cpu, out_FRk + i))
300 		increase_FR_busy (cpu, out_FRk + i, 1);
301 	      else if (use_is_fr_complex_2 (cpu, out_FRk + i))
302 		increase_FR_busy (cpu, out_FRk + i, 2);
303 	    }
304 	}
305     }
306 }
307 
308 /* Latency of floating point registers may be less than recorded when used in a
309    media insns and followed by another media insn.  */
310 static void
311 adjust_float_register_busy_for_media (SIM_CPU *cpu,
312 				      INT in_FRi, int iwidth,
313 				      INT in_FRj, int jwidth,
314 				      INT out_FRk, int kwidth)
315 {
316   int i;
317   /* The latency of FRk may be less than previously recorded.
318      See Table 14-15 in the LSI.  */
319   if (out_FRk >= 0)
320     {
321       for (i = 0; i < kwidth; ++i)
322 	{
323 	  if (! REG_OVERLAP (out_FRk + i, 1, in_FRi, iwidth)
324 	      && ! REG_OVERLAP (out_FRk + i, 1, in_FRj, jwidth))
325 	    {
326 	      if (use_is_fr_complex_1 (cpu, out_FRk + i))
327 		decrease_FR_busy (cpu, out_FRk + i, 1);
328 	      else
329 		enforce_full_fr_latency (cpu, out_FRk + i);
330 	    }
331 	}
332     }
333 }
334 
335 static void
336 restore_float_register_busy_for_media (SIM_CPU *cpu,
337 				       INT in_FRi, int iwidth,
338 				       INT in_FRj, int jwidth,
339 				       INT out_FRk, int kwidth)
340 {
341   int i;
342   if (out_FRk >= 0)
343     {
344       for (i = 0; i < kwidth; ++i)
345 	{
346 	  if (! REG_OVERLAP (out_FRk + i, 1, in_FRi, iwidth)
347 	      && ! REG_OVERLAP (out_FRk + i, 1, in_FRj, jwidth))
348 	    {
349 	      if (use_is_fr_complex_1 (cpu, out_FRk + i))
350 		increase_FR_busy (cpu, out_FRk + i, 1);
351 	    }
352 	}
353     }
354 }
355 
356 /* Latency of accumulator registers may be less than recorded when used in a
357    media insns and followed by another media insn.  */
358 static void
359 adjust_acc_busy_for_mmac (SIM_CPU *cpu,
360 			  INT in_ACC, int inwidth,
361 			  INT out_ACC, int outwidth)
362 {
363   int i;
364   /* The latency of an accumulator may be less than previously recorded.
365      See Table 14-15 in the LSI.  */
366   if (in_ACC >= 0)
367     {
368       for (i = 0; i < inwidth; ++i)
369 	{
370 	  if (use_is_acc_mmac (cpu, in_ACC + i))
371 	    decrease_ACC_busy (cpu, in_ACC + i, 1);
372 	  else
373 	    enforce_full_acc_latency (cpu, in_ACC + i);
374 	}
375     }
376   if (out_ACC >= 0)
377     {
378       for (i = 0; i < outwidth; ++i)
379 	{
380 	  if (! REG_OVERLAP (out_ACC + i, 1, in_ACC, inwidth))
381 	    {
382 	      if (use_is_acc_mmac (cpu, out_ACC + i))
383 		decrease_ACC_busy (cpu, out_ACC + i, 1);
384 	      else
385 		enforce_full_acc_latency (cpu, out_ACC + i);
386 	    }
387 	}
388     }
389 }
390 
391 static void
392 restore_acc_busy_for_mmac (SIM_CPU *cpu,
393 			   INT in_ACC, int inwidth,
394 			   INT out_ACC, int outwidth)
395 {
396   int i;
397   if (in_ACC >= 0)
398     {
399       for (i = 0; i < inwidth; ++i)
400 	{
401 	  if (use_is_acc_mmac (cpu, in_ACC + i))
402 	    increase_ACC_busy (cpu, in_ACC + i, 1);
403 	}
404     }
405   if (out_ACC >= 0)
406     {
407       for (i = 0; i < outwidth; ++i)
408 	{
409 	  if (! REG_OVERLAP (out_ACC + i, 1, in_ACC, inwidth))
410 	    {
411 	      if (use_is_acc_mmac (cpu, out_ACC + i))
412 		increase_ACC_busy (cpu, out_ACC + i, 1);
413 	    }
414 	}
415     }
416 }
417 
418 int
419 frvbf_model_fr550_u_exec (SIM_CPU *cpu, const IDESC *idesc,
420 			  int unit_num, int referenced)
421 {
422   return idesc->timing->units[unit_num].done;
423 }
424 
425 int
426 frvbf_model_fr550_u_integer (SIM_CPU *cpu, const IDESC *idesc,
427 			     int unit_num, int referenced,
428 			     INT in_GRi, INT in_GRj, INT out_GRk,
429 			     INT out_ICCi_1)
430 {
431   int cycles;
432 
433   /* icc0-icc4 are the upper 4 fields of the CCR.  */
434   if (out_ICCi_1 >= 0)
435     out_ICCi_1 += 4;
436 
437   if (model_insn == FRV_INSN_MODEL_PASS_1)
438     {
439       /* The entire VLIW insn must wait if there is a dependency on a register
440 	 which is not ready yet.  */
441       vliw_wait_for_GR (cpu, in_GRi);
442       vliw_wait_for_GR (cpu, in_GRj);
443       vliw_wait_for_GR (cpu, out_GRk);
444       vliw_wait_for_CCR (cpu, out_ICCi_1);
445       handle_resource_wait (cpu);
446       load_wait_for_GR (cpu, in_GRi);
447       load_wait_for_GR (cpu, in_GRj);
448       load_wait_for_GR (cpu, out_GRk);
449       trace_vliw_wait_cycles (cpu);
450       return 0;
451     }
452 
453   fr550_reset_ccr_flags (cpu, out_ICCi_1);
454 
455   /* GRk is available immediately to the next VLIW insn as is ICCi_1.  */
456   cycles = idesc->timing->units[unit_num].done;
457   return cycles;
458 }
459 
460 int
461 frvbf_model_fr550_u_imul (SIM_CPU *cpu, const IDESC *idesc,
462 			  int unit_num, int referenced,
463 			  INT in_GRi, INT in_GRj, INT out_GRk, INT out_ICCi_1)
464 {
465   int cycles;
466   /* icc0-icc4 are the upper 4 fields of the CCR.  */
467   if (out_ICCi_1 >= 0)
468     out_ICCi_1 += 4;
469 
470   if (model_insn == FRV_INSN_MODEL_PASS_1)
471     {
472       /* The entire VLIW insn must wait if there is a dependency on a register
473 	 which is not ready yet.  */
474       vliw_wait_for_GR (cpu, in_GRi);
475       vliw_wait_for_GR (cpu, in_GRj);
476       vliw_wait_for_GRdouble (cpu, out_GRk);
477       vliw_wait_for_CCR (cpu, out_ICCi_1);
478       handle_resource_wait (cpu);
479       load_wait_for_GR (cpu, in_GRi);
480       load_wait_for_GR (cpu, in_GRj);
481       load_wait_for_GRdouble (cpu, out_GRk);
482       trace_vliw_wait_cycles (cpu);
483       return 0;
484     }
485 
486   /* GRk has a latency of 1 cycles.  */
487   cycles = idesc->timing->units[unit_num].done;
488   update_GRdouble_latency (cpu, out_GRk, cycles + 1);
489 
490   /* ICCi_1 has a latency of 1 cycle.  */
491   update_CCR_latency (cpu, out_ICCi_1, cycles + 1);
492 
493   fr550_reset_ccr_flags (cpu, out_ICCi_1);
494 
495   return cycles;
496 }
497 
498 int
499 frvbf_model_fr550_u_idiv (SIM_CPU *cpu, const IDESC *idesc,
500 			  int unit_num, int referenced,
501 			  INT in_GRi, INT in_GRj, INT out_GRk, INT out_ICCi_1)
502 {
503   int cycles;
504   FRV_VLIW *vliw;
505   int slot;
506 
507   /* icc0-icc4 are the upper 4 fields of the CCR.  */
508   if (out_ICCi_1 >= 0)
509     out_ICCi_1 += 4;
510 
511   vliw = CPU_VLIW (cpu);
512   slot = vliw->next_slot - 1;
513   slot = (*vliw->current_vliw)[slot] - UNIT_I0;
514 
515   if (model_insn == FRV_INSN_MODEL_PASS_1)
516     {
517       /* The entire VLIW insn must wait if there is a dependency on a register
518 	 which is not ready yet.  */
519       vliw_wait_for_GR (cpu, in_GRi);
520       vliw_wait_for_GR (cpu, in_GRj);
521       vliw_wait_for_GR (cpu, out_GRk);
522       vliw_wait_for_CCR (cpu, out_ICCi_1);
523       vliw_wait_for_idiv_resource (cpu, slot);
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_GR (cpu, out_GRk);
528       trace_vliw_wait_cycles (cpu);
529       return 0;
530     }
531 
532   /* GRk has a latency of 18 cycles!  */
533   cycles = idesc->timing->units[unit_num].done;
534   update_GR_latency (cpu, out_GRk, cycles + 18);
535 
536   /* ICCi_1 has a latency of 18 cycles.  */
537   update_CCR_latency (cpu, out_ICCi_1, cycles + 18);
538 
539   if (CGEN_ATTR_VALUE(idesc, idesc->attrs, CGEN_INSN_NON_EXCEPTING))
540     {
541       /* GNER has a latency of 18 cycles.  */
542       update_SPR_latency (cpu, GNER_FOR_GR (out_GRk), cycles + 18);
543     }
544 
545   /* the idiv resource has a latency of 18 cycles!  */
546   update_idiv_resource_latency (cpu, slot, cycles + 18);
547 
548   fr550_reset_ccr_flags (cpu, out_ICCi_1);
549 
550   return cycles;
551 }
552 
553 int
554 frvbf_model_fr550_u_branch (SIM_CPU *cpu, const IDESC *idesc,
555 			    int unit_num, int referenced,
556 			    INT in_GRi, INT in_GRj,
557 			    INT in_ICCi_2, INT in_FCCi_2)
558 {
559   int cycles;
560   FRV_PROFILE_STATE *ps;
561 
562   if (model_insn == FRV_INSN_MODEL_PASS_1)
563     {
564       /* icc0-icc4 are the upper 4 fields of the CCR.  */
565       if (in_ICCi_2 >= 0)
566 	in_ICCi_2 += 4;
567 
568       /* The entire VLIW insn must wait if there is a dependency on a register
569 	 which is not ready yet.  */
570       vliw_wait_for_GR (cpu, in_GRi);
571       vliw_wait_for_GR (cpu, in_GRj);
572       vliw_wait_for_CCR (cpu, in_ICCi_2);
573       vliw_wait_for_CCR (cpu, in_FCCi_2);
574       handle_resource_wait (cpu);
575       load_wait_for_GR (cpu, in_GRi);
576       load_wait_for_GR (cpu, in_GRj);
577       trace_vliw_wait_cycles (cpu);
578       return 0;
579     }
580 
581   /* When counting branches taken or not taken, don't consider branches after
582      the first taken branch in a vliw insn.  */
583   ps = CPU_PROFILE_STATE (cpu);
584   if (! ps->vliw_branch_taken)
585     {
586       /* (1 << 4): The pc is the 5th element in inputs, outputs.
587 	 ??? can be cleaned up */
588       PROFILE_DATA *p = CPU_PROFILE_DATA (cpu);
589       int taken = (referenced & (1 << 4)) != 0;
590       if (taken)
591 	{
592 	  ++PROFILE_MODEL_TAKEN_COUNT (p);
593 	  ps->vliw_branch_taken = 1;
594 	}
595       else
596 	++PROFILE_MODEL_UNTAKEN_COUNT (p);
597     }
598 
599   cycles = idesc->timing->units[unit_num].done;
600   return cycles;
601 }
602 
603 int
604 frvbf_model_fr550_u_trap (SIM_CPU *cpu, const IDESC *idesc,
605 			  int unit_num, int referenced,
606 			  INT in_GRi, INT in_GRj,
607 			  INT in_ICCi_2, INT in_FCCi_2)
608 {
609   int cycles;
610 
611   if (model_insn == FRV_INSN_MODEL_PASS_1)
612     {
613       /* icc0-icc4 are the upper 4 fields of the CCR.  */
614       if (in_ICCi_2 >= 0)
615 	in_ICCi_2 += 4;
616 
617       /* The entire VLIW insn must wait if there is a dependency on a register
618 	 which is not ready yet.  */
619       vliw_wait_for_GR (cpu, in_GRi);
620       vliw_wait_for_GR (cpu, in_GRj);
621       vliw_wait_for_CCR (cpu, in_ICCi_2);
622       vliw_wait_for_CCR (cpu, in_FCCi_2);
623       handle_resource_wait (cpu);
624       load_wait_for_GR (cpu, in_GRi);
625       load_wait_for_GR (cpu, in_GRj);
626       trace_vliw_wait_cycles (cpu);
627       return 0;
628     }
629 
630   cycles = idesc->timing->units[unit_num].done;
631   return cycles;
632 }
633 
634 int
635 frvbf_model_fr550_u_check (SIM_CPU *cpu, const IDESC *idesc,
636 			   int unit_num, int referenced,
637 			   INT in_ICCi_3, INT in_FCCi_3)
638 {
639   /* Modelling for this unit is the same as for fr500.  */
640   return frvbf_model_fr500_u_check (cpu, idesc, unit_num, referenced,
641 				    in_ICCi_3, in_FCCi_3);
642 }
643 
644 int
645 frvbf_model_fr550_u_set_hilo (SIM_CPU *cpu, const IDESC *idesc,
646 			     int unit_num, int referenced,
647 			     INT out_GRkhi, INT out_GRklo)
648 {
649   int cycles;
650 
651   if (model_insn == FRV_INSN_MODEL_PASS_1)
652     {
653       /* The entire VLIW insn must wait if there is a dependency on a GR
654 	 which is not ready yet.  */
655       vliw_wait_for_GR (cpu, out_GRkhi);
656       vliw_wait_for_GR (cpu, out_GRklo);
657       handle_resource_wait (cpu);
658       load_wait_for_GR (cpu, out_GRkhi);
659       load_wait_for_GR (cpu, out_GRklo);
660       trace_vliw_wait_cycles (cpu);
661       return 0;
662     }
663 
664   /* GRk is available immediately to the next VLIW insn.  */
665   cycles = idesc->timing->units[unit_num].done;
666 
667   return cycles;
668 }
669 
670 int
671 frvbf_model_fr550_u_gr_load (SIM_CPU *cpu, const IDESC *idesc,
672 			     int unit_num, int referenced,
673 			     INT in_GRi, INT in_GRj,
674 			     INT out_GRk, INT out_GRdoublek)
675 {
676   int cycles;
677 
678   if (model_insn == FRV_INSN_MODEL_PASS_1)
679     {
680       /* The entire VLIW insn must wait if there is a dependency on a register
681 	 which is not ready yet.  */
682       vliw_wait_for_GR (cpu, in_GRi);
683       vliw_wait_for_GR (cpu, in_GRj);
684       vliw_wait_for_GR (cpu, out_GRk);
685       vliw_wait_for_GRdouble (cpu, out_GRdoublek);
686       handle_resource_wait (cpu);
687       load_wait_for_GR (cpu, in_GRi);
688       load_wait_for_GR (cpu, in_GRj);
689       load_wait_for_GR (cpu, out_GRk);
690       load_wait_for_GRdouble (cpu, out_GRdoublek);
691       trace_vliw_wait_cycles (cpu);
692       return 0;
693     }
694 
695   cycles = idesc->timing->units[unit_num].done;
696 
697   /* The latency of GRk for a load will depend on how long it takes to retrieve
698      the the data from the cache or memory.  */
699   update_GR_latency_for_load (cpu, out_GRk, cycles);
700   update_GRdouble_latency_for_load (cpu, out_GRdoublek, cycles);
701 
702   if (CGEN_ATTR_VALUE(idesc, idesc->attrs, CGEN_INSN_NON_EXCEPTING))
703     {
704       /* GNER has a latency of 2 cycles.  */
705       update_SPR_latency (cpu, GNER_FOR_GR (out_GRk), cycles + 2);
706       update_SPR_latency (cpu, GNER_FOR_GR (out_GRdoublek), cycles + 2);
707     }
708 
709   return cycles;
710 }
711 
712 int
713 frvbf_model_fr550_u_gr_store (SIM_CPU *cpu, const IDESC *idesc,
714 			      int unit_num, int referenced,
715 			      INT in_GRi, INT in_GRj,
716 			      INT in_GRk, INT in_GRdoublek)
717 {
718   int cycles;
719 
720   if (model_insn == FRV_INSN_MODEL_PASS_1)
721     {
722       /* The entire VLIW insn must wait if there is a dependency on a register
723 	 which is not ready yet.  */
724       vliw_wait_for_GR (cpu, in_GRi);
725       vliw_wait_for_GR (cpu, in_GRj);
726       vliw_wait_for_GR (cpu, in_GRk);
727       vliw_wait_for_GRdouble (cpu, in_GRdoublek);
728       handle_resource_wait (cpu);
729       load_wait_for_GR (cpu, in_GRi);
730       load_wait_for_GR (cpu, in_GRj);
731       load_wait_for_GR (cpu, in_GRk);
732       load_wait_for_GRdouble (cpu, in_GRdoublek);
733       trace_vliw_wait_cycles (cpu);
734       return 0;
735     }
736 
737   /* The target register is available immediately.  */
738   cycles = idesc->timing->units[unit_num].done;
739 
740   return cycles;
741 }
742 
743 int
744 frvbf_model_fr550_u_fr_load (SIM_CPU *cpu, const IDESC *idesc,
745 			     int unit_num, int referenced,
746 			     INT in_GRi, INT in_GRj,
747 			     INT out_FRk, INT out_FRdoublek)
748 {
749   int cycles;
750   if (model_insn == FRV_INSN_MODEL_PASS_1)
751     {
752       /* The entire VLIW insn must wait if there is a dependency on a register
753 	 which is not ready yet.
754 	 The latency of the registers may be less than previously recorded,
755 	 depending on how they were used previously.
756 	 See Table 13-8 in the LSI.  */
757       adjust_float_register_busy (cpu, -1, 1, -1, 1, out_FRk, 1);
758       adjust_float_register_busy (cpu, -1, 1, -1, 1, out_FRdoublek, 2);
759       vliw_wait_for_GR (cpu, in_GRi);
760       vliw_wait_for_GR (cpu, in_GRj);
761       vliw_wait_for_FR (cpu, out_FRk);
762       vliw_wait_for_FRdouble (cpu, out_FRdoublek);
763       if (CGEN_ATTR_VALUE(idesc, idesc->attrs, CGEN_INSN_NON_EXCEPTING))
764 	{
765 	  vliw_wait_for_SPR (cpu, FNER_FOR_FR (out_FRk));
766 	  vliw_wait_for_SPR (cpu, FNER_FOR_FR (out_FRdoublek));
767 	}
768       handle_resource_wait (cpu);
769       load_wait_for_GR (cpu, in_GRi);
770       load_wait_for_GR (cpu, in_GRj);
771       load_wait_for_FR (cpu, out_FRk);
772       load_wait_for_FRdouble (cpu, out_FRdoublek);
773       trace_vliw_wait_cycles (cpu);
774       return 0;
775     }
776 
777   cycles = idesc->timing->units[unit_num].done;
778 
779   /* The latency of FRk for a load will depend on how long it takes to retrieve
780      the the data from the cache or memory.  */
781   update_FR_latency_for_load (cpu, out_FRk, cycles);
782   update_FRdouble_latency_for_load (cpu, out_FRdoublek, cycles);
783 
784   if (CGEN_ATTR_VALUE(idesc, idesc->attrs, CGEN_INSN_NON_EXCEPTING))
785     {
786       /* FNER has a latency of 3 cycles.  */
787       update_SPR_latency (cpu, FNER_FOR_FR (out_FRk), cycles + 3);
788       update_SPR_latency (cpu, FNER_FOR_FR (out_FRdoublek), cycles + 3);
789     }
790 
791   if (out_FRk >= 0)
792     set_use_is_fr_load (cpu, out_FRk);
793   if (out_FRdoublek >= 0)
794     {
795       set_use_is_fr_load (cpu, out_FRdoublek);
796       set_use_is_fr_load (cpu, out_FRdoublek + 1);
797     }
798 
799   return cycles;
800 }
801 
802 int
803 frvbf_model_fr550_u_fr_store (SIM_CPU *cpu, const IDESC *idesc,
804 			      int unit_num, int referenced,
805 			      INT in_GRi, INT in_GRj,
806 			      INT in_FRk, INT in_FRdoublek)
807 {
808   int cycles;
809 
810   if (model_insn == FRV_INSN_MODEL_PASS_1)
811     {
812       /* The entire VLIW insn must wait if there is a dependency on a register
813 	 which is not ready yet.  */
814       adjust_float_register_busy (cpu, in_FRk, 1, -1, 1, -1, 1);
815       adjust_float_register_busy (cpu, in_FRdoublek, 2, -1, 1, -1, 1);
816       vliw_wait_for_GR (cpu, in_GRi);
817       vliw_wait_for_GR (cpu, in_GRj);
818       vliw_wait_for_FR (cpu, in_FRk);
819       vliw_wait_for_FRdouble (cpu, in_FRdoublek);
820       handle_resource_wait (cpu);
821       load_wait_for_GR (cpu, in_GRi);
822       load_wait_for_GR (cpu, in_GRj);
823       load_wait_for_FR (cpu, in_FRk);
824       load_wait_for_FRdouble (cpu, in_FRdoublek);
825       trace_vliw_wait_cycles (cpu);
826       return 0;
827     }
828 
829   /* The target register is available immediately.  */
830   cycles = idesc->timing->units[unit_num].done;
831 
832   return cycles;
833 }
834 
835 int
836 frvbf_model_fr550_u_ici (SIM_CPU *cpu, const IDESC *idesc,
837 			 int unit_num, int referenced,
838 			 INT in_GRi, INT in_GRj)
839 {
840   int cycles;
841 
842   if (model_insn == FRV_INSN_MODEL_PASS_1)
843     {
844       /* The entire VLIW insn must wait if there is a dependency on a register
845 	 which is not ready yet.  */
846       vliw_wait_for_GR (cpu, in_GRi);
847       vliw_wait_for_GR (cpu, in_GRj);
848       handle_resource_wait (cpu);
849       load_wait_for_GR (cpu, in_GRi);
850       load_wait_for_GR (cpu, in_GRj);
851       trace_vliw_wait_cycles (cpu);
852       return 0;
853     }
854 
855   cycles = idesc->timing->units[unit_num].done;
856   request_cache_invalidate (cpu, CPU_INSN_CACHE (cpu), cycles);
857   return cycles;
858 }
859 
860 int
861 frvbf_model_fr550_u_dci (SIM_CPU *cpu, const IDESC *idesc,
862 			 int unit_num, int referenced,
863 			 INT in_GRi, INT in_GRj)
864 {
865   int cycles;
866 
867   if (model_insn == FRV_INSN_MODEL_PASS_1)
868     {
869       /* The entire VLIW insn must wait if there is a dependency on a register
870 	 which is not ready yet.  */
871       vliw_wait_for_GR (cpu, in_GRi);
872       vliw_wait_for_GR (cpu, in_GRj);
873       handle_resource_wait (cpu);
874       load_wait_for_GR (cpu, in_GRi);
875       load_wait_for_GR (cpu, in_GRj);
876       trace_vliw_wait_cycles (cpu);
877       return 0;
878     }
879 
880   cycles = idesc->timing->units[unit_num].done;
881   request_cache_invalidate (cpu, CPU_DATA_CACHE (cpu), cycles);
882   return cycles;
883 }
884 
885 int
886 frvbf_model_fr550_u_dcf (SIM_CPU *cpu, const IDESC *idesc,
887 			 int unit_num, int referenced,
888 			 INT in_GRi, INT in_GRj)
889 {
890   int cycles;
891 
892   if (model_insn == FRV_INSN_MODEL_PASS_1)
893     {
894       /* The entire VLIW insn must wait if there is a dependency on a register
895 	 which is not ready yet.  */
896       vliw_wait_for_GR (cpu, in_GRi);
897       vliw_wait_for_GR (cpu, in_GRj);
898       handle_resource_wait (cpu);
899       load_wait_for_GR (cpu, in_GRi);
900       load_wait_for_GR (cpu, in_GRj);
901       trace_vliw_wait_cycles (cpu);
902       return 0;
903     }
904 
905   cycles = idesc->timing->units[unit_num].done;
906   request_cache_flush (cpu, CPU_DATA_CACHE (cpu), cycles);
907   return cycles;
908 }
909 
910 int
911 frvbf_model_fr550_u_icpl (SIM_CPU *cpu, const IDESC *idesc,
912 			  int unit_num, int referenced,
913 			  INT in_GRi, INT in_GRj)
914 {
915   int cycles;
916 
917   if (model_insn == FRV_INSN_MODEL_PASS_1)
918     {
919       /* The entire VLIW insn must wait if there is a dependency on a register
920 	 which is not ready yet.  */
921       vliw_wait_for_GR (cpu, in_GRi);
922       vliw_wait_for_GR (cpu, in_GRj);
923       handle_resource_wait (cpu);
924       load_wait_for_GR (cpu, in_GRi);
925       load_wait_for_GR (cpu, in_GRj);
926       trace_vliw_wait_cycles (cpu);
927       return 0;
928     }
929 
930   cycles = idesc->timing->units[unit_num].done;
931   request_cache_preload (cpu, CPU_INSN_CACHE (cpu), cycles);
932   return cycles;
933 }
934 
935 int
936 frvbf_model_fr550_u_dcpl (SIM_CPU *cpu, const IDESC *idesc,
937 			  int unit_num, int referenced,
938 			  INT in_GRi, INT in_GRj)
939 {
940   int cycles;
941 
942   if (model_insn == FRV_INSN_MODEL_PASS_1)
943     {
944       /* The entire VLIW insn must wait if there is a dependency on a register
945 	 which is not ready yet.  */
946       vliw_wait_for_GR (cpu, in_GRi);
947       vliw_wait_for_GR (cpu, in_GRj);
948       handle_resource_wait (cpu);
949       load_wait_for_GR (cpu, in_GRi);
950       load_wait_for_GR (cpu, in_GRj);
951       trace_vliw_wait_cycles (cpu);
952       return 0;
953     }
954 
955   cycles = idesc->timing->units[unit_num].done;
956   request_cache_preload (cpu, CPU_DATA_CACHE (cpu), cycles);
957   return cycles;
958 }
959 
960 int
961 frvbf_model_fr550_u_icul (SIM_CPU *cpu, const IDESC *idesc,
962 			  int unit_num, int referenced,
963 			  INT in_GRi, INT in_GRj)
964 {
965   int cycles;
966 
967   if (model_insn == FRV_INSN_MODEL_PASS_1)
968     {
969       /* The entire VLIW insn must wait if there is a dependency on a register
970 	 which is not ready yet.  */
971       vliw_wait_for_GR (cpu, in_GRi);
972       vliw_wait_for_GR (cpu, in_GRj);
973       handle_resource_wait (cpu);
974       load_wait_for_GR (cpu, in_GRi);
975       load_wait_for_GR (cpu, in_GRj);
976       trace_vliw_wait_cycles (cpu);
977       return 0;
978     }
979 
980   cycles = idesc->timing->units[unit_num].done;
981   request_cache_unlock (cpu, CPU_INSN_CACHE (cpu), cycles);
982   return cycles;
983 }
984 
985 int
986 frvbf_model_fr550_u_dcul (SIM_CPU *cpu, const IDESC *idesc,
987 			  int unit_num, int referenced,
988 			  INT in_GRi, INT in_GRj)
989 {
990   int cycles;
991 
992   if (model_insn == FRV_INSN_MODEL_PASS_1)
993     {
994       /* The entire VLIW insn must wait if there is a dependency on a register
995 	 which is not ready yet.  */
996       vliw_wait_for_GR (cpu, in_GRi);
997       vliw_wait_for_GR (cpu, in_GRj);
998       handle_resource_wait (cpu);
999       load_wait_for_GR (cpu, in_GRi);
1000       load_wait_for_GR (cpu, in_GRj);
1001       trace_vliw_wait_cycles (cpu);
1002       return 0;
1003     }
1004 
1005   cycles = idesc->timing->units[unit_num].done;
1006   request_cache_unlock (cpu, CPU_DATA_CACHE (cpu), cycles);
1007   return cycles;
1008 }
1009 
1010 int
1011 frvbf_model_fr550_u_float_arith (SIM_CPU *cpu, const IDESC *idesc,
1012 				 int unit_num, int referenced,
1013 				 INT in_FRi, INT in_FRj,
1014 				 INT in_FRdoublei, INT in_FRdoublej,
1015 				 INT out_FRk, INT out_FRdoublek)
1016 {
1017   int cycles;
1018   FRV_PROFILE_STATE *ps;
1019   FRV_VLIW *vliw;
1020   int slot;
1021 
1022   if (model_insn == FRV_INSN_MODEL_PASS_1)
1023     return 0;
1024 
1025   /* The preprocessing can execute right away.  */
1026   cycles = idesc->timing->units[unit_num].done;
1027 
1028   /* The post processing must wait if there is a dependency on a FR
1029      which is not ready yet.  */
1030   adjust_float_register_busy (cpu, in_FRi, 1, in_FRj, 1, out_FRk, 1);
1031   adjust_float_register_busy (cpu, in_FRdoublei, 2, in_FRdoublej, 2, out_FRdoublek, 2);
1032   ps = CPU_PROFILE_STATE (cpu);
1033   ps->post_wait = cycles;
1034   vliw = CPU_VLIW (cpu);
1035   slot = vliw->next_slot - 1;
1036   slot = (*vliw->current_vliw)[slot] - UNIT_FM0;
1037   post_wait_for_float (cpu, slot);
1038   post_wait_for_FR (cpu, in_FRi);
1039   post_wait_for_FR (cpu, in_FRj);
1040   post_wait_for_FR (cpu, out_FRk);
1041   post_wait_for_FRdouble (cpu, in_FRdoublei);
1042   post_wait_for_FRdouble (cpu, in_FRdoublej);
1043   post_wait_for_FRdouble (cpu, out_FRdoublek);
1044   if (CGEN_ATTR_VALUE(idesc, idesc->attrs, CGEN_INSN_NON_EXCEPTING))
1045     {
1046       post_wait_for_SPR (cpu, FNER_FOR_FR (out_FRk));
1047       post_wait_for_SPR (cpu, FNER_FOR_FR (out_FRdoublek));
1048     }
1049   restore_float_register_busy (cpu, in_FRi, 1, in_FRj, 1, out_FRk, 1);
1050   restore_float_register_busy (cpu, in_FRdoublei, 2, in_FRdoublej, 2, out_FRdoublek, 2);
1051 
1052   /* The latency of FRk will be at least the latency of the other inputs.  */
1053   update_FR_latency (cpu, out_FRk, ps->post_wait);
1054   update_FRdouble_latency (cpu, out_FRdoublek, ps->post_wait);
1055 
1056   if (CGEN_ATTR_VALUE(idesc, idesc->attrs, CGEN_INSN_NON_EXCEPTING))
1057     {
1058       update_SPR_latency (cpu, FNER_FOR_FR (out_FRk), ps->post_wait);
1059       update_SPR_latency (cpu, FNER_FOR_FR (out_FRdoublek), ps->post_wait);
1060     }
1061 
1062   /* Once initiated, post-processing will take 2 cycles.  */
1063   update_FR_ptime (cpu, out_FRk, 2);
1064   update_FRdouble_ptime (cpu, out_FRdoublek, 2);
1065   if (CGEN_ATTR_VALUE(idesc, idesc->attrs, CGEN_INSN_NON_EXCEPTING))
1066     {
1067       update_SPR_ptime (cpu, FNER_FOR_FR (out_FRk), 2);
1068       update_SPR_ptime (cpu, FNER_FOR_FR (out_FRdoublek), 2);
1069     }
1070 
1071   /* Mark this use of the register as a floating point op.  */
1072   if (out_FRk >= 0)
1073     set_use_is_fr_complex_2 (cpu, out_FRk);
1074   if (out_FRdoublek >= 0)
1075     {
1076       set_use_is_fr_complex_2 (cpu, out_FRdoublek);
1077       if (out_FRdoublek < 63)
1078 	set_use_is_fr_complex_2 (cpu, out_FRdoublek + 1);
1079     }
1080 
1081   /* the media point unit resource has a latency of 4 cycles  */
1082   update_media_resource_latency (cpu, slot, cycles + 4);
1083 
1084   return cycles;
1085 }
1086 
1087 int
1088 frvbf_model_fr550_u_float_dual_arith (SIM_CPU *cpu, const IDESC *idesc,
1089 				      int unit_num, int referenced,
1090 				      INT in_FRi, INT in_FRj,
1091 				      INT in_FRdoublei, INT in_FRdoublej,
1092 				      INT out_FRk, INT out_FRdoublek)
1093 {
1094   int cycles;
1095   INT dual_FRi;
1096   INT dual_FRj;
1097   INT dual_FRk;
1098   INT dual_FRdoublei;
1099   INT dual_FRdoublej;
1100   INT dual_FRdoublek;
1101   FRV_PROFILE_STATE *ps;
1102   FRV_VLIW *vliw;
1103   int slot;
1104 
1105   if (model_insn == FRV_INSN_MODEL_PASS_1)
1106     return 0;
1107 
1108   /* The preprocessing can execute right away.  */
1109   cycles = idesc->timing->units[unit_num].done;
1110 
1111   /* The post processing must wait if there is a dependency on a FR
1112      which is not ready yet.  */
1113   dual_FRi = DUAL_REG (in_FRi);
1114   dual_FRj = DUAL_REG (in_FRj);
1115   dual_FRk = DUAL_REG (out_FRk);
1116   dual_FRdoublei = DUAL_DOUBLE (in_FRdoublei);
1117   dual_FRdoublej = DUAL_DOUBLE (in_FRdoublej);
1118   dual_FRdoublek = DUAL_DOUBLE (out_FRdoublek);
1119 
1120   adjust_float_register_busy (cpu, in_FRi, 2, in_FRj, 2, out_FRk, 2);
1121   adjust_float_register_busy (cpu, in_FRdoublei, 4, in_FRdoublej, 4, out_FRdoublek, 4);
1122   ps = CPU_PROFILE_STATE (cpu);
1123   ps->post_wait = cycles;
1124   vliw = CPU_VLIW (cpu);
1125   slot = vliw->next_slot - 1;
1126   slot = (*vliw->current_vliw)[slot] - UNIT_FM0;
1127   post_wait_for_float (cpu, slot);
1128   post_wait_for_FR (cpu, in_FRi);
1129   post_wait_for_FR (cpu, in_FRj);
1130   post_wait_for_FR (cpu, out_FRk);
1131   post_wait_for_FR (cpu, dual_FRi);
1132   post_wait_for_FR (cpu, dual_FRj);
1133   post_wait_for_FR (cpu, dual_FRk);
1134   post_wait_for_FRdouble (cpu, in_FRdoublei);
1135   post_wait_for_FRdouble (cpu, in_FRdoublej);
1136   post_wait_for_FRdouble (cpu, out_FRdoublek);
1137   post_wait_for_FRdouble (cpu, dual_FRdoublei);
1138   post_wait_for_FRdouble (cpu, dual_FRdoublej);
1139   post_wait_for_FRdouble (cpu, dual_FRdoublek);
1140   if (CGEN_ATTR_VALUE(idesc, idesc->attrs, CGEN_INSN_NON_EXCEPTING))
1141     {
1142       post_wait_for_SPR (cpu, FNER_FOR_FR (out_FRk));
1143       post_wait_for_SPR (cpu, FNER_FOR_FR (dual_FRk));
1144       post_wait_for_SPR (cpu, FNER_FOR_FR (out_FRdoublek));
1145       post_wait_for_SPR (cpu, FNER_FOR_FR (dual_FRdoublek));
1146     }
1147   restore_float_register_busy (cpu, in_FRi, 2, in_FRj, 2, out_FRk, 2);
1148   restore_float_register_busy (cpu, in_FRdoublei, 4, in_FRdoublej, 4, out_FRdoublek, 4);
1149 
1150   /* The latency of FRk will be at least the latency of the other inputs.  */
1151   update_FR_latency (cpu, out_FRk, ps->post_wait);
1152   update_FR_latency (cpu, dual_FRk, ps->post_wait);
1153   update_FRdouble_latency (cpu, out_FRdoublek, ps->post_wait);
1154   update_FRdouble_latency (cpu, dual_FRdoublek, ps->post_wait);
1155 
1156   if (CGEN_ATTR_VALUE(idesc, idesc->attrs, CGEN_INSN_NON_EXCEPTING))
1157     {
1158       update_SPR_latency (cpu, FNER_FOR_FR (out_FRk), ps->post_wait);
1159       update_SPR_latency (cpu, FNER_FOR_FR (dual_FRk), ps->post_wait);
1160       update_SPR_latency (cpu, FNER_FOR_FR (out_FRdoublek), ps->post_wait);
1161       update_SPR_latency (cpu, FNER_FOR_FR (dual_FRdoublek), ps->post_wait);
1162     }
1163 
1164   /* Once initiated, post-processing will take 3 cycles.  */
1165   update_FR_ptime (cpu, out_FRk, 3);
1166   update_FR_ptime (cpu, dual_FRk, 3);
1167   update_FRdouble_ptime (cpu, out_FRdoublek, 3);
1168   update_FRdouble_ptime (cpu, dual_FRdoublek, 3);
1169 
1170   if (CGEN_ATTR_VALUE(idesc, idesc->attrs, CGEN_INSN_NON_EXCEPTING))
1171     {
1172       update_SPR_ptime (cpu, FNER_FOR_FR (out_FRk), 3);
1173       update_SPR_ptime (cpu, FNER_FOR_FR (dual_FRk), 3);
1174       update_SPR_ptime (cpu, FNER_FOR_FR (out_FRdoublek), 3);
1175       update_SPR_ptime (cpu, FNER_FOR_FR (dual_FRdoublek), 3);
1176     }
1177 
1178   /* Mark this use of the register as a floating point op.  */
1179   if (out_FRk >= 0)
1180     fr550_reset_fr_flags (cpu, out_FRk);
1181   if (dual_FRk >= 0)
1182     fr550_reset_fr_flags (cpu, dual_FRk);
1183   if (out_FRdoublek >= 0)
1184     {
1185       fr550_reset_fr_flags (cpu, out_FRdoublek);
1186       if (out_FRdoublek < 63)
1187 	fr550_reset_fr_flags (cpu, out_FRdoublek + 1);
1188     }
1189   if (dual_FRdoublek >= 0)
1190     {
1191       fr550_reset_fr_flags (cpu, dual_FRdoublek);
1192       if (dual_FRdoublek < 63)
1193 	fr550_reset_fr_flags (cpu, dual_FRdoublek + 1);
1194     }
1195 
1196   /* the media point unit resource has a latency of 5 cycles  */
1197   update_media_resource_latency (cpu, slot, cycles + 5);
1198 
1199   return cycles;
1200 }
1201 
1202 int
1203 frvbf_model_fr550_u_float_div (SIM_CPU *cpu, const IDESC *idesc,
1204 			       int unit_num, int referenced,
1205 			       INT in_FRi, INT in_FRj, INT out_FRk)
1206 {
1207   int cycles;
1208   FRV_VLIW *vliw;
1209   int slot;
1210   FRV_PROFILE_STATE *ps;
1211 
1212   if (model_insn == FRV_INSN_MODEL_PASS_1)
1213     return 0;
1214 
1215   cycles = idesc->timing->units[unit_num].done;
1216 
1217   /* The post processing must wait if there is a dependency on a FR
1218      which is not ready yet.  */
1219   adjust_float_register_busy (cpu, in_FRi, 1, in_FRj, 1, out_FRk, 1);
1220   ps = CPU_PROFILE_STATE (cpu);
1221   ps->post_wait = cycles;
1222   vliw = CPU_VLIW (cpu);
1223   slot = vliw->next_slot - 1;
1224   slot = (*vliw->current_vliw)[slot] - UNIT_FM0;
1225   post_wait_for_float (cpu, slot);
1226   post_wait_for_fdiv (cpu, slot);
1227   post_wait_for_FR (cpu, in_FRi);
1228   post_wait_for_FR (cpu, in_FRj);
1229   post_wait_for_FR (cpu, out_FRk);
1230   if (CGEN_ATTR_VALUE(idesc, idesc->attrs, CGEN_INSN_NON_EXCEPTING))
1231     post_wait_for_SPR (cpu, FNER_FOR_FR (out_FRk));
1232   restore_float_register_busy (cpu, in_FRi, 1, in_FRj, 1, out_FRk, 1);
1233 
1234   /* The latency of FRk will be at least the latency of the other inputs.  */
1235   /* Once initiated, post-processing will take 9 cycles.  */
1236   update_FR_latency (cpu, out_FRk, ps->post_wait);
1237   update_FR_ptime (cpu, out_FRk, 9);
1238 
1239   if (CGEN_ATTR_VALUE(idesc, idesc->attrs, CGEN_INSN_NON_EXCEPTING))
1240     {
1241       /* FNER has a latency of 9 cycles.  */
1242       update_SPR_latency (cpu, FNER_FOR_FR (out_FRk), ps->post_wait);
1243       update_SPR_ptime (cpu, FNER_FOR_FR (out_FRk), 9);
1244     }
1245 
1246   /* The latency of the fdiv unit will be at least the latency of the other
1247      inputs.  Once initiated, post-processing will take 9 cycles.  */
1248   update_fdiv_resource_latency (cpu, slot, ps->post_wait + 9);
1249 
1250   /* the media point unit resource has a latency of 11 cycles  */
1251   update_media_resource_latency (cpu, slot, cycles + 11);
1252 
1253   fr550_reset_fr_flags (cpu, out_FRk);
1254 
1255   return cycles;
1256 }
1257 
1258 int
1259 frvbf_model_fr550_u_float_sqrt (SIM_CPU *cpu, const IDESC *idesc,
1260 				int unit_num, int referenced,
1261 				INT in_FRj, INT in_FRdoublej,
1262 				INT out_FRk, INT out_FRdoublek)
1263 {
1264   int cycles;
1265   FRV_VLIW *vliw;
1266   int slot;
1267   FRV_PROFILE_STATE *ps;
1268 
1269   if (model_insn == FRV_INSN_MODEL_PASS_1)
1270     return 0;
1271 
1272   cycles = idesc->timing->units[unit_num].done;
1273 
1274   /* The post processing must wait if there is a dependency on a FR
1275      which is not ready yet.  */
1276   adjust_float_register_busy (cpu, -1, 1, in_FRj, 1, out_FRk, 1);
1277   adjust_float_register_busy (cpu, -1, 1, in_FRdoublej, 2, out_FRdoublek, 2);
1278   ps = CPU_PROFILE_STATE (cpu);
1279   ps->post_wait = cycles;
1280   vliw = CPU_VLIW (cpu);
1281   slot = vliw->next_slot - 1;
1282   slot = (*vliw->current_vliw)[slot] - UNIT_FM0;
1283   post_wait_for_float (cpu, slot);
1284   post_wait_for_fsqrt (cpu, slot);
1285   post_wait_for_FR (cpu, in_FRj);
1286   post_wait_for_FR (cpu, out_FRk);
1287   post_wait_for_FRdouble (cpu, in_FRdoublej);
1288   post_wait_for_FRdouble (cpu, out_FRdoublek);
1289   if (CGEN_ATTR_VALUE(idesc, idesc->attrs, CGEN_INSN_NON_EXCEPTING))
1290     {
1291       post_wait_for_SPR (cpu, FNER_FOR_FR (out_FRk));
1292       post_wait_for_SPR (cpu, FNER_FOR_FR (out_FRdoublek));
1293     }
1294   restore_float_register_busy (cpu, -1, 1, in_FRj, 1, out_FRk, 1);
1295   restore_float_register_busy (cpu, -1, 1, in_FRdoublej, 2, out_FRdoublek, 2);
1296 
1297   /* The latency of FRk will be at least the latency of the other inputs.  */
1298   update_FR_latency (cpu, out_FRk, ps->post_wait);
1299   update_FRdouble_latency (cpu, out_FRdoublek, ps->post_wait);
1300 
1301   if (CGEN_ATTR_VALUE(idesc, idesc->attrs, CGEN_INSN_NON_EXCEPTING))
1302     {
1303       /* FNER has a latency of 14 cycles.  */
1304       update_SPR_latency (cpu, FNER_FOR_FR (out_FRk), ps->post_wait);
1305       update_SPR_latency (cpu, FNER_FOR_FR (out_FRdoublek), ps->post_wait);
1306     }
1307 
1308   /* Once initiated, post-processing will take 14 cycles.  */
1309   update_FR_ptime (cpu, out_FRk, 14);
1310   update_FRdouble_ptime (cpu, out_FRdoublek, 14);
1311 
1312   if (CGEN_ATTR_VALUE(idesc, idesc->attrs, CGEN_INSN_NON_EXCEPTING))
1313     {
1314       /* FNER has a latency of 14 cycles.  */
1315       update_SPR_ptime (cpu, FNER_FOR_FR (out_FRk), 14);
1316       update_SPR_ptime (cpu, FNER_FOR_FR (out_FRdoublek), 14);
1317     }
1318 
1319   /* The latency of the sqrt unit will be the latency of the other
1320      inputs plus 14 cycles.  */
1321   update_fsqrt_resource_latency (cpu, slot, ps->post_wait + 14);
1322 
1323   fr550_reset_fr_flags (cpu, out_FRk);
1324   if (out_FRdoublek != -1)
1325     {
1326       fr550_reset_fr_flags (cpu, out_FRdoublek);
1327       fr550_reset_fr_flags (cpu, out_FRdoublek + 1);
1328     }
1329 
1330   /* the media point unit resource has a latency of 16 cycles  */
1331   update_media_resource_latency (cpu, slot, cycles + 16);
1332 
1333   return cycles;
1334 }
1335 
1336 int
1337 frvbf_model_fr550_u_float_compare (SIM_CPU *cpu, const IDESC *idesc,
1338 				   int unit_num, int referenced,
1339 				   INT in_FRi, INT in_FRj,
1340 				   INT in_FRdoublei, INT in_FRdoublej,
1341 				   INT out_FCCi_2)
1342 {
1343   int cycles;
1344   FRV_PROFILE_STATE *ps;
1345   FRV_VLIW *vliw;
1346   int slot;
1347 
1348   if (model_insn == FRV_INSN_MODEL_PASS_1)
1349     return 0;
1350 
1351   /* The preprocessing can execute right away.  */
1352   cycles = idesc->timing->units[unit_num].done;
1353 
1354   /* The post processing must wait if there is a dependency on a FR
1355      which is not ready yet.  */
1356   adjust_float_register_busy (cpu, in_FRi, 1, in_FRj, 1, -1, 1);
1357   adjust_float_register_busy (cpu, in_FRdoublei, 2, in_FRdoublej, 2, -1, 1);
1358   ps = CPU_PROFILE_STATE (cpu);
1359   ps->post_wait = cycles;
1360   vliw = CPU_VLIW (cpu);
1361   slot = vliw->next_slot - 1;
1362   slot = (*vliw->current_vliw)[slot] - UNIT_FM0;
1363   post_wait_for_float (cpu, slot);
1364   post_wait_for_FR (cpu, in_FRi);
1365   post_wait_for_FR (cpu, in_FRj);
1366   post_wait_for_FRdouble (cpu, in_FRdoublei);
1367   post_wait_for_FRdouble (cpu, in_FRdoublej);
1368   post_wait_for_CCR (cpu, out_FCCi_2);
1369   restore_float_register_busy (cpu, in_FRi, 1, in_FRj, 1, -1, 1);
1370   restore_float_register_busy (cpu, in_FRdoublei, 2, in_FRdoublej, 2, -1, 1);
1371 
1372   /* The latency of FCCi_2 will be the latency of the other inputs plus 2
1373      cycles.  */
1374   update_CCR_latency (cpu, out_FCCi_2, ps->post_wait + 2);
1375 
1376   /* the media point unit resource has a latency of 4 cycles  */
1377   update_media_resource_latency (cpu, slot, cycles + 4);
1378 
1379   set_use_is_ccr_complex (cpu, out_FCCi_2);
1380 
1381   return cycles;
1382 }
1383 
1384 int
1385 frvbf_model_fr550_u_float_dual_compare (SIM_CPU *cpu, const IDESC *idesc,
1386 					int unit_num, int referenced,
1387 					INT in_FRi, INT in_FRj,
1388 					INT out_FCCi_2)
1389 {
1390   int cycles;
1391   INT dual_FRi;
1392   INT dual_FRj;
1393   INT dual_FCCi_2;
1394   FRV_PROFILE_STATE *ps;
1395   FRV_VLIW *vliw;
1396   int slot;
1397 
1398   if (model_insn == FRV_INSN_MODEL_PASS_1)
1399     return 0;
1400 
1401   /* The preprocessing can execute right away.  */
1402   cycles = idesc->timing->units[unit_num].done;
1403 
1404   /* The post processing must wait if there is a dependency on a FR
1405      which is not ready yet.  */
1406   ps = CPU_PROFILE_STATE (cpu);
1407   ps->post_wait = cycles;
1408   dual_FRi = DUAL_REG (in_FRi);
1409   dual_FRj = DUAL_REG (in_FRj);
1410   dual_FCCi_2 = out_FCCi_2 + 1;
1411   adjust_float_register_busy (cpu, in_FRi, 2, in_FRj, 2, -1, 1);
1412   vliw = CPU_VLIW (cpu);
1413   slot = vliw->next_slot - 1;
1414   slot = (*vliw->current_vliw)[slot] - UNIT_FM0;
1415   post_wait_for_float (cpu, slot);
1416   post_wait_for_FR (cpu, in_FRi);
1417   post_wait_for_FR (cpu, in_FRj);
1418   post_wait_for_FR (cpu, dual_FRi);
1419   post_wait_for_FR (cpu, dual_FRj);
1420   post_wait_for_CCR (cpu, out_FCCi_2);
1421   post_wait_for_CCR (cpu, dual_FCCi_2);
1422   restore_float_register_busy (cpu, in_FRi, 2, in_FRj, 2, -1, 1);
1423 
1424   /* The latency of FCCi_2 will be the latency of the other inputs plus 3
1425      cycles.  */
1426   update_CCR_latency (cpu, out_FCCi_2, ps->post_wait + 3);
1427   update_CCR_latency (cpu, dual_FCCi_2, ps->post_wait + 3);
1428 
1429   set_use_is_ccr_complex (cpu, out_FCCi_2);
1430   if (dual_FCCi_2 >= 0)
1431     set_use_is_ccr_complex (cpu, dual_FCCi_2);
1432 
1433   /* the media point unit resource has a latency of 5 cycles  */
1434   update_media_resource_latency (cpu, slot, cycles + 5);
1435 
1436   return cycles;
1437 }
1438 
1439 int
1440 frvbf_model_fr550_u_float_convert (SIM_CPU *cpu, const IDESC *idesc,
1441 				   int unit_num, int referenced,
1442 				   INT in_FRj, INT in_FRintj, INT in_FRdoublej,
1443 				   INT out_FRk, INT out_FRintk,
1444 				   INT out_FRdoublek)
1445 {
1446   int cycles;
1447   FRV_PROFILE_STATE *ps;
1448   FRV_VLIW *vliw;
1449   int slot;
1450 
1451   if (model_insn == FRV_INSN_MODEL_PASS_1)
1452     return 0;
1453 
1454   /* The preprocessing can execute right away.  */
1455   cycles = idesc->timing->units[unit_num].done;
1456 
1457   /* The post processing must wait if there is a dependency on a FR
1458      which is not ready yet.  */
1459   ps = CPU_PROFILE_STATE (cpu);
1460   ps->post_wait = cycles;
1461   adjust_float_register_busy (cpu, -1, 1, in_FRj, 1, out_FRk, 1);
1462   adjust_float_register_busy (cpu, -1, 1, in_FRintj, 1, out_FRintk, 1);
1463   adjust_float_register_busy (cpu, -1, 1, in_FRdoublej, 2, out_FRdoublek, 2);
1464   vliw = CPU_VLIW (cpu);
1465   slot = vliw->next_slot - 1;
1466   slot = (*vliw->current_vliw)[slot] - UNIT_FM0;
1467   post_wait_for_float (cpu, slot);
1468   post_wait_for_FR (cpu, in_FRj);
1469   post_wait_for_FR (cpu, in_FRintj);
1470   post_wait_for_FRdouble (cpu, in_FRdoublej);
1471   post_wait_for_FR (cpu, out_FRk);
1472   post_wait_for_FR (cpu, out_FRintk);
1473   post_wait_for_FRdouble (cpu, out_FRdoublek);
1474   if (CGEN_ATTR_VALUE(idesc, idesc->attrs, CGEN_INSN_NON_EXCEPTING))
1475     {
1476       post_wait_for_SPR (cpu, FNER_FOR_FR (out_FRk));
1477       post_wait_for_SPR (cpu, FNER_FOR_FR (out_FRintk));
1478       post_wait_for_SPR (cpu, FNER_FOR_FR (out_FRdoublek));
1479     }
1480   restore_float_register_busy (cpu, -1, 1, in_FRj, 1, out_FRk, 1);
1481   restore_float_register_busy (cpu, -1, 1, in_FRintj, 1, out_FRintk, 1);
1482   restore_float_register_busy (cpu, -1, 1, in_FRdoublej, 2, out_FRdoublek, 2);
1483 
1484   /* The latency of FRk will be at least the latency of the other inputs.  */
1485   update_FR_latency (cpu, out_FRk, ps->post_wait);
1486   update_FR_latency (cpu, out_FRintk, ps->post_wait);
1487   update_FRdouble_latency (cpu, out_FRdoublek, ps->post_wait);
1488 
1489   if (CGEN_ATTR_VALUE(idesc, idesc->attrs, CGEN_INSN_NON_EXCEPTING))
1490     {
1491       update_SPR_latency (cpu, FNER_FOR_FR (out_FRk), ps->post_wait);
1492       update_SPR_latency (cpu, FNER_FOR_FR (out_FRintk), ps->post_wait);
1493       update_SPR_latency (cpu, FNER_FOR_FR (out_FRdoublek), ps->post_wait);
1494     }
1495 
1496   /* Once initiated, post-processing will take 2 cycles.  */
1497   update_FR_ptime (cpu, out_FRk, 2);
1498   update_FR_ptime (cpu, out_FRintk, 2);
1499   update_FRdouble_ptime (cpu, out_FRdoublek, 2);
1500 
1501   if (CGEN_ATTR_VALUE(idesc, idesc->attrs, CGEN_INSN_NON_EXCEPTING))
1502     {
1503       update_SPR_ptime (cpu, FNER_FOR_FR (out_FRk), 2);
1504       update_SPR_ptime (cpu, FNER_FOR_FR (out_FRintk), 2);
1505       update_SPR_ptime (cpu, FNER_FOR_FR (out_FRdoublek), 2);
1506     }
1507 
1508   /* Mark this use of the register as a floating point op.  */
1509   if (out_FRk >= 0)
1510     set_use_is_fr_complex_2 (cpu, out_FRk);
1511   if (out_FRintk >= 0)
1512     set_use_is_fr_complex_2 (cpu, out_FRintk);
1513   if (out_FRdoublek >= 0)
1514     {
1515       set_use_is_fr_complex_2 (cpu, out_FRdoublek);
1516       set_use_is_fr_complex_2 (cpu, out_FRdoublek + 1);
1517     }
1518 
1519   /* the media point unit resource has a latency of 4 cycles  */
1520   update_media_resource_latency (cpu, slot, cycles + 4);
1521 
1522   return cycles;
1523 }
1524 
1525 int
1526 frvbf_model_fr550_u_spr2gr (SIM_CPU *cpu, const IDESC *idesc,
1527 			    int unit_num, int referenced,
1528 			    INT in_spr, INT out_GRj)
1529 {
1530   /* Modelling for this unit is the same as for fr500.  */
1531   return frvbf_model_fr500_u_spr2gr (cpu, idesc, unit_num, referenced,
1532 				     in_spr, out_GRj);
1533 }
1534 
1535 int
1536 frvbf_model_fr550_u_gr2spr (SIM_CPU *cpu, const IDESC *idesc,
1537 			    int unit_num, int referenced,
1538 			    INT in_GRj, INT out_spr)
1539 {
1540   int cycles;
1541 
1542   if (model_insn == FRV_INSN_MODEL_PASS_1)
1543     {
1544       /* The entire VLIW insn must wait if there is a dependency on a register
1545 	 which is not ready yet.  */
1546       vliw_wait_for_GR (cpu, in_GRj);
1547       vliw_wait_for_SPR (cpu, out_spr);
1548       handle_resource_wait (cpu);
1549       load_wait_for_GR (cpu, in_GRj);
1550       trace_vliw_wait_cycles (cpu);
1551       return 0;
1552     }
1553 
1554   cycles = idesc->timing->units[unit_num].done;
1555 
1556 #if 0
1557   /* The latency of spr is ? cycles.  */
1558   update_SPR_latency (cpu, out_spr, cycles + ?);
1559 #endif
1560 
1561   return cycles;
1562 }
1563 
1564 int
1565 frvbf_model_fr550_u_gr2fr (SIM_CPU *cpu, const IDESC *idesc,
1566 			   int unit_num, int referenced,
1567 			   INT in_GRj, INT out_FRk)
1568 {
1569   int cycles;
1570 
1571   if (model_insn == FRV_INSN_MODEL_PASS_1)
1572     {
1573       /* The entire VLIW insn must wait if there is a dependency on a register
1574 	 which is not ready yet.
1575 	 The latency of the registers may be less than previously recorded,
1576 	 depending on how they were used previously.
1577 	 See Table 14-15 in the LSI.  */
1578       adjust_float_register_busy (cpu, -1, 1, -1, 1, out_FRk, 1);
1579       vliw_wait_for_GR (cpu, in_GRj);
1580       vliw_wait_for_FR (cpu, out_FRk);
1581       handle_resource_wait (cpu);
1582       load_wait_for_GR (cpu, in_GRj);
1583       load_wait_for_FR (cpu, out_FRk);
1584       trace_vliw_wait_cycles (cpu);
1585       return 0;
1586     }
1587 
1588   /* The latency of FRk is 1 cycles.  */
1589   cycles = idesc->timing->units[unit_num].done;
1590   update_FR_latency (cpu, out_FRk, cycles + 1);
1591 
1592   set_use_is_fr_complex_1 (cpu, out_FRk);
1593 
1594   return cycles;
1595 }
1596 
1597 int
1598 frvbf_model_fr550_u_swap (SIM_CPU *cpu, const IDESC *idesc,
1599 			  int unit_num, int referenced,
1600 			  INT in_GRi, INT in_GRj, INT out_GRk)
1601 {
1602   int cycles;
1603 
1604   if (model_insn == FRV_INSN_MODEL_PASS_1)
1605     {
1606       /* The entire VLIW insn must wait if there is a dependency on a register
1607 	 which is not ready yet.  */
1608       vliw_wait_for_GR (cpu, in_GRi);
1609       vliw_wait_for_GR (cpu, in_GRj);
1610       vliw_wait_for_GR (cpu, out_GRk);
1611       handle_resource_wait (cpu);
1612       load_wait_for_GR (cpu, in_GRi);
1613       load_wait_for_GR (cpu, in_GRj);
1614       load_wait_for_GR (cpu, out_GRk);
1615       trace_vliw_wait_cycles (cpu);
1616       return 0;
1617     }
1618 
1619   cycles = idesc->timing->units[unit_num].done;
1620 
1621   /* The latency of GRk will depend on how long it takes to swap
1622      the the data from the cache or memory.  */
1623   update_GR_latency_for_swap (cpu, out_GRk, cycles);
1624 
1625   return cycles;
1626 }
1627 
1628 int
1629 frvbf_model_fr550_u_fr2fr (SIM_CPU *cpu, const IDESC *idesc,
1630 			   int unit_num, int referenced,
1631 			   INT in_FRj, INT out_FRk)
1632 {
1633   int cycles;
1634 
1635   if (model_insn == FRV_INSN_MODEL_PASS_1)
1636     {
1637       /* The entire VLIW insn must wait if there is a dependency on a register
1638 	 which is not ready yet.
1639 	 The latency of the registers may be less than previously recorded,
1640 	 depending on how they were used previously.
1641 	 See Table 14-15 in the LSI.  */
1642       adjust_float_register_busy (cpu, -1, 1, in_FRj, 1, out_FRk, 1);
1643       vliw_wait_for_FR (cpu, in_FRj);
1644       vliw_wait_for_FR (cpu, out_FRk);
1645       handle_resource_wait (cpu);
1646       load_wait_for_FR (cpu, in_FRj);
1647       load_wait_for_FR (cpu, out_FRk);
1648       trace_vliw_wait_cycles (cpu);
1649       return 0;
1650     }
1651 
1652   /* The latency of FRj is 2 cycles.  */
1653   cycles = idesc->timing->units[unit_num].done;
1654   update_FR_latency (cpu, out_FRk, cycles + 2);
1655 
1656   set_use_is_fr_complex_2 (cpu, out_FRk);
1657 
1658   return cycles;
1659 }
1660 
1661 int
1662 frvbf_model_fr550_u_fr2gr (SIM_CPU *cpu, const IDESC *idesc,
1663 			   int unit_num, int referenced,
1664 			   INT in_FRk, INT out_GRj)
1665 {
1666   int cycles;
1667 
1668   if (model_insn == FRV_INSN_MODEL_PASS_1)
1669     {
1670       /* The entire VLIW insn must wait if there is a dependency on a register
1671 	 which is not ready yet.
1672 	 The latency of the registers may be less than previously recorded,
1673 	 depending on how they were used previously.
1674 	 See Table 14-15 in the LSI.  */
1675       adjust_float_register_busy (cpu, in_FRk, 1, -1, 1, -1, 1);
1676       vliw_wait_for_FR (cpu, in_FRk);
1677       vliw_wait_for_GR (cpu, out_GRj);
1678       handle_resource_wait (cpu);
1679       load_wait_for_FR (cpu, in_FRk);
1680       load_wait_for_GR (cpu, out_GRj);
1681       trace_vliw_wait_cycles (cpu);
1682       return 0;
1683     }
1684 
1685   /* The latency of GRj is 1 cycle.  */
1686   cycles = idesc->timing->units[unit_num].done;
1687   update_GR_latency (cpu, out_GRj, cycles + 1);
1688 
1689   return cycles;
1690 }
1691 
1692 int
1693 frvbf_model_fr550_u_clrgr (SIM_CPU *cpu, const IDESC *idesc,
1694 			   int unit_num, int referenced,
1695 			   INT in_GRk)
1696 {
1697   /* Modelling for this unit is the same as for fr500.  */
1698   return frvbf_model_fr500_u_clrgr (cpu, idesc, unit_num, referenced, in_GRk);
1699 }
1700 
1701 int
1702 frvbf_model_fr550_u_clrfr (SIM_CPU *cpu, const IDESC *idesc,
1703 			   int unit_num, int referenced,
1704 			   INT in_FRk)
1705 {
1706   /* Modelling for this unit is the same as for fr500.  */
1707   return frvbf_model_fr500_u_clrfr (cpu, idesc, unit_num, referenced, in_FRk);
1708 }
1709 
1710 int
1711 frvbf_model_fr550_u_commit (SIM_CPU *cpu, const IDESC *idesc,
1712 			    int unit_num, int referenced,
1713 			    INT in_GRk, INT in_FRk)
1714 {
1715   /* Modelling for this unit is the same as for fr500.  */
1716   return frvbf_model_fr500_u_commit (cpu, idesc, unit_num, referenced,
1717 				     in_GRk, in_FRk);
1718 }
1719 
1720 int
1721 frvbf_model_fr550_u_media (SIM_CPU *cpu, const IDESC *idesc,
1722 			   int unit_num, int referenced,
1723 			   INT in_FRi, INT in_FRj, INT out_FRk)
1724 {
1725   int cycles;
1726   FRV_PROFILE_STATE *ps;
1727   FRV_VLIW *vliw;
1728   int slot;
1729 
1730   if (model_insn == FRV_INSN_MODEL_PASS_1)
1731     return 0;
1732 
1733   /* The preprocessing can execute right away.  */
1734   cycles = idesc->timing->units[unit_num].done;
1735 
1736   /* If the previous use of the registers was a media op,
1737      then their latency may be less than previously recorded.
1738      See Table 14-15 in the LSI.  */
1739   adjust_float_register_busy_for_media (cpu, in_FRi, 1, in_FRj, 1, out_FRk, 1);
1740 
1741   /* The post processing must wait if there is a dependency on a FR
1742      which is not ready yet.  */
1743   ps = CPU_PROFILE_STATE (cpu);
1744   ps->post_wait = cycles;
1745   vliw = CPU_VLIW (cpu);
1746   slot = vliw->next_slot - 1;
1747   slot = (*vliw->current_vliw)[slot] - UNIT_FM0;
1748   post_wait_for_media (cpu, slot);
1749   post_wait_for_FR (cpu, in_FRi);
1750   post_wait_for_FR (cpu, in_FRj);
1751   post_wait_for_FR (cpu, out_FRk);
1752 
1753   /* Restore the busy cycles of the registers we used.  */
1754   restore_float_register_busy_for_media (cpu, in_FRi, 1, in_FRj, 1, out_FRk, 1);
1755 
1756   /* The latency of tht output register will be at least the latency of the
1757      other inputs.  Once initiated, post-processing will take 1 cycle.  */
1758   if (out_FRk >= 0)
1759     {
1760       update_FR_latency (cpu, out_FRk, ps->post_wait);
1761       update_FR_ptime (cpu, out_FRk, 1);
1762       /* Mark this use of the register as a media op.  */
1763       set_use_is_fr_complex_1 (cpu, out_FRk);
1764     }
1765 
1766   /* the floating point unit resource has a latency of 3 cycles  */
1767   update_float_resource_latency (cpu, slot, cycles + 3);
1768 
1769   return cycles;
1770 }
1771 
1772 int
1773 frvbf_model_fr550_u_media_quad (SIM_CPU *cpu, const IDESC *idesc,
1774 				int unit_num, int referenced,
1775 				INT in_FRi, INT in_FRj,
1776 				INT out_FRk)
1777 {
1778   int cycles;
1779   INT dual_FRi;
1780   INT dual_FRj;
1781   INT dual_FRk;
1782   FRV_PROFILE_STATE *ps;
1783   FRV_VLIW *vliw;
1784   int slot;
1785 
1786   if (model_insn == FRV_INSN_MODEL_PASS_1)
1787     return 0;
1788 
1789   /* The preprocessing can execute right away.  */
1790   cycles = idesc->timing->units[unit_num].done;
1791 
1792   dual_FRi = DUAL_REG (in_FRi);
1793   dual_FRj = DUAL_REG (in_FRj);
1794   dual_FRk = DUAL_REG (out_FRk);
1795 
1796   /* The latency of the registers may be less than previously recorded,
1797      depending on how they were used previously.
1798      See Table 14-15 in the LSI.  */
1799   adjust_float_register_busy_for_media (cpu, in_FRi, 2, in_FRj, 2, out_FRk, 2);
1800 
1801   /* The post processing must wait if there is a dependency on a FR
1802      which is not ready yet.  */
1803   ps = CPU_PROFILE_STATE (cpu);
1804   ps->post_wait = cycles;
1805   vliw = CPU_VLIW (cpu);
1806   slot = vliw->next_slot - 1;
1807   slot = (*vliw->current_vliw)[slot] - UNIT_FM0;
1808   post_wait_for_media (cpu, slot);
1809   post_wait_for_FR (cpu, in_FRi);
1810   post_wait_for_FR (cpu, dual_FRi);
1811   post_wait_for_FR (cpu, in_FRj);
1812   post_wait_for_FR (cpu, dual_FRj);
1813   post_wait_for_FR (cpu, out_FRk);
1814   post_wait_for_FR (cpu, dual_FRk);
1815 
1816   /* Restore the busy cycles of the registers we used.  */
1817   restore_float_register_busy_for_media (cpu, in_FRi, 2, in_FRj, 2, out_FRk, 2);
1818 
1819   /* The latency of the output register will be at least the latency of the
1820      other inputs.  Once initiated, post-processing take 1 cycle.  */
1821   update_FR_latency (cpu, out_FRk, ps->post_wait);
1822   update_FR_ptime (cpu, out_FRk, 1);
1823   set_use_is_fr_complex_1 (cpu, out_FRk);
1824 
1825   if (dual_FRk >= 0)
1826     {
1827       update_FR_latency (cpu, dual_FRk, ps->post_wait);
1828       update_FR_ptime (cpu, dual_FRk, 1);
1829       set_use_is_fr_complex_1 (cpu, dual_FRk);
1830     }
1831 
1832   /* the floating point unit resource has a latency of 3 cycles  */
1833   update_float_resource_latency (cpu, slot, cycles + 3);
1834 
1835   return cycles;
1836 }
1837 
1838 int
1839 frvbf_model_fr550_u_media_dual_expand (SIM_CPU *cpu, const IDESC *idesc,
1840 				       int unit_num, int referenced,
1841 				       INT in_FRi, INT out_FRk)
1842 {
1843   int cycles;
1844   INT dual_FRk;
1845   FRV_PROFILE_STATE *ps;
1846   FRV_VLIW *vliw;
1847   int slot;
1848 
1849   if (model_insn == FRV_INSN_MODEL_PASS_1)
1850     return 0;
1851 
1852   /* The preprocessing can execute right away.  */
1853   cycles = idesc->timing->units[unit_num].done;
1854 
1855   /* If the previous use of the registers was a media op,
1856      then their latency will be less than previously recorded.
1857      See Table 14-15 in the LSI.  */
1858   dual_FRk = DUAL_REG (out_FRk);
1859   adjust_float_register_busy_for_media (cpu, in_FRi, 1, -1, 1, out_FRk, 2);
1860 
1861   /* The post processing must wait if there is a dependency on a FR
1862      which is not ready yet.  */
1863   ps = CPU_PROFILE_STATE (cpu);
1864   ps->post_wait = cycles;
1865   vliw = CPU_VLIW (cpu);
1866   slot = vliw->next_slot - 1;
1867   slot = (*vliw->current_vliw)[slot] - UNIT_FM0;
1868   post_wait_for_media (cpu, slot);
1869   post_wait_for_FR (cpu, in_FRi);
1870   post_wait_for_FR (cpu, out_FRk);
1871   post_wait_for_FR (cpu, dual_FRk);
1872 
1873   /* Restore the busy cycles of the registers we used.  */
1874   restore_float_register_busy_for_media (cpu, in_FRi, 1, -1, 1, out_FRk, 2);
1875 
1876   /* The latency of the output register will be at least the latency of the
1877      other inputs.  Once initiated, post-processing will take 1 cycle.  */
1878   update_FR_latency (cpu, out_FRk, ps->post_wait);
1879   update_FR_ptime (cpu, out_FRk, 1);
1880   set_use_is_fr_complex_1 (cpu, out_FRk);
1881 
1882   if (dual_FRk >= 0)
1883     {
1884       update_FR_latency (cpu, dual_FRk, ps->post_wait);
1885       update_FR_ptime (cpu, dual_FRk, 1);
1886       set_use_is_fr_complex_1 (cpu, dual_FRk);
1887     }
1888 
1889   /* the floating point unit resource has a latency of 3 cycles  */
1890   update_float_resource_latency (cpu, slot, cycles + 3);
1891 
1892   return cycles;
1893 }
1894 
1895 int
1896 frvbf_model_fr550_u_media_3_dual (SIM_CPU *cpu, const IDESC *idesc,
1897 				  int unit_num, int referenced,
1898 				  INT in_FRi, INT out_FRk)
1899 {
1900   int cycles;
1901   INT dual_FRi;
1902   FRV_PROFILE_STATE *ps;
1903   FRV_VLIW *vliw;
1904   int slot;
1905 
1906   if (model_insn == FRV_INSN_MODEL_PASS_1)
1907     return 0;
1908 
1909   /* The preprocessing can execute right away.  */
1910   cycles = idesc->timing->units[unit_num].done;
1911 
1912   dual_FRi = DUAL_REG (in_FRi);
1913 
1914   /* The latency of the registers may be less than previously recorded,
1915      depending on how they were used previously.
1916      See Table 14-15 in the LSI.  */
1917   adjust_float_register_busy_for_media (cpu, in_FRi, 2, -1, 1, out_FRk, 1);
1918 
1919   /* The post processing must wait if there is a dependency on a FR
1920      which is not ready yet.  */
1921   ps = CPU_PROFILE_STATE (cpu);
1922   ps->post_wait = cycles;
1923   vliw = CPU_VLIW (cpu);
1924   slot = vliw->next_slot - 1;
1925   slot = (*vliw->current_vliw)[slot] - UNIT_FM0;
1926   post_wait_for_media (cpu, slot);
1927   post_wait_for_FR (cpu, in_FRi);
1928   post_wait_for_FR (cpu, dual_FRi);
1929   post_wait_for_FR (cpu, out_FRk);
1930 
1931   /* Restore the busy cycles of the registers we used.  */
1932   restore_float_register_busy_for_media (cpu, in_FRi, 2, -1, 1, out_FRk, 1);
1933 
1934   /* The latency of the output register will be at least the latency of the
1935      other inputs.  Once initiated, post-processing takes 1 cycle.  */
1936   update_FR_latency (cpu, out_FRk, ps->post_wait);
1937   update_FR_ptime (cpu, out_FRk, 1);
1938 
1939   set_use_is_fr_complex_1 (cpu, out_FRk);
1940 
1941   /* the floating point unit resource has a latency of 3 cycles  */
1942   update_float_resource_latency (cpu, slot, cycles + 3);
1943 
1944   return cycles;
1945 }
1946 
1947 int
1948 frvbf_model_fr550_u_media_3_acc (SIM_CPU *cpu, const IDESC *idesc,
1949 				 int unit_num, int referenced,
1950 				 INT in_FRj, INT in_ACC40Si,
1951 				 INT out_FRk)
1952 {
1953   int cycles;
1954   FRV_PROFILE_STATE *ps;
1955   FRV_VLIW *vliw;
1956   int slot;
1957 
1958   if (model_insn == FRV_INSN_MODEL_PASS_1)
1959     return 0;
1960 
1961   /* The preprocessing can execute right away.  */
1962   cycles = idesc->timing->units[unit_num].done;
1963 
1964   /* If the previous use of the registers was a media op,
1965      then their latency will be less than previously recorded.
1966      See Table 14-15 in the LSI.  */
1967   adjust_float_register_busy_for_media (cpu, -1, 1, in_FRj, 1, out_FRk, 1);
1968 
1969   /* The post processing must wait if there is a dependency on a FR
1970      which is not ready yet.  */
1971   ps = CPU_PROFILE_STATE (cpu);
1972   ps->post_wait = cycles;
1973   vliw = CPU_VLIW (cpu);
1974   slot = vliw->next_slot - 1;
1975   slot = (*vliw->current_vliw)[slot] - UNIT_FM0;
1976   post_wait_for_media (cpu, slot);
1977   post_wait_for_FR (cpu, in_FRj);
1978   post_wait_for_FR (cpu, out_FRk);
1979   post_wait_for_ACC (cpu, in_ACC40Si);
1980 
1981   /* Restore the busy cycles of the registers we used.  */
1982   restore_float_register_busy_for_media (cpu, -1, 1, in_FRj, 1, out_FRk, 1);
1983 
1984   /* The latency of tht output register will be at least the latency of the
1985      other inputs.  Once initiated, post-processing will take 1 cycle.  */
1986   update_FR_latency (cpu, out_FRk, ps->post_wait);
1987   update_FR_ptime (cpu, out_FRk, 1);
1988 
1989   set_use_is_fr_complex_1 (cpu, out_FRk);
1990 
1991   /* the floating point unit resource has a latency of 3 cycles  */
1992   update_float_resource_latency (cpu, slot, cycles + 3);
1993 
1994   return cycles;
1995 }
1996 
1997 int
1998 frvbf_model_fr550_u_media_3_acc_dual (SIM_CPU *cpu, const IDESC *idesc,
1999 				      int unit_num, int referenced,
2000 				      INT in_ACC40Si, INT out_FRk)
2001 {
2002   int cycles;
2003   FRV_PROFILE_STATE *ps;
2004   INT ACC40Si_1;
2005   INT dual_FRk;
2006   FRV_VLIW *vliw;
2007   int slot;
2008 
2009   if (model_insn == FRV_INSN_MODEL_PASS_1)
2010     return 0;
2011 
2012   /* The preprocessing can execute right away.  */
2013   cycles = idesc->timing->units[unit_num].done;
2014 
2015   ACC40Si_1 = DUAL_REG (in_ACC40Si);
2016   dual_FRk = DUAL_REG (out_FRk);
2017 
2018   /* If the previous use of the registers was a media op,
2019      then their latency will be less than previously recorded.
2020      See Table 14-15 in the LSI.  */
2021   adjust_float_register_busy_for_media (cpu, -1, 1, -1, 1, out_FRk, 2);
2022 
2023   /* The post processing must wait if there is a dependency on a FR
2024      which is not ready yet.  */
2025   ps = CPU_PROFILE_STATE (cpu);
2026   ps->post_wait = cycles;
2027   vliw = CPU_VLIW (cpu);
2028   slot = vliw->next_slot - 1;
2029   slot = (*vliw->current_vliw)[slot] - UNIT_FM0;
2030   post_wait_for_media (cpu, slot);
2031   post_wait_for_ACC (cpu, in_ACC40Si);
2032   post_wait_for_ACC (cpu, ACC40Si_1);
2033   post_wait_for_FR (cpu, out_FRk);
2034   post_wait_for_FR (cpu, dual_FRk);
2035 
2036   /* Restore the busy cycles of the registers we used.  */
2037   restore_float_register_busy_for_media (cpu, -1, 1, -1, 1, out_FRk, 2);
2038 
2039   /* The latency of the output register will be at least the latency of the
2040      other inputs.  Once initiated, post-processing will take 1 cycle.  */
2041   update_FR_latency (cpu, out_FRk, ps->post_wait);
2042   update_FR_ptime (cpu, out_FRk, 1);
2043   set_use_is_fr_complex_1 (cpu, out_FRk);
2044   if (dual_FRk >= 0)
2045     {
2046       update_FR_latency (cpu, dual_FRk, ps->post_wait);
2047       update_FR_ptime (cpu, dual_FRk, 1);
2048       set_use_is_fr_complex_1 (cpu, dual_FRk);
2049     }
2050 
2051   /* the floating point unit resource has a latency of 3 cycles  */
2052   update_float_resource_latency (cpu, slot, cycles + 3);
2053 
2054   return cycles;
2055 }
2056 
2057 int
2058 frvbf_model_fr550_u_media_3_wtacc (SIM_CPU *cpu, const IDESC *idesc,
2059 				   int unit_num, int referenced,
2060 				   INT in_FRi, INT out_ACC40Sk)
2061 {
2062   int cycles;
2063   FRV_PROFILE_STATE *ps;
2064   FRV_VLIW *vliw;
2065   int slot;
2066 
2067   if (model_insn == FRV_INSN_MODEL_PASS_1)
2068     return 0;
2069 
2070   /* The preprocessing can execute right away.  */
2071   cycles = idesc->timing->units[unit_num].done;
2072 
2073   ps = CPU_PROFILE_STATE (cpu);
2074 
2075   /* The latency of the registers may be less than previously recorded,
2076      depending on how they were used previously.
2077      See Table 14-15 in the LSI.  */
2078   adjust_float_register_busy_for_media (cpu, in_FRi, 1, -1, 1, -1, 1);
2079 
2080   /* The post processing must wait if there is a dependency on a FR
2081      which is not ready yet.  */
2082   ps->post_wait = cycles;
2083   vliw = CPU_VLIW (cpu);
2084   slot = vliw->next_slot - 1;
2085   slot = (*vliw->current_vliw)[slot] - UNIT_FM0;
2086   post_wait_for_media (cpu, slot);
2087   post_wait_for_FR (cpu, in_FRi);
2088   post_wait_for_ACC (cpu, out_ACC40Sk);
2089 
2090   /* Restore the busy cycles of the registers we used.  */
2091   restore_float_register_busy_for_media (cpu, in_FRi, 1, -1, 1, -1, 1);
2092 
2093   /* The latency of the output register will be at least the latency of the
2094      other inputs.  Once initiated, post-processing will take 1 cycle.  */
2095   update_ACC_latency (cpu, out_ACC40Sk, ps->post_wait);
2096   update_ACC_ptime (cpu, out_ACC40Sk, 1);
2097   set_use_is_acc_mmac (cpu, out_ACC40Sk);
2098 
2099   /* the floating point unit resource has a latency of 3 cycles  */
2100   update_float_resource_latency (cpu, slot, cycles + 3);
2101 
2102   return cycles;
2103 }
2104 
2105 int
2106 frvbf_model_fr550_u_media_3_mclracc (SIM_CPU *cpu, const IDESC *idesc,
2107 				     int unit_num, int referenced)
2108 {
2109   int cycles;
2110   FRV_PROFILE_STATE *ps;
2111   FRV_VLIW *vliw;
2112   int slot;
2113   int i;
2114 
2115   if (model_insn == FRV_INSN_MODEL_PASS_1)
2116     return 0;
2117 
2118   /* The preprocessing can execute right away.  */
2119   cycles = idesc->timing->units[unit_num].done;
2120 
2121   ps = CPU_PROFILE_STATE (cpu);
2122 
2123   /* The post processing must wait if there is a dependency on a FR
2124      which is not ready yet.  */
2125   ps->post_wait = cycles;
2126   vliw = CPU_VLIW (cpu);
2127   slot = vliw->next_slot - 1;
2128   slot = (*vliw->current_vliw)[slot] - UNIT_FM0;
2129   post_wait_for_media (cpu, slot);
2130 
2131   /* If A was 1 and the accumulator was ACC0, then we must check all
2132      accumulators. Otherwise just wait for the specified accumulator.  */
2133   if (ps->mclracc_A && ps->mclracc_acc == 0)
2134     {
2135       for (i = 0; i < 8; ++i)
2136 	post_wait_for_ACC (cpu, i);
2137     }
2138   else
2139     post_wait_for_ACC (cpu, ps->mclracc_acc);
2140 
2141   /* The latency of the output registers will be at least the latency of the
2142      other inputs.  Once initiated, post-processing will take 1 cycle.  */
2143   if (ps->mclracc_A && ps->mclracc_acc == 0)
2144     {
2145       for (i = 0; i < 8; ++i)
2146 	{
2147 	  update_ACC_latency (cpu, i, ps->post_wait);
2148 	  update_ACC_ptime (cpu, i, 1);
2149 	  set_use_is_acc_mmac (cpu, i);
2150 	}
2151     }
2152   else
2153     {
2154       update_ACC_latency (cpu, ps->mclracc_acc, ps->post_wait);
2155       update_ACC_ptime (cpu, ps->mclracc_acc, 1);
2156       set_use_is_acc_mmac (cpu, ps->mclracc_acc);
2157     }
2158 
2159   /* the floating point unit resource has a latency of 3 cycles  */
2160   update_float_resource_latency (cpu, slot, cycles + 3);
2161 
2162   return cycles;
2163 }
2164 
2165 int
2166 frvbf_model_fr550_u_media_set (SIM_CPU *cpu, const IDESC *idesc,
2167 			       int unit_num, int referenced,
2168 			       INT out_FRk)
2169 {
2170   int cycles;
2171   FRV_PROFILE_STATE *ps;
2172   FRV_VLIW *vliw;
2173   int slot;
2174 
2175   if (model_insn == FRV_INSN_MODEL_PASS_1)
2176     return 0;
2177 
2178   /* The preprocessing can execute right away.  */
2179   cycles = idesc->timing->units[unit_num].done;
2180 
2181   /* If the previous use of the registers was a media op,
2182      then their latency will be less than previously recorded.
2183      See Table 14-15 in the LSI.  */
2184   adjust_float_register_busy_for_media (cpu, -1, 1, -1, 1, out_FRk, 1);
2185 
2186   /* The post processing must wait if there is a dependency on a FR
2187      which is not ready yet.  */
2188   ps = CPU_PROFILE_STATE (cpu);
2189   ps->post_wait = cycles;
2190   vliw = CPU_VLIW (cpu);
2191   slot = vliw->next_slot - 1;
2192   slot = (*vliw->current_vliw)[slot] - UNIT_FM0;
2193   post_wait_for_media (cpu, slot);
2194   post_wait_for_FR (cpu, out_FRk);
2195 
2196   /* Restore the busy cycles of the registers we used.  */
2197   restore_float_register_busy_for_media (cpu, -1, 1, -1, 1, out_FRk, 1);
2198 
2199   /* The latency of the output register will be at least the latency of the
2200      other inputs.  Once initiated, post-processing takes 1 cycle.  */
2201   update_FR_latency (cpu, out_FRk, ps->post_wait);
2202   update_FR_ptime (cpu, out_FRk, 1);
2203   fr550_reset_acc_flags (cpu, out_FRk);
2204 
2205   /* the floating point unit resource has a latency of 3 cycles  */
2206   update_float_resource_latency (cpu, slot, cycles + 3);
2207 
2208   return cycles;
2209 }
2210 
2211 int
2212 frvbf_model_fr550_u_media_4 (SIM_CPU *cpu, const IDESC *idesc,
2213 			     int unit_num, int referenced,
2214 			     INT in_FRi, INT in_FRj,
2215 			     INT out_ACC40Sk, INT out_ACC40Uk)
2216 {
2217   int cycles;
2218   INT dual_ACC40Sk;
2219   INT dual_ACC40Uk;
2220   FRV_PROFILE_STATE *ps;
2221   FRV_VLIW *vliw;
2222   int slot;
2223 
2224   if (model_insn == FRV_INSN_MODEL_PASS_1)
2225     return 0;
2226 
2227   /* The preprocessing can execute right away.  */
2228   cycles = idesc->timing->units[unit_num].done;
2229 
2230   ps = CPU_PROFILE_STATE (cpu);
2231   dual_ACC40Sk = DUAL_REG (out_ACC40Sk);
2232   dual_ACC40Uk = DUAL_REG (out_ACC40Uk);
2233 
2234   /* The latency of the registers may be less than previously recorded,
2235      depending on how they were used previously.
2236      See Table 14-15 in the LSI.  */
2237   adjust_acc_busy_for_mmac (cpu, -1, 1, out_ACC40Sk, 2);
2238   adjust_acc_busy_for_mmac (cpu, -1, 1, out_ACC40Uk, 2);
2239 
2240   /* The post processing must wait if there is a dependency on a FR
2241      which is not ready yet.  */
2242   ps->post_wait = cycles;
2243   vliw = CPU_VLIW (cpu);
2244   slot = vliw->next_slot - 1;
2245   slot = (*vliw->current_vliw)[slot] - UNIT_FM0;
2246   post_wait_for_media (cpu, slot);
2247   post_wait_for_FR (cpu, in_FRi);
2248   post_wait_for_FR (cpu, in_FRj);
2249   post_wait_for_ACC (cpu, out_ACC40Sk);
2250   post_wait_for_ACC (cpu, dual_ACC40Sk);
2251   post_wait_for_ACC (cpu, out_ACC40Uk);
2252   post_wait_for_ACC (cpu, dual_ACC40Uk);
2253 
2254   /* Restore the busy cycles of the registers we used.  */
2255   restore_acc_busy_for_mmac (cpu, -1, 1, out_ACC40Sk, 2);
2256   restore_acc_busy_for_mmac (cpu, -1, 1, out_ACC40Uk, 2);
2257 
2258   /* The latency of the output register will be at least the latency of the
2259      other inputs.  Once initiated, post-processing will take 1 cycles.  */
2260   if (out_ACC40Sk >= 0)
2261     {
2262       update_ACC_latency (cpu, out_ACC40Sk, ps->post_wait + 1);
2263       set_use_is_acc_mmac (cpu, out_ACC40Sk);
2264     }
2265   if (dual_ACC40Sk >= 0)
2266     {
2267       update_ACC_latency (cpu, dual_ACC40Sk, ps->post_wait + 1);
2268       set_use_is_acc_mmac (cpu, dual_ACC40Sk);
2269     }
2270   if (out_ACC40Uk >= 0)
2271     {
2272       update_ACC_latency (cpu, out_ACC40Uk, ps->post_wait + 1);
2273       set_use_is_acc_mmac (cpu, out_ACC40Uk);
2274     }
2275   if (dual_ACC40Uk >= 0)
2276     {
2277       update_ACC_latency (cpu, dual_ACC40Uk, ps->post_wait + 1);
2278       set_use_is_acc_mmac (cpu, dual_ACC40Uk);
2279     }
2280 
2281   /* the floating point unit resource has a latency of 3 cycles  */
2282   update_float_resource_latency (cpu, slot, cycles + 3);
2283 
2284   return cycles;
2285 }
2286 
2287 int
2288 frvbf_model_fr550_u_media_4_acc (SIM_CPU *cpu, const IDESC *idesc,
2289 				 int unit_num, int referenced,
2290 				 INT in_ACC40Si, INT out_ACC40Sk)
2291 {
2292   int cycles;
2293   INT ACC40Si_1;
2294   FRV_PROFILE_STATE *ps;
2295   FRV_VLIW *vliw;
2296   int slot;
2297 
2298   if (model_insn == FRV_INSN_MODEL_PASS_1)
2299     return 0;
2300 
2301   /* The preprocessing can execute right away.  */
2302   cycles = idesc->timing->units[unit_num].done;
2303 
2304   ACC40Si_1 = DUAL_REG (in_ACC40Si);
2305 
2306   ps = CPU_PROFILE_STATE (cpu);
2307   /* The latency of the registers may be less than previously recorded,
2308      depending on how they were used previously.
2309      See Table 14-15 in the LSI.  */
2310   adjust_acc_busy_for_mmac (cpu, in_ACC40Si, 2, out_ACC40Sk, 1);
2311 
2312   /* The post processing must wait if there is a dependency on a register
2313      which is not ready yet.  */
2314   ps->post_wait = cycles;
2315   vliw = CPU_VLIW (cpu);
2316   slot = vliw->next_slot - 1;
2317   slot = (*vliw->current_vliw)[slot] - UNIT_FM0;
2318   post_wait_for_media (cpu, slot);
2319   post_wait_for_ACC (cpu, in_ACC40Si);
2320   post_wait_for_ACC (cpu, ACC40Si_1);
2321   post_wait_for_ACC (cpu, out_ACC40Sk);
2322 
2323   /* Restore the busy cycles of the registers we used.  */
2324   restore_acc_busy_for_mmac (cpu, in_ACC40Si, 2, out_ACC40Sk, 1);
2325 
2326   /* The latency of the output register will be at least the latency of the
2327      other inputs.  Once initiated, post-processing will take 1 cycle.  */
2328   update_ACC_latency (cpu, out_ACC40Sk, ps->post_wait + 1);
2329   set_use_is_acc_mmac (cpu, out_ACC40Sk);
2330 
2331   /* the floating point unit resource has a latency of 3 cycles  */
2332   update_float_resource_latency (cpu, slot, cycles + 3);
2333 
2334   return cycles;
2335 }
2336 
2337 int
2338 frvbf_model_fr550_u_media_4_acc_dual (SIM_CPU *cpu, const IDESC *idesc,
2339 				      int unit_num, int referenced,
2340 				      INT in_ACC40Si, INT out_ACC40Sk)
2341 {
2342   int cycles;
2343   INT ACC40Si_1;
2344   INT ACC40Si_2;
2345   INT ACC40Si_3;
2346   INT ACC40Sk_1;
2347   FRV_PROFILE_STATE *ps;
2348   FRV_VLIW *vliw;
2349   int slot;
2350 
2351   if (model_insn == FRV_INSN_MODEL_PASS_1)
2352     return 0;
2353 
2354   /* The preprocessing can execute right away.  */
2355   cycles = idesc->timing->units[unit_num].done;
2356 
2357   ACC40Si_1 = DUAL_REG (in_ACC40Si);
2358   ACC40Si_2 = DUAL_REG (ACC40Si_1);
2359   ACC40Si_3 = DUAL_REG (ACC40Si_2);
2360   ACC40Sk_1 = DUAL_REG (out_ACC40Sk);
2361 
2362   ps = CPU_PROFILE_STATE (cpu);
2363   /* The latency of the registers may be less than previously recorded,
2364      depending on how they were used previously.
2365      See Table 14-15 in the LSI.  */
2366   adjust_acc_busy_for_mmac (cpu, in_ACC40Si, 4, out_ACC40Sk, 2);
2367 
2368   /* The post processing must wait if there is a dependency on a register
2369      which is not ready yet.  */
2370   ps->post_wait = cycles;
2371   vliw = CPU_VLIW (cpu);
2372   slot = vliw->next_slot - 1;
2373   slot = (*vliw->current_vliw)[slot] - UNIT_FM0;
2374   post_wait_for_media (cpu, slot);
2375   post_wait_for_ACC (cpu, in_ACC40Si);
2376   post_wait_for_ACC (cpu, ACC40Si_1);
2377   post_wait_for_ACC (cpu, ACC40Si_2);
2378   post_wait_for_ACC (cpu, ACC40Si_3);
2379   post_wait_for_ACC (cpu, out_ACC40Sk);
2380   post_wait_for_ACC (cpu, ACC40Sk_1);
2381 
2382   /* Restore the busy cycles of the registers we used.  */
2383   restore_acc_busy_for_mmac (cpu, in_ACC40Si, 4, out_ACC40Sk, 2);
2384 
2385   /* The latency of the output register will be at least the latency of the
2386      other inputs.  Once initiated, post-processing will take 1 cycle.  */
2387   update_ACC_latency (cpu, out_ACC40Sk, ps->post_wait + 1);
2388   set_use_is_acc_mmac (cpu, out_ACC40Sk);
2389   if (ACC40Sk_1 >= 0)
2390     {
2391       update_ACC_latency (cpu, ACC40Sk_1, ps->post_wait + 1);
2392       set_use_is_acc_mmac (cpu, ACC40Sk_1);
2393     }
2394 
2395   /* the floating point unit resource has a latency of 3 cycles  */
2396   update_float_resource_latency (cpu, slot, cycles + 3);
2397 
2398   return cycles;
2399 }
2400 
2401 int
2402 frvbf_model_fr550_u_media_4_add_sub (SIM_CPU *cpu, const IDESC *idesc,
2403 				     int unit_num, int referenced,
2404 				     INT in_ACC40Si, INT out_ACC40Sk)
2405 {
2406   int cycles;
2407   INT ACC40Si_1;
2408   INT ACC40Sk_1;
2409   FRV_PROFILE_STATE *ps;
2410   FRV_VLIW *vliw;
2411   int slot;
2412 
2413   if (model_insn == FRV_INSN_MODEL_PASS_1)
2414     return 0;
2415 
2416   /* The preprocessing can execute right away.  */
2417   cycles = idesc->timing->units[unit_num].done;
2418 
2419   ACC40Si_1 = DUAL_REG (in_ACC40Si);
2420   ACC40Sk_1 = DUAL_REG (out_ACC40Sk);
2421 
2422   ps = CPU_PROFILE_STATE (cpu);
2423   /* The latency of the registers may be less than previously recorded,
2424      depending on how they were used previously.
2425      See Table 14-15 in the LSI.  */
2426   adjust_acc_busy_for_mmac (cpu, in_ACC40Si, 2, out_ACC40Sk, 2);
2427 
2428   /* The post processing must wait if there is a dependency on a register
2429      which is not ready yet.  */
2430   ps->post_wait = cycles;
2431   vliw = CPU_VLIW (cpu);
2432   slot = vliw->next_slot - 1;
2433   slot = (*vliw->current_vliw)[slot] - UNIT_FM0;
2434   post_wait_for_media (cpu, slot);
2435   post_wait_for_ACC (cpu, in_ACC40Si);
2436   post_wait_for_ACC (cpu, ACC40Si_1);
2437   post_wait_for_ACC (cpu, out_ACC40Sk);
2438   post_wait_for_ACC (cpu, ACC40Sk_1);
2439 
2440   /* Restore the busy cycles of the registers we used.  */
2441   restore_acc_busy_for_mmac (cpu, in_ACC40Si, 2, out_ACC40Sk, 2);
2442 
2443   /* The latency of the output register will be at least the latency of the
2444      other inputs.  Once initiated, post-processing will take 1 cycle.  */
2445   update_ACC_latency (cpu, out_ACC40Sk, ps->post_wait + 1);
2446   set_use_is_acc_mmac (cpu, out_ACC40Sk);
2447   if (ACC40Sk_1 >= 0)
2448     {
2449       update_ACC_latency (cpu, ACC40Sk_1, ps->post_wait + 1);
2450       set_use_is_acc_mmac (cpu, ACC40Sk_1);
2451     }
2452 
2453   /* the floating point unit resource has a latency of 3 cycles  */
2454   update_float_resource_latency (cpu, slot, cycles + 3);
2455 
2456   return cycles;
2457 }
2458 
2459 int
2460 frvbf_model_fr550_u_media_4_add_sub_dual (SIM_CPU *cpu, const IDESC *idesc,
2461 					  int unit_num, int referenced,
2462 					  INT in_ACC40Si, INT out_ACC40Sk)
2463 {
2464   int cycles;
2465   INT ACC40Si_1;
2466   INT ACC40Si_2;
2467   INT ACC40Si_3;
2468   INT ACC40Sk_1;
2469   INT ACC40Sk_2;
2470   INT ACC40Sk_3;
2471   FRV_PROFILE_STATE *ps;
2472   FRV_VLIW *vliw;
2473   int slot;
2474 
2475   if (model_insn == FRV_INSN_MODEL_PASS_1)
2476     return 0;
2477 
2478   /* The preprocessing can execute right away.  */
2479   cycles = idesc->timing->units[unit_num].done;
2480 
2481   ACC40Si_1 = DUAL_REG (in_ACC40Si);
2482   ACC40Si_2 = DUAL_REG (ACC40Si_1);
2483   ACC40Si_3 = DUAL_REG (ACC40Si_2);
2484   ACC40Sk_1 = DUAL_REG (out_ACC40Sk);
2485   ACC40Sk_2 = DUAL_REG (ACC40Sk_1);
2486   ACC40Sk_3 = DUAL_REG (ACC40Sk_2);
2487 
2488   ps = CPU_PROFILE_STATE (cpu);
2489   /* The latency of the registers may be less than previously recorded,
2490      depending on how they were used previously.
2491      See Table 14-15 in the LSI.  */
2492   adjust_acc_busy_for_mmac (cpu, in_ACC40Si, 4, out_ACC40Sk, 4);
2493 
2494   /* The post processing must wait if there is a dependency on a register
2495      which is not ready yet.  */
2496   ps->post_wait = cycles;
2497   vliw = CPU_VLIW (cpu);
2498   slot = vliw->next_slot - 1;
2499   slot = (*vliw->current_vliw)[slot] - UNIT_FM0;
2500   post_wait_for_media (cpu, slot);
2501   post_wait_for_ACC (cpu, in_ACC40Si);
2502   post_wait_for_ACC (cpu, ACC40Si_1);
2503   post_wait_for_ACC (cpu, ACC40Si_2);
2504   post_wait_for_ACC (cpu, ACC40Si_3);
2505   post_wait_for_ACC (cpu, out_ACC40Sk);
2506   post_wait_for_ACC (cpu, ACC40Sk_1);
2507   post_wait_for_ACC (cpu, ACC40Sk_2);
2508   post_wait_for_ACC (cpu, ACC40Sk_3);
2509 
2510   /* Restore the busy cycles of the registers we used.  */
2511   restore_acc_busy_for_mmac (cpu, in_ACC40Si, 4, out_ACC40Sk, 4);
2512 
2513   /* The latency of the output register will be at least the latency of the
2514      other inputs.  Once initiated, post-processing will take 1 cycle.  */
2515   update_ACC_latency (cpu, out_ACC40Sk, ps->post_wait + 1);
2516   set_use_is_acc_mmac (cpu, out_ACC40Sk);
2517   if (ACC40Sk_1 >= 0)
2518     {
2519       update_ACC_latency (cpu, ACC40Sk_1, ps->post_wait + 1);
2520       set_use_is_acc_mmac (cpu, ACC40Sk_1);
2521     }
2522   if (ACC40Sk_2 >= 0)
2523     {
2524       update_ACC_latency (cpu, ACC40Sk_2, ps->post_wait + 1);
2525       set_use_is_acc_mmac (cpu, ACC40Sk_2);
2526     }
2527   if (ACC40Sk_3 >= 0)
2528     {
2529       update_ACC_latency (cpu, ACC40Sk_3, ps->post_wait + 1);
2530       set_use_is_acc_mmac (cpu, ACC40Sk_3);
2531     }
2532 
2533   /* the floating point unit resource has a latency of 3 cycles  */
2534   update_float_resource_latency (cpu, slot, cycles + 3);
2535 
2536   return cycles;
2537 }
2538 
2539 int
2540 frvbf_model_fr550_u_media_4_quad (SIM_CPU *cpu, const IDESC *idesc,
2541 				  int unit_num, int referenced,
2542 				  INT in_FRi, INT in_FRj,
2543 				  INT out_ACC40Sk, INT out_ACC40Uk)
2544 {
2545   int cycles;
2546   INT dual_FRi;
2547   INT dual_FRj;
2548   INT ACC40Sk_1;
2549   INT ACC40Sk_2;
2550   INT ACC40Sk_3;
2551   INT ACC40Uk_1;
2552   INT ACC40Uk_2;
2553   INT ACC40Uk_3;
2554   FRV_PROFILE_STATE *ps;
2555   FRV_VLIW *vliw;
2556   int slot;
2557 
2558   if (model_insn == FRV_INSN_MODEL_PASS_1)
2559     return 0;
2560 
2561   /* The preprocessing can execute right away.  */
2562   cycles = idesc->timing->units[unit_num].done;
2563 
2564   dual_FRi = DUAL_REG (in_FRi);
2565   dual_FRj = DUAL_REG (in_FRj);
2566   ACC40Sk_1 = DUAL_REG (out_ACC40Sk);
2567   ACC40Sk_2 = DUAL_REG (ACC40Sk_1);
2568   ACC40Sk_3 = DUAL_REG (ACC40Sk_2);
2569   ACC40Uk_1 = DUAL_REG (out_ACC40Uk);
2570   ACC40Uk_2 = DUAL_REG (ACC40Uk_1);
2571   ACC40Uk_3 = DUAL_REG (ACC40Uk_2);
2572 
2573   ps = CPU_PROFILE_STATE (cpu);
2574   /* The latency of the registers may be less than previously recorded,
2575      depending on how they were used previously.
2576      See Table 14-15 in the LSI.  */
2577   adjust_float_register_busy_for_media (cpu, in_FRi, 2, in_FRj, 2, -1, 1);
2578   adjust_acc_busy_for_mmac (cpu, -1, 1, out_ACC40Sk, 4);
2579   adjust_acc_busy_for_mmac (cpu, -1, 1, out_ACC40Uk, 4);
2580 
2581   /* The post processing must wait if there is a dependency on a FR
2582      which is not ready yet.  */
2583   ps->post_wait = cycles;
2584   vliw = CPU_VLIW (cpu);
2585   slot = vliw->next_slot - 1;
2586   slot = (*vliw->current_vliw)[slot] - UNIT_FM0;
2587   post_wait_for_media (cpu, slot);
2588   post_wait_for_FR (cpu, in_FRi);
2589   post_wait_for_FR (cpu, dual_FRi);
2590   post_wait_for_FR (cpu, in_FRj);
2591   post_wait_for_FR (cpu, dual_FRj);
2592   post_wait_for_ACC (cpu, out_ACC40Sk);
2593   post_wait_for_ACC (cpu, ACC40Sk_1);
2594   post_wait_for_ACC (cpu, ACC40Sk_2);
2595   post_wait_for_ACC (cpu, ACC40Sk_3);
2596   post_wait_for_ACC (cpu, out_ACC40Uk);
2597   post_wait_for_ACC (cpu, ACC40Uk_1);
2598   post_wait_for_ACC (cpu, ACC40Uk_2);
2599   post_wait_for_ACC (cpu, ACC40Uk_3);
2600 
2601   /* Restore the busy cycles of the registers we used.  */
2602   restore_float_register_busy_for_media (cpu, in_FRi, 2, in_FRj, 2, -1, 1);
2603   restore_acc_busy_for_mmac (cpu, -1, 1, out_ACC40Sk, 4);
2604   restore_acc_busy_for_mmac (cpu, -1, 1, out_ACC40Uk, 4);
2605 
2606   /* The latency of the output register will be at least the latency of the
2607      other inputs.  Once initiated, post-processing will take 1 cycle.  */
2608   if (out_ACC40Sk >= 0)
2609     {
2610       update_ACC_latency (cpu, out_ACC40Sk, ps->post_wait + 1);
2611 
2612       set_use_is_acc_mmac (cpu, out_ACC40Sk);
2613       if (ACC40Sk_1 >= 0)
2614 	{
2615 	  update_ACC_latency (cpu, ACC40Sk_1, ps->post_wait + 1);
2616 
2617 	  set_use_is_acc_mmac (cpu, ACC40Sk_1);
2618 	}
2619       if (ACC40Sk_2 >= 0)
2620 	{
2621 	  update_ACC_latency (cpu, ACC40Sk_2, ps->post_wait + 1);
2622 
2623 	  set_use_is_acc_mmac (cpu, ACC40Sk_2);
2624 	}
2625       if (ACC40Sk_3 >= 0)
2626 	{
2627 	  update_ACC_latency (cpu, ACC40Sk_3, ps->post_wait + 1);
2628 
2629 	  set_use_is_acc_mmac (cpu, ACC40Sk_3);
2630 	}
2631     }
2632   else if (out_ACC40Uk >= 0)
2633     {
2634       update_ACC_latency (cpu, out_ACC40Uk, ps->post_wait + 1);
2635 
2636       set_use_is_acc_mmac (cpu, out_ACC40Uk);
2637       if (ACC40Uk_1 >= 0)
2638 	{
2639 	  update_ACC_latency (cpu, ACC40Uk_1, ps->post_wait + 1);
2640 
2641 	  set_use_is_acc_mmac (cpu, ACC40Uk_1);
2642 	}
2643       if (ACC40Uk_2 >= 0)
2644 	{
2645 	  update_ACC_latency (cpu, ACC40Uk_2, ps->post_wait + 1);
2646 
2647 	  set_use_is_acc_mmac (cpu, ACC40Uk_2);
2648 	}
2649       if (ACC40Uk_3 >= 0)
2650 	{
2651 	  update_ACC_latency (cpu, ACC40Uk_3, ps->post_wait + 1);
2652 
2653 	  set_use_is_acc_mmac (cpu, ACC40Uk_3);
2654 	}
2655     }
2656 
2657   /* the floating point unit resource has a latency of 3 cycles  */
2658   update_float_resource_latency (cpu, slot, cycles + 3);
2659 
2660   return cycles;
2661 }
2662 
2663 #endif /* WITH_PROFILE_MODEL_P */
2664