Home | History | Annotate | Line # | Download | only in frv
profile-fr400.c revision 1.9.2.1
      1      1.1  christos /* frv simulator fr400 dependent profiling code.
      2      1.1  christos 
      3  1.9.2.1  perseant    Copyright (C) 2001-2023 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.9.2.1  perseant along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
     20  1.9.2.1  perseant 
     21  1.9.2.1  perseant /* This must come before any other includes.  */
     22  1.9.2.1  perseant #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.9.2.1  perseant #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.9.2.1  perseant #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   const CGEN_INSN *insn;
    636      1.1  christos   int busy_adjustment[] = {0, 0};
    637      1.1  christos   int *fr;
    638      1.1  christos 
    639      1.1  christos   if (model_insn == FRV_INSN_MODEL_PASS_1)
    640      1.1  christos     return 0;
    641      1.1  christos 
    642      1.1  christos   /* The preprocessing can execute right away.  */
    643      1.1  christos   cycles = idesc->timing->units[unit_num].done;
    644      1.1  christos 
    645      1.1  christos   ps = CPU_PROFILE_STATE (cpu);
    646      1.1  christos   insn = idesc->idata;
    647      1.1  christos 
    648      1.1  christos   /* The latency of the registers may be less than previously recorded,
    649      1.1  christos      depending on how they were used previously.
    650      1.1  christos      See Table 13-8 in the LSI.  */
    651      1.1  christos   if (in_FRi >= 0)
    652      1.1  christos     {
    653      1.1  christos       if (use_is_fp_load (cpu, in_FRi))
    654      1.1  christos 	{
    655      1.1  christos 	  busy_adjustment[0] = 1;
    656      1.1  christos 	  decrease_FR_busy (cpu, in_FRi, busy_adjustment[0]);
    657      1.1  christos 	}
    658      1.1  christos       else
    659      1.1  christos 	enforce_full_fr_latency (cpu, in_FRi);
    660      1.1  christos     }
    661      1.1  christos   if (in_FRj >= 0 && in_FRj != in_FRi)
    662      1.1  christos     {
    663      1.1  christos       if (use_is_fp_load (cpu, in_FRj))
    664      1.1  christos 	{
    665      1.1  christos 	  busy_adjustment[1] = 1;
    666      1.1  christos 	  decrease_FR_busy (cpu, in_FRj, busy_adjustment[1]);
    667      1.1  christos 	}
    668      1.1  christos       else
    669      1.1  christos 	enforce_full_fr_latency (cpu, in_FRj);
    670      1.1  christos     }
    671      1.1  christos 
    672      1.1  christos   /* The post processing must wait if there is a dependency on a FR
    673      1.1  christos      which is not ready yet.  */
    674      1.1  christos   ps->post_wait = cycles;
    675      1.1  christos   post_wait_for_FR (cpu, in_FRi);
    676      1.1  christos   post_wait_for_FR (cpu, in_FRj);
    677      1.1  christos   post_wait_for_FR (cpu, out_FRk);
    678      1.1  christos 
    679      1.1  christos   /* Restore the busy cycles of the registers we used.  */
    680      1.1  christos   fr = ps->fr_busy;
    681      1.1  christos   if (in_FRi >= 0)
    682      1.1  christos     fr[in_FRi] += busy_adjustment[0];
    683      1.1  christos   if (in_FRj >= 0)
    684      1.1  christos     fr[in_FRj] += busy_adjustment[1];
    685      1.1  christos 
    686      1.1  christos   /* The latency of the output register will be at least the latency of the
    687      1.1  christos      other inputs.  Once initiated, post-processing has no latency.  */
    688      1.1  christos   if (out_FRk >= 0)
    689      1.1  christos     {
    690      1.1  christos       update_FR_latency (cpu, out_FRk, ps->post_wait);
    691      1.1  christos       update_FR_ptime (cpu, out_FRk, 0);
    692      1.1  christos     }
    693      1.1  christos 
    694      1.1  christos   return cycles;
    695      1.1  christos }
    696      1.1  christos 
    697      1.1  christos int
    698      1.1  christos frvbf_model_fr400_u_media_1_quad (SIM_CPU *cpu, const IDESC *idesc,
    699      1.1  christos 				  int unit_num, int referenced,
    700      1.1  christos 				  INT in_FRi, INT in_FRj,
    701      1.1  christos 				  INT out_FRk)
    702      1.1  christos {
    703      1.1  christos   int cycles;
    704      1.1  christos   INT dual_FRi;
    705      1.1  christos   INT dual_FRj;
    706      1.1  christos   INT dual_FRk;
    707      1.1  christos   FRV_PROFILE_STATE *ps;
    708      1.1  christos   int busy_adjustment[] = {0, 0, 0, 0};
    709      1.1  christos   int *fr;
    710      1.1  christos 
    711      1.1  christos   if (model_insn == FRV_INSN_MODEL_PASS_1)
    712      1.1  christos     return 0;
    713      1.1  christos 
    714      1.1  christos   /* The preprocessing can execute right away.  */
    715      1.1  christos   cycles = idesc->timing->units[unit_num].done;
    716      1.1  christos 
    717      1.1  christos   ps = CPU_PROFILE_STATE (cpu);
    718      1.1  christos   dual_FRi = DUAL_REG (in_FRi);
    719      1.1  christos   dual_FRj = DUAL_REG (in_FRj);
    720      1.1  christos   dual_FRk = DUAL_REG (out_FRk);
    721      1.1  christos 
    722      1.1  christos   /* The latency of the registers may be less than previously recorded,
    723      1.1  christos      depending on how they were used previously.
    724      1.1  christos      See Table 13-8 in the LSI.  */
    725      1.1  christos   if (use_is_fp_load (cpu, in_FRi))
    726      1.1  christos     {
    727      1.1  christos       busy_adjustment[0] = 1;
    728      1.1  christos       decrease_FR_busy (cpu, in_FRi, busy_adjustment[0]);
    729      1.1  christos     }
    730      1.1  christos   else
    731      1.1  christos     enforce_full_fr_latency (cpu, in_FRi);
    732      1.1  christos   if (dual_FRi >= 0 && use_is_fp_load (cpu, dual_FRi))
    733      1.1  christos     {
    734      1.1  christos       busy_adjustment[1] = 1;
    735      1.1  christos       decrease_FR_busy (cpu, dual_FRi, busy_adjustment[1]);
    736      1.1  christos     }
    737      1.1  christos   else
    738      1.1  christos     enforce_full_fr_latency (cpu, dual_FRi);
    739      1.1  christos   if (in_FRj != in_FRi)
    740      1.1  christos     {
    741      1.1  christos       if (use_is_fp_load (cpu, in_FRj))
    742      1.1  christos 	{
    743      1.1  christos 	  busy_adjustment[2] = 1;
    744      1.1  christos 	  decrease_FR_busy (cpu, in_FRj, busy_adjustment[2]);
    745      1.1  christos 	}
    746      1.1  christos       else
    747      1.1  christos 	enforce_full_fr_latency (cpu, in_FRj);
    748      1.1  christos       if (dual_FRj >= 0 && use_is_fp_load (cpu, dual_FRj))
    749      1.1  christos 	{
    750      1.1  christos 	  busy_adjustment[3] = 1;
    751      1.1  christos 	  decrease_FR_busy (cpu, dual_FRj, busy_adjustment[3]);
    752      1.1  christos 	}
    753      1.1  christos       else
    754      1.1  christos 	enforce_full_fr_latency (cpu, dual_FRj);
    755      1.1  christos     }
    756      1.1  christos 
    757      1.1  christos   /* The post processing must wait if there is a dependency on a FR
    758      1.1  christos      which is not ready yet.  */
    759      1.1  christos   ps->post_wait = cycles;
    760      1.1  christos   post_wait_for_FR (cpu, in_FRi);
    761      1.1  christos   post_wait_for_FR (cpu, dual_FRi);
    762      1.1  christos   post_wait_for_FR (cpu, in_FRj);
    763      1.1  christos   post_wait_for_FR (cpu, dual_FRj);
    764      1.1  christos   post_wait_for_FR (cpu, out_FRk);
    765      1.1  christos   post_wait_for_FR (cpu, dual_FRk);
    766      1.1  christos 
    767      1.1  christos   /* Restore the busy cycles of the registers we used.  */
    768      1.1  christos   fr = ps->fr_busy;
    769      1.1  christos   fr[in_FRi] += busy_adjustment[0];
    770      1.1  christos   if (dual_FRi >= 0)
    771      1.1  christos     fr[dual_FRi] += busy_adjustment[1];
    772      1.1  christos   fr[in_FRj] += busy_adjustment[2];
    773      1.1  christos   if (dual_FRj >= 0)
    774      1.1  christos     fr[dual_FRj] += busy_adjustment[3];
    775      1.1  christos 
    776      1.1  christos   /* The latency of the output register will be at least the latency of the
    777      1.1  christos      other inputs.  */
    778      1.1  christos   update_FR_latency (cpu, out_FRk, ps->post_wait);
    779      1.1  christos 
    780      1.1  christos   /* Once initiated, post-processing has no latency.  */
    781      1.1  christos   update_FR_ptime (cpu, out_FRk, 0);
    782      1.1  christos 
    783      1.1  christos   if (dual_FRk >= 0)
    784      1.1  christos     {
    785      1.1  christos       update_FR_latency (cpu, dual_FRk, ps->post_wait);
    786      1.1  christos       update_FR_ptime (cpu, dual_FRk, 0);
    787      1.1  christos     }
    788      1.1  christos 
    789      1.1  christos   return cycles;
    790      1.1  christos }
    791      1.1  christos 
    792      1.1  christos int
    793      1.1  christos frvbf_model_fr400_u_media_hilo (SIM_CPU *cpu, const IDESC *idesc,
    794      1.1  christos 				int unit_num, int referenced,
    795      1.1  christos 				INT out_FRkhi, INT out_FRklo)
    796      1.1  christos {
    797      1.1  christos   int cycles;
    798      1.1  christos   FRV_PROFILE_STATE *ps;
    799      1.1  christos 
    800      1.1  christos   if (model_insn == FRV_INSN_MODEL_PASS_1)
    801      1.1  christos     return 0;
    802      1.1  christos 
    803      1.1  christos   /* The preprocessing can execute right away.  */
    804      1.1  christos   cycles = idesc->timing->units[unit_num].done;
    805      1.1  christos 
    806      1.1  christos   ps = CPU_PROFILE_STATE (cpu);
    807      1.1  christos 
    808      1.1  christos   /* The post processing must wait if there is a dependency on a FR
    809      1.1  christos      which is not ready yet.  */
    810      1.1  christos   ps->post_wait = cycles;
    811      1.1  christos   post_wait_for_FR (cpu, out_FRkhi);
    812      1.1  christos   post_wait_for_FR (cpu, out_FRklo);
    813      1.1  christos 
    814      1.1  christos   /* The latency of the output register will be at least the latency of the
    815      1.1  christos      other inputs.  Once initiated, post-processing has no latency.  */
    816      1.1  christos   if (out_FRkhi >= 0)
    817      1.1  christos     {
    818      1.1  christos       update_FR_latency (cpu, out_FRkhi, ps->post_wait);
    819      1.1  christos       update_FR_ptime (cpu, out_FRkhi, 0);
    820      1.1  christos     }
    821      1.1  christos   if (out_FRklo >= 0)
    822      1.1  christos     {
    823      1.1  christos       update_FR_latency (cpu, out_FRklo, ps->post_wait);
    824      1.1  christos       update_FR_ptime (cpu, out_FRklo, 0);
    825      1.1  christos     }
    826      1.1  christos 
    827      1.1  christos   return cycles;
    828      1.1  christos }
    829      1.1  christos 
    830      1.1  christos int
    831      1.1  christos frvbf_model_fr400_u_media_2 (SIM_CPU *cpu, const IDESC *idesc,
    832      1.1  christos 			     int unit_num, int referenced,
    833      1.1  christos 			     INT in_FRi, INT in_FRj,
    834      1.1  christos 			     INT out_ACC40Sk, INT out_ACC40Uk)
    835      1.1  christos {
    836      1.1  christos   int cycles;
    837      1.1  christos   INT dual_ACC40Sk;
    838      1.1  christos   INT dual_ACC40Uk;
    839      1.1  christos   FRV_PROFILE_STATE *ps;
    840      1.1  christos   int busy_adjustment[] = {0, 0, 0, 0, 0, 0};
    841      1.1  christos   int *fr;
    842      1.1  christos   int *acc;
    843      1.1  christos 
    844      1.1  christos   if (model_insn == FRV_INSN_MODEL_PASS_1)
    845      1.1  christos     return 0;
    846      1.1  christos 
    847      1.1  christos   /* The preprocessing can execute right away.  */
    848      1.1  christos   cycles = idesc->timing->units[unit_num].done;
    849      1.1  christos 
    850      1.1  christos   ps = CPU_PROFILE_STATE (cpu);
    851      1.1  christos   dual_ACC40Sk = DUAL_REG (out_ACC40Sk);
    852      1.1  christos   dual_ACC40Uk = DUAL_REG (out_ACC40Uk);
    853      1.1  christos 
    854      1.1  christos   /* The latency of the registers may be less than previously recorded,
    855      1.1  christos      depending on how they were used previously.
    856      1.1  christos      See Table 13-8 in the LSI.  */
    857      1.1  christos   if (in_FRi >= 0)
    858      1.1  christos     {
    859      1.1  christos       if (use_is_fp_load (cpu, in_FRi))
    860      1.1  christos 	{
    861      1.1  christos 	  busy_adjustment[0] = 1;
    862      1.1  christos 	  decrease_FR_busy (cpu, in_FRi, busy_adjustment[0]);
    863      1.1  christos 	}
    864      1.1  christos       else
    865      1.1  christos 	enforce_full_fr_latency (cpu, in_FRi);
    866      1.1  christos     }
    867      1.1  christos   if (in_FRj >= 0 && in_FRj != in_FRi)
    868      1.1  christos     {
    869      1.1  christos       if (use_is_fp_load (cpu, in_FRj))
    870      1.1  christos 	{
    871      1.1  christos 	  busy_adjustment[1] = 1;
    872      1.1  christos 	  decrease_FR_busy (cpu, in_FRj, busy_adjustment[1]);
    873      1.1  christos 	}
    874      1.1  christos       else
    875      1.1  christos 	enforce_full_fr_latency (cpu, in_FRj);
    876      1.1  christos     }
    877      1.1  christos   if (out_ACC40Sk >= 0)
    878      1.1  christos     {
    879      1.1  christos       if (acc_use_is_media_p2 (cpu, out_ACC40Sk))
    880      1.1  christos 	{
    881      1.1  christos 	  busy_adjustment[2] = 1;
    882      1.1  christos 	  decrease_ACC_busy (cpu, out_ACC40Sk, busy_adjustment[2]);
    883      1.1  christos 	}
    884      1.1  christos     }
    885      1.1  christos   if (dual_ACC40Sk >= 0)
    886      1.1  christos     {
    887      1.1  christos       if (acc_use_is_media_p2 (cpu, dual_ACC40Sk))
    888      1.1  christos 	{
    889      1.1  christos 	  busy_adjustment[3] = 1;
    890      1.1  christos 	  decrease_ACC_busy (cpu, dual_ACC40Sk, busy_adjustment[3]);
    891      1.1  christos 	}
    892      1.1  christos     }
    893      1.1  christos   if (out_ACC40Uk >= 0)
    894      1.1  christos     {
    895      1.1  christos       if (acc_use_is_media_p2 (cpu, out_ACC40Uk))
    896      1.1  christos 	{
    897      1.1  christos 	  busy_adjustment[4] = 1;
    898      1.1  christos 	  decrease_ACC_busy (cpu, out_ACC40Uk, busy_adjustment[4]);
    899      1.1  christos 	}
    900      1.1  christos     }
    901      1.1  christos   if (dual_ACC40Uk >= 0)
    902      1.1  christos     {
    903      1.1  christos       if (acc_use_is_media_p2 (cpu, dual_ACC40Uk))
    904      1.1  christos 	{
    905      1.1  christos 	  busy_adjustment[5] = 1;
    906      1.1  christos 	  decrease_ACC_busy (cpu, dual_ACC40Uk, busy_adjustment[5]);
    907      1.1  christos 	}
    908      1.1  christos     }
    909      1.1  christos 
    910      1.1  christos   /* The post processing must wait if there is a dependency on a FR
    911      1.1  christos      which is not ready yet.  */
    912      1.1  christos   ps->post_wait = cycles;
    913      1.1  christos   post_wait_for_FR (cpu, in_FRi);
    914      1.1  christos   post_wait_for_FR (cpu, in_FRj);
    915      1.1  christos   post_wait_for_ACC (cpu, out_ACC40Sk);
    916      1.1  christos   post_wait_for_ACC (cpu, dual_ACC40Sk);
    917      1.1  christos   post_wait_for_ACC (cpu, out_ACC40Uk);
    918      1.1  christos   post_wait_for_ACC (cpu, dual_ACC40Uk);
    919      1.1  christos 
    920      1.1  christos   /* Restore the busy cycles of the registers we used.  */
    921      1.1  christos   fr = ps->fr_busy;
    922      1.1  christos   acc = ps->acc_busy;
    923      1.1  christos   fr[in_FRi] += busy_adjustment[0];
    924      1.1  christos   fr[in_FRj] += busy_adjustment[1];
    925      1.1  christos   if (out_ACC40Sk >= 0)
    926      1.1  christos     acc[out_ACC40Sk] += busy_adjustment[2];
    927      1.1  christos   if (dual_ACC40Sk >= 0)
    928      1.1  christos     acc[dual_ACC40Sk] += busy_adjustment[3];
    929      1.1  christos   if (out_ACC40Uk >= 0)
    930      1.1  christos     acc[out_ACC40Uk] += busy_adjustment[4];
    931      1.1  christos   if (dual_ACC40Uk >= 0)
    932      1.1  christos     acc[dual_ACC40Uk] += busy_adjustment[5];
    933      1.1  christos 
    934      1.1  christos   /* The latency of the output register will be at least the latency of the
    935      1.1  christos      other inputs.  Once initiated, post-processing will take 1 cycles.  */
    936      1.1  christos   if (out_ACC40Sk >= 0)
    937      1.1  christos     {
    938      1.1  christos       update_ACC_latency (cpu, out_ACC40Sk, ps->post_wait + 1);
    939      1.1  christos       set_acc_use_is_media_p2 (cpu, out_ACC40Sk);
    940      1.1  christos     }
    941      1.1  christos   if (dual_ACC40Sk >= 0)
    942      1.1  christos     {
    943      1.1  christos       update_ACC_latency (cpu, dual_ACC40Sk, ps->post_wait + 1);
    944      1.1  christos       set_acc_use_is_media_p2 (cpu, dual_ACC40Sk);
    945      1.1  christos     }
    946      1.1  christos   if (out_ACC40Uk >= 0)
    947      1.1  christos     {
    948      1.1  christos       update_ACC_latency (cpu, out_ACC40Uk, ps->post_wait + 1);
    949      1.1  christos       set_acc_use_is_media_p2 (cpu, out_ACC40Uk);
    950      1.1  christos     }
    951      1.1  christos   if (dual_ACC40Uk >= 0)
    952      1.1  christos     {
    953      1.1  christos       update_ACC_latency (cpu, dual_ACC40Uk, ps->post_wait + 1);
    954      1.1  christos       set_acc_use_is_media_p2 (cpu, dual_ACC40Uk);
    955      1.1  christos     }
    956      1.1  christos 
    957      1.1  christos   return cycles;
    958      1.1  christos }
    959      1.1  christos 
    960      1.1  christos int
    961      1.1  christos frvbf_model_fr400_u_media_2_quad (SIM_CPU *cpu, const IDESC *idesc,
    962      1.1  christos 				  int unit_num, int referenced,
    963      1.1  christos 				  INT in_FRi, INT in_FRj,
    964      1.1  christos 				  INT out_ACC40Sk, INT out_ACC40Uk)
    965      1.1  christos {
    966      1.1  christos   int cycles;
    967      1.1  christos   INT dual_FRi;
    968      1.1  christos   INT dual_FRj;
    969      1.1  christos   INT ACC40Sk_1;
    970      1.1  christos   INT ACC40Sk_2;
    971      1.1  christos   INT ACC40Sk_3;
    972      1.1  christos   INT ACC40Uk_1;
    973      1.1  christos   INT ACC40Uk_2;
    974      1.1  christos   INT ACC40Uk_3;
    975      1.1  christos   FRV_PROFILE_STATE *ps;
    976      1.1  christos   int busy_adjustment[] = {0, 0, 0, 0, 0, 0, 0 ,0};
    977      1.1  christos   int *fr;
    978      1.1  christos   int *acc;
    979      1.1  christos 
    980      1.1  christos   if (model_insn == FRV_INSN_MODEL_PASS_1)
    981      1.1  christos     return 0;
    982      1.1  christos 
    983      1.1  christos   /* The preprocessing can execute right away.  */
    984      1.1  christos   cycles = idesc->timing->units[unit_num].done;
    985      1.1  christos 
    986      1.1  christos   dual_FRi = DUAL_REG (in_FRi);
    987      1.1  christos   dual_FRj = DUAL_REG (in_FRj);
    988      1.1  christos   ACC40Sk_1 = DUAL_REG (out_ACC40Sk);
    989      1.1  christos   ACC40Sk_2 = DUAL_REG (ACC40Sk_1);
    990      1.1  christos   ACC40Sk_3 = DUAL_REG (ACC40Sk_2);
    991      1.1  christos   ACC40Uk_1 = DUAL_REG (out_ACC40Uk);
    992      1.1  christos   ACC40Uk_2 = DUAL_REG (ACC40Uk_1);
    993      1.1  christos   ACC40Uk_3 = DUAL_REG (ACC40Uk_2);
    994      1.1  christos 
    995      1.1  christos   ps = CPU_PROFILE_STATE (cpu);
    996      1.1  christos   /* The latency of the registers may be less than previously recorded,
    997      1.1  christos      depending on how they were used previously.
    998      1.1  christos      See Table 13-8 in the LSI.  */
    999      1.1  christos   if (use_is_fp_load (cpu, in_FRi))
   1000      1.1  christos     {
   1001      1.1  christos       busy_adjustment[0] = 1;
   1002      1.1  christos       decrease_FR_busy (cpu, in_FRi, busy_adjustment[0]);
   1003      1.1  christos     }
   1004      1.1  christos   else
   1005      1.1  christos     enforce_full_fr_latency (cpu, in_FRi);
   1006      1.1  christos   if (dual_FRi >= 0 && use_is_fp_load (cpu, dual_FRi))
   1007      1.1  christos     {
   1008      1.1  christos       busy_adjustment[1] = 1;
   1009      1.1  christos       decrease_FR_busy (cpu, dual_FRi, busy_adjustment[1]);
   1010      1.1  christos     }
   1011      1.1  christos   else
   1012      1.1  christos     enforce_full_fr_latency (cpu, dual_FRi);
   1013      1.1  christos   if (in_FRj != in_FRi)
   1014      1.1  christos     {
   1015      1.1  christos       if (use_is_fp_load (cpu, in_FRj))
   1016      1.1  christos 	{
   1017      1.1  christos 	  busy_adjustment[2] = 1;
   1018      1.1  christos 	  decrease_FR_busy (cpu, in_FRj, busy_adjustment[2]);
   1019      1.1  christos 	}
   1020      1.1  christos       else
   1021      1.1  christos 	enforce_full_fr_latency (cpu, in_FRj);
   1022      1.1  christos       if (dual_FRj >= 0 && use_is_fp_load (cpu, dual_FRj))
   1023      1.1  christos 	{
   1024      1.1  christos 	  busy_adjustment[3] = 1;
   1025      1.1  christos 	  decrease_FR_busy (cpu, dual_FRj, busy_adjustment[3]);
   1026      1.1  christos 	}
   1027      1.1  christos       else
   1028      1.1  christos 	enforce_full_fr_latency (cpu, dual_FRj);
   1029      1.1  christos     }
   1030      1.1  christos   if (out_ACC40Sk >= 0)
   1031      1.1  christos     {
   1032      1.1  christos       if (acc_use_is_media_p2 (cpu, out_ACC40Sk))
   1033      1.1  christos 	{
   1034      1.1  christos 	  busy_adjustment[4] = 1;
   1035      1.1  christos 	  decrease_ACC_busy (cpu, out_ACC40Sk, busy_adjustment[4]);
   1036      1.1  christos 	}
   1037      1.1  christos       if (ACC40Sk_1 >= 0)
   1038      1.1  christos 	{
   1039      1.1  christos 	  if (acc_use_is_media_p2 (cpu, ACC40Sk_1))
   1040      1.1  christos 	    {
   1041      1.1  christos 	      busy_adjustment[5] = 1;
   1042      1.1  christos 	      decrease_ACC_busy (cpu, ACC40Sk_1, busy_adjustment[5]);
   1043      1.1  christos 	    }
   1044      1.1  christos 	}
   1045      1.1  christos       if (ACC40Sk_2 >= 0)
   1046      1.1  christos 	{
   1047      1.1  christos 	  if (acc_use_is_media_p2 (cpu, ACC40Sk_2))
   1048      1.1  christos 	    {
   1049      1.1  christos 	      busy_adjustment[6] = 1;
   1050      1.1  christos 	      decrease_ACC_busy (cpu, ACC40Sk_2, busy_adjustment[6]);
   1051      1.1  christos 	    }
   1052      1.1  christos 	}
   1053      1.1  christos       if (ACC40Sk_3 >= 0)
   1054      1.1  christos 	{
   1055      1.1  christos 	  if (acc_use_is_media_p2 (cpu, ACC40Sk_3))
   1056      1.1  christos 	    {
   1057      1.1  christos 	      busy_adjustment[7] = 1;
   1058      1.1  christos 	      decrease_ACC_busy (cpu, ACC40Sk_3, busy_adjustment[7]);
   1059      1.1  christos 	    }
   1060      1.1  christos 	}
   1061      1.1  christos     }
   1062      1.1  christos   else if (out_ACC40Uk >= 0)
   1063      1.1  christos     {
   1064      1.1  christos       if (acc_use_is_media_p2 (cpu, out_ACC40Uk))
   1065      1.1  christos 	{
   1066      1.1  christos 	  busy_adjustment[4] = 1;
   1067      1.1  christos 	  decrease_ACC_busy (cpu, out_ACC40Uk, busy_adjustment[4]);
   1068      1.1  christos 	}
   1069      1.1  christos       if (ACC40Uk_1 >= 0)
   1070      1.1  christos 	{
   1071      1.1  christos 	  if (acc_use_is_media_p2 (cpu, ACC40Uk_1))
   1072      1.1  christos 	    {
   1073      1.1  christos 	      busy_adjustment[5] = 1;
   1074      1.1  christos 	      decrease_ACC_busy (cpu, ACC40Uk_1, busy_adjustment[5]);
   1075      1.1  christos 	    }
   1076      1.1  christos 	}
   1077      1.1  christos       if (ACC40Uk_2 >= 0)
   1078      1.1  christos 	{
   1079      1.1  christos 	  if (acc_use_is_media_p2 (cpu, ACC40Uk_2))
   1080      1.1  christos 	    {
   1081      1.1  christos 	      busy_adjustment[6] = 1;
   1082      1.1  christos 	      decrease_ACC_busy (cpu, ACC40Uk_2, busy_adjustment[6]);
   1083      1.1  christos 	    }
   1084      1.1  christos 	}
   1085      1.1  christos       if (ACC40Uk_3 >= 0)
   1086      1.1  christos 	{
   1087      1.1  christos 	  if (acc_use_is_media_p2 (cpu, ACC40Uk_3))
   1088      1.1  christos 	    {
   1089      1.1  christos 	      busy_adjustment[7] = 1;
   1090      1.1  christos 	      decrease_ACC_busy (cpu, ACC40Uk_3, busy_adjustment[7]);
   1091      1.1  christos 	    }
   1092      1.1  christos 	}
   1093      1.1  christos     }
   1094      1.1  christos 
   1095      1.1  christos   /* The post processing must wait if there is a dependency on a FR
   1096      1.1  christos      which is not ready yet.  */
   1097      1.1  christos   ps->post_wait = cycles;
   1098      1.1  christos   post_wait_for_FR (cpu, in_FRi);
   1099      1.1  christos   post_wait_for_FR (cpu, dual_FRi);
   1100      1.1  christos   post_wait_for_FR (cpu, in_FRj);
   1101      1.1  christos   post_wait_for_FR (cpu, dual_FRj);
   1102      1.1  christos   post_wait_for_ACC (cpu, out_ACC40Sk);
   1103      1.1  christos   post_wait_for_ACC (cpu, ACC40Sk_1);
   1104      1.1  christos   post_wait_for_ACC (cpu, ACC40Sk_2);
   1105      1.1  christos   post_wait_for_ACC (cpu, ACC40Sk_3);
   1106      1.1  christos   post_wait_for_ACC (cpu, out_ACC40Uk);
   1107      1.1  christos   post_wait_for_ACC (cpu, ACC40Uk_1);
   1108      1.1  christos   post_wait_for_ACC (cpu, ACC40Uk_2);
   1109      1.1  christos   post_wait_for_ACC (cpu, ACC40Uk_3);
   1110      1.1  christos 
   1111      1.1  christos   /* Restore the busy cycles of the registers we used.  */
   1112      1.1  christos   fr = ps->fr_busy;
   1113      1.1  christos   acc = ps->acc_busy;
   1114      1.1  christos   fr[in_FRi] += busy_adjustment[0];
   1115      1.1  christos   if (dual_FRi >= 0)
   1116      1.1  christos     fr[dual_FRi] += busy_adjustment[1];
   1117      1.1  christos   fr[in_FRj] += busy_adjustment[2];
   1118      1.1  christos   if (dual_FRj > 0)
   1119      1.1  christos     fr[dual_FRj] += busy_adjustment[3];
   1120      1.1  christos   if (out_ACC40Sk >= 0)
   1121      1.1  christos     {
   1122      1.1  christos       acc[out_ACC40Sk] += busy_adjustment[4];
   1123      1.1  christos       if (ACC40Sk_1 >= 0)
   1124      1.1  christos 	acc[ACC40Sk_1] += busy_adjustment[5];
   1125      1.1  christos       if (ACC40Sk_2 >= 0)
   1126      1.1  christos 	acc[ACC40Sk_2] += busy_adjustment[6];
   1127      1.1  christos       if (ACC40Sk_3 >= 0)
   1128      1.1  christos 	acc[ACC40Sk_3] += busy_adjustment[7];
   1129      1.1  christos     }
   1130      1.1  christos   else if (out_ACC40Uk >= 0)
   1131      1.1  christos     {
   1132      1.1  christos       acc[out_ACC40Uk] += busy_adjustment[4];
   1133      1.1  christos       if (ACC40Uk_1 >= 0)
   1134      1.1  christos 	acc[ACC40Uk_1] += busy_adjustment[5];
   1135      1.1  christos       if (ACC40Uk_2 >= 0)
   1136      1.1  christos 	acc[ACC40Uk_2] += busy_adjustment[6];
   1137      1.1  christos       if (ACC40Uk_3 >= 0)
   1138      1.1  christos 	acc[ACC40Uk_3] += busy_adjustment[7];
   1139      1.1  christos     }
   1140      1.1  christos 
   1141      1.1  christos   /* The latency of the output register will be at least the latency of the
   1142      1.1  christos      other inputs.  Once initiated, post-processing will take 1 cycle.  */
   1143      1.1  christos   if (out_ACC40Sk >= 0)
   1144      1.1  christos     {
   1145      1.1  christos       update_ACC_latency (cpu, out_ACC40Sk, ps->post_wait + 1);
   1146      1.1  christos 
   1147      1.1  christos       set_acc_use_is_media_p2 (cpu, out_ACC40Sk);
   1148      1.1  christos       if (ACC40Sk_1 >= 0)
   1149      1.1  christos 	{
   1150      1.1  christos 	  update_ACC_latency (cpu, ACC40Sk_1, ps->post_wait + 1);
   1151      1.1  christos 
   1152      1.1  christos 	  set_acc_use_is_media_p2 (cpu, ACC40Sk_1);
   1153      1.1  christos 	}
   1154      1.1  christos       if (ACC40Sk_2 >= 0)
   1155      1.1  christos 	{
   1156      1.1  christos 	  update_ACC_latency (cpu, ACC40Sk_2, ps->post_wait + 1);
   1157      1.1  christos 
   1158      1.1  christos 	  set_acc_use_is_media_p2 (cpu, ACC40Sk_2);
   1159      1.1  christos 	}
   1160      1.1  christos       if (ACC40Sk_3 >= 0)
   1161      1.1  christos 	{
   1162      1.1  christos 	  update_ACC_latency (cpu, ACC40Sk_3, ps->post_wait + 1);
   1163      1.1  christos 
   1164      1.1  christos 	  set_acc_use_is_media_p2 (cpu, ACC40Sk_3);
   1165      1.1  christos 	}
   1166      1.1  christos     }
   1167      1.1  christos   else if (out_ACC40Uk >= 0)
   1168      1.1  christos     {
   1169      1.1  christos       update_ACC_latency (cpu, out_ACC40Uk, ps->post_wait + 1);
   1170      1.1  christos 
   1171      1.1  christos       set_acc_use_is_media_p2 (cpu, out_ACC40Uk);
   1172      1.1  christos       if (ACC40Uk_1 >= 0)
   1173      1.1  christos 	{
   1174      1.1  christos 	  update_ACC_latency (cpu, ACC40Uk_1, ps->post_wait + 1);
   1175      1.1  christos 
   1176      1.1  christos 	  set_acc_use_is_media_p2 (cpu, ACC40Uk_1);
   1177      1.1  christos 	}
   1178      1.1  christos       if (ACC40Uk_2 >= 0)
   1179      1.1  christos 	{
   1180      1.1  christos 	  update_ACC_latency (cpu, ACC40Uk_2, ps->post_wait + 1);
   1181      1.1  christos 
   1182      1.1  christos 	  set_acc_use_is_media_p2 (cpu, ACC40Uk_2);
   1183      1.1  christos 	}
   1184      1.1  christos       if (ACC40Uk_3 >= 0)
   1185      1.1  christos 	{
   1186      1.1  christos 	  update_ACC_latency (cpu, ACC40Uk_3, ps->post_wait + 1);
   1187      1.1  christos 
   1188      1.1  christos 	  set_acc_use_is_media_p2 (cpu, ACC40Uk_3);
   1189      1.1  christos 	}
   1190      1.1  christos     }
   1191      1.1  christos 
   1192      1.1  christos   return cycles;
   1193      1.1  christos }
   1194      1.1  christos 
   1195      1.1  christos int
   1196      1.1  christos frvbf_model_fr400_u_media_2_acc (SIM_CPU *cpu, const IDESC *idesc,
   1197      1.1  christos 				 int unit_num, int referenced,
   1198      1.1  christos 				 INT in_ACC40Si, INT out_ACC40Sk)
   1199      1.1  christos {
   1200      1.1  christos   int cycles;
   1201      1.1  christos   INT ACC40Si_1;
   1202      1.1  christos   FRV_PROFILE_STATE *ps;
   1203      1.1  christos   int busy_adjustment[] = {0, 0, 0};
   1204      1.1  christos   int *acc;
   1205      1.1  christos 
   1206      1.1  christos   if (model_insn == FRV_INSN_MODEL_PASS_1)
   1207      1.1  christos     return 0;
   1208      1.1  christos 
   1209      1.1  christos   /* The preprocessing can execute right away.  */
   1210      1.1  christos   cycles = idesc->timing->units[unit_num].done;
   1211      1.1  christos 
   1212      1.1  christos   ACC40Si_1 = DUAL_REG (in_ACC40Si);
   1213      1.1  christos 
   1214      1.1  christos   ps = CPU_PROFILE_STATE (cpu);
   1215      1.1  christos   /* The latency of the registers may be less than previously recorded,
   1216      1.1  christos      depending on how they were used previously.
   1217      1.1  christos      See Table 13-8 in the LSI.  */
   1218      1.1  christos   if (acc_use_is_media_p2 (cpu, in_ACC40Si))
   1219      1.1  christos     {
   1220      1.1  christos       busy_adjustment[0] = 1;
   1221      1.1  christos       decrease_ACC_busy (cpu, in_ACC40Si, busy_adjustment[0]);
   1222      1.1  christos     }
   1223      1.1  christos   if (ACC40Si_1 >= 0 && acc_use_is_media_p2 (cpu, ACC40Si_1))
   1224      1.1  christos     {
   1225      1.1  christos       busy_adjustment[1] = 1;
   1226      1.1  christos       decrease_ACC_busy (cpu, ACC40Si_1, busy_adjustment[1]);
   1227      1.1  christos     }
   1228      1.1  christos   if (out_ACC40Sk != in_ACC40Si && out_ACC40Sk != ACC40Si_1
   1229      1.1  christos       && acc_use_is_media_p2 (cpu, out_ACC40Sk))
   1230      1.1  christos     {
   1231      1.1  christos       busy_adjustment[2] = 1;
   1232      1.1  christos       decrease_ACC_busy (cpu, out_ACC40Sk, busy_adjustment[2]);
   1233      1.1  christos     }
   1234      1.1  christos 
   1235      1.1  christos   /* The post processing must wait if there is a dependency on a register
   1236      1.1  christos      which is not ready yet.  */
   1237      1.1  christos   ps->post_wait = cycles;
   1238      1.1  christos   post_wait_for_ACC (cpu, in_ACC40Si);
   1239      1.1  christos   post_wait_for_ACC (cpu, ACC40Si_1);
   1240      1.1  christos   post_wait_for_ACC (cpu, out_ACC40Sk);
   1241      1.1  christos 
   1242      1.1  christos   /* Restore the busy cycles of the registers we used.  */
   1243      1.1  christos   acc = ps->acc_busy;
   1244      1.1  christos   acc[in_ACC40Si] += busy_adjustment[0];
   1245      1.1  christos   if (ACC40Si_1 >= 0)
   1246      1.1  christos     acc[ACC40Si_1] += busy_adjustment[1];
   1247      1.1  christos   acc[out_ACC40Sk] += busy_adjustment[2];
   1248      1.1  christos 
   1249      1.1  christos   /* The latency of the output register will be at least the latency of the
   1250      1.1  christos      other inputs.  Once initiated, post-processing will take 1 cycle.  */
   1251      1.1  christos   update_ACC_latency (cpu, out_ACC40Sk, ps->post_wait + 1);
   1252      1.1  christos   set_acc_use_is_media_p2 (cpu, out_ACC40Sk);
   1253      1.1  christos 
   1254      1.1  christos   return cycles;
   1255      1.1  christos }
   1256      1.1  christos 
   1257      1.1  christos int
   1258      1.1  christos frvbf_model_fr400_u_media_2_acc_dual (SIM_CPU *cpu, const IDESC *idesc,
   1259      1.1  christos 				      int unit_num, int referenced,
   1260      1.1  christos 				      INT in_ACC40Si, INT out_ACC40Sk)
   1261      1.1  christos {
   1262      1.1  christos   int cycles;
   1263      1.1  christos   INT ACC40Si_1;
   1264      1.1  christos   INT ACC40Si_2;
   1265      1.1  christos   INT ACC40Si_3;
   1266      1.1  christos   INT ACC40Sk_1;
   1267      1.1  christos   FRV_PROFILE_STATE *ps;
   1268      1.1  christos   int busy_adjustment[] = {0, 0, 0, 0, 0, 0};
   1269      1.1  christos   int *acc;
   1270      1.1  christos 
   1271      1.1  christos   if (model_insn == FRV_INSN_MODEL_PASS_1)
   1272      1.1  christos     return 0;
   1273      1.1  christos 
   1274      1.1  christos   /* The preprocessing can execute right away.  */
   1275      1.1  christos   cycles = idesc->timing->units[unit_num].done;
   1276      1.1  christos 
   1277      1.1  christos   ACC40Si_1 = DUAL_REG (in_ACC40Si);
   1278      1.1  christos   ACC40Si_2 = DUAL_REG (ACC40Si_1);
   1279      1.1  christos   ACC40Si_3 = DUAL_REG (ACC40Si_2);
   1280      1.1  christos   ACC40Sk_1 = DUAL_REG (out_ACC40Sk);
   1281      1.1  christos 
   1282      1.1  christos   ps = CPU_PROFILE_STATE (cpu);
   1283      1.1  christos   /* The latency of the registers may be less than previously recorded,
   1284      1.1  christos      depending on how they were used previously.
   1285      1.1  christos      See Table 13-8 in the LSI.  */
   1286      1.1  christos   if (acc_use_is_media_p2 (cpu, in_ACC40Si))
   1287      1.1  christos     {
   1288      1.1  christos       busy_adjustment[0] = 1;
   1289      1.1  christos       decrease_ACC_busy (cpu, in_ACC40Si, busy_adjustment[0]);
   1290      1.1  christos     }
   1291      1.1  christos   if (ACC40Si_1 >= 0 && acc_use_is_media_p2 (cpu, ACC40Si_1))
   1292      1.1  christos     {
   1293      1.1  christos       busy_adjustment[1] = 1;
   1294      1.1  christos       decrease_ACC_busy (cpu, ACC40Si_1, busy_adjustment[1]);
   1295      1.1  christos     }
   1296      1.1  christos   if (ACC40Si_2 >= 0 && acc_use_is_media_p2 (cpu, ACC40Si_2))
   1297      1.1  christos     {
   1298      1.1  christos       busy_adjustment[2] = 1;
   1299      1.1  christos       decrease_ACC_busy (cpu, ACC40Si_2, busy_adjustment[2]);
   1300      1.1  christos     }
   1301      1.1  christos   if (ACC40Si_3 >= 0 && acc_use_is_media_p2 (cpu, ACC40Si_3))
   1302      1.1  christos     {
   1303      1.1  christos       busy_adjustment[3] = 1;
   1304      1.1  christos       decrease_ACC_busy (cpu, ACC40Si_3, busy_adjustment[3]);
   1305      1.1  christos     }
   1306      1.1  christos   if (out_ACC40Sk != in_ACC40Si && out_ACC40Sk != ACC40Si_1
   1307      1.1  christos       && out_ACC40Sk != ACC40Si_2 && out_ACC40Sk != ACC40Si_3)
   1308      1.1  christos     {
   1309      1.1  christos       if (acc_use_is_media_p2 (cpu, out_ACC40Sk))
   1310      1.1  christos 	{
   1311      1.1  christos 	  busy_adjustment[4] = 1;
   1312      1.1  christos 	  decrease_ACC_busy (cpu, out_ACC40Sk, busy_adjustment[4]);
   1313      1.1  christos 	}
   1314      1.1  christos     }
   1315      1.1  christos   if (ACC40Sk_1 != in_ACC40Si && ACC40Sk_1 != ACC40Si_1
   1316      1.1  christos       && ACC40Sk_1 != ACC40Si_2 && ACC40Sk_1 != ACC40Si_3)
   1317      1.1  christos     {
   1318      1.1  christos       if (acc_use_is_media_p2 (cpu, ACC40Sk_1))
   1319      1.1  christos 	{
   1320      1.1  christos 	  busy_adjustment[5] = 1;
   1321      1.1  christos 	  decrease_ACC_busy (cpu, ACC40Sk_1, busy_adjustment[5]);
   1322      1.1  christos 	}
   1323      1.1  christos     }
   1324      1.1  christos 
   1325      1.1  christos   /* The post processing must wait if there is a dependency on a register
   1326      1.1  christos      which is not ready yet.  */
   1327      1.1  christos   ps->post_wait = cycles;
   1328      1.1  christos   post_wait_for_ACC (cpu, in_ACC40Si);
   1329      1.1  christos   post_wait_for_ACC (cpu, ACC40Si_1);
   1330      1.1  christos   post_wait_for_ACC (cpu, ACC40Si_2);
   1331      1.1  christos   post_wait_for_ACC (cpu, ACC40Si_3);
   1332      1.1  christos   post_wait_for_ACC (cpu, out_ACC40Sk);
   1333      1.1  christos   post_wait_for_ACC (cpu, ACC40Sk_1);
   1334      1.1  christos 
   1335      1.1  christos   /* Restore the busy cycles of the registers we used.  */
   1336      1.1  christos   acc = ps->acc_busy;
   1337      1.1  christos   acc[in_ACC40Si] += busy_adjustment[0];
   1338      1.1  christos   if (ACC40Si_1 >= 0)
   1339      1.1  christos     acc[ACC40Si_1] += busy_adjustment[1];
   1340      1.1  christos   if (ACC40Si_2 >= 0)
   1341      1.1  christos     acc[ACC40Si_2] += busy_adjustment[2];
   1342      1.1  christos   if (ACC40Si_3 >= 0)
   1343      1.1  christos     acc[ACC40Si_3] += busy_adjustment[3];
   1344      1.1  christos   acc[out_ACC40Sk] += busy_adjustment[4];
   1345      1.1  christos   if (ACC40Sk_1 >= 0)
   1346      1.1  christos     acc[ACC40Sk_1] += busy_adjustment[5];
   1347      1.1  christos 
   1348      1.1  christos   /* The latency of the output register will be at least the latency of the
   1349      1.1  christos      other inputs.  Once initiated, post-processing will take 1 cycle.  */
   1350      1.1  christos   update_ACC_latency (cpu, out_ACC40Sk, ps->post_wait + 1);
   1351      1.1  christos   set_acc_use_is_media_p2 (cpu, out_ACC40Sk);
   1352      1.1  christos   if (ACC40Sk_1 >= 0)
   1353      1.1  christos     {
   1354      1.1  christos       update_ACC_latency (cpu, ACC40Sk_1, ps->post_wait + 1);
   1355      1.1  christos       set_acc_use_is_media_p2 (cpu, ACC40Sk_1);
   1356      1.1  christos     }
   1357      1.1  christos 
   1358      1.1  christos   return cycles;
   1359      1.1  christos }
   1360      1.1  christos 
   1361      1.1  christos int
   1362      1.1  christos frvbf_model_fr400_u_media_2_add_sub (SIM_CPU *cpu, const IDESC *idesc,
   1363      1.1  christos 				     int unit_num, int referenced,
   1364      1.1  christos 				     INT in_ACC40Si, INT out_ACC40Sk)
   1365      1.1  christos {
   1366      1.1  christos   int cycles;
   1367      1.1  christos   INT ACC40Si_1;
   1368      1.1  christos   INT ACC40Sk_1;
   1369      1.1  christos   FRV_PROFILE_STATE *ps;
   1370      1.1  christos   int busy_adjustment[] = {0, 0, 0, 0};
   1371      1.1  christos   int *acc;
   1372      1.1  christos 
   1373      1.1  christos   if (model_insn == FRV_INSN_MODEL_PASS_1)
   1374      1.1  christos     return 0;
   1375      1.1  christos 
   1376      1.1  christos   /* The preprocessing can execute right away.  */
   1377      1.1  christos   cycles = idesc->timing->units[unit_num].done;
   1378      1.1  christos 
   1379      1.1  christos   ACC40Si_1 = DUAL_REG (in_ACC40Si);
   1380      1.1  christos   ACC40Sk_1 = DUAL_REG (out_ACC40Sk);
   1381      1.1  christos 
   1382      1.1  christos   ps = CPU_PROFILE_STATE (cpu);
   1383      1.1  christos   /* The latency of the registers may be less than previously recorded,
   1384      1.1  christos      depending on how they were used previously.
   1385      1.1  christos      See Table 13-8 in the LSI.  */
   1386      1.1  christos   if (acc_use_is_media_p2 (cpu, in_ACC40Si))
   1387      1.1  christos     {
   1388      1.1  christos       busy_adjustment[0] = 1;
   1389      1.1  christos       decrease_ACC_busy (cpu, in_ACC40Si, busy_adjustment[0]);
   1390      1.1  christos     }
   1391      1.1  christos   if (ACC40Si_1 >= 0 && acc_use_is_media_p2 (cpu, ACC40Si_1))
   1392      1.1  christos     {
   1393      1.1  christos       busy_adjustment[1] = 1;
   1394      1.1  christos       decrease_ACC_busy (cpu, ACC40Si_1, busy_adjustment[1]);
   1395      1.1  christos     }
   1396      1.1  christos   if (out_ACC40Sk != in_ACC40Si && out_ACC40Sk != ACC40Si_1)
   1397      1.1  christos     {
   1398      1.1  christos       if (acc_use_is_media_p2 (cpu, out_ACC40Sk))
   1399      1.1  christos 	{
   1400      1.1  christos 	  busy_adjustment[2] = 1;
   1401      1.1  christos 	  decrease_ACC_busy (cpu, out_ACC40Sk, busy_adjustment[2]);
   1402      1.1  christos 	}
   1403      1.1  christos     }
   1404      1.1  christos   if (ACC40Sk_1 != in_ACC40Si && ACC40Sk_1 != ACC40Si_1)
   1405      1.1  christos     {
   1406      1.1  christos       if (acc_use_is_media_p2 (cpu, ACC40Sk_1))
   1407      1.1  christos 	{
   1408      1.1  christos 	  busy_adjustment[3] = 1;
   1409      1.1  christos 	  decrease_ACC_busy (cpu, ACC40Sk_1, busy_adjustment[3]);
   1410      1.1  christos 	}
   1411      1.1  christos     }
   1412      1.1  christos 
   1413      1.1  christos   /* The post processing must wait if there is a dependency on a register
   1414      1.1  christos      which is not ready yet.  */
   1415      1.1  christos   ps->post_wait = cycles;
   1416      1.1  christos   post_wait_for_ACC (cpu, in_ACC40Si);
   1417      1.1  christos   post_wait_for_ACC (cpu, ACC40Si_1);
   1418      1.1  christos   post_wait_for_ACC (cpu, out_ACC40Sk);
   1419      1.1  christos   post_wait_for_ACC (cpu, ACC40Sk_1);
   1420      1.1  christos 
   1421      1.1  christos   /* Restore the busy cycles of the registers we used.  */
   1422      1.1  christos   acc = ps->acc_busy;
   1423      1.1  christos   acc[in_ACC40Si] += busy_adjustment[0];
   1424      1.1  christos   if (ACC40Si_1 >= 0)
   1425      1.1  christos     acc[ACC40Si_1] += busy_adjustment[1];
   1426      1.1  christos   acc[out_ACC40Sk] += busy_adjustment[2];
   1427      1.1  christos   if (ACC40Sk_1 >= 0)
   1428      1.1  christos     acc[ACC40Sk_1] += busy_adjustment[3];
   1429      1.1  christos 
   1430      1.1  christos   /* The latency of the output register will be at least the latency of the
   1431      1.1  christos      other inputs.  Once initiated, post-processing will take 1 cycle.  */
   1432      1.1  christos   update_ACC_latency (cpu, out_ACC40Sk, ps->post_wait + 1);
   1433      1.1  christos   set_acc_use_is_media_p2 (cpu, out_ACC40Sk);
   1434      1.1  christos   if (ACC40Sk_1 >= 0)
   1435      1.1  christos     {
   1436      1.1  christos       update_ACC_latency (cpu, ACC40Sk_1, ps->post_wait + 1);
   1437      1.1  christos       set_acc_use_is_media_p2 (cpu, ACC40Sk_1);
   1438      1.1  christos     }
   1439      1.1  christos 
   1440      1.1  christos   return cycles;
   1441      1.1  christos }
   1442      1.1  christos 
   1443      1.1  christos int
   1444      1.1  christos frvbf_model_fr400_u_media_2_add_sub_dual (SIM_CPU *cpu, const IDESC *idesc,
   1445      1.1  christos 					  int unit_num, int referenced,
   1446      1.1  christos 					  INT in_ACC40Si, INT out_ACC40Sk)
   1447      1.1  christos {
   1448      1.1  christos   int cycles;
   1449      1.1  christos   INT ACC40Si_1;
   1450      1.1  christos   INT ACC40Si_2;
   1451      1.1  christos   INT ACC40Si_3;
   1452      1.1  christos   INT ACC40Sk_1;
   1453      1.1  christos   INT ACC40Sk_2;
   1454      1.1  christos   INT ACC40Sk_3;
   1455      1.1  christos   FRV_PROFILE_STATE *ps;
   1456      1.1  christos   int busy_adjustment[] = {0, 0, 0, 0, 0, 0, 0, 0};
   1457      1.1  christos   int *acc;
   1458      1.1  christos 
   1459      1.1  christos   if (model_insn == FRV_INSN_MODEL_PASS_1)
   1460      1.1  christos     return 0;
   1461      1.1  christos 
   1462      1.1  christos   /* The preprocessing can execute right away.  */
   1463      1.1  christos   cycles = idesc->timing->units[unit_num].done;
   1464      1.1  christos 
   1465      1.1  christos   ACC40Si_1 = DUAL_REG (in_ACC40Si);
   1466      1.1  christos   ACC40Si_2 = DUAL_REG (ACC40Si_1);
   1467      1.1  christos   ACC40Si_3 = DUAL_REG (ACC40Si_2);
   1468      1.1  christos   ACC40Sk_1 = DUAL_REG (out_ACC40Sk);
   1469      1.1  christos   ACC40Sk_2 = DUAL_REG (ACC40Sk_1);
   1470      1.1  christos   ACC40Sk_3 = DUAL_REG (ACC40Sk_2);
   1471      1.1  christos 
   1472      1.1  christos   ps = CPU_PROFILE_STATE (cpu);
   1473      1.1  christos   /* The latency of the registers may be less than previously recorded,
   1474      1.1  christos      depending on how they were used previously.
   1475      1.1  christos      See Table 13-8 in the LSI.  */
   1476      1.1  christos   if (acc_use_is_media_p2 (cpu, in_ACC40Si))
   1477      1.1  christos     {
   1478      1.1  christos       busy_adjustment[0] = 1;
   1479      1.1  christos       decrease_ACC_busy (cpu, in_ACC40Si, busy_adjustment[0]);
   1480      1.1  christos     }
   1481      1.1  christos   if (ACC40Si_1 >= 0 && acc_use_is_media_p2 (cpu, ACC40Si_1))
   1482      1.1  christos     {
   1483      1.1  christos       busy_adjustment[1] = 1;
   1484      1.1  christos       decrease_ACC_busy (cpu, ACC40Si_1, busy_adjustment[1]);
   1485      1.1  christos     }
   1486      1.1  christos   if (ACC40Si_2 >= 0 && acc_use_is_media_p2 (cpu, ACC40Si_2))
   1487      1.1  christos     {
   1488      1.1  christos       busy_adjustment[2] = 1;
   1489      1.1  christos       decrease_ACC_busy (cpu, ACC40Si_2, busy_adjustment[2]);
   1490      1.1  christos     }
   1491      1.1  christos   if (ACC40Si_3 >= 0 && acc_use_is_media_p2 (cpu, ACC40Si_3))
   1492      1.1  christos     {
   1493      1.1  christos       busy_adjustment[3] = 1;
   1494      1.1  christos       decrease_ACC_busy (cpu, ACC40Si_3, busy_adjustment[3]);
   1495      1.1  christos     }
   1496      1.1  christos   if (out_ACC40Sk != in_ACC40Si && out_ACC40Sk != ACC40Si_1
   1497      1.1  christos       && out_ACC40Sk != ACC40Si_2 && out_ACC40Sk != ACC40Si_3)
   1498      1.1  christos     {
   1499      1.1  christos       if (acc_use_is_media_p2 (cpu, out_ACC40Sk))
   1500      1.1  christos 	{
   1501      1.1  christos 	  busy_adjustment[4] = 1;
   1502      1.1  christos 	  decrease_ACC_busy (cpu, out_ACC40Sk, busy_adjustment[4]);
   1503      1.1  christos 	}
   1504      1.1  christos     }
   1505      1.1  christos   if (ACC40Sk_1 != in_ACC40Si && ACC40Sk_1 != ACC40Si_1
   1506      1.1  christos       && ACC40Sk_1 != ACC40Si_2 && ACC40Sk_1 != ACC40Si_3)
   1507      1.1  christos     {
   1508      1.1  christos       if (acc_use_is_media_p2 (cpu, ACC40Sk_1))
   1509      1.1  christos 	{
   1510      1.1  christos 	  busy_adjustment[5] = 1;
   1511      1.1  christos 	  decrease_ACC_busy (cpu, ACC40Sk_1, busy_adjustment[5]);
   1512      1.1  christos 	}
   1513      1.1  christos     }
   1514      1.1  christos   if (ACC40Sk_2 != in_ACC40Si && ACC40Sk_2 != ACC40Si_1
   1515      1.1  christos       && ACC40Sk_2 != ACC40Si_2 && ACC40Sk_2 != ACC40Si_3)
   1516      1.1  christos     {
   1517      1.1  christos       if (acc_use_is_media_p2 (cpu, ACC40Sk_2))
   1518      1.1  christos 	{
   1519      1.1  christos 	  busy_adjustment[6] = 1;
   1520      1.1  christos 	  decrease_ACC_busy (cpu, ACC40Sk_2, busy_adjustment[6]);
   1521      1.1  christos 	}
   1522      1.1  christos     }
   1523      1.1  christos   if (ACC40Sk_3 != in_ACC40Si && ACC40Sk_3 != ACC40Si_1
   1524      1.1  christos       && ACC40Sk_3 != ACC40Si_2 && ACC40Sk_3 != ACC40Si_3)
   1525      1.1  christos     {
   1526      1.1  christos       if (acc_use_is_media_p2 (cpu, ACC40Sk_3))
   1527      1.1  christos 	{
   1528      1.1  christos 	  busy_adjustment[7] = 1;
   1529      1.1  christos 	  decrease_ACC_busy (cpu, ACC40Sk_3, busy_adjustment[7]);
   1530      1.1  christos 	}
   1531      1.1  christos     }
   1532      1.1  christos 
   1533      1.1  christos   /* The post processing must wait if there is a dependency on a register
   1534      1.1  christos      which is not ready yet.  */
   1535      1.1  christos   ps->post_wait = cycles;
   1536      1.1  christos   post_wait_for_ACC (cpu, in_ACC40Si);
   1537      1.1  christos   post_wait_for_ACC (cpu, ACC40Si_1);
   1538      1.1  christos   post_wait_for_ACC (cpu, ACC40Si_2);
   1539      1.1  christos   post_wait_for_ACC (cpu, ACC40Si_3);
   1540      1.1  christos   post_wait_for_ACC (cpu, out_ACC40Sk);
   1541      1.1  christos   post_wait_for_ACC (cpu, ACC40Sk_1);
   1542      1.1  christos   post_wait_for_ACC (cpu, ACC40Sk_2);
   1543      1.1  christos   post_wait_for_ACC (cpu, ACC40Sk_3);
   1544      1.1  christos 
   1545      1.1  christos   /* Restore the busy cycles of the registers we used.  */
   1546      1.1  christos   acc = ps->acc_busy;
   1547      1.1  christos   acc[in_ACC40Si] += busy_adjustment[0];
   1548      1.1  christos   if (ACC40Si_1 >= 0)
   1549      1.1  christos     acc[ACC40Si_1] += busy_adjustment[1];
   1550      1.1  christos   if (ACC40Si_2 >= 0)
   1551      1.1  christos     acc[ACC40Si_2] += busy_adjustment[2];
   1552      1.1  christos   if (ACC40Si_3 >= 0)
   1553      1.1  christos     acc[ACC40Si_3] += busy_adjustment[3];
   1554      1.1  christos   acc[out_ACC40Sk] += busy_adjustment[4];
   1555      1.1  christos   if (ACC40Sk_1 >= 0)
   1556      1.1  christos     acc[ACC40Sk_1] += busy_adjustment[5];
   1557      1.1  christos   if (ACC40Sk_2 >= 0)
   1558      1.1  christos     acc[ACC40Sk_2] += busy_adjustment[6];
   1559      1.1  christos   if (ACC40Sk_3 >= 0)
   1560      1.1  christos     acc[ACC40Sk_3] += busy_adjustment[7];
   1561      1.1  christos 
   1562      1.1  christos   /* The latency of the output register will be at least the latency of the
   1563      1.1  christos      other inputs.  Once initiated, post-processing will take 1 cycle.  */
   1564      1.1  christos   update_ACC_latency (cpu, out_ACC40Sk, ps->post_wait + 1);
   1565      1.1  christos   set_acc_use_is_media_p2 (cpu, out_ACC40Sk);
   1566      1.1  christos   if (ACC40Sk_1 >= 0)
   1567      1.1  christos     {
   1568      1.1  christos       update_ACC_latency (cpu, ACC40Sk_1, ps->post_wait + 1);
   1569      1.1  christos       set_acc_use_is_media_p2 (cpu, ACC40Sk_1);
   1570      1.1  christos     }
   1571      1.1  christos   if (ACC40Sk_2 >= 0)
   1572      1.1  christos     {
   1573      1.1  christos       update_ACC_latency (cpu, ACC40Sk_2, ps->post_wait + 1);
   1574      1.1  christos       set_acc_use_is_media_p2 (cpu, ACC40Sk_2);
   1575      1.1  christos     }
   1576      1.1  christos   if (ACC40Sk_3 >= 0)
   1577      1.1  christos     {
   1578      1.1  christos       update_ACC_latency (cpu, ACC40Sk_3, ps->post_wait + 1);
   1579      1.1  christos       set_acc_use_is_media_p2 (cpu, ACC40Sk_3);
   1580      1.1  christos     }
   1581      1.1  christos 
   1582      1.1  christos   return cycles;
   1583      1.1  christos }
   1584      1.1  christos 
   1585      1.1  christos int
   1586      1.1  christos frvbf_model_fr400_u_media_3 (SIM_CPU *cpu, const IDESC *idesc,
   1587      1.1  christos 			     int unit_num, int referenced,
   1588      1.1  christos 			     INT in_FRi, INT in_FRj,
   1589      1.1  christos 			     INT out_FRk)
   1590      1.1  christos {
   1591      1.1  christos   /* Modelling is the same as media unit 1.  */
   1592      1.1  christos   return frvbf_model_fr400_u_media_1 (cpu, idesc, unit_num, referenced,
   1593      1.1  christos 				      in_FRi, in_FRj, out_FRk);
   1594      1.1  christos }
   1595      1.1  christos 
   1596      1.1  christos int
   1597      1.1  christos frvbf_model_fr400_u_media_3_dual (SIM_CPU *cpu, const IDESC *idesc,
   1598      1.1  christos 				  int unit_num, int referenced,
   1599      1.1  christos 				  INT in_FRi, INT out_FRk)
   1600      1.1  christos {
   1601      1.1  christos   int cycles;
   1602      1.1  christos   INT dual_FRi;
   1603      1.1  christos   FRV_PROFILE_STATE *ps;
   1604      1.1  christos   int busy_adjustment[] = {0, 0};
   1605      1.1  christos   int *fr;
   1606      1.1  christos 
   1607      1.1  christos   if (model_insn == FRV_INSN_MODEL_PASS_1)
   1608      1.1  christos     return 0;
   1609      1.1  christos 
   1610      1.1  christos   /* The preprocessing can execute right away.  */
   1611      1.1  christos   cycles = idesc->timing->units[unit_num].done;
   1612      1.1  christos 
   1613      1.1  christos   ps = CPU_PROFILE_STATE (cpu);
   1614      1.1  christos   dual_FRi = DUAL_REG (in_FRi);
   1615      1.1  christos 
   1616      1.1  christos   /* The latency of the registers may be less than previously recorded,
   1617      1.1  christos      depending on how they were used previously.
   1618      1.1  christos      See Table 13-8 in the LSI.  */
   1619      1.1  christos   if (use_is_fp_load (cpu, in_FRi))
   1620      1.1  christos     {
   1621      1.1  christos       busy_adjustment[0] = 1;
   1622      1.1  christos       decrease_FR_busy (cpu, in_FRi, busy_adjustment[0]);
   1623      1.1  christos     }
   1624      1.1  christos   else
   1625      1.1  christos     enforce_full_fr_latency (cpu, in_FRi);
   1626      1.1  christos   if (dual_FRi >= 0 && use_is_fp_load (cpu, dual_FRi))
   1627      1.1  christos     {
   1628      1.1  christos       busy_adjustment[1] = 1;
   1629      1.1  christos       decrease_FR_busy (cpu, dual_FRi, busy_adjustment[1]);
   1630      1.1  christos     }
   1631      1.1  christos   else
   1632      1.1  christos     enforce_full_fr_latency (cpu, dual_FRi);
   1633      1.1  christos 
   1634      1.1  christos   /* The post processing must wait if there is a dependency on a FR
   1635      1.1  christos      which is not ready yet.  */
   1636      1.1  christos   ps->post_wait = cycles;
   1637      1.1  christos   post_wait_for_FR (cpu, in_FRi);
   1638      1.1  christos   post_wait_for_FR (cpu, dual_FRi);
   1639      1.1  christos   post_wait_for_FR (cpu, out_FRk);
   1640      1.1  christos 
   1641      1.1  christos   /* Restore the busy cycles of the registers we used.  */
   1642      1.1  christos   fr = ps->fr_busy;
   1643      1.1  christos   fr[in_FRi] += busy_adjustment[0];
   1644      1.1  christos   if (dual_FRi >= 0)
   1645      1.1  christos     fr[dual_FRi] += busy_adjustment[1];
   1646      1.1  christos 
   1647      1.1  christos   /* The latency of the output register will be at least the latency of the
   1648      1.1  christos      other inputs.  */
   1649      1.1  christos   update_FR_latency (cpu, out_FRk, ps->post_wait);
   1650      1.1  christos 
   1651      1.1  christos   /* Once initiated, post-processing has no latency.  */
   1652      1.1  christos   update_FR_ptime (cpu, out_FRk, 0);
   1653      1.1  christos 
   1654      1.1  christos   return cycles;
   1655      1.1  christos }
   1656      1.1  christos 
   1657      1.1  christos int
   1658      1.1  christos frvbf_model_fr400_u_media_3_quad (SIM_CPU *cpu, const IDESC *idesc,
   1659      1.1  christos 				  int unit_num, int referenced,
   1660      1.1  christos 				  INT in_FRi, INT in_FRj,
   1661      1.1  christos 				  INT out_FRk)
   1662      1.1  christos {
   1663      1.1  christos   /* Modelling is the same as media unit 1.  */
   1664      1.1  christos   return frvbf_model_fr400_u_media_1_quad (cpu, idesc, unit_num, referenced,
   1665      1.1  christos 					   in_FRi, in_FRj, out_FRk);
   1666      1.1  christos }
   1667      1.1  christos 
   1668      1.1  christos int
   1669      1.1  christos frvbf_model_fr400_u_media_4 (SIM_CPU *cpu, const IDESC *idesc,
   1670      1.1  christos 			     int unit_num, int referenced,
   1671      1.1  christos 			     INT in_ACC40Si, INT in_FRj,
   1672      1.1  christos 			     INT out_ACC40Sk, INT out_FRk)
   1673      1.1  christos {
   1674      1.1  christos   int cycles;
   1675      1.1  christos   FRV_PROFILE_STATE *ps;
   1676      1.1  christos   const CGEN_INSN *insn;
   1677      1.1  christos   int busy_adjustment[] = {0};
   1678      1.1  christos   int *fr;
   1679      1.1  christos 
   1680      1.1  christos   if (model_insn == FRV_INSN_MODEL_PASS_1)
   1681      1.1  christos     return 0;
   1682      1.1  christos 
   1683      1.1  christos   /* The preprocessing can execute right away.  */
   1684      1.1  christos   cycles = idesc->timing->units[unit_num].done;
   1685      1.1  christos 
   1686      1.1  christos   ps = CPU_PROFILE_STATE (cpu);
   1687      1.1  christos   insn = idesc->idata;
   1688      1.1  christos 
   1689      1.1  christos   /* The latency of the registers may be less than previously recorded,
   1690      1.1  christos      depending on how they were used previously.
   1691      1.1  christos      See Table 13-8 in the LSI.  */
   1692      1.1  christos   if (in_FRj >= 0)
   1693      1.1  christos     {
   1694      1.1  christos       if (use_is_fp_load (cpu, in_FRj))
   1695      1.1  christos 	{
   1696      1.1  christos 	  busy_adjustment[0] = 1;
   1697      1.1  christos 	  decrease_FR_busy (cpu, in_FRj, busy_adjustment[0]);
   1698      1.1  christos 	}
   1699      1.1  christos       else
   1700      1.1  christos 	enforce_full_fr_latency (cpu, in_FRj);
   1701      1.1  christos     }
   1702      1.1  christos 
   1703      1.1  christos   /* The post processing must wait if there is a dependency on a FR
   1704      1.1  christos      which is not ready yet.  */
   1705      1.1  christos   ps->post_wait = cycles;
   1706      1.1  christos   post_wait_for_ACC (cpu, in_ACC40Si);
   1707      1.1  christos   post_wait_for_ACC (cpu, out_ACC40Sk);
   1708      1.1  christos   post_wait_for_FR (cpu, in_FRj);
   1709      1.1  christos   post_wait_for_FR (cpu, out_FRk);
   1710      1.1  christos 
   1711      1.1  christos   /* Restore the busy cycles of the registers we used.  */
   1712      1.1  christos   fr = ps->fr_busy;
   1713      1.1  christos 
   1714      1.1  christos   /* The latency of the output register will be at least the latency of the
   1715      1.1  christos      other inputs.  Once initiated, post-processing will take 1 cycle.  */
   1716      1.1  christos   if (out_FRk >= 0)
   1717      1.1  christos     {
   1718      1.1  christos       update_FR_latency (cpu, out_FRk, ps->post_wait);
   1719      1.1  christos       update_FR_ptime (cpu, out_FRk, 1);
   1720      1.1  christos       /* Mark this use of the register as media unit 4.  */
   1721      1.1  christos       set_use_is_media_p4 (cpu, out_FRk);
   1722      1.1  christos     }
   1723      1.1  christos   else if (out_ACC40Sk >= 0)
   1724      1.1  christos     {
   1725      1.1  christos       update_ACC_latency (cpu, out_ACC40Sk, ps->post_wait);
   1726      1.1  christos       update_ACC_ptime (cpu, out_ACC40Sk, 1);
   1727      1.1  christos       /* Mark this use of the register as media unit 4.  */
   1728      1.1  christos       set_acc_use_is_media_p4 (cpu, out_ACC40Sk);
   1729      1.1  christos     }
   1730      1.1  christos 
   1731      1.1  christos   return cycles;
   1732      1.1  christos }
   1733      1.1  christos 
   1734      1.1  christos int
   1735      1.1  christos frvbf_model_fr400_u_media_4_accg (SIM_CPU *cpu, const IDESC *idesc,
   1736      1.1  christos 				  int unit_num, int referenced,
   1737      1.1  christos 				  INT in_ACCGi, INT in_FRinti,
   1738      1.1  christos 				  INT out_ACCGk, INT out_FRintk)
   1739      1.1  christos {
   1740      1.1  christos   /* Modelling is the same as media-4 unit except use accumulator guards
   1741      1.1  christos      as input instead of accumulators.  */
   1742      1.1  christos   return frvbf_model_fr400_u_media_4 (cpu, idesc, unit_num, referenced,
   1743      1.1  christos 				      in_ACCGi, in_FRinti,
   1744      1.1  christos 				      out_ACCGk, out_FRintk);
   1745      1.1  christos }
   1746      1.1  christos 
   1747      1.1  christos int
   1748      1.1  christos frvbf_model_fr400_u_media_4_acc_dual (SIM_CPU *cpu, const IDESC *idesc,
   1749      1.1  christos 				      int unit_num, int referenced,
   1750      1.1  christos 				      INT in_ACC40Si, INT out_FRk)
   1751      1.1  christos {
   1752      1.1  christos   int cycles;
   1753      1.1  christos   FRV_PROFILE_STATE *ps;
   1754      1.1  christos   const CGEN_INSN *insn;
   1755      1.1  christos   INT ACC40Si_1;
   1756      1.1  christos   INT FRk_1;
   1757      1.1  christos 
   1758      1.1  christos   if (model_insn == FRV_INSN_MODEL_PASS_1)
   1759      1.1  christos     return 0;
   1760      1.1  christos 
   1761      1.1  christos   /* The preprocessing can execute right away.  */
   1762      1.1  christos   cycles = idesc->timing->units[unit_num].done;
   1763      1.1  christos 
   1764      1.1  christos   ps = CPU_PROFILE_STATE (cpu);
   1765      1.1  christos   ACC40Si_1 = DUAL_REG (in_ACC40Si);
   1766      1.1  christos   FRk_1 = DUAL_REG (out_FRk);
   1767      1.1  christos 
   1768      1.1  christos   insn = idesc->idata;
   1769      1.1  christos 
   1770      1.1  christos   /* The post processing must wait if there is a dependency on a FR
   1771      1.1  christos      which is not ready yet.  */
   1772      1.1  christos   ps->post_wait = cycles;
   1773      1.1  christos   post_wait_for_ACC (cpu, in_ACC40Si);
   1774      1.1  christos   post_wait_for_ACC (cpu, ACC40Si_1);
   1775      1.1  christos   post_wait_for_FR (cpu, out_FRk);
   1776      1.1  christos   post_wait_for_FR (cpu, FRk_1);
   1777      1.1  christos 
   1778      1.1  christos   /* The latency of the output register will be at least the latency of the
   1779      1.1  christos      other inputs.  Once initiated, post-processing will take 1 cycle.  */
   1780      1.1  christos   if (out_FRk >= 0)
   1781      1.1  christos     {
   1782      1.1  christos       update_FR_latency (cpu, out_FRk, ps->post_wait);
   1783      1.1  christos       update_FR_ptime (cpu, out_FRk, 1);
   1784      1.1  christos       /* Mark this use of the register as media unit 4.  */
   1785      1.1  christos       set_use_is_media_p4 (cpu, out_FRk);
   1786      1.1  christos     }
   1787      1.1  christos   if (FRk_1 >= 0)
   1788      1.1  christos     {
   1789      1.1  christos       update_FR_latency (cpu, FRk_1, ps->post_wait);
   1790      1.1  christos       update_FR_ptime (cpu, FRk_1, 1);
   1791      1.1  christos       /* Mark this use of the register as media unit 4.  */
   1792      1.1  christos       set_use_is_media_p4 (cpu, FRk_1);
   1793      1.1  christos     }
   1794      1.1  christos 
   1795      1.1  christos   return cycles;
   1796      1.1  christos }
   1797      1.1  christos 
   1798      1.1  christos int
   1799      1.1  christos frvbf_model_fr400_u_media_6 (SIM_CPU *cpu, const IDESC *idesc,
   1800      1.1  christos 			     int unit_num, int referenced,
   1801      1.1  christos 			     INT in_FRi, INT out_FRk)
   1802      1.1  christos {
   1803      1.1  christos   int cycles;
   1804      1.1  christos   FRV_PROFILE_STATE *ps;
   1805      1.1  christos   const CGEN_INSN *insn;
   1806      1.1  christos   int busy_adjustment[] = {0};
   1807      1.1  christos   int *fr;
   1808      1.1  christos 
   1809      1.1  christos   if (model_insn == FRV_INSN_MODEL_PASS_1)
   1810      1.1  christos     return 0;
   1811      1.1  christos 
   1812      1.1  christos   /* The preprocessing can execute right away.  */
   1813      1.1  christos   cycles = idesc->timing->units[unit_num].done;
   1814      1.1  christos 
   1815      1.1  christos   ps = CPU_PROFILE_STATE (cpu);
   1816      1.1  christos   insn = idesc->idata;
   1817      1.1  christos 
   1818      1.1  christos   /* The latency of the registers may be less than previously recorded,
   1819      1.1  christos      depending on how they were used previously.
   1820      1.1  christos      See Table 13-8 in the LSI.  */
   1821      1.1  christos   if (in_FRi >= 0)
   1822      1.1  christos     {
   1823      1.1  christos       if (use_is_fp_load (cpu, in_FRi))
   1824      1.1  christos 	{
   1825      1.1  christos 	  busy_adjustment[0] = 1;
   1826      1.1  christos 	  decrease_FR_busy (cpu, in_FRi, busy_adjustment[0]);
   1827      1.1  christos 	}
   1828      1.1  christos       else
   1829      1.1  christos 	enforce_full_fr_latency (cpu, in_FRi);
   1830      1.1  christos     }
   1831      1.1  christos 
   1832      1.1  christos   /* The post processing must wait if there is a dependency on a FR
   1833      1.1  christos      which is not ready yet.  */
   1834      1.1  christos   ps->post_wait = cycles;
   1835      1.1  christos   post_wait_for_FR (cpu, in_FRi);
   1836      1.1  christos   post_wait_for_FR (cpu, out_FRk);
   1837      1.1  christos 
   1838      1.1  christos   /* Restore the busy cycles of the registers we used.  */
   1839      1.1  christos   fr = ps->fr_busy;
   1840      1.1  christos   if (in_FRi >= 0)
   1841      1.1  christos     fr[in_FRi] += busy_adjustment[0];
   1842      1.1  christos 
   1843      1.1  christos   /* The latency of the output register will be at least the latency of the
   1844      1.1  christos      other inputs.  Once initiated, post-processing will take 1 cycle.  */
   1845      1.1  christos   if (out_FRk >= 0)
   1846      1.1  christos     {
   1847      1.1  christos       update_FR_latency (cpu, out_FRk, ps->post_wait);
   1848      1.1  christos       update_FR_ptime (cpu, out_FRk, 1);
   1849      1.1  christos 
   1850      1.1  christos       /* Mark this use of the register as media unit 1.  */
   1851      1.1  christos       set_use_is_media_p6 (cpu, out_FRk);
   1852      1.1  christos     }
   1853      1.1  christos 
   1854      1.1  christos   return cycles;
   1855      1.1  christos }
   1856      1.1  christos 
   1857      1.1  christos int
   1858      1.1  christos frvbf_model_fr400_u_media_7 (SIM_CPU *cpu, const IDESC *idesc,
   1859      1.1  christos 			     int unit_num, int referenced,
   1860      1.1  christos 			     INT in_FRinti, INT in_FRintj,
   1861      1.1  christos 			     INT out_FCCk)
   1862      1.1  christos {
   1863      1.1  christos   int cycles;
   1864      1.1  christos   FRV_PROFILE_STATE *ps;
   1865      1.1  christos   int busy_adjustment[] = {0, 0};
   1866      1.1  christos   int *fr;
   1867      1.1  christos 
   1868      1.1  christos   if (model_insn == FRV_INSN_MODEL_PASS_1)
   1869      1.1  christos     return 0;
   1870      1.1  christos 
   1871      1.1  christos   /* The preprocessing can execute right away.  */
   1872      1.1  christos   cycles = idesc->timing->units[unit_num].done;
   1873      1.1  christos 
   1874      1.1  christos   /* The post processing must wait if there is a dependency on a FR
   1875      1.1  christos      which is not ready yet.  */
   1876      1.1  christos   ps = CPU_PROFILE_STATE (cpu);
   1877      1.1  christos 
   1878      1.1  christos   /* The latency of the registers may be less than previously recorded,
   1879      1.1  christos      depending on how they were used previously.
   1880      1.1  christos      See Table 13-8 in the LSI.  */
   1881      1.1  christos   if (in_FRinti >= 0)
   1882      1.1  christos     {
   1883      1.1  christos       if (use_is_fp_load (cpu, in_FRinti))
   1884      1.1  christos 	{
   1885      1.1  christos 	  busy_adjustment[0] = 1;
   1886      1.1  christos 	  decrease_FR_busy (cpu, in_FRinti, busy_adjustment[0]);
   1887      1.1  christos 	}
   1888      1.1  christos       else
   1889      1.1  christos 	enforce_full_fr_latency (cpu, in_FRinti);
   1890      1.1  christos     }
   1891      1.1  christos   if (in_FRintj >= 0 && in_FRintj != in_FRinti)
   1892      1.1  christos     {
   1893      1.1  christos       if (use_is_fp_load (cpu, in_FRintj))
   1894      1.1  christos 	{
   1895      1.1  christos 	  busy_adjustment[1] = 1;
   1896      1.1  christos 	  decrease_FR_busy (cpu, in_FRintj, busy_adjustment[1]);
   1897      1.1  christos 	}
   1898      1.1  christos       else
   1899      1.1  christos 	enforce_full_fr_latency (cpu, in_FRintj);
   1900      1.1  christos     }
   1901      1.1  christos 
   1902      1.1  christos   ps->post_wait = cycles;
   1903      1.1  christos   post_wait_for_FR (cpu, in_FRinti);
   1904      1.1  christos   post_wait_for_FR (cpu, in_FRintj);
   1905      1.1  christos   post_wait_for_CCR (cpu, out_FCCk);
   1906      1.1  christos 
   1907      1.1  christos   /* Restore the busy cycles of the registers we used.  */
   1908      1.1  christos   fr = ps->fr_busy;
   1909      1.1  christos   if (in_FRinti >= 0)
   1910      1.1  christos     fr[in_FRinti] += busy_adjustment[0];
   1911      1.1  christos   if (in_FRintj >= 0)
   1912      1.1  christos     fr[in_FRintj] += busy_adjustment[1];
   1913      1.1  christos 
   1914      1.1  christos   /* The latency of FCCi_2 will be the latency of the other inputs plus 1
   1915      1.1  christos      cycle.  */
   1916      1.1  christos   update_CCR_latency (cpu, out_FCCk, ps->post_wait + 1);
   1917      1.1  christos 
   1918      1.1  christos   return cycles;
   1919      1.1  christos }
   1920      1.1  christos 
   1921      1.1  christos int
   1922      1.1  christos frvbf_model_fr400_u_media_dual_expand (SIM_CPU *cpu, const IDESC *idesc,
   1923      1.1  christos 				       int unit_num, int referenced,
   1924      1.1  christos 				       INT in_FRi,
   1925      1.1  christos 				       INT out_FRk)
   1926      1.1  christos {
   1927      1.1  christos   /* Insns using this unit are media-3 class insns, with a dual FRk output.  */
   1928      1.1  christos   int cycles;
   1929      1.1  christos   INT dual_FRk;
   1930      1.1  christos   FRV_PROFILE_STATE *ps;
   1931      1.1  christos   int busy_adjustment[] = {0};
   1932      1.1  christos   int *fr;
   1933      1.1  christos 
   1934      1.1  christos   if (model_insn == FRV_INSN_MODEL_PASS_1)
   1935      1.1  christos     return 0;
   1936      1.1  christos 
   1937      1.1  christos   /* The preprocessing can execute right away.  */
   1938      1.1  christos   cycles = idesc->timing->units[unit_num].done;
   1939      1.1  christos 
   1940      1.1  christos   /* If the previous use of the registers was a media op,
   1941      1.1  christos      then their latency will be less than previously recorded.
   1942      1.1  christos      See Table 13-13 in the LSI.  */
   1943      1.1  christos   dual_FRk = DUAL_REG (out_FRk);
   1944      1.1  christos   ps = CPU_PROFILE_STATE (cpu);
   1945      1.1  christos   if (use_is_fp_load (cpu, in_FRi))
   1946      1.1  christos     {
   1947      1.1  christos       busy_adjustment[0] = 1;
   1948      1.1  christos       decrease_FR_busy (cpu, in_FRi, busy_adjustment[0]);
   1949      1.1  christos     }
   1950      1.1  christos   else
   1951      1.1  christos     enforce_full_fr_latency (cpu, in_FRi);
   1952      1.1  christos 
   1953      1.1  christos   /* The post processing must wait if there is a dependency on a FR
   1954      1.1  christos      which is not ready yet.  */
   1955      1.1  christos   ps->post_wait = cycles;
   1956      1.1  christos   post_wait_for_FR (cpu, in_FRi);
   1957      1.1  christos   post_wait_for_FR (cpu, out_FRk);
   1958      1.1  christos   post_wait_for_FR (cpu, dual_FRk);
   1959      1.1  christos 
   1960      1.1  christos   /* Restore the busy cycles of the registers we used.  */
   1961      1.1  christos   fr = ps->fr_busy;
   1962      1.1  christos   fr[in_FRi] += busy_adjustment[0];
   1963      1.1  christos 
   1964      1.1  christos   /* The latency of the output register will be at least the latency of the
   1965      1.1  christos      other inputs.  Once initiated, post-processing has no latency.  */
   1966      1.1  christos   update_FR_latency (cpu, out_FRk, ps->post_wait);
   1967      1.1  christos   update_FR_ptime (cpu, out_FRk, 0);
   1968      1.1  christos 
   1969      1.1  christos   if (dual_FRk >= 0)
   1970      1.1  christos     {
   1971      1.1  christos       update_FR_latency (cpu, dual_FRk, ps->post_wait);
   1972      1.1  christos       update_FR_ptime (cpu, dual_FRk, 0);
   1973      1.1  christos     }
   1974      1.1  christos 
   1975      1.1  christos   return cycles;
   1976      1.1  christos }
   1977      1.1  christos 
   1978      1.1  christos int
   1979      1.1  christos frvbf_model_fr400_u_media_dual_htob (SIM_CPU *cpu, const IDESC *idesc,
   1980      1.1  christos 				     int unit_num, int referenced,
   1981      1.1  christos 				     INT in_FRj,
   1982      1.1  christos 				     INT out_FRk)
   1983      1.1  christos {
   1984      1.1  christos   /* Insns using this unit are media-3 class insns, with a dual FRj input.  */
   1985      1.1  christos   int cycles;
   1986      1.1  christos   INT dual_FRj;
   1987      1.1  christos   FRV_PROFILE_STATE *ps;
   1988      1.1  christos   int busy_adjustment[] = {0, 0};
   1989      1.1  christos   int *fr;
   1990      1.1  christos 
   1991      1.1  christos   if (model_insn == FRV_INSN_MODEL_PASS_1)
   1992      1.1  christos     return 0;
   1993      1.1  christos 
   1994      1.1  christos   /* The preprocessing can execute right away.  */
   1995      1.1  christos   cycles = idesc->timing->units[unit_num].done;
   1996      1.1  christos 
   1997      1.1  christos   /* If the previous use of the registers was a media op,
   1998      1.1  christos      then their latency will be less than previously recorded.
   1999      1.1  christos      See Table 13-13 in the LSI.  */
   2000      1.1  christos   dual_FRj = DUAL_REG (in_FRj);
   2001      1.1  christos   ps = CPU_PROFILE_STATE (cpu);
   2002      1.1  christos   if (use_is_fp_load (cpu, in_FRj))
   2003      1.1  christos     {
   2004      1.1  christos       busy_adjustment[0] = 1;
   2005      1.1  christos       decrease_FR_busy (cpu, in_FRj, busy_adjustment[0]);
   2006      1.1  christos     }
   2007      1.1  christos   else
   2008      1.1  christos     enforce_full_fr_latency (cpu, in_FRj);
   2009      1.1  christos   if (dual_FRj >= 0)
   2010      1.1  christos     {
   2011      1.1  christos       if (use_is_fp_load (cpu, dual_FRj))
   2012      1.1  christos 	{
   2013      1.1  christos 	  busy_adjustment[1] = 1;
   2014      1.1  christos 	  decrease_FR_busy (cpu, dual_FRj, busy_adjustment[1]);
   2015      1.1  christos 	}
   2016      1.1  christos       else
   2017      1.1  christos 	enforce_full_fr_latency (cpu, dual_FRj);
   2018      1.1  christos     }
   2019      1.1  christos 
   2020      1.1  christos   /* The post processing must wait if there is a dependency on a FR
   2021      1.1  christos      which is not ready yet.  */
   2022      1.1  christos   ps->post_wait = cycles;
   2023      1.1  christos   post_wait_for_FR (cpu, in_FRj);
   2024      1.1  christos   post_wait_for_FR (cpu, dual_FRj);
   2025      1.1  christos   post_wait_for_FR (cpu, out_FRk);
   2026      1.1  christos 
   2027      1.1  christos   /* Restore the busy cycles of the registers we used.  */
   2028      1.1  christos   fr = ps->fr_busy;
   2029      1.1  christos   fr[in_FRj] += busy_adjustment[0];
   2030      1.1  christos   if (dual_FRj >= 0)
   2031      1.1  christos     fr[dual_FRj] += busy_adjustment[1];
   2032      1.1  christos 
   2033      1.1  christos   /* The latency of the output register will be at least the latency of the
   2034      1.1  christos      other inputs.  */
   2035      1.1  christos   update_FR_latency (cpu, out_FRk, ps->post_wait);
   2036      1.1  christos 
   2037      1.1  christos   /* Once initiated, post-processing has no latency.  */
   2038      1.1  christos   update_FR_ptime (cpu, out_FRk, 0);
   2039      1.1  christos 
   2040      1.1  christos   return cycles;
   2041      1.1  christos }
   2042      1.1  christos 
   2043      1.1  christos int
   2044      1.1  christos frvbf_model_fr400_u_ici (SIM_CPU *cpu, const IDESC *idesc,
   2045      1.1  christos 			 int unit_num, int referenced,
   2046      1.1  christos 			 INT in_GRi, INT in_GRj)
   2047      1.1  christos {
   2048      1.1  christos   /* Modelling for this unit is the same as for fr500.  */
   2049      1.1  christos   return frvbf_model_fr500_u_ici (cpu, idesc, unit_num, referenced,
   2050      1.1  christos 				  in_GRi, in_GRj);
   2051      1.1  christos }
   2052      1.1  christos 
   2053      1.1  christos int
   2054      1.1  christos frvbf_model_fr400_u_dci (SIM_CPU *cpu, const IDESC *idesc,
   2055      1.1  christos 			 int unit_num, int referenced,
   2056      1.1  christos 			 INT in_GRi, INT in_GRj)
   2057      1.1  christos {
   2058      1.1  christos   /* Modelling for this unit is the same as for fr500.  */
   2059      1.1  christos   return frvbf_model_fr500_u_dci (cpu, idesc, unit_num, referenced,
   2060      1.1  christos 				  in_GRi, in_GRj);
   2061      1.1  christos }
   2062      1.1  christos 
   2063      1.1  christos int
   2064      1.1  christos frvbf_model_fr400_u_dcf (SIM_CPU *cpu, const IDESC *idesc,
   2065      1.1  christos 			 int unit_num, int referenced,
   2066      1.1  christos 			 INT in_GRi, INT in_GRj)
   2067      1.1  christos {
   2068      1.1  christos   /* Modelling for this unit is the same as for fr500.  */
   2069      1.1  christos   return frvbf_model_fr500_u_dcf (cpu, idesc, unit_num, referenced,
   2070      1.1  christos 				  in_GRi, in_GRj);
   2071      1.1  christos }
   2072      1.1  christos 
   2073      1.1  christos int
   2074      1.1  christos frvbf_model_fr400_u_icpl (SIM_CPU *cpu, const IDESC *idesc,
   2075      1.1  christos 			  int unit_num, int referenced,
   2076      1.1  christos 			  INT in_GRi, INT in_GRj)
   2077      1.1  christos {
   2078      1.1  christos   /* Modelling for this unit is the same as for fr500.  */
   2079      1.1  christos   return frvbf_model_fr500_u_icpl (cpu, idesc, unit_num, referenced,
   2080      1.1  christos 				   in_GRi, in_GRj);
   2081      1.1  christos }
   2082      1.1  christos 
   2083      1.1  christos int
   2084      1.1  christos frvbf_model_fr400_u_dcpl (SIM_CPU *cpu, const IDESC *idesc,
   2085      1.1  christos 			  int unit_num, int referenced,
   2086      1.1  christos 			  INT in_GRi, INT in_GRj)
   2087      1.1  christos {
   2088      1.1  christos   /* Modelling for this unit is the same as for fr500.  */
   2089      1.1  christos   return frvbf_model_fr500_u_dcpl (cpu, idesc, unit_num, referenced,
   2090      1.1  christos 				   in_GRi, in_GRj);
   2091      1.1  christos }
   2092      1.1  christos 
   2093      1.1  christos int
   2094      1.1  christos frvbf_model_fr400_u_icul (SIM_CPU *cpu, const IDESC *idesc,
   2095      1.1  christos 			  int unit_num, int referenced,
   2096      1.1  christos 			  INT in_GRi, INT in_GRj)
   2097      1.1  christos {
   2098      1.1  christos   /* Modelling for this unit is the same as for fr500.  */
   2099      1.1  christos   return frvbf_model_fr500_u_icul (cpu, idesc, unit_num, referenced,
   2100      1.1  christos 				   in_GRi, in_GRj);
   2101      1.1  christos }
   2102      1.1  christos 
   2103      1.1  christos int
   2104      1.1  christos frvbf_model_fr400_u_dcul (SIM_CPU *cpu, const IDESC *idesc,
   2105      1.1  christos 			  int unit_num, int referenced,
   2106      1.1  christos 			  INT in_GRi, INT in_GRj)
   2107      1.1  christos {
   2108      1.1  christos   /* Modelling for this unit is the same as for fr500.  */
   2109      1.1  christos   return frvbf_model_fr500_u_dcul (cpu, idesc, unit_num, referenced,
   2110      1.1  christos 				   in_GRi, in_GRj);
   2111      1.1  christos }
   2112      1.1  christos 
   2113      1.1  christos int
   2114      1.1  christos frvbf_model_fr400_u_barrier (SIM_CPU *cpu, const IDESC *idesc,
   2115      1.1  christos 			     int unit_num, int referenced)
   2116      1.1  christos {
   2117      1.1  christos   /* Modelling for this unit is the same as for fr500.  */
   2118      1.1  christos   return frvbf_model_fr500_u_barrier (cpu, idesc, unit_num, referenced);
   2119      1.1  christos }
   2120      1.1  christos 
   2121      1.1  christos int
   2122      1.1  christos frvbf_model_fr400_u_membar (SIM_CPU *cpu, const IDESC *idesc,
   2123      1.1  christos 			    int unit_num, int referenced)
   2124      1.1  christos {
   2125      1.1  christos   /* Modelling for this unit is the same as for fr500.  */
   2126      1.1  christos   return frvbf_model_fr500_u_membar (cpu, idesc, unit_num, referenced);
   2127      1.1  christos }
   2128      1.1  christos 
   2129      1.1  christos #endif /* WITH_PROFILE_MODEL_P */
   2130