Copyright updates for 2007.
[external/binutils.git] / sim / frv / profile-fr500.c
1 /* frv simulator fr500 dependent profiling code.
2
3    Copyright (C) 1998, 1999, 2000, 2001, 2003, 2007
4    Free Software Foundation, Inc.
5    Contributed by Red Hat
6
7 This file is part of the GNU simulators.
8
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 2, or (at your option)
12 any later version.
13
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17 GNU General Public License for more details.
18
19 You should have received a copy of the GNU General Public License along
20 with this program; if not, write to the Free Software Foundation, Inc.,
21 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
22
23 */
24 #define WANT_CPU
25 #define WANT_CPU_FRVBF
26
27 #include "sim-main.h"
28 #include "bfd.h"
29
30 #if WITH_PROFILE_MODEL_P
31
32 #include "profile.h"
33 #include "profile-fr500.h"
34
35 /* Initialize cycle counting for an insn.
36    FIRST_P is non-zero if this is the first insn in a set of parallel
37    insns.  */
38 void
39 fr500_model_insn_before (SIM_CPU *cpu, int first_p)
40 {
41   if (first_p)
42     {
43       MODEL_FR500_DATA *d = CPU_MODEL_DATA (cpu);
44       FRV_PROFILE_STATE *ps = CPU_PROFILE_STATE (cpu);
45       ps->cur_gr_complex = ps->prev_gr_complex;
46       d->cur_fpop     = d->prev_fpop;
47       d->cur_media    = d->prev_media;
48       d->cur_cc_complex = d->prev_cc_complex;
49     }
50 }
51
52 /* Record the cycles computed for an insn.
53    LAST_P is non-zero if this is the last insn in a set of parallel insns,
54    and we update the total cycle count.
55    CYCLES is the cycle count of the insn.  */
56 void
57 fr500_model_insn_after (SIM_CPU *cpu, int last_p, int cycles)
58 {
59   if (last_p)
60     {
61       MODEL_FR500_DATA *d = CPU_MODEL_DATA (cpu);
62       FRV_PROFILE_STATE *ps = CPU_PROFILE_STATE (cpu);
63       ps->prev_gr_complex = ps->cur_gr_complex;
64       d->prev_fpop     = d->cur_fpop;
65       d->prev_media    = d->cur_media;
66       d->prev_cc_complex = d->cur_cc_complex;
67     }
68 }
69
70 static void
71 set_use_is_fpop (SIM_CPU *cpu, INT fr)
72 {
73   MODEL_FR500_DATA *d = CPU_MODEL_DATA (cpu);
74   fr500_reset_fr_flags (cpu, (fr));
75   d->cur_fpop |=  (((DI)1) << (fr));
76 }
77
78 static void
79 set_use_not_fpop (SIM_CPU *cpu, INT fr)
80 {
81   MODEL_FR500_DATA *d = CPU_MODEL_DATA (cpu);
82   d->cur_fpop &= ~(((DI)1) << (fr));
83 }
84
85 static int
86 use_is_fpop (SIM_CPU *cpu, INT fr)
87 {
88   MODEL_FR500_DATA *d = CPU_MODEL_DATA (cpu);
89   return d->prev_fpop & (((DI)1) << (fr));
90 }
91
92 static void
93 set_use_is_media ( SIM_CPU *cpu, INT fr)
94 {
95   MODEL_FR500_DATA *d = CPU_MODEL_DATA (cpu);
96   fr500_reset_fr_flags (cpu, (fr));
97   d->cur_media |=  (((DI)1) << (fr));
98 }
99
100 static void
101 set_use_not_media (SIM_CPU *cpu, INT fr)
102 {
103   MODEL_FR500_DATA *d = CPU_MODEL_DATA (cpu);
104   d->cur_media &= ~(((DI)1) << (fr));
105 }
106
107 static int
108 use_is_media (SIM_CPU *cpu, INT fr)
109 {
110   MODEL_FR500_DATA *d = CPU_MODEL_DATA (cpu);
111   return d->prev_media & (((DI)1) << (fr));
112 }
113
114 static void
115 set_use_is_cc_complex (SIM_CPU *cpu, INT cc)
116 {
117   MODEL_FR500_DATA *d = CPU_MODEL_DATA (cpu);
118   fr500_reset_cc_flags (cpu, cc);
119   d->cur_cc_complex |= (((DI)1) << (cc));
120 }
121
122 static void
123 set_use_not_cc_complex (SIM_CPU *cpu, INT cc)
124 {
125   MODEL_FR500_DATA *d = CPU_MODEL_DATA (cpu);
126   d->cur_cc_complex &= ~(((DI)1) << (cc));
127 }
128
129 static int
130 use_is_cc_complex (SIM_CPU *cpu, INT cc)
131 {
132   MODEL_FR500_DATA *d = CPU_MODEL_DATA (cpu);
133   return d->prev_cc_complex &   (((DI)1) << (cc));
134 }
135
136 void
137 fr500_reset_fr_flags (SIM_CPU *cpu, INT fr)
138 {
139   set_use_not_fpop (cpu, fr);
140   set_use_not_media (cpu, fr);
141 }
142
143 void
144 fr500_reset_cc_flags (SIM_CPU *cpu, INT cc)
145 {
146   set_use_not_cc_complex (cpu, cc);
147 }
148
149 /* Latency of floating point registers may be less than recorded when followed
150    by another floating point insn.  */
151 static void
152 adjust_float_register_busy (SIM_CPU *cpu, INT in_FRi, INT in_FRj, INT out_FRk,
153                             int cycles)
154 {
155   /* If the registers were previously used in a floating point op,
156      then their latency will be less than previously recorded.
157      See Table 13-13 in the LSI.  */
158   if (in_FRi >= 0)
159     if (use_is_fpop (cpu, in_FRi))
160       decrease_FR_busy (cpu, in_FRi, cycles);
161     else
162       enforce_full_fr_latency (cpu, in_FRi);
163   
164   if (in_FRj >= 0 && in_FRj != in_FRi)
165     if (use_is_fpop (cpu, in_FRj))
166       decrease_FR_busy (cpu, in_FRj, cycles);
167     else
168       enforce_full_fr_latency (cpu, in_FRj);
169
170   if (out_FRk >= 0 && out_FRk != in_FRi && out_FRk != in_FRj)
171     if (use_is_fpop (cpu, out_FRk))
172       decrease_FR_busy (cpu, out_FRk, cycles);
173     else
174       enforce_full_fr_latency (cpu, out_FRk);
175 }
176
177 /* Latency of floating point registers may be less than recorded when followed
178    by another floating point insn.  */
179 static void
180 adjust_double_register_busy (SIM_CPU *cpu, INT in_FRi, INT in_FRj, INT out_FRk,
181                             int cycles)
182 {
183   /* If the registers were previously used in a floating point op,
184      then their latency will be less than previously recorded.
185      See Table 13-13 in the LSI.  */
186   adjust_float_register_busy (cpu, in_FRi, in_FRj, out_FRk, cycles);
187   if (in_FRi >= 0)  ++in_FRi;
188   if (in_FRj >= 0)  ++in_FRj;
189   if (out_FRk >= 0) ++out_FRk;
190   adjust_float_register_busy (cpu, in_FRi, in_FRj, out_FRk, cycles);
191 }
192
193 /* Latency of floating point registers is less than recorded when followed
194    by another floating point insn.  */
195 static void
196 restore_float_register_busy (SIM_CPU *cpu, INT in_FRi, INT in_FRj, INT out_FRk,
197                              int cycles)
198 {
199   /* If the registers were previously used in a floating point op,
200      then their latency will be less than previously recorded.
201      See Table 13-13 in the LSI.  */
202   if (in_FRi >= 0 && use_is_fpop (cpu, in_FRi))
203     increase_FR_busy (cpu, in_FRi, cycles);
204   if (in_FRj != in_FRi && use_is_fpop (cpu, in_FRj))
205     increase_FR_busy (cpu, in_FRj, cycles);
206   if (out_FRk != in_FRi && out_FRk != in_FRj && use_is_fpop (cpu, out_FRk))
207     increase_FR_busy (cpu, out_FRk, cycles);
208 }
209
210 /* Latency of floating point registers is less than recorded when followed
211    by another floating point insn.  */
212 static void
213 restore_double_register_busy (SIM_CPU *cpu, INT in_FRi, INT in_FRj, INT out_FRk,
214                             int cycles)
215 {
216   /* If the registers were previously used in a floating point op,
217      then their latency will be less than previously recorded.
218      See Table 13-13 in the LSI.  */
219   restore_float_register_busy (cpu, in_FRi, in_FRj, out_FRk, cycles);
220   if (in_FRi >= 0)  ++in_FRi;
221   if (in_FRj >= 0)  ++in_FRj;
222   if (out_FRk >= 0) ++out_FRk;
223   restore_float_register_busy (cpu, in_FRi, in_FRj, out_FRk, cycles);
224 }
225
226 int
227 frvbf_model_fr500_u_exec (SIM_CPU *cpu, const IDESC *idesc,
228                           int unit_num, int referenced)
229 {
230   return idesc->timing->units[unit_num].done;
231 }
232
233 int
234 frvbf_model_fr500_u_integer (SIM_CPU *cpu, const IDESC *idesc,
235                              int unit_num, int referenced,
236                              INT in_GRi, INT in_GRj, INT out_GRk,
237                              INT out_ICCi_1)
238 {
239   int cycles;
240
241   if (model_insn == FRV_INSN_MODEL_PASS_1)
242     {
243       /* icc0-icc4 are the upper 4 fields of the CCR.  */
244       if (out_ICCi_1 >= 0)
245         out_ICCi_1 += 4;
246
247       /* The entire VLIW insn must wait if there is a dependency on a register
248          which is not ready yet.
249          The latency of the registers may be less than previously recorded,
250          depending on how they were used previously.
251          See Table 13-8 in the LSI.  */
252       if (in_GRi != out_GRk && in_GRi >= 0)
253         {
254           if (use_is_gr_complex (cpu, in_GRi))
255             decrease_GR_busy (cpu, in_GRi, 1);
256         }
257       if (in_GRj != out_GRk && in_GRj != in_GRi && in_GRj >= 0)
258         {
259           if (use_is_gr_complex (cpu, in_GRj))
260             decrease_GR_busy (cpu, in_GRj, 1);
261         }
262       vliw_wait_for_GR (cpu, in_GRi);
263       vliw_wait_for_GR (cpu, in_GRj);
264       vliw_wait_for_GR (cpu, out_GRk);
265       vliw_wait_for_CCR (cpu, out_ICCi_1);
266       handle_resource_wait (cpu);
267       load_wait_for_GR (cpu, in_GRi);
268       load_wait_for_GR (cpu, in_GRj);
269       load_wait_for_GR (cpu, out_GRk);
270       trace_vliw_wait_cycles (cpu);
271       return 0;
272     }
273
274   /* GRk is available immediately to the next VLIW insn as is ICCi_1.  */
275   cycles = idesc->timing->units[unit_num].done;
276   return cycles;
277 }
278
279 int
280 frvbf_model_fr500_u_imul (SIM_CPU *cpu, const IDESC *idesc,
281                           int unit_num, int referenced,
282                           INT in_GRi, INT in_GRj, INT out_GRk, INT out_ICCi_1)
283 {
284   int cycles;
285   /* icc0-icc4 are the upper 4 fields of the CCR.  */
286   if (out_ICCi_1 >= 0)
287     out_ICCi_1 += 4;
288
289   if (model_insn == FRV_INSN_MODEL_PASS_1)
290     {
291       /* The entire VLIW insn must wait if there is a dependency on a register
292          which is not ready yet.
293          The latency of the registers may be less than previously recorded,
294          depending on how they were used previously.
295          See Table 13-8 in the LSI.  */
296       if (in_GRi != out_GRk && in_GRi >= 0)
297         {
298           if (use_is_gr_complex (cpu, in_GRi))
299             decrease_GR_busy (cpu, in_GRi, 1);
300         }
301       if (in_GRj != out_GRk && in_GRj != in_GRi && in_GRj >= 0)
302         {
303           if (use_is_gr_complex (cpu, in_GRj))
304             decrease_GR_busy (cpu, in_GRj, 1);
305         }
306       vliw_wait_for_GR (cpu, in_GRi);
307       vliw_wait_for_GR (cpu, in_GRj);
308       vliw_wait_for_GRdouble (cpu, out_GRk);
309       vliw_wait_for_CCR (cpu, out_ICCi_1);
310       handle_resource_wait (cpu);
311       load_wait_for_GR (cpu, in_GRi);
312       load_wait_for_GR (cpu, in_GRj);
313       load_wait_for_GRdouble (cpu, out_GRk);
314       trace_vliw_wait_cycles (cpu);
315       return 0;
316     }
317
318   /* GRk has a latency of 2 cycles.  */
319   cycles = idesc->timing->units[unit_num].done;
320   update_GRdouble_latency (cpu, out_GRk, cycles + 2);
321   set_use_is_gr_complex (cpu, out_GRk);
322   set_use_is_gr_complex (cpu, out_GRk + 1);
323
324   /* ICCi_1 has a latency of 1 cycle.  */
325   update_CCR_latency (cpu, out_ICCi_1, cycles + 1);
326
327   return cycles;
328 }
329
330 int
331 frvbf_model_fr500_u_idiv (SIM_CPU *cpu, const IDESC *idesc,
332                           int unit_num, int referenced,
333                           INT in_GRi, INT in_GRj, INT out_GRk, INT out_ICCi_1)
334 {
335   int cycles;
336   FRV_VLIW *vliw;
337   int slot;
338
339   /* icc0-icc4 are the upper 4 fields of the CCR.  */
340   if (out_ICCi_1 >= 0)
341     out_ICCi_1 += 4;
342
343   vliw = CPU_VLIW (cpu);
344   slot = vliw->next_slot - 1;
345   slot = (*vliw->current_vliw)[slot] - UNIT_I0;
346
347   if (model_insn == FRV_INSN_MODEL_PASS_1)
348     {
349       /* The entire VLIW insn must wait if there is a dependency on a register
350          which is not ready yet.
351          The latency of the registers may be less than previously recorded,
352          depending on how they were used previously.
353          See Table 13-8 in the LSI.  */
354       if (in_GRi != out_GRk && in_GRi >= 0)
355         {
356           if (use_is_gr_complex (cpu, in_GRi))
357             decrease_GR_busy (cpu, in_GRi, 1);
358         }
359       if (in_GRj != out_GRk && in_GRj != in_GRi && in_GRj >= 0)
360         {
361           if (use_is_gr_complex (cpu, in_GRj))
362             decrease_GR_busy (cpu, in_GRj, 1);
363         }
364       vliw_wait_for_GR (cpu, in_GRi);
365       vliw_wait_for_GR (cpu, in_GRj);
366       vliw_wait_for_GR (cpu, out_GRk);
367       vliw_wait_for_CCR (cpu, out_ICCi_1);
368       vliw_wait_for_idiv_resource (cpu, slot);
369       handle_resource_wait (cpu);
370       load_wait_for_GR (cpu, in_GRi);
371       load_wait_for_GR (cpu, in_GRj);
372       load_wait_for_GR (cpu, out_GRk);
373       trace_vliw_wait_cycles (cpu);
374       return 0;
375     }
376
377   /* GRk has a latency of 19 cycles!  */
378   cycles = idesc->timing->units[unit_num].done;
379   update_GR_latency (cpu, out_GRk, cycles + 19);
380   set_use_is_gr_complex (cpu, out_GRk);
381
382   /* ICCi_1 has a latency of 19 cycles.  */
383   update_CCR_latency (cpu, out_ICCi_1, cycles + 19);
384   set_use_is_cc_complex (cpu, out_ICCi_1);
385
386   if (CGEN_ATTR_VALUE(idesc, idesc->attrs, CGEN_INSN_NON_EXCEPTING))
387     {
388       /* GNER has a latency of 18 cycles.  */
389       update_SPR_latency (cpu, GNER_FOR_GR (out_GRk), cycles + 18);
390     }
391
392   /* the idiv resource has a latency of 18 cycles!  */
393   update_idiv_resource_latency (cpu, slot, cycles + 18);
394
395   return cycles;
396 }
397
398 int
399 frvbf_model_fr500_u_branch (SIM_CPU *cpu, const IDESC *idesc,
400                             int unit_num, int referenced,
401                             INT in_GRi, INT in_GRj,
402                             INT in_ICCi_2, INT in_FCCi_2)
403 {
404   int cycles;
405   FRV_PROFILE_STATE *ps;
406
407   if (model_insn == FRV_INSN_MODEL_PASS_1)
408     {
409       /* icc0-icc4 are the upper 4 fields of the CCR.  */
410       if (in_ICCi_2 >= 0)
411         in_ICCi_2 += 4;
412
413       /* The entire VLIW insn must wait if there is a dependency on a register
414          which is not ready yet.
415          The latency of the registers may be less than previously recorded,
416          depending on how they were used previously.
417          See Table 13-8 in the LSI.  */
418       if (in_GRi >= 0)
419         {
420           if (use_is_gr_complex (cpu, in_GRi))
421             decrease_GR_busy (cpu, in_GRi, 1);
422         }
423       if (in_GRj != in_GRi && in_GRj >= 0)
424         {
425           if (use_is_gr_complex (cpu, in_GRj))
426             decrease_GR_busy (cpu, in_GRj, 1);
427         }
428       vliw_wait_for_GR (cpu, in_GRi);
429       vliw_wait_for_GR (cpu, in_GRj);
430       vliw_wait_for_CCR (cpu, in_ICCi_2);
431       vliw_wait_for_CCR (cpu, in_FCCi_2);
432       handle_resource_wait (cpu);
433       load_wait_for_GR (cpu, in_GRi);
434       load_wait_for_GR (cpu, in_GRj);
435       trace_vliw_wait_cycles (cpu);
436       return 0;
437     }
438
439   /* When counting branches taken or not taken, don't consider branches after
440      the first taken branch in a vliw insn.  */
441   ps = CPU_PROFILE_STATE (cpu);
442   if (! ps->vliw_branch_taken)
443     {
444       /* (1 << 4): The pc is the 5th element in inputs, outputs.
445          ??? can be cleaned up */
446       PROFILE_DATA *p = CPU_PROFILE_DATA (cpu);
447       int taken = (referenced & (1 << 4)) != 0;
448       if (taken)
449         {
450           ++PROFILE_MODEL_TAKEN_COUNT (p);
451           ps->vliw_branch_taken = 1;
452         }
453       else
454         ++PROFILE_MODEL_UNTAKEN_COUNT (p);
455     }
456
457   cycles = idesc->timing->units[unit_num].done;
458   return cycles;
459 }
460
461 int
462 frvbf_model_fr500_u_trap (SIM_CPU *cpu, const IDESC *idesc,
463                           int unit_num, int referenced,
464                           INT in_GRi, INT in_GRj,
465                           INT in_ICCi_2, INT in_FCCi_2)
466 {
467   int cycles;
468
469   if (model_insn == FRV_INSN_MODEL_PASS_1)
470     {
471       /* icc0-icc4 are the upper 4 fields of the CCR.  */
472       if (in_ICCi_2 >= 0)
473         in_ICCi_2 += 4;
474
475       /* The entire VLIW insn must wait if there is a dependency on a register
476          which is not ready yet.
477          The latency of the registers may be less than previously recorded,
478          depending on how they were used previously.
479          See Table 13-8 in the LSI.  */
480       if (in_GRi >= 0)
481         {
482           if (use_is_gr_complex (cpu, in_GRi))
483             decrease_GR_busy (cpu, in_GRi, 1);
484         }
485       if (in_GRj != in_GRi && in_GRj >= 0)
486         {
487           if (use_is_gr_complex (cpu, in_GRj))
488             decrease_GR_busy (cpu, in_GRj, 1);
489         }
490       vliw_wait_for_GR (cpu, in_GRi);
491       vliw_wait_for_GR (cpu, in_GRj);
492       vliw_wait_for_CCR (cpu, in_ICCi_2);
493       vliw_wait_for_CCR (cpu, in_FCCi_2);
494       handle_resource_wait (cpu);
495       load_wait_for_GR (cpu, in_GRi);
496       load_wait_for_GR (cpu, in_GRj);
497       trace_vliw_wait_cycles (cpu);
498       return 0;
499     }
500
501   cycles = idesc->timing->units[unit_num].done;
502   return cycles;
503 }
504
505 int
506 frvbf_model_fr500_u_check (SIM_CPU *cpu, const IDESC *idesc,
507                            int unit_num, int referenced,
508                            INT in_ICCi_3, INT in_FCCi_3)
509 {
510   int cycles;
511
512   if (model_insn == FRV_INSN_MODEL_PASS_1)
513     {
514       /* icc0-icc4 are the upper 4 fields of the CCR.  */
515       if (in_ICCi_3 >= 0)
516         in_ICCi_3 += 4;
517
518       /* The entire VLIW insn must wait if there is a dependency on a register
519          which is not ready yet.  */
520       vliw_wait_for_CCR (cpu, in_ICCi_3);
521       vliw_wait_for_CCR (cpu, in_FCCi_3);
522       handle_resource_wait (cpu);
523       trace_vliw_wait_cycles (cpu);
524       return 0;
525     }
526
527   cycles = idesc->timing->units[unit_num].done;
528   return cycles;
529 }
530
531 int
532 frvbf_model_fr500_u_clrgr (SIM_CPU *cpu, const IDESC *idesc,
533                            int unit_num, int referenced,
534                            INT in_GRk)
535 {
536   int cycles;
537
538   if (model_insn == FRV_INSN_MODEL_PASS_1)
539     {
540       /* Wait for both GNER registers or just the one specified.  */
541       if (in_GRk == -1)
542         {
543           vliw_wait_for_SPR (cpu, H_SPR_GNER0);
544           vliw_wait_for_SPR (cpu, H_SPR_GNER1);
545         }
546       else
547         vliw_wait_for_SPR (cpu, GNER_FOR_GR (in_GRk));
548       handle_resource_wait (cpu);
549       trace_vliw_wait_cycles (cpu);
550       return 0;
551     }
552
553   cycles = idesc->timing->units[unit_num].done;
554   return cycles;
555 }
556
557 int
558 frvbf_model_fr500_u_clrfr (SIM_CPU *cpu, const IDESC *idesc,
559                            int unit_num, int referenced,
560                            INT in_FRk)
561 {
562   int cycles;
563
564   if (model_insn == FRV_INSN_MODEL_PASS_1)
565     {
566       /* Wait for both GNER registers or just the one specified.  */
567       if (in_FRk == -1)
568         {
569           vliw_wait_for_SPR (cpu, H_SPR_FNER0);
570           vliw_wait_for_SPR (cpu, H_SPR_FNER1);
571         }
572       else
573         vliw_wait_for_SPR (cpu, FNER_FOR_FR (in_FRk));
574       handle_resource_wait (cpu);
575       trace_vliw_wait_cycles (cpu);
576       return 0;
577     }
578
579   cycles = idesc->timing->units[unit_num].done;
580   return cycles;
581 }
582
583 int
584 frvbf_model_fr500_u_commit (SIM_CPU *cpu, const IDESC *idesc,
585                             int unit_num, int referenced,
586                             INT in_GRk, INT in_FRk)
587 {
588   int cycles;
589
590   if (model_insn == FRV_INSN_MODEL_PASS_1)
591     {
592       /* If GR is specified, then FR is not and vice-versa. If neither is
593          then it's a commitga or commitfa. Check the insn attribute to
594          figure out which.  */
595       if (in_GRk != -1)
596         vliw_wait_for_SPR (cpu, GNER_FOR_GR (in_GRk));
597       else if (in_FRk != -1)
598         vliw_wait_for_SPR (cpu, FNER_FOR_FR (in_FRk));
599       else if (CGEN_ATTR_VALUE(idesc, idesc->attrs, CGEN_INSN_FR_ACCESS))
600         {
601           vliw_wait_for_SPR (cpu, H_SPR_FNER0);
602           vliw_wait_for_SPR (cpu, H_SPR_FNER1);
603         }
604       else
605         {
606           vliw_wait_for_SPR (cpu, H_SPR_GNER0);
607           vliw_wait_for_SPR (cpu, H_SPR_GNER1);
608         }
609       handle_resource_wait (cpu);
610       trace_vliw_wait_cycles (cpu);
611       return 0;
612     }
613
614   cycles = idesc->timing->units[unit_num].done;
615   return cycles;
616 }
617
618 int
619 frvbf_model_fr500_u_set_hilo (SIM_CPU *cpu, const IDESC *idesc,
620                              int unit_num, int referenced,
621                              INT out_GRkhi, INT out_GRklo)
622 {
623   int cycles;
624
625   if (model_insn == FRV_INSN_MODEL_PASS_1)
626     {
627       /* The entire VLIW insn must wait if there is a dependency on a GR
628          which is not ready yet.  */
629       vliw_wait_for_GR (cpu, out_GRkhi);
630       vliw_wait_for_GR (cpu, out_GRklo);
631       handle_resource_wait (cpu);
632       load_wait_for_GR (cpu, out_GRkhi);
633       load_wait_for_GR (cpu, out_GRklo);
634       trace_vliw_wait_cycles (cpu);
635       return 0;
636     }
637
638   /* GRk is available immediately to the next VLIW insn.  */
639   cycles = idesc->timing->units[unit_num].done;
640
641   set_use_not_gr_complex (cpu, out_GRkhi);
642   set_use_not_gr_complex (cpu, out_GRklo);
643
644   return cycles;
645 }
646
647 int
648 frvbf_model_fr500_u_gr_load (SIM_CPU *cpu, const IDESC *idesc,
649                              int unit_num, int referenced,
650                              INT in_GRi, INT in_GRj,
651                              INT out_GRk, INT out_GRdoublek)
652 {
653   int cycles;
654
655   if (model_insn == FRV_INSN_MODEL_PASS_1)
656     {
657       /* The entire VLIW insn must wait if there is a dependency on a register
658          which is not ready yet.
659          The latency of the registers may be less than previously recorded,
660          depending on how they were used previously.
661          See Table 13-8 in the LSI.  */
662       if (in_GRi != out_GRk && in_GRi != out_GRdoublek
663           && in_GRi != out_GRdoublek + 1 && in_GRi >= 0)
664         {
665           if (use_is_gr_complex (cpu, in_GRi))
666             decrease_GR_busy (cpu, in_GRi, 1);
667         }
668       if (in_GRj != in_GRi && in_GRj != out_GRk && in_GRj != out_GRdoublek
669           && in_GRj != out_GRdoublek + 1 && in_GRj >= 0)
670
671         {
672           if (use_is_gr_complex (cpu, in_GRj))
673             decrease_GR_busy (cpu, in_GRj, 1);
674         }
675       vliw_wait_for_GR (cpu, in_GRi);
676       vliw_wait_for_GR (cpu, in_GRj);
677       vliw_wait_for_GR (cpu, out_GRk);
678       vliw_wait_for_GRdouble (cpu, out_GRdoublek);
679       handle_resource_wait (cpu);
680       load_wait_for_GR (cpu, in_GRi);
681       load_wait_for_GR (cpu, in_GRj);
682       load_wait_for_GR (cpu, out_GRk);
683       load_wait_for_GRdouble (cpu, out_GRdoublek);
684       trace_vliw_wait_cycles (cpu);
685       return 0;
686     }
687
688   cycles = idesc->timing->units[unit_num].done;
689
690   /* The latency of GRk for a load will depend on how long it takes to retrieve
691      the the data from the cache or memory.  */
692   update_GR_latency_for_load (cpu, out_GRk, cycles);
693   update_GRdouble_latency_for_load (cpu, out_GRdoublek, cycles);
694
695   if (CGEN_ATTR_VALUE(idesc, idesc->attrs, CGEN_INSN_NON_EXCEPTING))
696     {
697       /* GNER has a latency of 2 cycles.  */
698       update_SPR_latency (cpu, GNER_FOR_GR (out_GRk), cycles + 2);
699       update_SPR_latency (cpu, GNER_FOR_GR (out_GRdoublek), cycles + 2);
700     }
701
702   if (out_GRk >= 0)
703     set_use_is_gr_complex (cpu, out_GRk);
704   if (out_GRdoublek != -1)
705     {
706       set_use_is_gr_complex (cpu, out_GRdoublek);
707       set_use_is_gr_complex (cpu, out_GRdoublek + 1);
708     }
709
710   return cycles;
711 }
712
713 int
714 frvbf_model_fr500_u_gr_store (SIM_CPU *cpu, const IDESC *idesc,
715                               int unit_num, int referenced,
716                               INT in_GRi, INT in_GRj,
717                               INT in_GRk, INT in_GRdoublek)
718 {
719   int cycles;
720
721   if (model_insn == FRV_INSN_MODEL_PASS_1)
722     {
723       /* The entire VLIW insn must wait if there is a dependency on a register
724          which is not ready yet.
725          The latency of the registers may be less than previously recorded,
726          depending on how they were used previously.
727          See Table 13-8 in the LSI.  */
728       if (in_GRi >= 0)
729         {
730           if (use_is_gr_complex (cpu, in_GRi))
731             decrease_GR_busy (cpu, in_GRi, 1);
732         }
733       if (in_GRj != in_GRi && in_GRj >= 0)
734         {
735           if (use_is_gr_complex (cpu, in_GRj))
736             decrease_GR_busy (cpu, in_GRj, 1);
737         }
738       if (in_GRk != in_GRi && in_GRk != in_GRj && in_GRk >= 0)
739         {
740           if (use_is_gr_complex (cpu, in_GRk))
741             decrease_GR_busy (cpu, in_GRk, 1);
742         }
743       if (in_GRdoublek != in_GRi && in_GRdoublek != in_GRj
744           && in_GRdoublek + 1 != in_GRi && in_GRdoublek + 1 != in_GRj
745           && in_GRdoublek >= 0)
746         {
747           if (use_is_gr_complex (cpu, in_GRdoublek))
748             decrease_GR_busy (cpu, in_GRdoublek, 1);
749           if (use_is_gr_complex (cpu, in_GRdoublek + 1))
750             decrease_GR_busy (cpu, in_GRdoublek + 1, 1);
751         }
752       vliw_wait_for_GR (cpu, in_GRi);
753       vliw_wait_for_GR (cpu, in_GRj);
754       vliw_wait_for_GR (cpu, in_GRk);
755       vliw_wait_for_GRdouble (cpu, in_GRdoublek);
756       handle_resource_wait (cpu);
757       load_wait_for_GR (cpu, in_GRi);
758       load_wait_for_GR (cpu, in_GRj);
759       load_wait_for_GR (cpu, in_GRk);
760       load_wait_for_GRdouble (cpu, in_GRdoublek);
761       trace_vliw_wait_cycles (cpu);
762       return 0;
763     }
764
765   cycles = idesc->timing->units[unit_num].done;
766
767   return cycles;
768 }
769
770 int
771 frvbf_model_fr500_u_gr_r_store (SIM_CPU *cpu, const IDESC *idesc,
772                                 int unit_num, int referenced,
773                                 INT in_GRi, INT in_GRj,
774                                 INT in_GRk, INT in_GRdoublek)
775 {
776   int cycles = frvbf_model_fr500_u_gr_store (cpu, idesc, unit_num, referenced,
777                                              in_GRi, in_GRj, in_GRk,
778                                              in_GRdoublek);
779
780   if (model_insn == FRV_INSN_MODEL_PASS_2)
781     {
782       if (CPU_RSTR_INVALIDATE(cpu))
783         request_cache_invalidate (cpu, CPU_DATA_CACHE (cpu), cycles);
784     }
785
786   return cycles;
787 }
788
789 int
790 frvbf_model_fr500_u_fr_load (SIM_CPU *cpu, const IDESC *idesc,
791                              int unit_num, int referenced,
792                              INT in_GRi, INT in_GRj,
793                              INT out_FRk, INT out_FRdoublek)
794 {
795   int cycles;
796
797   if (model_insn == FRV_INSN_MODEL_PASS_1)
798     {
799       /* The entire VLIW insn must wait if there is a dependency on a register
800          which is not ready yet.
801          The latency of the registers may be less than previously recorded,
802          depending on how they were used previously.
803          See Table 13-8 in the LSI.  */
804       if (in_GRi >= 0)
805         {
806           if (use_is_gr_complex (cpu, in_GRi))
807             decrease_GR_busy (cpu, in_GRi, 1);
808         }
809       if (in_GRj != in_GRi && in_GRj >= 0)
810         {
811           if (use_is_gr_complex (cpu, in_GRj))
812             decrease_GR_busy (cpu, in_GRj, 1);
813         }
814       if (out_FRk >= 0)
815         {
816           if (use_is_media (cpu, out_FRk))
817             decrease_FR_busy (cpu, out_FRk, 1);
818           else
819             adjust_float_register_busy (cpu, -1, -1, out_FRk, 1);
820         }
821       if (out_FRdoublek >= 0)
822         {
823           if (use_is_media (cpu, out_FRdoublek))
824             decrease_FR_busy (cpu, out_FRdoublek, 1);
825           else
826             adjust_float_register_busy (cpu, -1, -1, out_FRdoublek, 1);
827           if (use_is_media (cpu, out_FRdoublek + 1))
828             decrease_FR_busy (cpu, out_FRdoublek + 1, 1);
829           else
830             adjust_float_register_busy (cpu, -1, -1, out_FRdoublek + 1, 1);
831         }
832       vliw_wait_for_GR (cpu, in_GRi);
833       vliw_wait_for_GR (cpu, in_GRj);
834       vliw_wait_for_FR (cpu, out_FRk);
835       vliw_wait_for_FRdouble (cpu, out_FRdoublek);
836       if (CGEN_ATTR_VALUE(idesc, idesc->attrs, CGEN_INSN_NON_EXCEPTING))
837         {
838           vliw_wait_for_SPR (cpu, FNER_FOR_FR (out_FRk));
839           vliw_wait_for_SPR (cpu, FNER_FOR_FR (out_FRdoublek));
840         }
841       handle_resource_wait (cpu);
842       load_wait_for_GR (cpu, in_GRi);
843       load_wait_for_GR (cpu, in_GRj);
844       load_wait_for_FR (cpu, out_FRk);
845       load_wait_for_FRdouble (cpu, out_FRdoublek);
846       trace_vliw_wait_cycles (cpu);
847       return 0;
848     }
849
850   cycles = idesc->timing->units[unit_num].done;
851
852   /* The latency of FRk for a load will depend on how long it takes to retrieve
853      the the data from the cache or memory.  */
854   update_FR_latency_for_load (cpu, out_FRk, cycles);
855   update_FRdouble_latency_for_load (cpu, out_FRdoublek, cycles);
856
857   if (CGEN_ATTR_VALUE(idesc, idesc->attrs, CGEN_INSN_NON_EXCEPTING))
858     {
859       /* FNER has a latency of 3 cycles.  */
860       update_SPR_latency (cpu, FNER_FOR_FR (out_FRk), cycles + 3);
861       update_SPR_latency (cpu, FNER_FOR_FR (out_FRdoublek), cycles + 3);
862     }
863
864   fr500_reset_fr_flags (cpu, out_FRk);
865
866   return cycles;
867 }
868
869 int
870 frvbf_model_fr500_u_fr_store (SIM_CPU *cpu, const IDESC *idesc,
871                               int unit_num, int referenced,
872                               INT in_GRi, INT in_GRj,
873                               INT in_FRk, INT in_FRdoublek)
874 {
875   int cycles;
876
877   if (model_insn == FRV_INSN_MODEL_PASS_1)
878     {
879       /* The entire VLIW insn must wait if there is a dependency on a register
880          which is not ready yet.
881          The latency of the registers may be less than previously recorded,
882          depending on how they were used previously.
883          See Table 13-8 in the LSI.  */
884       if (in_GRi >= 0)
885         {
886           if (use_is_gr_complex (cpu, in_GRi))
887             decrease_GR_busy (cpu, in_GRi, 1);
888         }
889       if (in_GRj != in_GRi && in_GRj >= 0)
890         {
891           if (use_is_gr_complex (cpu, in_GRj))
892             decrease_GR_busy (cpu, in_GRj, 1);
893         }
894       if (in_FRk >= 0)
895         {
896           if (use_is_media (cpu, in_FRk))
897             decrease_FR_busy (cpu, in_FRk, 1);
898           else
899             adjust_float_register_busy (cpu, -1, -1, in_FRk, 1);
900         }
901       if (in_FRdoublek >= 0)
902         {
903           if (use_is_media (cpu, in_FRdoublek))
904             decrease_FR_busy (cpu, in_FRdoublek, 1);
905           else
906             adjust_float_register_busy (cpu, -1, -1, in_FRdoublek, 1);
907           if (use_is_media (cpu, in_FRdoublek + 1))
908             decrease_FR_busy (cpu, in_FRdoublek + 1, 1);
909           else
910             adjust_float_register_busy (cpu, -1, -1, in_FRdoublek + 1, 1);
911         }
912       vliw_wait_for_GR (cpu, in_GRi);
913       vliw_wait_for_GR (cpu, in_GRj);
914       vliw_wait_for_FR (cpu, in_FRk);
915       vliw_wait_for_FRdouble (cpu, in_FRdoublek);
916       handle_resource_wait (cpu);
917       load_wait_for_GR (cpu, in_GRi);
918       load_wait_for_GR (cpu, in_GRj);
919       load_wait_for_FR (cpu, in_FRk);
920       load_wait_for_FRdouble (cpu, in_FRdoublek);
921       trace_vliw_wait_cycles (cpu);
922       return 0;
923     }
924
925   cycles = idesc->timing->units[unit_num].done;
926
927   return cycles;
928 }
929
930 int
931 frvbf_model_fr500_u_fr_r_store (SIM_CPU *cpu, const IDESC *idesc,
932                                 int unit_num, int referenced,
933                                 INT in_GRi, INT in_GRj,
934                                 INT in_FRk, INT in_FRdoublek)
935 {
936   int cycles = frvbf_model_fr500_u_fr_store (cpu, idesc, unit_num, referenced,
937                                              in_GRi, in_GRj, in_FRk,
938                                              in_FRdoublek);
939
940   if (model_insn == FRV_INSN_MODEL_PASS_2)
941     {
942       if (CPU_RSTR_INVALIDATE(cpu))
943         request_cache_invalidate (cpu, CPU_DATA_CACHE (cpu), cycles);
944     }
945
946   return cycles;
947 }
948
949 int
950 frvbf_model_fr500_u_swap (SIM_CPU *cpu, const IDESC *idesc,
951                           int unit_num, int referenced,
952                           INT in_GRi, INT in_GRj, INT out_GRk)
953 {
954   int cycles;
955
956   if (model_insn == FRV_INSN_MODEL_PASS_1)
957     {
958       /* The entire VLIW insn must wait if there is a dependency on a register
959          which is not ready yet.
960          The latency of the registers may be less than previously recorded,
961          depending on how they were used previously.
962          See Table 13-8 in the LSI.  */
963       if (in_GRi != out_GRk && in_GRi >= 0)
964         {
965           if (use_is_gr_complex (cpu, in_GRi))
966             decrease_GR_busy (cpu, in_GRi, 1);
967         }
968       if (in_GRj != out_GRk && in_GRj != in_GRi && in_GRj >= 0)
969         {
970           if (use_is_gr_complex (cpu, in_GRj))
971             decrease_GR_busy (cpu, in_GRj, 1);
972         }
973       vliw_wait_for_GR (cpu, in_GRi);
974       vliw_wait_for_GR (cpu, in_GRj);
975       vliw_wait_for_GR (cpu, out_GRk);
976       handle_resource_wait (cpu);
977       load_wait_for_GR (cpu, in_GRi);
978       load_wait_for_GR (cpu, in_GRj);
979       load_wait_for_GR (cpu, out_GRk);
980       trace_vliw_wait_cycles (cpu);
981       return 0;
982     }
983
984   cycles = idesc->timing->units[unit_num].done;
985
986   /* The latency of GRk will depend on how long it takes to swap
987      the the data from the cache or memory.  */
988   update_GR_latency_for_swap (cpu, out_GRk, cycles);
989   set_use_is_gr_complex (cpu, out_GRk);
990
991   return cycles;
992 }
993
994 int
995 frvbf_model_fr500_u_fr2fr (SIM_CPU *cpu, const IDESC *idesc,
996                            int unit_num, int referenced,
997                            INT in_FRj, INT out_FRk)
998 {
999   int cycles;
1000
1001   if (model_insn == FRV_INSN_MODEL_PASS_1)
1002     {
1003       /* The entire VLIW insn must wait if there is a dependency on a register
1004          which is not ready yet.  */
1005       if (in_FRj >= 0)
1006         {
1007           if (use_is_media (cpu, in_FRj))
1008             decrease_FR_busy (cpu, in_FRj, 1);
1009           else
1010             adjust_float_register_busy (cpu, -1, in_FRj, -1, 1);
1011         }
1012       if (out_FRk >= 0 && out_FRk != in_FRj)
1013         {
1014           if (use_is_media (cpu, out_FRk))
1015             decrease_FR_busy (cpu, out_FRk, 1);
1016           else
1017             adjust_float_register_busy (cpu, -1, -1, out_FRk, 1);
1018         }
1019       vliw_wait_for_FR (cpu, in_FRj);
1020       vliw_wait_for_FR (cpu, out_FRk);
1021       handle_resource_wait (cpu);
1022       load_wait_for_FR (cpu, in_FRj);
1023       load_wait_for_FR (cpu, out_FRk);
1024       trace_vliw_wait_cycles (cpu);
1025       return 0;
1026     }
1027
1028   /* The latency of FRj is 3 cycles.  */
1029   cycles = idesc->timing->units[unit_num].done;
1030   update_FR_latency (cpu, out_FRk, cycles + 3);
1031
1032   return cycles;
1033 }
1034
1035 int
1036 frvbf_model_fr500_u_fr2gr (SIM_CPU *cpu, const IDESC *idesc,
1037                            int unit_num, int referenced,
1038                            INT in_FRk, INT out_GRj)
1039 {
1040   int cycles;
1041
1042   if (model_insn == FRV_INSN_MODEL_PASS_1)
1043     {
1044       /* The entire VLIW insn must wait if there is a dependency on a register
1045          which is not ready yet.  */
1046       if (in_FRk >= 0)
1047         {
1048           if (use_is_media (cpu, in_FRk))
1049             decrease_FR_busy (cpu, in_FRk, 1);
1050           else
1051             adjust_float_register_busy (cpu, -1, in_FRk, -1, 1);
1052         }
1053       vliw_wait_for_FR (cpu, in_FRk);
1054       vliw_wait_for_GR (cpu, out_GRj);
1055       handle_resource_wait (cpu);
1056       load_wait_for_FR (cpu, in_FRk);
1057       load_wait_for_GR (cpu, out_GRj);
1058       trace_vliw_wait_cycles (cpu);
1059       return 0;
1060     }
1061
1062   /* The latency of GRj is 2 cycles.  */
1063   cycles = idesc->timing->units[unit_num].done;
1064   update_GR_latency (cpu, out_GRj, cycles + 2);
1065   set_use_is_gr_complex (cpu, out_GRj);
1066
1067   return cycles;
1068 }
1069
1070 int
1071 frvbf_model_fr500_u_spr2gr (SIM_CPU *cpu, const IDESC *idesc,
1072                            int unit_num, int referenced,
1073                            INT in_spr, INT out_GRj)
1074 {
1075   int cycles;
1076
1077   if (model_insn == FRV_INSN_MODEL_PASS_1)
1078     {
1079       /* The entire VLIW insn must wait if there is a dependency on a register
1080          which is not ready yet.  */
1081       vliw_wait_for_SPR (cpu, in_spr);
1082       vliw_wait_for_GR (cpu, out_GRj);
1083       handle_resource_wait (cpu);
1084       load_wait_for_GR (cpu, out_GRj);
1085       trace_vliw_wait_cycles (cpu);
1086       return 0;
1087     }
1088
1089   cycles = idesc->timing->units[unit_num].done;
1090
1091 #if 0 /* no latency?  */
1092   /* The latency of GRj is 2 cycles.  */
1093   update_GR_latency (cpu, out_GRj, cycles + 2);
1094 #endif
1095
1096   return cycles;
1097 }
1098
1099 int
1100 frvbf_model_fr500_u_gr2fr (SIM_CPU *cpu, const IDESC *idesc,
1101                            int unit_num, int referenced,
1102                            INT in_GRj, INT out_FRk)
1103 {
1104   int cycles;
1105
1106   if (model_insn == FRV_INSN_MODEL_PASS_1)
1107     {
1108       /* The entire VLIW insn must wait if there is a dependency on a register
1109          which is not ready yet.
1110          The latency of the registers may be less than previously recorded,
1111          depending on how they were used previously.
1112          See Table 13-8 in the LSI.  */
1113       if (in_GRj >= 0)
1114         {
1115           if (use_is_gr_complex (cpu, in_GRj))
1116             decrease_GR_busy (cpu, in_GRj, 1);
1117         }
1118       if (out_FRk >= 0)
1119         {
1120           if (use_is_media (cpu, out_FRk))
1121             decrease_FR_busy (cpu, out_FRk, 1);
1122           else
1123             adjust_float_register_busy (cpu, -1, -1, out_FRk, 1);
1124         }
1125       vliw_wait_for_GR (cpu, in_GRj);
1126       vliw_wait_for_FR (cpu, out_FRk);
1127       handle_resource_wait (cpu);
1128       load_wait_for_GR (cpu, in_GRj);
1129       load_wait_for_FR (cpu, out_FRk);
1130       trace_vliw_wait_cycles (cpu);
1131       return 0;
1132     }
1133
1134   /* The latency of FRk is 2 cycles.  */
1135   cycles = idesc->timing->units[unit_num].done;
1136   update_FR_latency (cpu, out_FRk, cycles + 2);
1137
1138   /* Mark this use of the register as NOT a floating point op.  */
1139   fr500_reset_fr_flags (cpu, out_FRk);
1140
1141   return cycles;
1142 }
1143
1144 int
1145 frvbf_model_fr500_u_gr2spr (SIM_CPU *cpu, const IDESC *idesc,
1146                             int unit_num, int referenced,
1147                             INT in_GRj, INT out_spr)
1148 {
1149   int cycles;
1150
1151   if (model_insn == FRV_INSN_MODEL_PASS_1)
1152     {
1153       /* The entire VLIW insn must wait if there is a dependency on a register
1154          which is not ready yet.
1155          The latency of the registers may be less than previously recorded,
1156          depending on how they were used previously.
1157          See Table 13-8 in the LSI.  */
1158       if (in_GRj >= 0)
1159         {
1160           if (use_is_gr_complex (cpu, in_GRj))
1161             decrease_GR_busy (cpu, in_GRj, 1);
1162         }
1163       vliw_wait_for_GR (cpu, in_GRj);
1164       vliw_wait_for_SPR (cpu, out_spr);
1165       handle_resource_wait (cpu);
1166       load_wait_for_GR (cpu, in_GRj);
1167       trace_vliw_wait_cycles (cpu);
1168       return 0;
1169     }
1170
1171   cycles = idesc->timing->units[unit_num].done;
1172
1173 #if 0
1174   /* The latency of spr is ? cycles.  */
1175   update_SPR_latency (cpu, out_spr, cycles + ?);
1176 #endif
1177
1178   return cycles;
1179 }
1180
1181 int
1182 frvbf_model_fr500_u_ici (SIM_CPU *cpu, const IDESC *idesc,
1183                          int unit_num, int referenced,
1184                          INT in_GRi, INT in_GRj)
1185 {
1186   int cycles;
1187
1188   if (model_insn == FRV_INSN_MODEL_PASS_1)
1189     {
1190       /* The entire VLIW insn must wait if there is a dependency on a register
1191          which is not ready yet.
1192          The latency of the registers may be less than previously recorded,
1193          depending on how they were used previously.
1194          See Table 13-8 in the LSI.  */
1195       if (in_GRi >= 0)
1196         {
1197           if (use_is_gr_complex (cpu, in_GRi))
1198             decrease_GR_busy (cpu, in_GRi, 1);
1199         }
1200       if (in_GRj != in_GRi && in_GRj >= 0)
1201         {
1202           if (use_is_gr_complex (cpu, in_GRj))
1203             decrease_GR_busy (cpu, in_GRj, 1);
1204         }
1205       vliw_wait_for_GR (cpu, in_GRi);
1206       vliw_wait_for_GR (cpu, in_GRj);
1207       handle_resource_wait (cpu);
1208       load_wait_for_GR (cpu, in_GRi);
1209       load_wait_for_GR (cpu, in_GRj);
1210       trace_vliw_wait_cycles (cpu);
1211       return 0;
1212     }
1213
1214   cycles = idesc->timing->units[unit_num].done;
1215   request_cache_invalidate (cpu, CPU_INSN_CACHE (cpu), cycles);
1216   return cycles;
1217 }
1218
1219 int
1220 frvbf_model_fr500_u_dci (SIM_CPU *cpu, const IDESC *idesc,
1221                          int unit_num, int referenced,
1222                          INT in_GRi, INT in_GRj)
1223 {
1224   int cycles;
1225
1226   if (model_insn == FRV_INSN_MODEL_PASS_1)
1227     {
1228       /* The entire VLIW insn must wait if there is a dependency on a register
1229          which is not ready yet.
1230          The latency of the registers may be less than previously recorded,
1231          depending on how they were used previously.
1232          See Table 13-8 in the LSI.  */
1233       if (in_GRi >= 0)
1234         {
1235           if (use_is_gr_complex (cpu, in_GRi))
1236             decrease_GR_busy (cpu, in_GRi, 1);
1237         }
1238       if (in_GRj != in_GRi && in_GRj >= 0)
1239         {
1240           if (use_is_gr_complex (cpu, in_GRj))
1241             decrease_GR_busy (cpu, in_GRj, 1);
1242         }
1243       vliw_wait_for_GR (cpu, in_GRi);
1244       vliw_wait_for_GR (cpu, in_GRj);
1245       handle_resource_wait (cpu);
1246       load_wait_for_GR (cpu, in_GRi);
1247       load_wait_for_GR (cpu, in_GRj);
1248       trace_vliw_wait_cycles (cpu);
1249       return 0;
1250     }
1251
1252   cycles = idesc->timing->units[unit_num].done;
1253   request_cache_invalidate (cpu, CPU_DATA_CACHE (cpu), cycles);
1254   return cycles;
1255 }
1256
1257 int
1258 frvbf_model_fr500_u_dcf (SIM_CPU *cpu, const IDESC *idesc,
1259                          int unit_num, int referenced,
1260                          INT in_GRi, INT in_GRj)
1261 {
1262   int cycles;
1263
1264   if (model_insn == FRV_INSN_MODEL_PASS_1)
1265     {
1266       /* The entire VLIW insn must wait if there is a dependency on a register
1267          which is not ready yet.
1268          The latency of the registers may be less than previously recorded,
1269          depending on how they were used previously.
1270          See Table 13-8 in the LSI.  */
1271       if (in_GRi >= 0)
1272         {
1273           if (use_is_gr_complex (cpu, in_GRi))
1274             decrease_GR_busy (cpu, in_GRi, 1);
1275         }
1276       if (in_GRj != in_GRi && in_GRj >= 0)
1277         {
1278           if (use_is_gr_complex (cpu, in_GRj))
1279             decrease_GR_busy (cpu, in_GRj, 1);
1280         }
1281       vliw_wait_for_GR (cpu, in_GRi);
1282       vliw_wait_for_GR (cpu, in_GRj);
1283       handle_resource_wait (cpu);
1284       load_wait_for_GR (cpu, in_GRi);
1285       load_wait_for_GR (cpu, in_GRj);
1286       trace_vliw_wait_cycles (cpu);
1287       return 0;
1288     }
1289
1290   cycles = idesc->timing->units[unit_num].done;
1291   request_cache_flush (cpu, CPU_DATA_CACHE (cpu), cycles);
1292   return cycles;
1293 }
1294
1295 int
1296 frvbf_model_fr500_u_icpl (SIM_CPU *cpu, const IDESC *idesc,
1297                           int unit_num, int referenced,
1298                           INT in_GRi, INT in_GRj)
1299 {
1300   int cycles;
1301
1302   if (model_insn == FRV_INSN_MODEL_PASS_1)
1303     {
1304       /* The entire VLIW insn must wait if there is a dependency on a register
1305          which is not ready yet.
1306          The latency of the registers may be less than previously recorded,
1307          depending on how they were used previously.
1308          See Table 13-8 in the LSI.  */
1309       if (in_GRi >= 0)
1310         {
1311           if (use_is_gr_complex (cpu, in_GRi))
1312             decrease_GR_busy (cpu, in_GRi, 1);
1313         }
1314       if (in_GRj != in_GRi && in_GRj >= 0)
1315         {
1316           if (use_is_gr_complex (cpu, in_GRj))
1317             decrease_GR_busy (cpu, in_GRj, 1);
1318         }
1319       vliw_wait_for_GR (cpu, in_GRi);
1320       vliw_wait_for_GR (cpu, in_GRj);
1321       handle_resource_wait (cpu);
1322       load_wait_for_GR (cpu, in_GRi);
1323       load_wait_for_GR (cpu, in_GRj);
1324       trace_vliw_wait_cycles (cpu);
1325       return 0;
1326     }
1327
1328   cycles = idesc->timing->units[unit_num].done;
1329   request_cache_preload (cpu, CPU_INSN_CACHE (cpu), cycles);
1330   return cycles;
1331 }
1332
1333 int
1334 frvbf_model_fr500_u_dcpl (SIM_CPU *cpu, const IDESC *idesc,
1335                           int unit_num, int referenced,
1336                           INT in_GRi, INT in_GRj)
1337 {
1338   int cycles;
1339
1340   if (model_insn == FRV_INSN_MODEL_PASS_1)
1341     {
1342       /* The entire VLIW insn must wait if there is a dependency on a register
1343          which is not ready yet.
1344          The latency of the registers may be less than previously recorded,
1345          depending on how they were used previously.
1346          See Table 13-8 in the LSI.  */
1347       if (in_GRi >= 0)
1348         {
1349           if (use_is_gr_complex (cpu, in_GRi))
1350             decrease_GR_busy (cpu, in_GRi, 1);
1351         }
1352       if (in_GRj != in_GRi && in_GRj >= 0)
1353         {
1354           if (use_is_gr_complex (cpu, in_GRj))
1355             decrease_GR_busy (cpu, in_GRj, 1);
1356         }
1357       vliw_wait_for_GR (cpu, in_GRi);
1358       vliw_wait_for_GR (cpu, in_GRj);
1359       handle_resource_wait (cpu);
1360       load_wait_for_GR (cpu, in_GRi);
1361       load_wait_for_GR (cpu, in_GRj);
1362       trace_vliw_wait_cycles (cpu);
1363       return 0;
1364     }
1365
1366   cycles = idesc->timing->units[unit_num].done;
1367   request_cache_preload (cpu, CPU_DATA_CACHE (cpu), cycles);
1368   return cycles;
1369 }
1370
1371 int
1372 frvbf_model_fr500_u_icul (SIM_CPU *cpu, const IDESC *idesc,
1373                           int unit_num, int referenced,
1374                           INT in_GRi, INT in_GRj)
1375 {
1376   int cycles;
1377
1378   if (model_insn == FRV_INSN_MODEL_PASS_1)
1379     {
1380       /* The entire VLIW insn must wait if there is a dependency on a register
1381          which is not ready yet.
1382          The latency of the registers may be less than previously recorded,
1383          depending on how they were used previously.
1384          See Table 13-8 in the LSI.  */
1385       if (in_GRi >= 0)
1386         {
1387           if (use_is_gr_complex (cpu, in_GRi))
1388             decrease_GR_busy (cpu, in_GRi, 1);
1389         }
1390       if (in_GRj != in_GRi && in_GRj >= 0)
1391         {
1392           if (use_is_gr_complex (cpu, in_GRj))
1393             decrease_GR_busy (cpu, in_GRj, 1);
1394         }
1395       vliw_wait_for_GR (cpu, in_GRi);
1396       vliw_wait_for_GR (cpu, in_GRj);
1397       handle_resource_wait (cpu);
1398       load_wait_for_GR (cpu, in_GRi);
1399       load_wait_for_GR (cpu, in_GRj);
1400       trace_vliw_wait_cycles (cpu);
1401       return 0;
1402     }
1403
1404   cycles = idesc->timing->units[unit_num].done;
1405   request_cache_unlock (cpu, CPU_INSN_CACHE (cpu), cycles);
1406   return cycles;
1407 }
1408
1409 int
1410 frvbf_model_fr500_u_dcul (SIM_CPU *cpu, const IDESC *idesc,
1411                           int unit_num, int referenced,
1412                           INT in_GRi, INT in_GRj)
1413 {
1414   int cycles;
1415
1416   if (model_insn == FRV_INSN_MODEL_PASS_1)
1417     {
1418       /* The entire VLIW insn must wait if there is a dependency on a register
1419          which is not ready yet.
1420          The latency of the registers may be less than previously recorded,
1421          depending on how they were used previously.
1422          See Table 13-8 in the LSI.  */
1423       if (in_GRi >= 0)
1424         {
1425           if (use_is_gr_complex (cpu, in_GRi))
1426             decrease_GR_busy (cpu, in_GRi, 1);
1427         }
1428       if (in_GRj != in_GRi && in_GRj >= 0)
1429         {
1430           if (use_is_gr_complex (cpu, in_GRj))
1431             decrease_GR_busy (cpu, in_GRj, 1);
1432         }
1433       vliw_wait_for_GR (cpu, in_GRi);
1434       vliw_wait_for_GR (cpu, in_GRj);
1435       handle_resource_wait (cpu);
1436       load_wait_for_GR (cpu, in_GRi);
1437       load_wait_for_GR (cpu, in_GRj);
1438       trace_vliw_wait_cycles (cpu);
1439       return 0;
1440     }
1441
1442   cycles = idesc->timing->units[unit_num].done;
1443   request_cache_unlock (cpu, CPU_DATA_CACHE (cpu), cycles);
1444   return cycles;
1445 }
1446
1447 int
1448 frvbf_model_fr500_u_float_arith (SIM_CPU *cpu, const IDESC *idesc,
1449                                  int unit_num, int referenced,
1450                                  INT in_FRi, INT in_FRj,
1451                                  INT in_FRdoublei, INT in_FRdoublej,
1452                                  INT out_FRk, INT out_FRdoublek)
1453 {
1454   int cycles;
1455   FRV_PROFILE_STATE *ps;
1456
1457   if (model_insn == FRV_INSN_MODEL_PASS_1)
1458     return 0;
1459
1460   /* The preprocessing can execute right away.  */
1461   cycles = idesc->timing->units[unit_num].done;
1462
1463   /* The post processing must wait if there is a dependency on a FR
1464      which is not ready yet.  */
1465   adjust_float_register_busy (cpu, in_FRi, in_FRj, out_FRk, 1);
1466   adjust_double_register_busy (cpu, in_FRdoublei, in_FRdoublej, out_FRdoublek,
1467                                1);
1468   ps = CPU_PROFILE_STATE (cpu);
1469   ps->post_wait = cycles;
1470   post_wait_for_FR (cpu, in_FRi);
1471   post_wait_for_FR (cpu, in_FRj);
1472   post_wait_for_FR (cpu, out_FRk);
1473   post_wait_for_FRdouble (cpu, in_FRdoublei);
1474   post_wait_for_FRdouble (cpu, in_FRdoublej);
1475   post_wait_for_FRdouble (cpu, out_FRdoublek);
1476   if (CGEN_ATTR_VALUE(idesc, idesc->attrs, CGEN_INSN_NON_EXCEPTING))
1477     {
1478       post_wait_for_SPR (cpu, FNER_FOR_FR (out_FRk));
1479       post_wait_for_SPR (cpu, FNER_FOR_FR (out_FRdoublek));
1480     }
1481   restore_float_register_busy (cpu, in_FRi, in_FRj, out_FRk, 1);
1482   restore_double_register_busy (cpu, in_FRdoublei, in_FRdoublej, out_FRdoublek,
1483                                 1);
1484
1485   /* The latency of FRk will be at least the latency of the other inputs.  */
1486   update_FR_latency (cpu, out_FRk, 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_FRdoublek), ps->post_wait);
1493     }
1494
1495   /* Once initiated, post-processing will take 3 cycles.  */
1496   update_FR_ptime (cpu, out_FRk, 3);
1497   update_FRdouble_ptime (cpu, out_FRdoublek, 3);
1498
1499   if (CGEN_ATTR_VALUE(idesc, idesc->attrs, CGEN_INSN_NON_EXCEPTING))
1500     {
1501       update_SPR_ptime (cpu, FNER_FOR_FR (out_FRk), 3);
1502       update_SPR_ptime (cpu, FNER_FOR_FR (out_FRdoublek), 3);
1503     }
1504
1505   /* Mark this use of the register as a floating point op.  */
1506   if (out_FRk >= 0)
1507     set_use_is_fpop (cpu, out_FRk);
1508   if (out_FRdoublek >= 0)
1509     {
1510       set_use_is_fpop (cpu, out_FRdoublek);
1511       if (out_FRdoublek < 63)
1512         set_use_is_fpop (cpu, out_FRdoublek + 1);
1513     }
1514
1515   return cycles;
1516 }
1517
1518 int
1519 frvbf_model_fr500_u_float_dual_arith (SIM_CPU *cpu, const IDESC *idesc,
1520                                       int unit_num, int referenced,
1521                                       INT in_FRi, INT in_FRj,
1522                                       INT in_FRdoublei, INT in_FRdoublej,
1523                                       INT out_FRk, INT out_FRdoublek)
1524 {
1525   int cycles;
1526   INT dual_FRi;
1527   INT dual_FRj;
1528   INT dual_FRk;
1529   INT dual_FRdoublei;
1530   INT dual_FRdoublej;
1531   INT dual_FRdoublek;
1532   FRV_PROFILE_STATE *ps;
1533
1534   if (model_insn == FRV_INSN_MODEL_PASS_1)
1535     return 0;
1536
1537   /* The preprocessing can execute right away.  */
1538   cycles = idesc->timing->units[unit_num].done;
1539
1540   /* The post processing must wait if there is a dependency on a FR
1541      which is not ready yet.  */
1542   dual_FRi = DUAL_REG (in_FRi);
1543   dual_FRj = DUAL_REG (in_FRj);
1544   dual_FRk = DUAL_REG (out_FRk);
1545   dual_FRdoublei = DUAL_DOUBLE (in_FRdoublei);
1546   dual_FRdoublej = DUAL_DOUBLE (in_FRdoublej);
1547   dual_FRdoublek = DUAL_DOUBLE (out_FRdoublek);
1548
1549   adjust_float_register_busy (cpu, in_FRi, in_FRj, out_FRk, 1);
1550   adjust_float_register_busy (cpu, dual_FRi, dual_FRj, dual_FRk, 1);
1551   adjust_double_register_busy (cpu, in_FRdoublei, in_FRdoublej, out_FRdoublek,
1552                                1);
1553   adjust_double_register_busy (cpu, dual_FRdoublei, dual_FRdoublej,
1554                                dual_FRdoublek, 1);
1555   ps = CPU_PROFILE_STATE (cpu);
1556   ps->post_wait = cycles;
1557   post_wait_for_FR (cpu, in_FRi);
1558   post_wait_for_FR (cpu, in_FRj);
1559   post_wait_for_FR (cpu, out_FRk);
1560   post_wait_for_FR (cpu, dual_FRi);
1561   post_wait_for_FR (cpu, dual_FRj);
1562   post_wait_for_FR (cpu, dual_FRk);
1563   post_wait_for_FRdouble (cpu, in_FRdoublei);
1564   post_wait_for_FRdouble (cpu, in_FRdoublej);
1565   post_wait_for_FRdouble (cpu, out_FRdoublek);
1566   post_wait_for_FRdouble (cpu, dual_FRdoublei);
1567   post_wait_for_FRdouble (cpu, dual_FRdoublej);
1568   post_wait_for_FRdouble (cpu, dual_FRdoublek);
1569   if (CGEN_ATTR_VALUE(idesc, idesc->attrs, CGEN_INSN_NON_EXCEPTING))
1570     {
1571       post_wait_for_SPR (cpu, FNER_FOR_FR (out_FRk));
1572       post_wait_for_SPR (cpu, FNER_FOR_FR (dual_FRk));
1573       post_wait_for_SPR (cpu, FNER_FOR_FR (out_FRdoublek));
1574       post_wait_for_SPR (cpu, FNER_FOR_FR (dual_FRdoublek));
1575     }
1576   restore_float_register_busy (cpu, in_FRi, in_FRj, out_FRk, 1);
1577   restore_float_register_busy (cpu, dual_FRi, dual_FRj, dual_FRk, 1);
1578   restore_double_register_busy (cpu, in_FRdoublei, in_FRdoublej, out_FRdoublek,
1579                                 1);
1580   restore_double_register_busy (cpu, dual_FRdoublei, dual_FRdoublej,
1581                                 dual_FRdoublek, 1);
1582
1583   /* The latency of FRk will be at least the latency of the other inputs.  */
1584   update_FR_latency (cpu, out_FRk, ps->post_wait);
1585   update_FR_latency (cpu, dual_FRk, ps->post_wait);
1586   update_FRdouble_latency (cpu, out_FRdoublek, ps->post_wait);
1587   update_FRdouble_latency (cpu, dual_FRdoublek, ps->post_wait);
1588
1589   if (CGEN_ATTR_VALUE(idesc, idesc->attrs, CGEN_INSN_NON_EXCEPTING))
1590     {
1591       update_SPR_latency (cpu, FNER_FOR_FR (out_FRk), ps->post_wait);
1592       update_SPR_latency (cpu, FNER_FOR_FR (dual_FRk), ps->post_wait);
1593       update_SPR_latency (cpu, FNER_FOR_FR (out_FRdoublek), ps->post_wait);
1594       update_SPR_latency (cpu, FNER_FOR_FR (dual_FRdoublek), ps->post_wait);
1595     }
1596
1597   /* Once initiated, post-processing will take 3 cycles.  */
1598   update_FR_ptime (cpu, out_FRk, 3);
1599   update_FR_ptime (cpu, dual_FRk, 3);
1600   update_FRdouble_ptime (cpu, out_FRdoublek, 3);
1601   update_FRdouble_ptime (cpu, dual_FRdoublek, 3);
1602
1603   if (CGEN_ATTR_VALUE(idesc, idesc->attrs, CGEN_INSN_NON_EXCEPTING))
1604     {
1605       update_SPR_ptime (cpu, FNER_FOR_FR (out_FRk), 3);
1606       update_SPR_ptime (cpu, FNER_FOR_FR (dual_FRk), 3);
1607       update_SPR_ptime (cpu, FNER_FOR_FR (out_FRdoublek), 3);
1608       update_SPR_ptime (cpu, FNER_FOR_FR (dual_FRdoublek), 3);
1609     }
1610
1611   /* Mark this use of the register as a floating point op.  */
1612   if (out_FRk >= 0)
1613     set_use_is_fpop (cpu, out_FRk);
1614   if (dual_FRk >= 0)
1615     set_use_is_fpop (cpu, dual_FRk);
1616   if (out_FRdoublek >= 0)
1617     {
1618       set_use_is_fpop (cpu, out_FRdoublek);
1619       if (out_FRdoublek < 63)
1620         set_use_is_fpop (cpu, out_FRdoublek + 1);
1621     }
1622   if (dual_FRdoublek >= 0)
1623     {
1624       set_use_is_fpop (cpu, dual_FRdoublek);
1625       if (dual_FRdoublek < 63)
1626         set_use_is_fpop (cpu, dual_FRdoublek + 1);
1627     }
1628
1629   return cycles;
1630 }
1631
1632 int
1633 frvbf_model_fr500_u_float_div (SIM_CPU *cpu, const IDESC *idesc,
1634                                int unit_num, int referenced,
1635                                INT in_FRi, INT in_FRj, INT out_FRk)
1636 {
1637   int cycles;
1638   FRV_VLIW *vliw;
1639   int slot;
1640   FRV_PROFILE_STATE *ps;
1641
1642   if (model_insn == FRV_INSN_MODEL_PASS_1)
1643     return 0;
1644
1645   cycles = idesc->timing->units[unit_num].done;
1646
1647   /* The post processing must wait if there is a dependency on a FR
1648      which is not ready yet.  */
1649   adjust_float_register_busy (cpu, in_FRi, in_FRj, out_FRk, 1);
1650   ps = CPU_PROFILE_STATE (cpu);
1651   ps->post_wait = cycles;
1652   post_wait_for_FR (cpu, in_FRi);
1653   post_wait_for_FR (cpu, in_FRj);
1654   post_wait_for_FR (cpu, out_FRk);
1655   if (CGEN_ATTR_VALUE(idesc, idesc->attrs, CGEN_INSN_NON_EXCEPTING))
1656     post_wait_for_SPR (cpu, FNER_FOR_FR (out_FRk));
1657   vliw = CPU_VLIW (cpu);
1658   slot = vliw->next_slot - 1;
1659   slot = (*vliw->current_vliw)[slot] - UNIT_FM0;
1660   post_wait_for_fdiv (cpu, slot);
1661   restore_float_register_busy (cpu, in_FRi, in_FRj, out_FRk, 1);
1662
1663   /* The latency of FRk will be at least the latency of the other inputs.  */
1664   /* Once initiated, post-processing will take 10 cycles.  */
1665   update_FR_latency (cpu, out_FRk, ps->post_wait);
1666   update_FR_ptime (cpu, out_FRk, 10);
1667
1668   if (CGEN_ATTR_VALUE(idesc, idesc->attrs, CGEN_INSN_NON_EXCEPTING))
1669     {
1670       /* FNER has a latency of 10 cycles.  */
1671       update_SPR_latency (cpu, FNER_FOR_FR (out_FRk), ps->post_wait);
1672       update_SPR_ptime (cpu, FNER_FOR_FR (out_FRk), 10);
1673     }
1674
1675   /* The latency of the fdiv unit will be at least the latency of the other
1676      inputs.  Once initiated, post-processing will take 9 cycles.  */
1677   update_fdiv_resource_latency (cpu, slot, ps->post_wait + 9);
1678
1679   /* Mark this use of the register as a floating point op.  */
1680   set_use_is_fpop (cpu, out_FRk);
1681
1682   return cycles;
1683 }
1684
1685 int
1686 frvbf_model_fr500_u_float_sqrt (SIM_CPU *cpu, const IDESC *idesc,
1687                                 int unit_num, int referenced,
1688                                 INT in_FRj, INT in_FRdoublej,
1689                                 INT out_FRk, INT out_FRdoublek)
1690 {
1691   int cycles;
1692   FRV_VLIW *vliw;
1693   int slot;
1694   FRV_PROFILE_STATE *ps;
1695
1696   if (model_insn == FRV_INSN_MODEL_PASS_1)
1697     return 0;
1698
1699   cycles = idesc->timing->units[unit_num].done;
1700
1701   /* The post processing must wait if there is a dependency on a FR
1702      which is not ready yet.  */
1703   adjust_float_register_busy (cpu, -1, in_FRj, out_FRk, 1);
1704   adjust_double_register_busy (cpu, -1, in_FRdoublej, out_FRdoublek, 1);
1705   ps = CPU_PROFILE_STATE (cpu);
1706   ps->post_wait = cycles;
1707   post_wait_for_FR (cpu, in_FRj);
1708   post_wait_for_FR (cpu, out_FRk);
1709   post_wait_for_FRdouble (cpu, in_FRdoublej);
1710   post_wait_for_FRdouble (cpu, out_FRdoublek);
1711   if (CGEN_ATTR_VALUE(idesc, idesc->attrs, CGEN_INSN_NON_EXCEPTING))
1712     post_wait_for_SPR (cpu, FNER_FOR_FR (out_FRk));
1713   vliw = CPU_VLIW (cpu);
1714   slot = vliw->next_slot - 1;
1715   slot = (*vliw->current_vliw)[slot] - UNIT_FM0;
1716   post_wait_for_fsqrt (cpu, slot);
1717   restore_float_register_busy (cpu, -1, in_FRj, out_FRk, 1);
1718   restore_double_register_busy (cpu, -1, in_FRdoublej, out_FRdoublek, 1);
1719
1720   /* The latency of FRk will be at least the latency of the other inputs.  */
1721   update_FR_latency (cpu, out_FRk, ps->post_wait);
1722   update_FRdouble_latency (cpu, out_FRdoublek, ps->post_wait);
1723   if (CGEN_ATTR_VALUE(idesc, idesc->attrs, CGEN_INSN_NON_EXCEPTING))
1724     update_SPR_latency (cpu, FNER_FOR_FR (out_FRk), ps->post_wait);
1725
1726   /* Once initiated, post-processing will take 15 cycles.  */
1727   update_FR_ptime (cpu, out_FRk, 15);
1728   update_FRdouble_ptime (cpu, out_FRdoublek, 15);
1729
1730   if (CGEN_ATTR_VALUE(idesc, idesc->attrs, CGEN_INSN_NON_EXCEPTING))
1731     update_SPR_ptime (cpu, FNER_FOR_FR (out_FRk), 15);
1732
1733   /* The latency of the sqrt unit will be the latency of the other
1734      inputs plus 14 cycles.  */
1735   update_fsqrt_resource_latency (cpu, slot, ps->post_wait + 14);
1736
1737   /* Mark this use of the register as a floating point op.  */
1738   if (out_FRk >= 0)
1739     set_use_is_fpop (cpu, out_FRk);
1740   if (out_FRdoublek >= 0)
1741     {
1742       set_use_is_fpop (cpu, out_FRdoublek);
1743       if (out_FRdoublek < 63)
1744         set_use_is_fpop (cpu, out_FRdoublek + 1);
1745     }
1746
1747   return cycles;
1748 }
1749
1750 int
1751 frvbf_model_fr500_u_float_dual_sqrt (SIM_CPU *cpu, const IDESC *idesc,
1752                                      int unit_num, int referenced,
1753                                      INT in_FRj, INT out_FRk)
1754 {
1755   int cycles;
1756   FRV_VLIW *vliw;
1757   int slot;
1758   INT dual_FRj;
1759   INT dual_FRk;
1760   FRV_PROFILE_STATE *ps;
1761
1762   if (model_insn == FRV_INSN_MODEL_PASS_1)
1763     return 0;
1764
1765   cycles = idesc->timing->units[unit_num].done;
1766
1767   /* The post processing must wait if there is a dependency on a FR
1768      which is not ready yet.  */
1769   dual_FRj = DUAL_REG (in_FRj);
1770   dual_FRk = DUAL_REG (out_FRk);
1771   adjust_float_register_busy (cpu, -1, in_FRj, out_FRk, 1);
1772   adjust_float_register_busy (cpu, -1, dual_FRj, dual_FRk, 1);
1773   ps = CPU_PROFILE_STATE (cpu);
1774   ps->post_wait = cycles;
1775   post_wait_for_FR (cpu, in_FRj);
1776   post_wait_for_FR (cpu, out_FRk);
1777   post_wait_for_FR (cpu, dual_FRj);
1778   post_wait_for_FR (cpu, dual_FRk);
1779
1780   vliw = CPU_VLIW (cpu);
1781   slot = vliw->next_slot - 1;
1782   slot = (*vliw->current_vliw)[slot] - UNIT_FM0;
1783   post_wait_for_fsqrt (cpu, slot);
1784   restore_float_register_busy (cpu, -1, in_FRj, out_FRk, 1);
1785   restore_float_register_busy (cpu, -1, dual_FRj, dual_FRk, 1);
1786
1787   /* The latency of FRk will be at least the latency of the other inputs.  */
1788   update_FR_latency (cpu, out_FRk, ps->post_wait);
1789   update_FR_latency (cpu, dual_FRk, ps->post_wait);
1790
1791   /* Once initiated, post-processing will take 15 cycles.  */
1792   update_FR_ptime (cpu, out_FRk, 15);
1793   update_FR_ptime (cpu, dual_FRk, 15);
1794
1795   /* The latency of the sqrt unit will be at least the latency of the other
1796      inputs.  */
1797   update_fsqrt_resource_latency (cpu, slot, ps->post_wait + 14);
1798
1799   /* Mark this use of the register as a floating point op.  */
1800   if (out_FRk >= 0)
1801     set_use_is_fpop (cpu, out_FRk);
1802   if (dual_FRk >= 0)
1803     set_use_is_fpop (cpu, dual_FRk);
1804
1805   return cycles;
1806 }
1807
1808 int
1809 frvbf_model_fr500_u_float_compare (SIM_CPU *cpu, const IDESC *idesc,
1810                                    int unit_num, int referenced,
1811                                    INT in_FRi, INT in_FRj,
1812                                    INT in_FRdoublei, INT in_FRdoublej,
1813                                    INT out_FCCi_2)
1814 {
1815   int cycles;
1816   FRV_PROFILE_STATE *ps;
1817
1818   if (model_insn == FRV_INSN_MODEL_PASS_1)
1819     return 0;
1820
1821   /* The preprocessing can execute right away.  */
1822   cycles = idesc->timing->units[unit_num].done;
1823
1824   /* The post processing must wait if there is a dependency on a FR
1825      which is not ready yet.  */
1826   adjust_double_register_busy (cpu, in_FRdoublei, in_FRdoublej, -1, 1);
1827   ps = CPU_PROFILE_STATE (cpu);
1828   ps->post_wait = cycles;
1829   post_wait_for_FR (cpu, in_FRi);
1830   post_wait_for_FR (cpu, in_FRj);
1831   post_wait_for_FRdouble (cpu, in_FRdoublei);
1832   post_wait_for_FRdouble (cpu, in_FRdoublej);
1833   post_wait_for_CCR (cpu, out_FCCi_2);
1834   restore_double_register_busy (cpu, in_FRdoublei, in_FRdoublej, -1, 1);
1835
1836   /* The latency of FCCi_2 will be the latency of the other inputs plus 3
1837      cycles.  */
1838   update_CCR_latency (cpu, out_FCCi_2, ps->post_wait + 3);
1839
1840   return cycles;
1841 }
1842
1843 int
1844 frvbf_model_fr500_u_float_dual_compare (SIM_CPU *cpu, const IDESC *idesc,
1845                                         int unit_num, int referenced,
1846                                         INT in_FRi, INT in_FRj,
1847                                         INT out_FCCi_2)
1848 {
1849   int cycles;
1850   INT dual_FRi;
1851   INT dual_FRj;
1852   INT dual_FCCi_2;
1853   FRV_PROFILE_STATE *ps;
1854
1855   if (model_insn == FRV_INSN_MODEL_PASS_1)
1856     return 0;
1857
1858   /* The preprocessing can execute right away.  */
1859   cycles = idesc->timing->units[unit_num].done;
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   dual_FRi = DUAL_REG (in_FRi);
1866   dual_FRj = DUAL_REG (in_FRj);
1867   dual_FCCi_2 = out_FCCi_2 + 1;
1868   adjust_float_register_busy (cpu, in_FRi, in_FRj, -1, 1);
1869   adjust_float_register_busy (cpu, dual_FRi, dual_FRj, -1, 1);
1870   post_wait_for_FR (cpu, in_FRi);
1871   post_wait_for_FR (cpu, in_FRj);
1872   post_wait_for_FR (cpu, dual_FRi);
1873   post_wait_for_FR (cpu, dual_FRj);
1874   post_wait_for_CCR (cpu, out_FCCi_2);
1875   post_wait_for_CCR (cpu, dual_FCCi_2);
1876   restore_float_register_busy (cpu, in_FRi, in_FRj, -1, 1);
1877   restore_float_register_busy (cpu, dual_FRi, dual_FRj, -1, 1);
1878
1879   /* The latency of FCCi_2 will be the latency of the other inputs plus 3
1880      cycles.  */
1881   update_CCR_latency (cpu, out_FCCi_2, ps->post_wait + 3);
1882   update_CCR_latency (cpu, dual_FCCi_2, ps->post_wait + 3);
1883
1884   return cycles;
1885 }
1886
1887 int
1888 frvbf_model_fr500_u_float_convert (SIM_CPU *cpu, const IDESC *idesc,
1889                                    int unit_num, int referenced,
1890                                    INT in_FRj, INT in_FRintj, INT in_FRdoublej,
1891                                    INT out_FRk, INT out_FRintk,
1892                                    INT out_FRdoublek)
1893 {
1894   int cycles;
1895   FRV_PROFILE_STATE *ps;
1896
1897   if (model_insn == FRV_INSN_MODEL_PASS_1)
1898     return 0;
1899
1900   /* The preprocessing can execute right away.  */
1901   cycles = idesc->timing->units[unit_num].done;
1902
1903   /* The post processing must wait if there is a dependency on a FR
1904      which is not ready yet.  */
1905   ps = CPU_PROFILE_STATE (cpu);
1906   ps->post_wait = cycles;
1907   adjust_float_register_busy (cpu, -1, in_FRj, out_FRk, 1);
1908   adjust_float_register_busy (cpu, -1, in_FRintj, out_FRintk, 1);
1909   adjust_double_register_busy (cpu, -1, in_FRdoublej, out_FRdoublek, 1);
1910   post_wait_for_FR (cpu, in_FRj);
1911   post_wait_for_FR (cpu, in_FRintj);
1912   post_wait_for_FRdouble (cpu, in_FRdoublej);
1913   post_wait_for_FR (cpu, out_FRk);
1914   post_wait_for_FR (cpu, out_FRintk);
1915   post_wait_for_FRdouble (cpu, out_FRdoublek);
1916   if (CGEN_ATTR_VALUE(idesc, idesc->attrs, CGEN_INSN_NON_EXCEPTING))
1917     {
1918       post_wait_for_SPR (cpu, FNER_FOR_FR (out_FRk));
1919       post_wait_for_SPR (cpu, FNER_FOR_FR (out_FRintk));
1920       post_wait_for_SPR (cpu, FNER_FOR_FR (out_FRdoublek));
1921     }
1922   restore_float_register_busy (cpu, -1, in_FRj, out_FRk, 1);
1923   restore_float_register_busy (cpu, -1, in_FRintj, out_FRintk, 1);
1924   restore_double_register_busy (cpu, -1, in_FRdoublej, out_FRdoublek, 1);
1925
1926   /* The latency of FRk will be at least the latency of the other inputs.  */
1927   update_FR_latency (cpu, out_FRk, ps->post_wait);
1928   update_FR_latency (cpu, out_FRintk, ps->post_wait);
1929   update_FRdouble_latency (cpu, out_FRdoublek, ps->post_wait);
1930
1931   if (CGEN_ATTR_VALUE(idesc, idesc->attrs, CGEN_INSN_NON_EXCEPTING))
1932     {
1933       update_SPR_latency (cpu, FNER_FOR_FR (out_FRk), ps->post_wait);
1934       update_SPR_latency (cpu, FNER_FOR_FR (out_FRintk), ps->post_wait);
1935       update_SPR_latency (cpu, FNER_FOR_FR (out_FRdoublek), ps->post_wait);
1936     }
1937
1938   /* Once initiated, post-processing will take 3 cycles.  */
1939   update_FR_ptime (cpu, out_FRk, 3);
1940   update_FR_ptime (cpu, out_FRintk, 3);
1941   update_FRdouble_ptime (cpu, out_FRdoublek, 3);
1942
1943   if (CGEN_ATTR_VALUE(idesc, idesc->attrs, CGEN_INSN_NON_EXCEPTING))
1944     {
1945       update_SPR_ptime (cpu, FNER_FOR_FR (out_FRk), 3);
1946       update_SPR_ptime (cpu, FNER_FOR_FR (out_FRintk), 3);
1947       update_SPR_ptime (cpu, FNER_FOR_FR (out_FRdoublek), 3);
1948     }
1949
1950   /* Mark this use of the register as a floating point op.  */
1951   if (out_FRk >= 0)
1952     set_use_is_fpop (cpu, out_FRk);
1953   if (out_FRintk >= 0)
1954     set_use_is_fpop (cpu, out_FRintk);
1955   if (out_FRdoublek >= 0)
1956     {
1957       set_use_is_fpop (cpu, out_FRdoublek);
1958       set_use_is_fpop (cpu, out_FRdoublek + 1);
1959     }
1960
1961   return cycles;
1962 }
1963
1964 int
1965 frvbf_model_fr500_u_float_dual_convert (SIM_CPU *cpu, const IDESC *idesc,
1966                                         int unit_num, int referenced,
1967                                         INT in_FRj, INT in_FRintj,
1968                                         INT out_FRk, INT out_FRintk)
1969 {
1970   int cycles;
1971   INT dual_FRj;
1972   INT dual_FRintj;
1973   INT dual_FRk;
1974   INT dual_FRintk;
1975   FRV_PROFILE_STATE *ps;
1976
1977   if (model_insn == FRV_INSN_MODEL_PASS_1)
1978     return 0;
1979
1980   /* The preprocessing can execute right away.  */
1981   cycles = idesc->timing->units[unit_num].done;
1982
1983   /* The post processing must wait if there is a dependency on a FR
1984      which is not ready yet.  */
1985   ps = CPU_PROFILE_STATE (cpu);
1986   ps->post_wait = cycles;
1987   dual_FRj = DUAL_REG (in_FRj);
1988   dual_FRintj = DUAL_REG (in_FRintj);
1989   dual_FRk = DUAL_REG (out_FRk);
1990   dual_FRintk = DUAL_REG (out_FRintk);
1991   adjust_float_register_busy (cpu, -1, in_FRj, out_FRk, 1);
1992   adjust_float_register_busy (cpu, -1, dual_FRj, dual_FRk, 1);
1993   adjust_float_register_busy (cpu, -1, in_FRintj, out_FRintk, 1);
1994   adjust_float_register_busy (cpu, -1, dual_FRintj, dual_FRintk, 1);
1995   post_wait_for_FR (cpu, in_FRj);
1996   post_wait_for_FR (cpu, in_FRintj);
1997   post_wait_for_FR (cpu, out_FRk);
1998   post_wait_for_FR (cpu, out_FRintk);
1999   post_wait_for_FR (cpu, dual_FRj);
2000   post_wait_for_FR (cpu, dual_FRintj);
2001   post_wait_for_FR (cpu, dual_FRk);
2002   post_wait_for_FR (cpu, dual_FRintk);
2003   restore_float_register_busy (cpu, -1, in_FRj, out_FRk, 1);
2004   restore_float_register_busy (cpu, -1, dual_FRj, dual_FRk, 1);
2005   restore_float_register_busy (cpu, -1, in_FRintj, out_FRintk, 1);
2006   restore_float_register_busy (cpu, -1, dual_FRintj, dual_FRintk, 1);
2007
2008   /* The latency of FRk will be at least the latency of the other inputs.  */
2009   update_FR_latency (cpu, out_FRk, ps->post_wait);
2010   update_FR_latency (cpu, out_FRintk, ps->post_wait);
2011   update_FR_latency (cpu, dual_FRk, ps->post_wait);
2012   update_FR_latency (cpu, dual_FRintk, ps->post_wait);
2013
2014   /* Once initiated, post-processing will take 3 cycles.  */
2015   update_FR_ptime (cpu, out_FRk, 3);
2016   update_FR_ptime (cpu, out_FRintk, 3);
2017   update_FR_ptime (cpu, dual_FRk, 3);
2018   update_FR_ptime (cpu, dual_FRintk, 3);
2019
2020   /* Mark this use of the register as a floating point op.  */
2021   if (out_FRk >= 0)
2022     set_use_is_fpop (cpu, out_FRk);
2023   if (out_FRintk >= 0)
2024     set_use_is_fpop (cpu, out_FRintk);
2025
2026   return cycles;
2027 }
2028
2029 int
2030 frvbf_model_fr500_u_media (SIM_CPU *cpu, const IDESC *idesc,
2031                            int unit_num, int referenced,
2032                            INT in_FRi, INT in_FRj, INT in_ACC40Si, INT in_ACCGi,
2033                            INT out_FRk,
2034                            INT out_ACC40Sk, INT out_ACC40Uk, INT out_ACCGk)
2035 {
2036   int cycles;
2037   FRV_PROFILE_STATE *ps;
2038   const CGEN_INSN *insn;
2039   int is_media_s1;
2040   int is_media_s2;
2041   int busy_adjustment[] = {0, 0, 0};
2042   int *fr;
2043   int *acc;
2044
2045   if (model_insn == FRV_INSN_MODEL_PASS_1)
2046     return 0;
2047
2048   /* The preprocessing can execute right away.  */
2049   cycles = idesc->timing->units[unit_num].done;
2050
2051   ps = CPU_PROFILE_STATE (cpu);
2052   insn = idesc->idata;
2053
2054   /* If the previous use of the registers was a media op,
2055      then their latency will be less than previously recorded.
2056      See Table 13-13 in the LSI.  */
2057   if (in_FRi >= 0)
2058     {
2059       if (use_is_media (cpu, in_FRi))
2060         {
2061           busy_adjustment[0] = 2;
2062           decrease_FR_busy (cpu, in_FRi, busy_adjustment[0]);
2063         }
2064       else
2065         enforce_full_fr_latency (cpu, in_FRi);
2066     }
2067   if (in_FRj >= 0 && in_FRj != in_FRi)
2068     {
2069       if (use_is_media (cpu, in_FRj))
2070         {
2071           busy_adjustment[1] = 2;
2072           decrease_FR_busy (cpu, in_FRj, busy_adjustment[1]);
2073         }
2074       else
2075         enforce_full_fr_latency (cpu, in_FRj);
2076     }
2077   if (out_FRk >= 0 && out_FRk != in_FRi && out_FRk != in_FRj)
2078     {
2079       if (use_is_media (cpu, out_FRk))
2080         {
2081           busy_adjustment[2] = 2;
2082           decrease_FR_busy (cpu, out_FRk, busy_adjustment[2]);
2083         }
2084       else
2085         enforce_full_fr_latency (cpu, out_FRk);
2086     }
2087
2088   /* The post processing must wait if there is a dependency on a FR
2089      which is not ready yet.  */
2090   ps->post_wait = cycles;
2091   post_wait_for_FR (cpu, in_FRi);
2092   post_wait_for_FR (cpu, in_FRj);
2093   post_wait_for_FR (cpu, out_FRk);
2094   post_wait_for_ACC (cpu, in_ACC40Si);
2095   post_wait_for_ACC (cpu, in_ACCGi);
2096   post_wait_for_ACC (cpu, out_ACC40Sk);
2097   post_wait_for_ACC (cpu, out_ACC40Uk);
2098   post_wait_for_ACC (cpu, out_ACCGk);
2099
2100   /* Restore the busy cycles of the registers we used.  */
2101   fr = ps->fr_busy;
2102   if (in_FRi >= 0)
2103     fr[in_FRi] += busy_adjustment[0];
2104   if (in_FRj >= 0)
2105     fr[in_FRj] += busy_adjustment[1];
2106   if (out_FRk >= 0)
2107     fr[out_FRk] += busy_adjustment[2];
2108
2109   /* The latency of tht output register will be at least the latency of the
2110      other inputs.  Once initiated, post-processing will take 3 cycles.  */
2111   if (out_FRk >= 0)
2112     {
2113       update_FR_latency (cpu, out_FRk, ps->post_wait);
2114       update_FR_ptime (cpu, out_FRk, 3);
2115       /* Mark this use of the register as a media op.  */
2116       set_use_is_media (cpu, out_FRk);
2117     }
2118   /* The latency of tht output accumulator will be at least the latency of the
2119      other inputs.  Once initiated, post-processing will take 1 cycle.  */
2120   if (out_ACC40Sk >= 0)
2121     update_ACC_latency (cpu, out_ACC40Sk, ps->post_wait + 1);
2122   if (out_ACC40Uk >= 0)
2123     update_ACC_latency (cpu, out_ACC40Uk, ps->post_wait + 1);
2124   if (out_ACCGk >= 0)
2125     update_ACC_latency (cpu, out_ACCGk, ps->post_wait + 1);
2126
2127   return cycles;
2128 }
2129
2130 int
2131 frvbf_model_fr500_u_media_quad_arith (SIM_CPU *cpu, const IDESC *idesc,
2132                                        int unit_num, int referenced,
2133                                        INT in_FRi, INT in_FRj,
2134                                        INT out_FRk)
2135 {
2136   int cycles;
2137   INT dual_FRi;
2138   INT dual_FRj;
2139   INT dual_FRk;
2140   FRV_PROFILE_STATE *ps;
2141   int busy_adjustment[] = {0, 0, 0, 0, 0, 0};
2142   int *fr;
2143
2144   if (model_insn == FRV_INSN_MODEL_PASS_1)
2145     return 0;
2146
2147   /* The preprocessing can execute right away.  */
2148   cycles = idesc->timing->units[unit_num].done;
2149
2150   ps = CPU_PROFILE_STATE (cpu);
2151   dual_FRi = DUAL_REG (in_FRi);
2152   dual_FRj = DUAL_REG (in_FRj);
2153   dual_FRk = DUAL_REG (out_FRk);
2154
2155   /* If the previous use of the registers was a media op,
2156      then their latency will be less than previously recorded.
2157      See Table 13-13 in the LSI.  */
2158   if (use_is_media (cpu, in_FRi))
2159     {
2160       busy_adjustment[0] = 2;
2161       decrease_FR_busy (cpu, in_FRi, busy_adjustment[0]);
2162     }
2163   else
2164     enforce_full_fr_latency (cpu, in_FRi);
2165   if (dual_FRi >= 0 && use_is_media (cpu, dual_FRi))
2166     {
2167       busy_adjustment[1] = 2;
2168       decrease_FR_busy (cpu, dual_FRi, busy_adjustment[1]);
2169     }
2170   else
2171     enforce_full_fr_latency (cpu, dual_FRi);
2172   if (in_FRj != in_FRi)
2173     {
2174       if (use_is_media (cpu, in_FRj))
2175         {
2176           busy_adjustment[2] = 2;
2177           decrease_FR_busy (cpu, in_FRj, busy_adjustment[2]);
2178         }
2179       else
2180         enforce_full_fr_latency (cpu, in_FRj);
2181       if (dual_FRj >= 0 && use_is_media (cpu, dual_FRj))
2182         {
2183           busy_adjustment[3] = 2;
2184           decrease_FR_busy (cpu, dual_FRj, busy_adjustment[3]);
2185         }
2186       else
2187         enforce_full_fr_latency (cpu, dual_FRj + 1);
2188     }
2189   if (out_FRk != in_FRi && out_FRk != in_FRj)
2190     {
2191       if (use_is_media (cpu, out_FRk))
2192         {
2193           busy_adjustment[4] = 2;
2194           decrease_FR_busy (cpu, out_FRk, busy_adjustment[4]);
2195         }
2196       else
2197         enforce_full_fr_latency (cpu, out_FRk);
2198       if (dual_FRk >= 0 && use_is_media (cpu, dual_FRk))
2199         {
2200           busy_adjustment[5] = 2;
2201           decrease_FR_busy (cpu, dual_FRk, busy_adjustment[5]);
2202         }
2203       else
2204         enforce_full_fr_latency (cpu, dual_FRk);
2205     }
2206
2207   /* The post processing must wait if there is a dependency on a FR
2208      which is not ready yet.  */
2209   ps->post_wait = cycles;
2210   post_wait_for_FR (cpu, in_FRi);
2211   post_wait_for_FR (cpu, dual_FRi);
2212   post_wait_for_FR (cpu, in_FRj);
2213   post_wait_for_FR (cpu, dual_FRj);
2214   post_wait_for_FR (cpu, out_FRk);
2215   post_wait_for_FR (cpu, dual_FRk);
2216
2217   /* Restore the busy cycles of the registers we used.  */
2218   fr = ps->fr_busy;
2219   fr[in_FRi] += busy_adjustment[0];
2220   if (dual_FRi >= 0)
2221     fr[dual_FRi] += busy_adjustment[1];
2222   fr[in_FRj] += busy_adjustment[2];
2223   if (dual_FRj >= 0)
2224     fr[dual_FRj] += busy_adjustment[3];
2225   fr[out_FRk] += busy_adjustment[4];
2226   if (dual_FRk >= 0)
2227     fr[dual_FRk] += busy_adjustment[5];
2228
2229   /* The latency of tht output register will be at least the latency of the
2230      other inputs.  */
2231   update_FR_latency (cpu, out_FRk, ps->post_wait);
2232
2233   /* Once initiated, post-processing will take 3 cycles.  */
2234   update_FR_ptime (cpu, out_FRk, 3);
2235
2236   /* Mark this use of the register as a media op.  */
2237   set_use_is_media (cpu, out_FRk);
2238   if (dual_FRk >= 0)
2239     {
2240       update_FR_latency (cpu, dual_FRk, ps->post_wait);
2241       update_FR_ptime (cpu, dual_FRk, 3);
2242       /* Mark this use of the register as a media op.  */
2243       set_use_is_media (cpu, dual_FRk);
2244     }
2245
2246   return cycles;
2247 }
2248
2249 int
2250 frvbf_model_fr500_u_media_dual_mul (SIM_CPU *cpu, const IDESC *idesc,
2251                                     int unit_num, int referenced,
2252                                     INT in_FRi, INT in_FRj,
2253                                     INT out_ACC40Sk, INT out_ACC40Uk)
2254 {
2255   int cycles;
2256   INT dual_ACC40Sk;
2257   INT dual_ACC40Uk;
2258   FRV_PROFILE_STATE *ps;
2259   int busy_adjustment[] = {0, 0, 0, 0, 0, 0};
2260   int *fr;
2261   int *acc;
2262
2263   if (model_insn == FRV_INSN_MODEL_PASS_1)
2264     return 0;
2265
2266   /* The preprocessing can execute right away.  */
2267   cycles = idesc->timing->units[unit_num].done;
2268
2269   ps = CPU_PROFILE_STATE (cpu);
2270   dual_ACC40Sk = DUAL_REG (out_ACC40Sk);
2271   dual_ACC40Uk = DUAL_REG (out_ACC40Uk);
2272
2273   /* If the previous use of the registers was a media op,
2274      then their latency will be less than previously recorded.
2275      See Table 13-13 in the LSI.  */
2276   if (use_is_media (cpu, in_FRi))
2277     {
2278       busy_adjustment[0] = 2;
2279       decrease_FR_busy (cpu, in_FRi, busy_adjustment[0]);
2280     }
2281   else
2282     enforce_full_fr_latency (cpu, in_FRi);
2283   if (in_FRj != in_FRi)
2284     {
2285       if (use_is_media (cpu, in_FRj))
2286         {
2287           busy_adjustment[1] = 2;
2288           decrease_FR_busy (cpu, in_FRj, busy_adjustment[1]);
2289         }
2290       else
2291         enforce_full_fr_latency (cpu, in_FRj);
2292     }
2293   if (out_ACC40Sk >= 0)
2294     {
2295       busy_adjustment[2] = 1;
2296       decrease_ACC_busy (cpu, out_ACC40Sk, busy_adjustment[2]);
2297     }
2298   if (dual_ACC40Sk >= 0)
2299     {
2300       busy_adjustment[3] = 1;
2301       decrease_ACC_busy (cpu, dual_ACC40Sk, busy_adjustment[3]);
2302     }
2303   if (out_ACC40Uk >= 0)
2304     {
2305       busy_adjustment[4] = 1;
2306       decrease_ACC_busy (cpu, out_ACC40Uk, busy_adjustment[4]);
2307     }
2308   if (dual_ACC40Uk >= 0)
2309     {
2310       busy_adjustment[5] = 1;
2311       decrease_ACC_busy (cpu, dual_ACC40Uk, busy_adjustment[5]);
2312     }
2313
2314   /* The post processing must wait if there is a dependency on a FR
2315      which is not ready yet.  */
2316   ps->post_wait = cycles;
2317   post_wait_for_FR (cpu, in_FRi);
2318   post_wait_for_FR (cpu, in_FRj);
2319   post_wait_for_ACC (cpu, out_ACC40Sk);
2320   post_wait_for_ACC (cpu, dual_ACC40Sk);
2321   post_wait_for_ACC (cpu, out_ACC40Uk);
2322   post_wait_for_ACC (cpu, dual_ACC40Uk);
2323
2324   /* Restore the busy cycles of the registers we used.  */
2325   fr = ps->fr_busy;
2326   acc = ps->acc_busy;
2327   fr[in_FRi] += busy_adjustment[0];
2328   fr[in_FRj] += busy_adjustment[1];
2329   if (out_ACC40Sk >= 0)
2330     acc[out_ACC40Sk] += busy_adjustment[2];
2331   if (dual_ACC40Sk >= 0)
2332     acc[dual_ACC40Sk] += busy_adjustment[3];
2333   if (out_ACC40Uk >= 0)
2334     acc[out_ACC40Uk] += busy_adjustment[4];
2335   if (dual_ACC40Uk >= 0)
2336     acc[dual_ACC40Uk] += busy_adjustment[5];
2337
2338   /* The latency of tht output register will be at least the latency of the
2339      other inputs.  Once initiated, post-processing will take 1 cycle.  */
2340   if (out_ACC40Sk >= 0)
2341     update_ACC_latency (cpu, out_ACC40Sk, ps->post_wait + 1);
2342   if (dual_ACC40Sk >= 0)
2343     update_ACC_latency (cpu, dual_ACC40Sk, ps->post_wait + 1);
2344   if (out_ACC40Uk >= 0)
2345     update_ACC_latency (cpu, out_ACC40Uk, ps->post_wait + 1);
2346   if (dual_ACC40Uk >= 0)
2347     update_ACC_latency (cpu, dual_ACC40Uk, ps->post_wait + 1);
2348
2349   return cycles;
2350 }
2351
2352 int
2353 frvbf_model_fr500_u_media_quad_mul (SIM_CPU *cpu, const IDESC *idesc,
2354                                     int unit_num, int referenced,
2355                                     INT in_FRi, INT in_FRj,
2356                                     INT out_ACC40Sk, INT out_ACC40Uk)
2357 {
2358   int cycles;
2359   INT FRi_1;
2360   INT FRj_1;
2361   INT ACC40Sk_1;
2362   INT ACC40Sk_2;
2363   INT ACC40Sk_3;
2364   INT ACC40Uk_1;
2365   INT ACC40Uk_2;
2366   INT ACC40Uk_3;
2367   FRV_PROFILE_STATE *ps;
2368   int busy_adjustment[] = {0, 0, 0, 0, 0, 0, 0 ,0};
2369   int *fr;
2370   int *acc;
2371
2372   if (model_insn == FRV_INSN_MODEL_PASS_1)
2373     return 0;
2374
2375   /* The preprocessing can execute right away.  */
2376   cycles = idesc->timing->units[unit_num].done;
2377
2378   FRi_1 = DUAL_REG (in_FRi);
2379   FRj_1 = DUAL_REG (in_FRj);
2380   ACC40Sk_1 = DUAL_REG (out_ACC40Sk);
2381   ACC40Sk_2 = DUAL_REG (ACC40Sk_1);
2382   ACC40Sk_3 = DUAL_REG (ACC40Sk_2);
2383   ACC40Uk_1 = DUAL_REG (out_ACC40Uk);
2384   ACC40Uk_2 = DUAL_REG (ACC40Uk_1);
2385   ACC40Uk_3 = DUAL_REG (ACC40Uk_2);
2386
2387   /* If the previous use of the registers was a media op,
2388      then their latency will be less than previously recorded.
2389      See Table 13-13 in the LSI.  */
2390   ps = CPU_PROFILE_STATE (cpu);
2391   if (use_is_media (cpu, in_FRi))
2392     {
2393       busy_adjustment[0] = 2;
2394       decrease_FR_busy (cpu, in_FRi, busy_adjustment[0]);
2395     }
2396   else
2397     enforce_full_fr_latency (cpu, in_FRi);
2398   if (FRi_1 >= 0)
2399     {
2400       if (use_is_media (cpu, FRi_1))
2401         {
2402           busy_adjustment[1] = 2;
2403           decrease_FR_busy (cpu, FRi_1, busy_adjustment[1]);
2404         }
2405       else
2406         enforce_full_fr_latency (cpu, FRi_1);
2407     }
2408   if (in_FRj != in_FRi)
2409     {
2410       if (use_is_media (cpu, in_FRj))
2411         {
2412           busy_adjustment[2] = 2;
2413           decrease_FR_busy (cpu, in_FRj, busy_adjustment[2]);
2414         }
2415       else
2416         enforce_full_fr_latency (cpu, in_FRj);
2417       if (FRj_1 >= 0)
2418         {
2419           if (use_is_media (cpu, FRj_1))
2420             {
2421               busy_adjustment[3] = 2;
2422               decrease_FR_busy (cpu, FRj_1, busy_adjustment[3]);
2423             }
2424           else
2425             enforce_full_fr_latency (cpu, FRj_1);
2426         }
2427     }
2428   if (out_ACC40Sk >= 0)
2429     {
2430       busy_adjustment[4] = 1;
2431       decrease_ACC_busy (cpu, out_ACC40Sk, busy_adjustment[4]);
2432
2433       if (ACC40Sk_1 >= 0)
2434         {
2435           busy_adjustment[5] = 1;
2436           decrease_ACC_busy (cpu, ACC40Sk_1, busy_adjustment[5]);
2437         }
2438       if (ACC40Sk_2 >= 0)
2439         {
2440           busy_adjustment[6] = 1;
2441           decrease_ACC_busy (cpu, ACC40Sk_2, busy_adjustment[6]);
2442         }
2443       if (ACC40Sk_3 >= 0)
2444         {
2445           busy_adjustment[7] = 1;
2446           decrease_ACC_busy (cpu, ACC40Sk_3, busy_adjustment[7]);
2447         }
2448     }
2449   else if (out_ACC40Uk >= 0)
2450     {
2451       busy_adjustment[4] = 1;
2452       decrease_ACC_busy (cpu, out_ACC40Uk, busy_adjustment[4]);
2453
2454       if (ACC40Uk_1 >= 0)
2455         {
2456           busy_adjustment[5] = 1;
2457           decrease_ACC_busy (cpu, ACC40Uk_1, busy_adjustment[5]);
2458         }
2459       if (ACC40Uk_2 >= 0)
2460         {
2461           busy_adjustment[6] = 1;
2462           decrease_ACC_busy (cpu, ACC40Uk_2, busy_adjustment[6]);
2463         }
2464       if (ACC40Uk_3 >= 0)
2465         {
2466           busy_adjustment[7] = 1;
2467           decrease_ACC_busy (cpu, ACC40Uk_3, busy_adjustment[7]);
2468         }
2469     }
2470
2471   /* The post processing must wait if there is a dependency on a FR
2472      which is not ready yet.  */
2473   ps->post_wait = cycles;
2474   post_wait_for_FR (cpu, in_FRi);
2475   post_wait_for_FR (cpu, FRi_1);
2476   post_wait_for_FR (cpu, in_FRj);
2477   post_wait_for_FR (cpu, FRj_1);
2478   post_wait_for_ACC (cpu, out_ACC40Sk);
2479   post_wait_for_ACC (cpu, ACC40Sk_1);
2480   post_wait_for_ACC (cpu, ACC40Sk_2);
2481   post_wait_for_ACC (cpu, ACC40Sk_3);
2482   post_wait_for_ACC (cpu, out_ACC40Uk);
2483   post_wait_for_ACC (cpu, ACC40Uk_1);
2484   post_wait_for_ACC (cpu, ACC40Uk_2);
2485   post_wait_for_ACC (cpu, ACC40Uk_3);
2486
2487   /* Restore the busy cycles of the registers we used.  */
2488   fr = ps->fr_busy;
2489   acc = ps->acc_busy;
2490   fr[in_FRi] += busy_adjustment[0];
2491   if (FRi_1 >= 0)
2492     fr[FRi_1] += busy_adjustment[1];
2493   fr[in_FRj] += busy_adjustment[2];
2494   if (FRj_1 > 0)
2495     fr[FRj_1] += busy_adjustment[3];
2496   if (out_ACC40Sk >= 0)
2497     {
2498       acc[out_ACC40Sk] += busy_adjustment[4];
2499       if (ACC40Sk_1 >= 0)
2500         acc[ACC40Sk_1] += busy_adjustment[5];
2501       if (ACC40Sk_2 >= 0)
2502         acc[ACC40Sk_2] += busy_adjustment[6];
2503       if (ACC40Sk_3 >= 0)
2504         acc[ACC40Sk_3] += busy_adjustment[7];
2505     }
2506   else if (out_ACC40Uk >= 0)
2507     {
2508       acc[out_ACC40Uk] += busy_adjustment[4];
2509       if (ACC40Uk_1 >= 0)
2510         acc[ACC40Uk_1] += busy_adjustment[5];
2511       if (ACC40Uk_2 >= 0)
2512         acc[ACC40Uk_2] += busy_adjustment[6];
2513       if (ACC40Uk_3 >= 0)
2514         acc[ACC40Uk_3] += busy_adjustment[7];
2515     }
2516
2517   /* The latency of tht output register will be at least the latency of the
2518      other inputs.  Once initiated, post-processing will take 1 cycle.  */
2519   if (out_ACC40Sk >= 0)
2520     {
2521       update_ACC_latency (cpu, out_ACC40Sk, ps->post_wait + 1);
2522       if (ACC40Sk_1 >= 0)
2523         update_ACC_latency (cpu, ACC40Sk_1, ps->post_wait + 1);
2524       if (ACC40Sk_2 >= 0)
2525         update_ACC_latency (cpu, ACC40Sk_2, ps->post_wait + 1);
2526       if (ACC40Sk_3 >= 0)
2527         update_ACC_latency (cpu, ACC40Sk_3, ps->post_wait + 1);
2528     }
2529   else if (out_ACC40Uk >= 0)
2530     {
2531       update_ACC_latency (cpu, out_ACC40Uk, ps->post_wait + 1);
2532       if (ACC40Uk_1 >= 0)
2533         update_ACC_latency (cpu, ACC40Uk_1, ps->post_wait + 1);
2534       if (ACC40Uk_2 >= 0)
2535         update_ACC_latency (cpu, ACC40Uk_2, ps->post_wait + 1);
2536       if (ACC40Uk_3 >= 0)
2537         update_ACC_latency (cpu, ACC40Uk_3, ps->post_wait + 1);
2538     }
2539
2540   return cycles;
2541 }
2542
2543 int
2544 frvbf_model_fr500_u_media_quad_complex (SIM_CPU *cpu, const IDESC *idesc,
2545                                         int unit_num, int referenced,
2546                                         INT in_FRi, INT in_FRj,
2547                                         INT out_ACC40Sk)
2548 {
2549   int cycles;
2550   INT FRi_1;
2551   INT FRj_1;
2552   INT ACC40Sk_1;
2553   FRV_PROFILE_STATE *ps;
2554   int busy_adjustment[] = {0, 0, 0, 0, 0, 0};
2555   int *fr;
2556   int *acc;
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   FRi_1 = DUAL_REG (in_FRi);
2565   FRj_1 = DUAL_REG (in_FRj);
2566   ACC40Sk_1 = DUAL_REG (out_ACC40Sk);
2567
2568   /* If the previous use of the registers was a media op,
2569      then their latency will be less than previously recorded.
2570      See Table 13-13 in the LSI.  */
2571   ps = CPU_PROFILE_STATE (cpu);
2572   if (use_is_media (cpu, in_FRi))
2573     {
2574       busy_adjustment[0] = 2;
2575       decrease_FR_busy (cpu, in_FRi, busy_adjustment[0]);
2576     }
2577   else
2578     enforce_full_fr_latency (cpu, in_FRi);
2579   if (FRi_1 >= 0)
2580     {
2581       if (use_is_media (cpu, FRi_1))
2582         {
2583           busy_adjustment[1] = 2;
2584           decrease_FR_busy (cpu, FRi_1, busy_adjustment[1]);
2585         }
2586       else
2587         enforce_full_fr_latency (cpu, FRi_1);
2588     }
2589   if (in_FRj != in_FRi)
2590     {
2591       if (use_is_media (cpu, in_FRj))
2592         {
2593           busy_adjustment[2] = 2;
2594           decrease_FR_busy (cpu, in_FRj, busy_adjustment[2]);
2595         }
2596       else
2597         enforce_full_fr_latency (cpu, in_FRj);
2598       if (FRj_1 >= 0)
2599         {
2600           if (use_is_media (cpu, FRj_1))
2601             {
2602               busy_adjustment[3] = 2;
2603               decrease_FR_busy (cpu, FRj_1, busy_adjustment[3]);
2604             }
2605           else
2606             enforce_full_fr_latency (cpu, FRj_1);
2607         }
2608     }
2609   if (out_ACC40Sk >= 0)
2610     {
2611       busy_adjustment[4] = 1;
2612       decrease_ACC_busy (cpu, out_ACC40Sk, busy_adjustment[4]);
2613
2614       if (ACC40Sk_1 >= 0)
2615         {
2616           busy_adjustment[5] = 1;
2617           decrease_ACC_busy (cpu, ACC40Sk_1, busy_adjustment[5]);
2618         }
2619     }
2620
2621   /* The post processing must wait if there is a dependency on a FR
2622      which is not ready yet.  */
2623   ps->post_wait = cycles;
2624   post_wait_for_FR (cpu, in_FRi);
2625   post_wait_for_FR (cpu, FRi_1);
2626   post_wait_for_FR (cpu, in_FRj);
2627   post_wait_for_FR (cpu, FRj_1);
2628   post_wait_for_ACC (cpu, out_ACC40Sk);
2629   post_wait_for_ACC (cpu, ACC40Sk_1);
2630
2631   /* Restore the busy cycles of the registers we used.  */
2632   fr = ps->fr_busy;
2633   acc = ps->acc_busy;
2634   fr[in_FRi] += busy_adjustment[0];
2635   if (FRi_1 >= 0)
2636     fr[FRi_1] += busy_adjustment[1];
2637   fr[in_FRj] += busy_adjustment[2];
2638   if (FRj_1 > 0)
2639     fr[FRj_1] += busy_adjustment[3];
2640   if (out_ACC40Sk >= 0)
2641     {
2642       acc[out_ACC40Sk] += busy_adjustment[4];
2643       if (ACC40Sk_1 >= 0)
2644         acc[ACC40Sk_1] += busy_adjustment[5];
2645     }
2646
2647   /* The latency of tht output register will be at least the latency of the
2648      other inputs.  Once initiated, post-processing will take 1 cycle.  */
2649   if (out_ACC40Sk >= 0)
2650     {
2651       update_ACC_latency (cpu, out_ACC40Sk, ps->post_wait + 1);
2652       if (ACC40Sk_1 >= 0)
2653         update_ACC_latency (cpu, ACC40Sk_1, ps->post_wait + 1);
2654     }
2655
2656   return cycles;
2657 }
2658
2659 int
2660 frvbf_model_fr500_u_media_dual_expand (SIM_CPU *cpu, const IDESC *idesc,
2661                                        int unit_num, int referenced,
2662                                        INT in_FRi,
2663                                        INT out_FRk)
2664 {
2665   int cycles;
2666   INT dual_FRk;
2667   FRV_PROFILE_STATE *ps;
2668   int busy_adjustment[] = {0, 0, 0};
2669   int *fr;
2670
2671   if (model_insn == FRV_INSN_MODEL_PASS_1)
2672     return 0;
2673
2674   /* The preprocessing can execute right away.  */
2675   cycles = idesc->timing->units[unit_num].done;
2676
2677   /* If the previous use of the registers was a media op,
2678      then their latency will be less than previously recorded.
2679      See Table 13-13 in the LSI.  */
2680   dual_FRk = DUAL_REG (out_FRk);
2681   ps = CPU_PROFILE_STATE (cpu);
2682   if (use_is_media (cpu, in_FRi))
2683     {
2684       busy_adjustment[0] = 2;
2685       decrease_FR_busy (cpu, in_FRi, busy_adjustment[0]);
2686     }
2687   else
2688     enforce_full_fr_latency (cpu, in_FRi);
2689   if (out_FRk != in_FRi)
2690     {
2691       if (use_is_media (cpu, out_FRk))
2692         {
2693           busy_adjustment[1] = 2;
2694           decrease_FR_busy (cpu, out_FRk, busy_adjustment[1]);
2695         }
2696       else
2697         enforce_full_fr_latency (cpu, out_FRk);
2698     }
2699   if (dual_FRk >= 0 && dual_FRk != in_FRi)
2700     {
2701       if (use_is_media (cpu, dual_FRk))
2702         {
2703           busy_adjustment[2] = 2;
2704           decrease_FR_busy (cpu, dual_FRk, busy_adjustment[2]);
2705         }
2706       else
2707         enforce_full_fr_latency (cpu, dual_FRk);
2708     }
2709
2710   /* The post processing must wait if there is a dependency on a FR
2711      which is not ready yet.  */
2712   ps->post_wait = cycles;
2713   post_wait_for_FR (cpu, in_FRi);
2714   post_wait_for_FR (cpu, out_FRk);
2715   post_wait_for_FR (cpu, dual_FRk);
2716
2717   /* Restore the busy cycles of the registers we used.  */
2718   fr = ps->fr_busy;
2719   fr[in_FRi] += busy_adjustment[0];
2720   fr[out_FRk] += busy_adjustment[1];
2721   if (dual_FRk >= 0)
2722     fr[dual_FRk] += busy_adjustment[2];
2723
2724   /* The latency of the output register will be at least the latency of the
2725      other inputs.  Once initiated, post-processing will take 3 cycles.  */
2726   update_FR_latency (cpu, out_FRk, ps->post_wait);
2727   update_FR_ptime (cpu, out_FRk, 3);
2728
2729   /* Mark this use of the register as a media op.  */
2730   set_use_is_media (cpu, out_FRk);
2731   if (dual_FRk >= 0)
2732     {
2733       update_FR_latency (cpu, dual_FRk, ps->post_wait);
2734       update_FR_ptime (cpu, dual_FRk, 3);
2735
2736       /* Mark this use of the register as a media op.  */
2737       set_use_is_media (cpu, dual_FRk);
2738     }
2739
2740   return cycles;
2741 }
2742
2743 int
2744 frvbf_model_fr500_u_media_dual_unpack (SIM_CPU *cpu, const IDESC *idesc,
2745                                        int unit_num, int referenced,
2746                                        INT in_FRi,
2747                                        INT out_FRk)
2748 {
2749   int cycles;
2750   INT FRi_1;
2751   INT FRk_1;
2752   INT FRk_2;
2753   INT FRk_3;
2754   FRV_PROFILE_STATE *ps;
2755   int busy_adjustment[] = {0, 0, 0, 0, 0, 0};
2756   int *fr;
2757
2758   if (model_insn == FRV_INSN_MODEL_PASS_1)
2759     return 0;
2760
2761   /* The preprocessing can execute right away.  */
2762   cycles = idesc->timing->units[unit_num].done;
2763
2764   FRi_1 = DUAL_REG (in_FRi);
2765   FRk_1 = DUAL_REG (out_FRk);
2766   FRk_2 = DUAL_REG (FRk_1);
2767   FRk_3 = DUAL_REG (FRk_2);
2768
2769   /* If the previous use of the registers was a media op,
2770      then their latency will be less than previously recorded.
2771      See Table 13-13 in the LSI.  */
2772   ps = CPU_PROFILE_STATE (cpu);
2773   if (use_is_media (cpu, in_FRi))
2774     {
2775       busy_adjustment[0] = 2;
2776       decrease_FR_busy (cpu, in_FRi, busy_adjustment[0]);
2777     }
2778   else
2779     enforce_full_fr_latency (cpu, in_FRi);
2780   if (FRi_1 >= 0 && use_is_media (cpu, FRi_1))
2781     {
2782       busy_adjustment[1] = 2;
2783       decrease_FR_busy (cpu, FRi_1, busy_adjustment[1]);
2784     }
2785   else
2786     enforce_full_fr_latency (cpu, FRi_1);
2787   if (out_FRk != in_FRi)
2788     {
2789       if (use_is_media (cpu, out_FRk))
2790         {
2791           busy_adjustment[2] = 2;
2792           decrease_FR_busy (cpu, out_FRk, busy_adjustment[2]);
2793         }
2794       else
2795         enforce_full_fr_latency (cpu, out_FRk);
2796       if (FRk_1 >= 0 && FRk_1 != in_FRi)
2797         {
2798           if (use_is_media (cpu, FRk_1))
2799             {
2800               busy_adjustment[3] = 2;
2801               decrease_FR_busy (cpu, FRk_1, busy_adjustment[3]);
2802             }
2803           else
2804             enforce_full_fr_latency (cpu, FRk_1);
2805         }
2806       if (FRk_2 >= 0 && FRk_2 != in_FRi)
2807         {
2808           if (use_is_media (cpu, FRk_2))
2809             {
2810               busy_adjustment[4] = 2;
2811               decrease_FR_busy (cpu, FRk_2, busy_adjustment[4]);
2812             }
2813           else
2814             enforce_full_fr_latency (cpu, FRk_2);
2815         }
2816       if (FRk_3 >= 0 && FRk_3 != in_FRi)
2817         {
2818           if (use_is_media (cpu, FRk_3))
2819             {
2820               busy_adjustment[5] = 2;
2821               decrease_FR_busy (cpu, FRk_3, busy_adjustment[5]);
2822             }
2823           else
2824             enforce_full_fr_latency (cpu, FRk_3);
2825         }
2826     }
2827
2828   /* The post processing must wait if there is a dependency on a FR
2829      which is not ready yet.  */
2830   ps->post_wait = cycles;
2831   post_wait_for_FR (cpu, in_FRi);
2832   post_wait_for_FR (cpu, FRi_1);
2833   post_wait_for_FR (cpu, out_FRk);
2834   post_wait_for_FR (cpu, FRk_1);
2835   post_wait_for_FR (cpu, FRk_2);
2836   post_wait_for_FR (cpu, FRk_3);
2837
2838   /* Restore the busy cycles of the registers we used.  */
2839   fr = ps->fr_busy;
2840   fr[in_FRi] += busy_adjustment[0];
2841   if (FRi_1 >= 0)
2842     fr[FRi_1] += busy_adjustment[1];
2843   fr[out_FRk] += busy_adjustment[2];
2844   if (FRk_1 >= 0)
2845     fr[FRk_1] += busy_adjustment[3];
2846   if (FRk_2 >= 0)
2847     fr[FRk_2] += busy_adjustment[4];
2848   if (FRk_3 >= 0)
2849     fr[FRk_3] += busy_adjustment[5];
2850
2851   /* The latency of tht output register will be at least the latency of the
2852      other inputs.  Once initiated, post-processing will take 3 cycles.  */
2853   update_FR_latency (cpu, out_FRk, ps->post_wait);
2854   update_FR_ptime (cpu, out_FRk, 3);
2855
2856   /* Mark this use of the register as a media op.  */
2857   set_use_is_media (cpu, out_FRk);
2858   if (FRk_1 >= 0)
2859     {
2860       update_FR_latency (cpu, FRk_1, ps->post_wait);
2861       update_FR_ptime (cpu, FRk_1, 3);
2862
2863       /* Mark this use of the register as a media op.  */
2864       set_use_is_media (cpu, FRk_1);
2865     }
2866   if (FRk_2 >= 0)
2867     {
2868       update_FR_latency (cpu, FRk_2, ps->post_wait);
2869       update_FR_ptime (cpu, FRk_2, 3);
2870
2871       /* Mark this use of the register as a media op.  */
2872       set_use_is_media (cpu, FRk_2);
2873     }
2874   if (FRk_3 >= 0)
2875     {
2876       update_FR_latency (cpu, FRk_3, ps->post_wait);
2877       update_FR_ptime (cpu, FRk_3, 3);
2878
2879       /* Mark this use of the register as a media op.  */
2880       set_use_is_media (cpu, FRk_3);
2881     }
2882
2883   return cycles;
2884 }
2885
2886 int
2887 frvbf_model_fr500_u_media_dual_btoh (SIM_CPU *cpu, const IDESC *idesc,
2888                                      int unit_num, int referenced,
2889                                      INT in_FRj,
2890                                      INT out_FRk)
2891 {
2892   return frvbf_model_fr500_u_media_dual_expand (cpu, idesc, unit_num,
2893                                                 referenced, in_FRj, out_FRk);
2894 }
2895
2896 int
2897 frvbf_model_fr500_u_media_dual_htob (SIM_CPU *cpu, const IDESC *idesc,
2898                                      int unit_num, int referenced,
2899                                      INT in_FRj,
2900                                      INT out_FRk)
2901 {
2902   int cycles;
2903   INT dual_FRj;
2904   FRV_PROFILE_STATE *ps;
2905   int busy_adjustment[] = {0, 0, 0};
2906   int *fr;
2907
2908   if (model_insn == FRV_INSN_MODEL_PASS_1)
2909     return 0;
2910
2911   /* The preprocessing can execute right away.  */
2912   cycles = idesc->timing->units[unit_num].done;
2913
2914   /* If the previous use of the registers was a media op,
2915      then their latency will be less than previously recorded.
2916      See Table 13-13 in the LSI.  */
2917   dual_FRj = DUAL_REG (in_FRj);
2918   ps = CPU_PROFILE_STATE (cpu);
2919   if (use_is_media (cpu, in_FRj))
2920     {
2921       busy_adjustment[0] = 2;
2922       decrease_FR_busy (cpu, in_FRj, busy_adjustment[0]);
2923     }
2924   else
2925     enforce_full_fr_latency (cpu, in_FRj);
2926   if (dual_FRj >= 0)
2927     {
2928       if (use_is_media (cpu, dual_FRj))
2929         {
2930           busy_adjustment[1] = 2;
2931           decrease_FR_busy (cpu, dual_FRj, busy_adjustment[1]);
2932         }
2933       else
2934         enforce_full_fr_latency (cpu, dual_FRj);
2935     }
2936   if (out_FRk != in_FRj)
2937     {
2938       if (use_is_media (cpu, out_FRk))
2939         {
2940           busy_adjustment[2] = 2;
2941           decrease_FR_busy (cpu, out_FRk, busy_adjustment[2]);
2942         }
2943       else
2944         enforce_full_fr_latency (cpu, out_FRk);
2945     }
2946
2947   /* The post processing must wait if there is a dependency on a FR
2948      which is not ready yet.  */
2949   ps->post_wait = cycles;
2950   post_wait_for_FR (cpu, in_FRj);
2951   post_wait_for_FR (cpu, dual_FRj);
2952   post_wait_for_FR (cpu, out_FRk);
2953
2954   /* Restore the busy cycles of the registers we used.  */
2955   fr = ps->fr_busy;
2956   fr[in_FRj] += busy_adjustment[0];
2957   if (dual_FRj >= 0)
2958     fr[dual_FRj] += busy_adjustment[1];
2959   fr[out_FRk] += busy_adjustment[2];
2960
2961   /* The latency of tht output register will be at least the latency of the
2962      other inputs.  */
2963   update_FR_latency (cpu, out_FRk, ps->post_wait);
2964
2965   /* Once initiated, post-processing will take 3 cycles.  */
2966   update_FR_ptime (cpu, out_FRk, 3);
2967
2968   /* Mark this use of the register as a media op.  */
2969   set_use_is_media (cpu, out_FRk);
2970
2971   return cycles;
2972 }
2973
2974 int
2975 frvbf_model_fr500_u_media_dual_btohe (SIM_CPU *cpu, const IDESC *idesc,
2976                                       int unit_num, int referenced,
2977                                       INT in_FRj,
2978                                       INT out_FRk)
2979 {
2980   int cycles;
2981   INT FRk_1;
2982   INT FRk_2;
2983   INT FRk_3;
2984   FRV_PROFILE_STATE *ps;
2985   int busy_adjustment[] = {0, 0, 0, 0, 0};
2986   int *fr;
2987
2988   if (model_insn == FRV_INSN_MODEL_PASS_1)
2989     return 0;
2990
2991   /* The preprocessing can execute right away.  */
2992   cycles = idesc->timing->units[unit_num].done;
2993
2994   FRk_1 = DUAL_REG (out_FRk);
2995   FRk_2 = DUAL_REG (FRk_1);
2996   FRk_3 = DUAL_REG (FRk_2);
2997
2998   /* If the previous use of the registers was a media op,
2999      then their latency will be less than previously recorded.
3000      See Table 13-13 in the LSI.  */
3001   ps = CPU_PROFILE_STATE (cpu);
3002   if (use_is_media (cpu, in_FRj))
3003     {
3004       busy_adjustment[0] = 2;
3005       decrease_FR_busy (cpu, in_FRj, busy_adjustment[0]);
3006     }
3007   else
3008     enforce_full_fr_latency (cpu, in_FRj);
3009   if (out_FRk != in_FRj)
3010     {
3011       if (use_is_media (cpu, out_FRk))
3012         {
3013           busy_adjustment[1] = 2;
3014           decrease_FR_busy (cpu, out_FRk, busy_adjustment[1]);
3015         }
3016       else
3017         enforce_full_fr_latency (cpu, out_FRk);
3018       if (FRk_1 >= 0 && FRk_1 != in_FRj)
3019         {
3020           if (use_is_media (cpu, FRk_1))
3021             {
3022               busy_adjustment[2] = 2;
3023               decrease_FR_busy (cpu, FRk_1, busy_adjustment[2]);
3024             }
3025           else
3026             enforce_full_fr_latency (cpu, FRk_1);
3027         }
3028       if (FRk_2 >= 0 && FRk_2 != in_FRj)
3029         {
3030           if (use_is_media (cpu, FRk_2))
3031             {
3032               busy_adjustment[3] = 2;
3033               decrease_FR_busy (cpu, FRk_2, busy_adjustment[3]);
3034             }
3035           else
3036             enforce_full_fr_latency (cpu, FRk_2);
3037         }
3038       if (FRk_3 >= 0 && FRk_3 != in_FRj)
3039         {
3040           if (use_is_media (cpu, FRk_3))
3041             {
3042               busy_adjustment[4] = 2;
3043               decrease_FR_busy (cpu, FRk_3, busy_adjustment[4]);
3044             }
3045           else
3046             enforce_full_fr_latency (cpu, FRk_3);
3047         }
3048     }
3049
3050   /* The post processing must wait if there is a dependency on a FR
3051      which is not ready yet.  */
3052   ps->post_wait = cycles;
3053   post_wait_for_FR (cpu, in_FRj);
3054   post_wait_for_FR (cpu, out_FRk);
3055   post_wait_for_FR (cpu, FRk_1);
3056   post_wait_for_FR (cpu, FRk_2);
3057   post_wait_for_FR (cpu, FRk_3);
3058
3059   /* Restore the busy cycles of the registers we used.  */
3060   fr = ps->fr_busy;
3061   fr[in_FRj] += busy_adjustment[0];
3062   fr[out_FRk] += busy_adjustment[1];
3063   if (FRk_1 >= 0)
3064     fr[FRk_1] += busy_adjustment[2];
3065   if (FRk_2 >= 0)
3066     fr[FRk_2] += busy_adjustment[3];
3067   if (FRk_3 >= 0)
3068     fr[FRk_3] += busy_adjustment[4];
3069
3070   /* The latency of tht output register will be at least the latency of the
3071      other inputs.  Once initiated, post-processing will take 3 cycles.  */
3072   update_FR_latency (cpu, out_FRk, ps->post_wait);
3073   update_FR_ptime (cpu, out_FRk, 3);
3074
3075   /* Mark this use of the register as a media op.  */
3076   set_use_is_media (cpu, out_FRk);
3077   if (FRk_1 >= 0)
3078     {
3079       update_FR_latency (cpu, FRk_1, ps->post_wait);
3080       update_FR_ptime (cpu, FRk_1, 3);
3081
3082       /* Mark this use of the register as a media op.  */
3083       set_use_is_media (cpu, FRk_1);
3084     }
3085   if (FRk_2 >= 0)
3086     {
3087       update_FR_latency (cpu, FRk_2, ps->post_wait);
3088       update_FR_ptime (cpu, FRk_2, 3);
3089
3090       /* Mark this use of the register as a media op.  */
3091       set_use_is_media (cpu, FRk_2);
3092     }
3093   if (FRk_3 >= 0)
3094     {
3095       update_FR_latency (cpu, FRk_3, ps->post_wait);
3096       update_FR_ptime (cpu, FRk_3, 3);
3097
3098       /* Mark this use of the register as a media op.  */
3099       set_use_is_media (cpu, FRk_3);
3100     }
3101
3102   return cycles;
3103 }
3104
3105 int
3106 frvbf_model_fr500_u_barrier (SIM_CPU *cpu, const IDESC *idesc,
3107                              int unit_num, int referenced)
3108 {
3109   int cycles;
3110   if (model_insn == FRV_INSN_MODEL_PASS_1)
3111     {
3112       int i;
3113       /* Wait for ALL resources.  */
3114       for (i = 0; i < 64; ++i)
3115         {
3116           enforce_full_fr_latency (cpu, i);
3117           vliw_wait_for_GR (cpu, i);
3118           vliw_wait_for_FR (cpu, i);
3119           vliw_wait_for_ACC (cpu, i);
3120         }
3121       for (i = 0; i < 8; ++i)
3122         vliw_wait_for_CCR (cpu, i);
3123       for (i = 0; i < 2; ++i)
3124         {
3125           vliw_wait_for_idiv_resource (cpu, i);
3126           vliw_wait_for_fdiv_resource (cpu, i);
3127           vliw_wait_for_fsqrt_resource (cpu, i);
3128         }
3129       handle_resource_wait (cpu);
3130       for (i = 0; i < 64; ++i)
3131         {
3132           load_wait_for_GR (cpu, i);
3133           load_wait_for_FR (cpu, i);
3134         }
3135       trace_vliw_wait_cycles (cpu);
3136       return 0;
3137     }
3138
3139   cycles = idesc->timing->units[unit_num].done;
3140   return cycles;
3141 }
3142
3143 int
3144 frvbf_model_fr500_u_membar (SIM_CPU *cpu, const IDESC *idesc,
3145                             int unit_num, int referenced)
3146 {
3147   int cycles;
3148   if (model_insn == FRV_INSN_MODEL_PASS_1)
3149     {
3150       int i;
3151       /* Wait for ALL resources, except GR and ICC.  */
3152       for (i = 0; i < 64; ++i)
3153         {
3154           enforce_full_fr_latency (cpu, i);
3155           vliw_wait_for_FR (cpu, i);
3156           vliw_wait_for_ACC (cpu, i);
3157         }
3158       for (i = 0; i < 4; ++i)
3159         vliw_wait_for_CCR (cpu, i);
3160       for (i = 0; i < 2; ++i)
3161         {
3162           vliw_wait_for_idiv_resource (cpu, i);
3163           vliw_wait_for_fdiv_resource (cpu, i);
3164           vliw_wait_for_fsqrt_resource (cpu, i);
3165         }
3166       handle_resource_wait (cpu);
3167       for (i = 0; i < 64; ++i)
3168         {
3169           load_wait_for_FR (cpu, i);
3170         }
3171       trace_vliw_wait_cycles (cpu);
3172       return 0;
3173     }
3174
3175   cycles = idesc->timing->units[unit_num].done;
3176   return cycles;
3177 }
3178
3179 /* The frv machine is a fictional implementation of the fr500 which implements
3180    all frv architectural features.  */
3181 int
3182 frvbf_model_frv_u_exec (SIM_CPU *cpu, const IDESC *idesc,
3183                             int unit_num, int referenced)
3184 {
3185   return idesc->timing->units[unit_num].done;
3186 }
3187
3188 /* The simple machine is a fictional implementation of the fr500 which
3189    implements limited frv architectural features.  */
3190 int
3191 frvbf_model_simple_u_exec (SIM_CPU *cpu, const IDESC *idesc,
3192                             int unit_num, int referenced)
3193 {
3194   return idesc->timing->units[unit_num].done;
3195 }
3196
3197 /* The tomcat machine is models a prototype fr500 machine which had a few
3198    bugs and restrictions to work around.  */
3199 int
3200 frvbf_model_tomcat_u_exec (SIM_CPU *cpu, const IDESC *idesc,
3201                             int unit_num, int referenced)
3202 {
3203   return idesc->timing->units[unit_num].done;
3204 }
3205
3206 #endif /* WITH_PROFILE_MODEL_P */