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