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