OpenCores
URL https://opencores.org/ocsvn/openrisc_2011-10-31/openrisc_2011-10-31/trunk

Subversion Repositories openrisc_2011-10-31

[/] [openrisc/] [trunk/] [gnu-src/] [gdb-6.8/] [sim/] [frv/] [profile-fr400.c] - Blame information for rev 621

Go to most recent revision | Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.