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