profile-fr500.c revision 1.1.1.3
1/* frv simulator fr500 dependent profiling code.
2
3   Copyright (C) 1998-2014 Free Software Foundation, Inc.
4   Contributed by Red Hat
5
6This file is part of the GNU simulators.
7
8This program is free software; you can redistribute it and/or modify
9it under the terms of the GNU General Public License as published by
10the Free Software Foundation; either version 3 of the License, or
11(at your option) any later version.
12
13This program is distributed in the hope that it will be useful,
14but WITHOUT ANY WARRANTY; without even the implied warranty of
15MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16GNU General Public License for more details.
17
18You should have received a copy of the GNU General Public License
19along 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.  */
36void
37fr500_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.  */
54void
55fr500_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
68static void
69set_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
76static void
77set_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
83static int
84use_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
90static void
91set_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
98static void
99set_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
105static int
106use_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
112static void
113set_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
120static void
121set_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
127static int
128use_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
134void
135fr500_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
141void
142fr500_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.  */
149static void
150adjust_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.  */
177static void
178adjust_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.  */
193static void
194restore_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.  */
210static void
211restore_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
224int
225frvbf_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
231int
232frvbf_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
277int
278frvbf_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
328int
329frvbf_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
396int
397frvbf_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
459int
460frvbf_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
503int
504frvbf_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
529int
530frvbf_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
555int
556frvbf_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
581int
582frvbf_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
616int
617frvbf_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
645int
646frvbf_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
711int
712frvbf_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
768int
769frvbf_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
787int
788frvbf_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
867int
868frvbf_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
928int
929frvbf_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
947int
948frvbf_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
992int
993frvbf_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
1033int
1034frvbf_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
1068int
1069frvbf_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
1097int
1098frvbf_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
1142int
1143frvbf_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
1179int
1180frvbf_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
1217int
1218frvbf_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
1255int
1256frvbf_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
1293int
1294frvbf_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
1331int
1332frvbf_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
1369int
1370frvbf_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
1407int
1408frvbf_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
1445int
1446frvbf_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
1516int
1517frvbf_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
1630int
1631frvbf_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
1683int
1684frvbf_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
1748int
1749frvbf_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
1806int
1807frvbf_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
1841int
1842frvbf_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
1885int
1886frvbf_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
1962int
1963frvbf_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
2027int
2028frvbf_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
2128int
2129frvbf_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
2247int
2248frvbf_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
2350int
2351frvbf_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
2541int
2542frvbf_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
2657int
2658frvbf_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
2741int
2742frvbf_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
2884int
2885frvbf_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
2894int
2895frvbf_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
2972int
2973frvbf_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
3103int
3104frvbf_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
3141int
3142frvbf_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.  */
3179int
3180frvbf_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.  */
3188int
3189frvbf_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.  */
3197int
3198frvbf_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 */
3205