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