OpenCores
URL https://opencores.org/ocsvn/openrisc_me/openrisc_me/trunk

Subversion Repositories openrisc_me

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

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

Line No. Rev Author Line
1 24 jeremybenn
/* frv simulator fr500 dependent profiling code.
2
 
3
   Copyright (C) 1998, 1999, 2000, 2001, 2003, 2007, 2008
4
   Free Software Foundation, Inc.
5
   Contributed by Red Hat
6
 
7
This file is part of the GNU simulators.
8
 
9
This program is free software; you can redistribute it and/or modify
10
it under the terms of the GNU General Public License as published by
11
the Free Software Foundation; either version 3 of the License, or
12
(at your option) any later version.
13
 
14
This program is distributed in the hope that it will be useful,
15
but WITHOUT ANY WARRANTY; without even the implied warranty of
16
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17
GNU General Public License for more details.
18
 
19
You should have received a copy of the GNU General Public License
20
along with this program.  If not, see <http://www.gnu.org/licenses/>.
21
 
22
*/
23
#define WANT_CPU
24
#define WANT_CPU_FRVBF
25
 
26
#include "sim-main.h"
27
#include "bfd.h"
28
 
29
#if WITH_PROFILE_MODEL_P
30
 
31
#include "profile.h"
32
#include "profile-fr500.h"
33
 
34
/* Initialize cycle counting for an insn.
35
   FIRST_P is non-zero if this is the first insn in a set of parallel
36
   insns.  */
37
void
38
fr500_model_insn_before (SIM_CPU *cpu, int first_p)
39
{
40
  if (first_p)
41
    {
42
      MODEL_FR500_DATA *d = CPU_MODEL_DATA (cpu);
43
      FRV_PROFILE_STATE *ps = CPU_PROFILE_STATE (cpu);
44
      ps->cur_gr_complex = ps->prev_gr_complex;
45
      d->cur_fpop     = d->prev_fpop;
46
      d->cur_media    = d->prev_media;
47
      d->cur_cc_complex = d->prev_cc_complex;
48
    }
49
}
50
 
51
/* Record the cycles computed for an insn.
52
   LAST_P is non-zero if this is the last insn in a set of parallel insns,
53
   and we update the total cycle count.
54
   CYCLES is the cycle count of the insn.  */
55
void
56
fr500_model_insn_after (SIM_CPU *cpu, int last_p, int cycles)
57
{
58
  if (last_p)
59
    {
60
      MODEL_FR500_DATA *d = CPU_MODEL_DATA (cpu);
61
      FRV_PROFILE_STATE *ps = CPU_PROFILE_STATE (cpu);
62
      ps->prev_gr_complex = ps->cur_gr_complex;
63
      d->prev_fpop     = d->cur_fpop;
64
      d->prev_media    = d->cur_media;
65
      d->prev_cc_complex = d->cur_cc_complex;
66
    }
67
}
68
 
69
static void
70
set_use_is_fpop (SIM_CPU *cpu, INT fr)
71
{
72
  MODEL_FR500_DATA *d = CPU_MODEL_DATA (cpu);
73
  fr500_reset_fr_flags (cpu, (fr));
74
  d->cur_fpop |=  (((DI)1) << (fr));
75
}
76
 
77
static void
78
set_use_not_fpop (SIM_CPU *cpu, INT fr)
79
{
80
  MODEL_FR500_DATA *d = CPU_MODEL_DATA (cpu);
81
  d->cur_fpop &= ~(((DI)1) << (fr));
82
}
83
 
84
static int
85
use_is_fpop (SIM_CPU *cpu, INT fr)
86
{
87
  MODEL_FR500_DATA *d = CPU_MODEL_DATA (cpu);
88
  return d->prev_fpop & (((DI)1) << (fr));
89
}
90
 
91
static void
92
set_use_is_media ( SIM_CPU *cpu, INT fr)
93
{
94
  MODEL_FR500_DATA *d = CPU_MODEL_DATA (cpu);
95
  fr500_reset_fr_flags (cpu, (fr));
96
  d->cur_media |=  (((DI)1) << (fr));
97
}
98
 
99
static void
100
set_use_not_media (SIM_CPU *cpu, INT fr)
101
{
102
  MODEL_FR500_DATA *d = CPU_MODEL_DATA (cpu);
103
  d->cur_media &= ~(((DI)1) << (fr));
104
}
105
 
106
static int
107
use_is_media (SIM_CPU *cpu, INT fr)
108
{
109
  MODEL_FR500_DATA *d = CPU_MODEL_DATA (cpu);
110
  return d->prev_media & (((DI)1) << (fr));
111
}
112
 
113
static void
114
set_use_is_cc_complex (SIM_CPU *cpu, INT cc)
115
{
116
  MODEL_FR500_DATA *d = CPU_MODEL_DATA (cpu);
117
  fr500_reset_cc_flags (cpu, cc);
118
  d->cur_cc_complex |= (((DI)1) << (cc));
119
}
120
 
121
static void
122
set_use_not_cc_complex (SIM_CPU *cpu, INT cc)
123
{
124
  MODEL_FR500_DATA *d = CPU_MODEL_DATA (cpu);
125
  d->cur_cc_complex &= ~(((DI)1) << (cc));
126
}
127
 
128
static int
129
use_is_cc_complex (SIM_CPU *cpu, INT cc)
130
{
131
  MODEL_FR500_DATA *d = CPU_MODEL_DATA (cpu);
132
  return d->prev_cc_complex &   (((DI)1) << (cc));
133
}
134
 
135
void
136
fr500_reset_fr_flags (SIM_CPU *cpu, INT fr)
137
{
138
  set_use_not_fpop (cpu, fr);
139
  set_use_not_media (cpu, fr);
140
}
141
 
142
void
143
fr500_reset_cc_flags (SIM_CPU *cpu, INT cc)
144
{
145
  set_use_not_cc_complex (cpu, cc);
146
}
147
 
148
/* Latency of floating point registers may be less than recorded when followed
149
   by another floating point insn.  */
150
static void
151
adjust_float_register_busy (SIM_CPU *cpu, INT in_FRi, INT in_FRj, INT out_FRk,
152
                            int cycles)
153
{
154
  /* If the registers were previously used in a floating point op,
155
     then their latency will be less than previously recorded.
156
     See Table 13-13 in the LSI.  */
157
  if (in_FRi >= 0)
158
    if (use_is_fpop (cpu, in_FRi))
159
      decrease_FR_busy (cpu, in_FRi, cycles);
160
    else
161
      enforce_full_fr_latency (cpu, in_FRi);
162
 
163
  if (in_FRj >= 0 && in_FRj != in_FRi)
164
    if (use_is_fpop (cpu, in_FRj))
165
      decrease_FR_busy (cpu, in_FRj, cycles);
166
    else
167
      enforce_full_fr_latency (cpu, in_FRj);
168
 
169
  if (out_FRk >= 0 && out_FRk != in_FRi && out_FRk != in_FRj)
170
    if (use_is_fpop (cpu, out_FRk))
171
      decrease_FR_busy (cpu, out_FRk, cycles);
172
    else
173
      enforce_full_fr_latency (cpu, out_FRk);
174
}
175
 
176
/* Latency of floating point registers may be less than recorded when followed
177
   by another floating point insn.  */
178
static void
179
adjust_double_register_busy (SIM_CPU *cpu, INT in_FRi, INT in_FRj, INT out_FRk,
180
                            int cycles)
181
{
182
  /* If the registers were previously used in a floating point op,
183
     then their latency will be less than previously recorded.
184
     See Table 13-13 in the LSI.  */
185
  adjust_float_register_busy (cpu, in_FRi, in_FRj, out_FRk, cycles);
186
  if (in_FRi >= 0)  ++in_FRi;
187
  if (in_FRj >= 0)  ++in_FRj;
188
  if (out_FRk >= 0) ++out_FRk;
189
  adjust_float_register_busy (cpu, in_FRi, in_FRj, out_FRk, cycles);
190
}
191
 
192
/* Latency of floating point registers is less than recorded when followed
193
   by another floating point insn.  */
194
static void
195
restore_float_register_busy (SIM_CPU *cpu, INT in_FRi, INT in_FRj, INT out_FRk,
196
                             int cycles)
197
{
198
  /* If the registers were previously used in a floating point op,
199
     then their latency will be less than previously recorded.
200
     See Table 13-13 in the LSI.  */
201
  if (in_FRi >= 0 && use_is_fpop (cpu, in_FRi))
202
    increase_FR_busy (cpu, in_FRi, cycles);
203
  if (in_FRj != in_FRi && use_is_fpop (cpu, in_FRj))
204
    increase_FR_busy (cpu, in_FRj, cycles);
205
  if (out_FRk != in_FRi && out_FRk != in_FRj && use_is_fpop (cpu, out_FRk))
206
    increase_FR_busy (cpu, out_FRk, cycles);
207
}
208
 
209
/* Latency of floating point registers is less than recorded when followed
210
   by another floating point insn.  */
211
static void
212
restore_double_register_busy (SIM_CPU *cpu, INT in_FRi, INT in_FRj, INT out_FRk,
213
                            int cycles)
214
{
215
  /* If the registers were previously used in a floating point op,
216
     then their latency will be less than previously recorded.
217
     See Table 13-13 in the LSI.  */
218
  restore_float_register_busy (cpu, in_FRi, in_FRj, out_FRk, cycles);
219
  if (in_FRi >= 0)  ++in_FRi;
220
  if (in_FRj >= 0)  ++in_FRj;
221
  if (out_FRk >= 0) ++out_FRk;
222
  restore_float_register_busy (cpu, in_FRi, in_FRj, out_FRk, cycles);
223
}
224
 
225
int
226
frvbf_model_fr500_u_exec (SIM_CPU *cpu, const IDESC *idesc,
227
                          int unit_num, int referenced)
228
{
229
  return idesc->timing->units[unit_num].done;
230
}
231
 
232
int
233
frvbf_model_fr500_u_integer (SIM_CPU *cpu, const IDESC *idesc,
234
                             int unit_num, int referenced,
235
                             INT in_GRi, INT in_GRj, INT out_GRk,
236
                             INT out_ICCi_1)
237
{
238
  int cycles;
239
 
240
  if (model_insn == FRV_INSN_MODEL_PASS_1)
241
    {
242
      /* icc0-icc4 are the upper 4 fields of the CCR.  */
243
      if (out_ICCi_1 >= 0)
244
        out_ICCi_1 += 4;
245
 
246
      /* The entire VLIW insn must wait if there is a dependency on a register
247
         which is not ready yet.
248
         The latency of the registers may be less than previously recorded,
249
         depending on how they were used previously.
250
         See Table 13-8 in the LSI.  */
251
      if (in_GRi != out_GRk && in_GRi >= 0)
252
        {
253
          if (use_is_gr_complex (cpu, in_GRi))
254
            decrease_GR_busy (cpu, in_GRi, 1);
255
        }
256
      if (in_GRj != out_GRk && in_GRj != in_GRi && in_GRj >= 0)
257
        {
258
          if (use_is_gr_complex (cpu, in_GRj))
259
            decrease_GR_busy (cpu, in_GRj, 1);
260
        }
261
      vliw_wait_for_GR (cpu, in_GRi);
262
      vliw_wait_for_GR (cpu, in_GRj);
263
      vliw_wait_for_GR (cpu, out_GRk);
264
      vliw_wait_for_CCR (cpu, out_ICCi_1);
265
      handle_resource_wait (cpu);
266
      load_wait_for_GR (cpu, in_GRi);
267
      load_wait_for_GR (cpu, in_GRj);
268
      load_wait_for_GR (cpu, out_GRk);
269
      trace_vliw_wait_cycles (cpu);
270
      return 0;
271
    }
272
 
273
  /* GRk is available immediately to the next VLIW insn as is ICCi_1.  */
274
  cycles = idesc->timing->units[unit_num].done;
275
  return cycles;
276
}
277
 
278
int
279
frvbf_model_fr500_u_imul (SIM_CPU *cpu, const IDESC *idesc,
280
                          int unit_num, int referenced,
281
                          INT in_GRi, INT in_GRj, INT out_GRk, INT out_ICCi_1)
282
{
283
  int cycles;
284
  /* icc0-icc4 are the upper 4 fields of the CCR.  */
285
  if (out_ICCi_1 >= 0)
286
    out_ICCi_1 += 4;
287
 
288
  if (model_insn == FRV_INSN_MODEL_PASS_1)
289
    {
290
      /* The entire VLIW insn must wait if there is a dependency on a register
291
         which is not ready yet.
292
         The latency of the registers may be less than previously recorded,
293
         depending on how they were used previously.
294
         See Table 13-8 in the LSI.  */
295
      if (in_GRi != out_GRk && in_GRi >= 0)
296
        {
297
          if (use_is_gr_complex (cpu, in_GRi))
298
            decrease_GR_busy (cpu, in_GRi, 1);
299
        }
300
      if (in_GRj != out_GRk && in_GRj != in_GRi && in_GRj >= 0)
301
        {
302
          if (use_is_gr_complex (cpu, in_GRj))
303
            decrease_GR_busy (cpu, in_GRj, 1);
304
        }
305
      vliw_wait_for_GR (cpu, in_GRi);
306
      vliw_wait_for_GR (cpu, in_GRj);
307
      vliw_wait_for_GRdouble (cpu, out_GRk);
308
      vliw_wait_for_CCR (cpu, out_ICCi_1);
309
      handle_resource_wait (cpu);
310
      load_wait_for_GR (cpu, in_GRi);
311
      load_wait_for_GR (cpu, in_GRj);
312
      load_wait_for_GRdouble (cpu, out_GRk);
313
      trace_vliw_wait_cycles (cpu);
314
      return 0;
315
    }
316
 
317
  /* GRk has a latency of 2 cycles.  */
318
  cycles = idesc->timing->units[unit_num].done;
319
  update_GRdouble_latency (cpu, out_GRk, cycles + 2);
320
  set_use_is_gr_complex (cpu, out_GRk);
321
  set_use_is_gr_complex (cpu, out_GRk + 1);
322
 
323
  /* ICCi_1 has a latency of 1 cycle.  */
324
  update_CCR_latency (cpu, out_ICCi_1, cycles + 1);
325
 
326
  return cycles;
327
}
328
 
329
int
330
frvbf_model_fr500_u_idiv (SIM_CPU *cpu, const IDESC *idesc,
331
                          int unit_num, int referenced,
332
                          INT in_GRi, INT in_GRj, INT out_GRk, INT out_ICCi_1)
333
{
334
  int cycles;
335
  FRV_VLIW *vliw;
336
  int slot;
337
 
338
  /* icc0-icc4 are the upper 4 fields of the CCR.  */
339
  if (out_ICCi_1 >= 0)
340
    out_ICCi_1 += 4;
341
 
342
  vliw = CPU_VLIW (cpu);
343
  slot = vliw->next_slot - 1;
344
  slot = (*vliw->current_vliw)[slot] - UNIT_I0;
345
 
346
  if (model_insn == FRV_INSN_MODEL_PASS_1)
347
    {
348
      /* The entire VLIW insn must wait if there is a dependency on a register
349
         which is not ready yet.
350
         The latency of the registers may be less than previously recorded,
351
         depending on how they were used previously.
352
         See Table 13-8 in the LSI.  */
353
      if (in_GRi != out_GRk && in_GRi >= 0)
354
        {
355
          if (use_is_gr_complex (cpu, in_GRi))
356
            decrease_GR_busy (cpu, in_GRi, 1);
357
        }
358
      if (in_GRj != out_GRk && in_GRj != in_GRi && in_GRj >= 0)
359
        {
360
          if (use_is_gr_complex (cpu, in_GRj))
361
            decrease_GR_busy (cpu, in_GRj, 1);
362
        }
363
      vliw_wait_for_GR (cpu, in_GRi);
364
      vliw_wait_for_GR (cpu, in_GRj);
365
      vliw_wait_for_GR (cpu, out_GRk);
366
      vliw_wait_for_CCR (cpu, out_ICCi_1);
367
      vliw_wait_for_idiv_resource (cpu, slot);
368
      handle_resource_wait (cpu);
369
      load_wait_for_GR (cpu, in_GRi);
370
      load_wait_for_GR (cpu, in_GRj);
371
      load_wait_for_GR (cpu, out_GRk);
372
      trace_vliw_wait_cycles (cpu);
373
      return 0;
374
    }
375
 
376
  /* GRk has a latency of 19 cycles!  */
377
  cycles = idesc->timing->units[unit_num].done;
378
  update_GR_latency (cpu, out_GRk, cycles + 19);
379
  set_use_is_gr_complex (cpu, out_GRk);
380
 
381
  /* ICCi_1 has a latency of 19 cycles.  */
382
  update_CCR_latency (cpu, out_ICCi_1, cycles + 19);
383
  set_use_is_cc_complex (cpu, out_ICCi_1);
384
 
385
  if (CGEN_ATTR_VALUE(idesc, idesc->attrs, CGEN_INSN_NON_EXCEPTING))
386
    {
387
      /* GNER has a latency of 18 cycles.  */
388
      update_SPR_latency (cpu, GNER_FOR_GR (out_GRk), cycles + 18);
389
    }
390
 
391
  /* the idiv resource has a latency of 18 cycles!  */
392
  update_idiv_resource_latency (cpu, slot, cycles + 18);
393
 
394
  return cycles;
395
}
396
 
397
int
398
frvbf_model_fr500_u_branch (SIM_CPU *cpu, const IDESC *idesc,
399
                            int unit_num, int referenced,
400
                            INT in_GRi, INT in_GRj,
401
                            INT in_ICCi_2, INT in_FCCi_2)
402
{
403
  int cycles;
404
  FRV_PROFILE_STATE *ps;
405
 
406
  if (model_insn == FRV_INSN_MODEL_PASS_1)
407
    {
408
      /* icc0-icc4 are the upper 4 fields of the CCR.  */
409
      if (in_ICCi_2 >= 0)
410
        in_ICCi_2 += 4;
411
 
412
      /* The entire VLIW insn must wait if there is a dependency on a register
413
         which is not ready yet.
414
         The latency of the registers may be less than previously recorded,
415
         depending on how they were used previously.
416
         See Table 13-8 in the LSI.  */
417
      if (in_GRi >= 0)
418
        {
419
          if (use_is_gr_complex (cpu, in_GRi))
420
            decrease_GR_busy (cpu, in_GRi, 1);
421
        }
422
      if (in_GRj != in_GRi && in_GRj >= 0)
423
        {
424
          if (use_is_gr_complex (cpu, in_GRj))
425
            decrease_GR_busy (cpu, in_GRj, 1);
426
        }
427
      vliw_wait_for_GR (cpu, in_GRi);
428
      vliw_wait_for_GR (cpu, in_GRj);
429
      vliw_wait_for_CCR (cpu, in_ICCi_2);
430
      vliw_wait_for_CCR (cpu, in_FCCi_2);
431
      handle_resource_wait (cpu);
432
      load_wait_for_GR (cpu, in_GRi);
433
      load_wait_for_GR (cpu, in_GRj);
434
      trace_vliw_wait_cycles (cpu);
435
      return 0;
436
    }
437
 
438
  /* When counting branches taken or not taken, don't consider branches after
439
     the first taken branch in a vliw insn.  */
440
  ps = CPU_PROFILE_STATE (cpu);
441
  if (! ps->vliw_branch_taken)
442
    {
443
      /* (1 << 4): The pc is the 5th element in inputs, outputs.
444
         ??? can be cleaned up */
445
      PROFILE_DATA *p = CPU_PROFILE_DATA (cpu);
446
      int taken = (referenced & (1 << 4)) != 0;
447
      if (taken)
448
        {
449
          ++PROFILE_MODEL_TAKEN_COUNT (p);
450
          ps->vliw_branch_taken = 1;
451
        }
452
      else
453
        ++PROFILE_MODEL_UNTAKEN_COUNT (p);
454
    }
455
 
456
  cycles = idesc->timing->units[unit_num].done;
457
  return cycles;
458
}
459
 
460
int
461
frvbf_model_fr500_u_trap (SIM_CPU *cpu, const IDESC *idesc,
462
                          int unit_num, int referenced,
463
                          INT in_GRi, INT in_GRj,
464
                          INT in_ICCi_2, INT in_FCCi_2)
465
{
466
  int cycles;
467
 
468
  if (model_insn == FRV_INSN_MODEL_PASS_1)
469
    {
470
      /* icc0-icc4 are the upper 4 fields of the CCR.  */
471
      if (in_ICCi_2 >= 0)
472
        in_ICCi_2 += 4;
473
 
474
      /* The entire VLIW insn must wait if there is a dependency on a register
475
         which is not ready yet.
476
         The latency of the registers may be less than previously recorded,
477
         depending on how they were used previously.
478
         See Table 13-8 in the LSI.  */
479
      if (in_GRi >= 0)
480
        {
481
          if (use_is_gr_complex (cpu, in_GRi))
482
            decrease_GR_busy (cpu, in_GRi, 1);
483
        }
484
      if (in_GRj != in_GRi && in_GRj >= 0)
485
        {
486
          if (use_is_gr_complex (cpu, in_GRj))
487
            decrease_GR_busy (cpu, in_GRj, 1);
488
        }
489
      vliw_wait_for_GR (cpu, in_GRi);
490
      vliw_wait_for_GR (cpu, in_GRj);
491
      vliw_wait_for_CCR (cpu, in_ICCi_2);
492
      vliw_wait_for_CCR (cpu, in_FCCi_2);
493
      handle_resource_wait (cpu);
494
      load_wait_for_GR (cpu, in_GRi);
495
      load_wait_for_GR (cpu, in_GRj);
496
      trace_vliw_wait_cycles (cpu);
497
      return 0;
498
    }
499
 
500
  cycles = idesc->timing->units[unit_num].done;
501
  return cycles;
502
}
503
 
504
int
505
frvbf_model_fr500_u_check (SIM_CPU *cpu, const IDESC *idesc,
506
                           int unit_num, int referenced,
507
                           INT in_ICCi_3, INT in_FCCi_3)
508
{
509
  int cycles;
510
 
511
  if (model_insn == FRV_INSN_MODEL_PASS_1)
512
    {
513
      /* icc0-icc4 are the upper 4 fields of the CCR.  */
514
      if (in_ICCi_3 >= 0)
515
        in_ICCi_3 += 4;
516
 
517
      /* The entire VLIW insn must wait if there is a dependency on a register
518
         which is not ready yet.  */
519
      vliw_wait_for_CCR (cpu, in_ICCi_3);
520
      vliw_wait_for_CCR (cpu, in_FCCi_3);
521
      handle_resource_wait (cpu);
522
      trace_vliw_wait_cycles (cpu);
523
      return 0;
524
    }
525
 
526
  cycles = idesc->timing->units[unit_num].done;
527
  return cycles;
528
}
529
 
530
int
531
frvbf_model_fr500_u_clrgr (SIM_CPU *cpu, const IDESC *idesc,
532
                           int unit_num, int referenced,
533
                           INT in_GRk)
534
{
535
  int cycles;
536
 
537
  if (model_insn == FRV_INSN_MODEL_PASS_1)
538
    {
539
      /* Wait for both GNER registers or just the one specified.  */
540
      if (in_GRk == -1)
541
        {
542
          vliw_wait_for_SPR (cpu, H_SPR_GNER0);
543
          vliw_wait_for_SPR (cpu, H_SPR_GNER1);
544
        }
545
      else
546
        vliw_wait_for_SPR (cpu, GNER_FOR_GR (in_GRk));
547
      handle_resource_wait (cpu);
548
      trace_vliw_wait_cycles (cpu);
549
      return 0;
550
    }
551
 
552
  cycles = idesc->timing->units[unit_num].done;
553
  return cycles;
554
}
555
 
556
int
557
frvbf_model_fr500_u_clrfr (SIM_CPU *cpu, const IDESC *idesc,
558
                           int unit_num, int referenced,
559
                           INT in_FRk)
560
{
561
  int cycles;
562
 
563
  if (model_insn == FRV_INSN_MODEL_PASS_1)
564
    {
565
      /* Wait for both GNER registers or just the one specified.  */
566
      if (in_FRk == -1)
567
        {
568
          vliw_wait_for_SPR (cpu, H_SPR_FNER0);
569
          vliw_wait_for_SPR (cpu, H_SPR_FNER1);
570
        }
571
      else
572
        vliw_wait_for_SPR (cpu, FNER_FOR_FR (in_FRk));
573
      handle_resource_wait (cpu);
574
      trace_vliw_wait_cycles (cpu);
575
      return 0;
576
    }
577
 
578
  cycles = idesc->timing->units[unit_num].done;
579
  return cycles;
580
}
581
 
582
int
583
frvbf_model_fr500_u_commit (SIM_CPU *cpu, const IDESC *idesc,
584
                            int unit_num, int referenced,
585
                            INT in_GRk, INT in_FRk)
586
{
587
  int cycles;
588
 
589
  if (model_insn == FRV_INSN_MODEL_PASS_1)
590
    {
591
      /* If GR is specified, then FR is not and vice-versa. If neither is
592
         then it's a commitga or commitfa. Check the insn attribute to
593
         figure out which.  */
594
      if (in_GRk != -1)
595
        vliw_wait_for_SPR (cpu, GNER_FOR_GR (in_GRk));
596
      else if (in_FRk != -1)
597
        vliw_wait_for_SPR (cpu, FNER_FOR_FR (in_FRk));
598
      else if (CGEN_ATTR_VALUE(idesc, idesc->attrs, CGEN_INSN_FR_ACCESS))
599
        {
600
          vliw_wait_for_SPR (cpu, H_SPR_FNER0);
601
          vliw_wait_for_SPR (cpu, H_SPR_FNER1);
602
        }
603
      else
604
        {
605
          vliw_wait_for_SPR (cpu, H_SPR_GNER0);
606
          vliw_wait_for_SPR (cpu, H_SPR_GNER1);
607
        }
608
      handle_resource_wait (cpu);
609
      trace_vliw_wait_cycles (cpu);
610
      return 0;
611
    }
612
 
613
  cycles = idesc->timing->units[unit_num].done;
614
  return cycles;
615
}
616
 
617
int
618
frvbf_model_fr500_u_set_hilo (SIM_CPU *cpu, const IDESC *idesc,
619
                             int unit_num, int referenced,
620
                             INT out_GRkhi, INT out_GRklo)
621
{
622
  int cycles;
623
 
624
  if (model_insn == FRV_INSN_MODEL_PASS_1)
625
    {
626
      /* The entire VLIW insn must wait if there is a dependency on a GR
627
         which is not ready yet.  */
628
      vliw_wait_for_GR (cpu, out_GRkhi);
629
      vliw_wait_for_GR (cpu, out_GRklo);
630
      handle_resource_wait (cpu);
631
      load_wait_for_GR (cpu, out_GRkhi);
632
      load_wait_for_GR (cpu, out_GRklo);
633
      trace_vliw_wait_cycles (cpu);
634
      return 0;
635
    }
636
 
637
  /* GRk is available immediately to the next VLIW insn.  */
638
  cycles = idesc->timing->units[unit_num].done;
639
 
640
  set_use_not_gr_complex (cpu, out_GRkhi);
641
  set_use_not_gr_complex (cpu, out_GRklo);
642
 
643
  return cycles;
644
}
645
 
646
int
647
frvbf_model_fr500_u_gr_load (SIM_CPU *cpu, const IDESC *idesc,
648
                             int unit_num, int referenced,
649
                             INT in_GRi, INT in_GRj,
650
                             INT out_GRk, INT out_GRdoublek)
651
{
652
  int cycles;
653
 
654
  if (model_insn == FRV_INSN_MODEL_PASS_1)
655
    {
656
      /* The entire VLIW insn must wait if there is a dependency on a register
657
         which is not ready yet.
658
         The latency of the registers may be less than previously recorded,
659
         depending on how they were used previously.
660
         See Table 13-8 in the LSI.  */
661
      if (in_GRi != out_GRk && in_GRi != out_GRdoublek
662
          && in_GRi != out_GRdoublek + 1 && in_GRi >= 0)
663
        {
664
          if (use_is_gr_complex (cpu, in_GRi))
665
            decrease_GR_busy (cpu, in_GRi, 1);
666
        }
667
      if (in_GRj != in_GRi && in_GRj != out_GRk && in_GRj != out_GRdoublek
668
          && in_GRj != out_GRdoublek + 1 && in_GRj >= 0)
669
 
670
        {
671
          if (use_is_gr_complex (cpu, in_GRj))
672
            decrease_GR_busy (cpu, in_GRj, 1);
673
        }
674
      vliw_wait_for_GR (cpu, in_GRi);
675
      vliw_wait_for_GR (cpu, in_GRj);
676
      vliw_wait_for_GR (cpu, out_GRk);
677
      vliw_wait_for_GRdouble (cpu, out_GRdoublek);
678
      handle_resource_wait (cpu);
679
      load_wait_for_GR (cpu, in_GRi);
680
      load_wait_for_GR (cpu, in_GRj);
681
      load_wait_for_GR (cpu, out_GRk);
682
      load_wait_for_GRdouble (cpu, out_GRdoublek);
683
      trace_vliw_wait_cycles (cpu);
684
      return 0;
685
    }
686
 
687
  cycles = idesc->timing->units[unit_num].done;
688
 
689
  /* The latency of GRk for a load will depend on how long it takes to retrieve
690
     the the data from the cache or memory.  */
691
  update_GR_latency_for_load (cpu, out_GRk, cycles);
692
  update_GRdouble_latency_for_load (cpu, out_GRdoublek, cycles);
693
 
694
  if (CGEN_ATTR_VALUE(idesc, idesc->attrs, CGEN_INSN_NON_EXCEPTING))
695
    {
696
      /* GNER has a latency of 2 cycles.  */
697
      update_SPR_latency (cpu, GNER_FOR_GR (out_GRk), cycles + 2);
698
      update_SPR_latency (cpu, GNER_FOR_GR (out_GRdoublek), cycles + 2);
699
    }
700
 
701
  if (out_GRk >= 0)
702
    set_use_is_gr_complex (cpu, out_GRk);
703
  if (out_GRdoublek != -1)
704
    {
705
      set_use_is_gr_complex (cpu, out_GRdoublek);
706
      set_use_is_gr_complex (cpu, out_GRdoublek + 1);
707
    }
708
 
709
  return cycles;
710
}
711
 
712
int
713
frvbf_model_fr500_u_gr_store (SIM_CPU *cpu, const IDESC *idesc,
714
                              int unit_num, int referenced,
715
                              INT in_GRi, INT in_GRj,
716
                              INT in_GRk, INT in_GRdoublek)
717
{
718
  int cycles;
719
 
720
  if (model_insn == FRV_INSN_MODEL_PASS_1)
721
    {
722
      /* The entire VLIW insn must wait if there is a dependency on a register
723
         which is not ready yet.
724
         The latency of the registers may be less than previously recorded,
725
         depending on how they were used previously.
726
         See Table 13-8 in the LSI.  */
727
      if (in_GRi >= 0)
728
        {
729
          if (use_is_gr_complex (cpu, in_GRi))
730
            decrease_GR_busy (cpu, in_GRi, 1);
731
        }
732
      if (in_GRj != in_GRi && in_GRj >= 0)
733
        {
734
          if (use_is_gr_complex (cpu, in_GRj))
735
            decrease_GR_busy (cpu, in_GRj, 1);
736
        }
737
      if (in_GRk != in_GRi && in_GRk != in_GRj && in_GRk >= 0)
738
        {
739
          if (use_is_gr_complex (cpu, in_GRk))
740
            decrease_GR_busy (cpu, in_GRk, 1);
741
        }
742
      if (in_GRdoublek != in_GRi && in_GRdoublek != in_GRj
743
          && in_GRdoublek + 1 != in_GRi && in_GRdoublek + 1 != in_GRj
744
          && in_GRdoublek >= 0)
745
        {
746
          if (use_is_gr_complex (cpu, in_GRdoublek))
747
            decrease_GR_busy (cpu, in_GRdoublek, 1);
748
          if (use_is_gr_complex (cpu, in_GRdoublek + 1))
749
            decrease_GR_busy (cpu, in_GRdoublek + 1, 1);
750
        }
751
      vliw_wait_for_GR (cpu, in_GRi);
752
      vliw_wait_for_GR (cpu, in_GRj);
753
      vliw_wait_for_GR (cpu, in_GRk);
754
      vliw_wait_for_GRdouble (cpu, in_GRdoublek);
755
      handle_resource_wait (cpu);
756
      load_wait_for_GR (cpu, in_GRi);
757
      load_wait_for_GR (cpu, in_GRj);
758
      load_wait_for_GR (cpu, in_GRk);
759
      load_wait_for_GRdouble (cpu, in_GRdoublek);
760
      trace_vliw_wait_cycles (cpu);
761
      return 0;
762
    }
763
 
764
  cycles = idesc->timing->units[unit_num].done;
765
 
766
  return cycles;
767
}
768
 
769
int
770
frvbf_model_fr500_u_gr_r_store (SIM_CPU *cpu, const IDESC *idesc,
771
                                int unit_num, int referenced,
772
                                INT in_GRi, INT in_GRj,
773
                                INT in_GRk, INT in_GRdoublek)
774
{
775
  int cycles = frvbf_model_fr500_u_gr_store (cpu, idesc, unit_num, referenced,
776
                                             in_GRi, in_GRj, in_GRk,
777
                                             in_GRdoublek);
778
 
779
  if (model_insn == FRV_INSN_MODEL_PASS_2)
780
    {
781
      if (CPU_RSTR_INVALIDATE(cpu))
782
        request_cache_invalidate (cpu, CPU_DATA_CACHE (cpu), cycles);
783
    }
784
 
785
  return cycles;
786
}
787
 
788
int
789
frvbf_model_fr500_u_fr_load (SIM_CPU *cpu, const IDESC *idesc,
790
                             int unit_num, int referenced,
791
                             INT in_GRi, INT in_GRj,
792
                             INT out_FRk, INT out_FRdoublek)
793
{
794
  int cycles;
795
 
796
  if (model_insn == FRV_INSN_MODEL_PASS_1)
797
    {
798
      /* The entire VLIW insn must wait if there is a dependency on a register
799
         which is not ready yet.
800
         The latency of the registers may be less than previously recorded,
801
         depending on how they were used previously.
802
         See Table 13-8 in the LSI.  */
803
      if (in_GRi >= 0)
804
        {
805
          if (use_is_gr_complex (cpu, in_GRi))
806
            decrease_GR_busy (cpu, in_GRi, 1);
807
        }
808
      if (in_GRj != in_GRi && in_GRj >= 0)
809
        {
810
          if (use_is_gr_complex (cpu, in_GRj))
811
            decrease_GR_busy (cpu, in_GRj, 1);
812
        }
813
      if (out_FRk >= 0)
814
        {
815
          if (use_is_media (cpu, out_FRk))
816
            decrease_FR_busy (cpu, out_FRk, 1);
817
          else
818
            adjust_float_register_busy (cpu, -1, -1, out_FRk, 1);
819
        }
820
      if (out_FRdoublek >= 0)
821
        {
822
          if (use_is_media (cpu, out_FRdoublek))
823
            decrease_FR_busy (cpu, out_FRdoublek, 1);
824
          else
825
            adjust_float_register_busy (cpu, -1, -1, out_FRdoublek, 1);
826
          if (use_is_media (cpu, out_FRdoublek + 1))
827
            decrease_FR_busy (cpu, out_FRdoublek + 1, 1);
828
          else
829
            adjust_float_register_busy (cpu, -1, -1, out_FRdoublek + 1, 1);
830
        }
831
      vliw_wait_for_GR (cpu, in_GRi);
832
      vliw_wait_for_GR (cpu, in_GRj);
833
      vliw_wait_for_FR (cpu, out_FRk);
834
      vliw_wait_for_FRdouble (cpu, out_FRdoublek);
835
      if (CGEN_ATTR_VALUE(idesc, idesc->attrs, CGEN_INSN_NON_EXCEPTING))
836
        {
837
          vliw_wait_for_SPR (cpu, FNER_FOR_FR (out_FRk));
838
          vliw_wait_for_SPR (cpu, FNER_FOR_FR (out_FRdoublek));
839
        }
840
      handle_resource_wait (cpu);
841
      load_wait_for_GR (cpu, in_GRi);
842
      load_wait_for_GR (cpu, in_GRj);
843
      load_wait_for_FR (cpu, out_FRk);
844
      load_wait_for_FRdouble (cpu, out_FRdoublek);
845
      trace_vliw_wait_cycles (cpu);
846
      return 0;
847
    }
848
 
849
  cycles = idesc->timing->units[unit_num].done;
850
 
851
  /* The latency of FRk for a load will depend on how long it takes to retrieve
852
     the the data from the cache or memory.  */
853
  update_FR_latency_for_load (cpu, out_FRk, cycles);
854
  update_FRdouble_latency_for_load (cpu, out_FRdoublek, cycles);
855
 
856
  if (CGEN_ATTR_VALUE(idesc, idesc->attrs, CGEN_INSN_NON_EXCEPTING))
857
    {
858
      /* FNER has a latency of 3 cycles.  */
859
      update_SPR_latency (cpu, FNER_FOR_FR (out_FRk), cycles + 3);
860
      update_SPR_latency (cpu, FNER_FOR_FR (out_FRdoublek), cycles + 3);
861
    }
862
 
863
  fr500_reset_fr_flags (cpu, out_FRk);
864
 
865
  return cycles;
866
}
867
 
868
int
869
frvbf_model_fr500_u_fr_store (SIM_CPU *cpu, const IDESC *idesc,
870
                              int unit_num, int referenced,
871
                              INT in_GRi, INT in_GRj,
872
                              INT in_FRk, INT in_FRdoublek)
873
{
874
  int cycles;
875
 
876
  if (model_insn == FRV_INSN_MODEL_PASS_1)
877
    {
878
      /* The entire VLIW insn must wait if there is a dependency on a register
879
         which is not ready yet.
880
         The latency of the registers may be less than previously recorded,
881
         depending on how they were used previously.
882
         See Table 13-8 in the LSI.  */
883
      if (in_GRi >= 0)
884
        {
885
          if (use_is_gr_complex (cpu, in_GRi))
886
            decrease_GR_busy (cpu, in_GRi, 1);
887
        }
888
      if (in_GRj != in_GRi && in_GRj >= 0)
889
        {
890
          if (use_is_gr_complex (cpu, in_GRj))
891
            decrease_GR_busy (cpu, in_GRj, 1);
892
        }
893
      if (in_FRk >= 0)
894
        {
895
          if (use_is_media (cpu, in_FRk))
896
            decrease_FR_busy (cpu, in_FRk, 1);
897
          else
898
            adjust_float_register_busy (cpu, -1, -1, in_FRk, 1);
899
        }
900
      if (in_FRdoublek >= 0)
901
        {
902
          if (use_is_media (cpu, in_FRdoublek))
903
            decrease_FR_busy (cpu, in_FRdoublek, 1);
904
          else
905
            adjust_float_register_busy (cpu, -1, -1, in_FRdoublek, 1);
906
          if (use_is_media (cpu, in_FRdoublek + 1))
907
            decrease_FR_busy (cpu, in_FRdoublek + 1, 1);
908
          else
909
            adjust_float_register_busy (cpu, -1, -1, in_FRdoublek + 1, 1);
910
        }
911
      vliw_wait_for_GR (cpu, in_GRi);
912
      vliw_wait_for_GR (cpu, in_GRj);
913
      vliw_wait_for_FR (cpu, in_FRk);
914
      vliw_wait_for_FRdouble (cpu, in_FRdoublek);
915
      handle_resource_wait (cpu);
916
      load_wait_for_GR (cpu, in_GRi);
917
      load_wait_for_GR (cpu, in_GRj);
918
      load_wait_for_FR (cpu, in_FRk);
919
      load_wait_for_FRdouble (cpu, in_FRdoublek);
920
      trace_vliw_wait_cycles (cpu);
921
      return 0;
922
    }
923
 
924
  cycles = idesc->timing->units[unit_num].done;
925
 
926
  return cycles;
927
}
928
 
929
int
930
frvbf_model_fr500_u_fr_r_store (SIM_CPU *cpu, const IDESC *idesc,
931
                                int unit_num, int referenced,
932
                                INT in_GRi, INT in_GRj,
933
                                INT in_FRk, INT in_FRdoublek)
934
{
935
  int cycles = frvbf_model_fr500_u_fr_store (cpu, idesc, unit_num, referenced,
936
                                             in_GRi, in_GRj, in_FRk,
937
                                             in_FRdoublek);
938
 
939
  if (model_insn == FRV_INSN_MODEL_PASS_2)
940
    {
941
      if (CPU_RSTR_INVALIDATE(cpu))
942
        request_cache_invalidate (cpu, CPU_DATA_CACHE (cpu), cycles);
943
    }
944
 
945
  return cycles;
946
}
947
 
948
int
949
frvbf_model_fr500_u_swap (SIM_CPU *cpu, const IDESC *idesc,
950
                          int unit_num, int referenced,
951
                          INT in_GRi, INT in_GRj, INT out_GRk)
952
{
953
  int cycles;
954
 
955
  if (model_insn == FRV_INSN_MODEL_PASS_1)
956
    {
957
      /* The entire VLIW insn must wait if there is a dependency on a register
958
         which is not ready yet.
959
         The latency of the registers may be less than previously recorded,
960
         depending on how they were used previously.
961
         See Table 13-8 in the LSI.  */
962
      if (in_GRi != out_GRk && in_GRi >= 0)
963
        {
964
          if (use_is_gr_complex (cpu, in_GRi))
965
            decrease_GR_busy (cpu, in_GRi, 1);
966
        }
967
      if (in_GRj != out_GRk && in_GRj != in_GRi && in_GRj >= 0)
968
        {
969
          if (use_is_gr_complex (cpu, in_GRj))
970
            decrease_GR_busy (cpu, in_GRj, 1);
971
        }
972
      vliw_wait_for_GR (cpu, in_GRi);
973
      vliw_wait_for_GR (cpu, in_GRj);
974
      vliw_wait_for_GR (cpu, out_GRk);
975
      handle_resource_wait (cpu);
976
      load_wait_for_GR (cpu, in_GRi);
977
      load_wait_for_GR (cpu, in_GRj);
978
      load_wait_for_GR (cpu, out_GRk);
979
      trace_vliw_wait_cycles (cpu);
980
      return 0;
981
    }
982
 
983
  cycles = idesc->timing->units[unit_num].done;
984
 
985
  /* The latency of GRk will depend on how long it takes to swap
986
     the the data from the cache or memory.  */
987
  update_GR_latency_for_swap (cpu, out_GRk, cycles);
988
  set_use_is_gr_complex (cpu, out_GRk);
989
 
990
  return cycles;
991
}
992
 
993
int
994
frvbf_model_fr500_u_fr2fr (SIM_CPU *cpu, const IDESC *idesc,
995
                           int unit_num, int referenced,
996
                           INT in_FRj, INT out_FRk)
997
{
998
  int cycles;
999
 
1000
  if (model_insn == FRV_INSN_MODEL_PASS_1)
1001
    {
1002
      /* The entire VLIW insn must wait if there is a dependency on a register
1003
         which is not ready yet.  */
1004
      if (in_FRj >= 0)
1005
        {
1006
          if (use_is_media (cpu, in_FRj))
1007
            decrease_FR_busy (cpu, in_FRj, 1);
1008
          else
1009
            adjust_float_register_busy (cpu, -1, in_FRj, -1, 1);
1010
        }
1011
      if (out_FRk >= 0 && out_FRk != in_FRj)
1012
        {
1013
          if (use_is_media (cpu, out_FRk))
1014
            decrease_FR_busy (cpu, out_FRk, 1);
1015
          else
1016
            adjust_float_register_busy (cpu, -1, -1, out_FRk, 1);
1017
        }
1018
      vliw_wait_for_FR (cpu, in_FRj);
1019
      vliw_wait_for_FR (cpu, out_FRk);
1020
      handle_resource_wait (cpu);
1021
      load_wait_for_FR (cpu, in_FRj);
1022
      load_wait_for_FR (cpu, out_FRk);
1023
      trace_vliw_wait_cycles (cpu);
1024
      return 0;
1025
    }
1026
 
1027
  /* The latency of FRj is 3 cycles.  */
1028
  cycles = idesc->timing->units[unit_num].done;
1029
  update_FR_latency (cpu, out_FRk, cycles + 3);
1030
 
1031
  return cycles;
1032
}
1033
 
1034
int
1035
frvbf_model_fr500_u_fr2gr (SIM_CPU *cpu, const IDESC *idesc,
1036
                           int unit_num, int referenced,
1037
                           INT in_FRk, INT out_GRj)
1038
{
1039
  int cycles;
1040
 
1041
  if (model_insn == FRV_INSN_MODEL_PASS_1)
1042
    {
1043
      /* The entire VLIW insn must wait if there is a dependency on a register
1044
         which is not ready yet.  */
1045
      if (in_FRk >= 0)
1046
        {
1047
          if (use_is_media (cpu, in_FRk))
1048
            decrease_FR_busy (cpu, in_FRk, 1);
1049
          else
1050
            adjust_float_register_busy (cpu, -1, in_FRk, -1, 1);
1051
        }
1052
      vliw_wait_for_FR (cpu, in_FRk);
1053
      vliw_wait_for_GR (cpu, out_GRj);
1054
      handle_resource_wait (cpu);
1055
      load_wait_for_FR (cpu, in_FRk);
1056
      load_wait_for_GR (cpu, out_GRj);
1057
      trace_vliw_wait_cycles (cpu);
1058
      return 0;
1059
    }
1060
 
1061
  /* The latency of GRj is 2 cycles.  */
1062
  cycles = idesc->timing->units[unit_num].done;
1063
  update_GR_latency (cpu, out_GRj, cycles + 2);
1064
  set_use_is_gr_complex (cpu, out_GRj);
1065
 
1066
  return cycles;
1067
}
1068
 
1069
int
1070
frvbf_model_fr500_u_spr2gr (SIM_CPU *cpu, const IDESC *idesc,
1071
                           int unit_num, int referenced,
1072
                           INT in_spr, INT out_GRj)
1073
{
1074
  int cycles;
1075
 
1076
  if (model_insn == FRV_INSN_MODEL_PASS_1)
1077
    {
1078
      /* The entire VLIW insn must wait if there is a dependency on a register
1079
         which is not ready yet.  */
1080
      vliw_wait_for_SPR (cpu, in_spr);
1081
      vliw_wait_for_GR (cpu, out_GRj);
1082
      handle_resource_wait (cpu);
1083
      load_wait_for_GR (cpu, out_GRj);
1084
      trace_vliw_wait_cycles (cpu);
1085
      return 0;
1086
    }
1087
 
1088
  cycles = idesc->timing->units[unit_num].done;
1089
 
1090
#if 0 /* no latency?  */
1091
  /* The latency of GRj is 2 cycles.  */
1092
  update_GR_latency (cpu, out_GRj, cycles + 2);
1093
#endif
1094
 
1095
  return cycles;
1096
}
1097
 
1098
int
1099
frvbf_model_fr500_u_gr2fr (SIM_CPU *cpu, const IDESC *idesc,
1100
                           int unit_num, int referenced,
1101
                           INT in_GRj, INT out_FRk)
1102
{
1103
  int cycles;
1104
 
1105
  if (model_insn == FRV_INSN_MODEL_PASS_1)
1106
    {
1107
      /* The entire VLIW insn must wait if there is a dependency on a register
1108
         which is not ready yet.
1109
         The latency of the registers may be less than previously recorded,
1110
         depending on how they were used previously.
1111
         See Table 13-8 in the LSI.  */
1112
      if (in_GRj >= 0)
1113
        {
1114
          if (use_is_gr_complex (cpu, in_GRj))
1115
            decrease_GR_busy (cpu, in_GRj, 1);
1116
        }
1117
      if (out_FRk >= 0)
1118
        {
1119
          if (use_is_media (cpu, out_FRk))
1120
            decrease_FR_busy (cpu, out_FRk, 1);
1121
          else
1122
            adjust_float_register_busy (cpu, -1, -1, out_FRk, 1);
1123
        }
1124
      vliw_wait_for_GR (cpu, in_GRj);
1125
      vliw_wait_for_FR (cpu, out_FRk);
1126
      handle_resource_wait (cpu);
1127
      load_wait_for_GR (cpu, in_GRj);
1128
      load_wait_for_FR (cpu, out_FRk);
1129
      trace_vliw_wait_cycles (cpu);
1130
      return 0;
1131
    }
1132
 
1133
  /* The latency of FRk is 2 cycles.  */
1134
  cycles = idesc->timing->units[unit_num].done;
1135
  update_FR_latency (cpu, out_FRk, cycles + 2);
1136
 
1137
  /* Mark this use of the register as NOT a floating point op.  */
1138
  fr500_reset_fr_flags (cpu, out_FRk);
1139
 
1140
  return cycles;
1141
}
1142
 
1143
int
1144
frvbf_model_fr500_u_gr2spr (SIM_CPU *cpu, const IDESC *idesc,
1145
                            int unit_num, int referenced,
1146
                            INT in_GRj, INT out_spr)
1147
{
1148
  int cycles;
1149
 
1150
  if (model_insn == FRV_INSN_MODEL_PASS_1)
1151
    {
1152
      /* The entire VLIW insn must wait if there is a dependency on a register
1153
         which is not ready yet.
1154
         The latency of the registers may be less than previously recorded,
1155
         depending on how they were used previously.
1156
         See Table 13-8 in the LSI.  */
1157
      if (in_GRj >= 0)
1158
        {
1159
          if (use_is_gr_complex (cpu, in_GRj))
1160
            decrease_GR_busy (cpu, in_GRj, 1);
1161
        }
1162
      vliw_wait_for_GR (cpu, in_GRj);
1163
      vliw_wait_for_SPR (cpu, out_spr);
1164
      handle_resource_wait (cpu);
1165
      load_wait_for_GR (cpu, in_GRj);
1166
      trace_vliw_wait_cycles (cpu);
1167
      return 0;
1168
    }
1169
 
1170
  cycles = idesc->timing->units[unit_num].done;
1171
 
1172
#if 0
1173
  /* The latency of spr is ? cycles.  */
1174
  update_SPR_latency (cpu, out_spr, cycles + ?);
1175
#endif
1176
 
1177
  return cycles;
1178
}
1179
 
1180
int
1181
frvbf_model_fr500_u_ici (SIM_CPU *cpu, const IDESC *idesc,
1182
                         int unit_num, int referenced,
1183
                         INT in_GRi, INT in_GRj)
1184
{
1185
  int cycles;
1186
 
1187
  if (model_insn == FRV_INSN_MODEL_PASS_1)
1188
    {
1189
      /* The entire VLIW insn must wait if there is a dependency on a register
1190
         which is not ready yet.
1191
         The latency of the registers may be less than previously recorded,
1192
         depending on how they were used previously.
1193
         See Table 13-8 in the LSI.  */
1194
      if (in_GRi >= 0)
1195
        {
1196
          if (use_is_gr_complex (cpu, in_GRi))
1197
            decrease_GR_busy (cpu, in_GRi, 1);
1198
        }
1199
      if (in_GRj != in_GRi && in_GRj >= 0)
1200
        {
1201
          if (use_is_gr_complex (cpu, in_GRj))
1202
            decrease_GR_busy (cpu, in_GRj, 1);
1203
        }
1204
      vliw_wait_for_GR (cpu, in_GRi);
1205
      vliw_wait_for_GR (cpu, in_GRj);
1206
      handle_resource_wait (cpu);
1207
      load_wait_for_GR (cpu, in_GRi);
1208
      load_wait_for_GR (cpu, in_GRj);
1209
      trace_vliw_wait_cycles (cpu);
1210
      return 0;
1211
    }
1212
 
1213
  cycles = idesc->timing->units[unit_num].done;
1214
  request_cache_invalidate (cpu, CPU_INSN_CACHE (cpu), cycles);
1215
  return cycles;
1216
}
1217
 
1218
int
1219
frvbf_model_fr500_u_dci (SIM_CPU *cpu, const IDESC *idesc,
1220
                         int unit_num, int referenced,
1221
                         INT in_GRi, INT in_GRj)
1222
{
1223
  int cycles;
1224
 
1225
  if (model_insn == FRV_INSN_MODEL_PASS_1)
1226
    {
1227
      /* The entire VLIW insn must wait if there is a dependency on a register
1228
         which is not ready yet.
1229
         The latency of the registers may be less than previously recorded,
1230
         depending on how they were used previously.
1231
         See Table 13-8 in the LSI.  */
1232
      if (in_GRi >= 0)
1233
        {
1234
          if (use_is_gr_complex (cpu, in_GRi))
1235
            decrease_GR_busy (cpu, in_GRi, 1);
1236
        }
1237
      if (in_GRj != in_GRi && in_GRj >= 0)
1238
        {
1239
          if (use_is_gr_complex (cpu, in_GRj))
1240
            decrease_GR_busy (cpu, in_GRj, 1);
1241
        }
1242
      vliw_wait_for_GR (cpu, in_GRi);
1243
      vliw_wait_for_GR (cpu, in_GRj);
1244
      handle_resource_wait (cpu);
1245
      load_wait_for_GR (cpu, in_GRi);
1246
      load_wait_for_GR (cpu, in_GRj);
1247
      trace_vliw_wait_cycles (cpu);
1248
      return 0;
1249
    }
1250
 
1251
  cycles = idesc->timing->units[unit_num].done;
1252
  request_cache_invalidate (cpu, CPU_DATA_CACHE (cpu), cycles);
1253
  return cycles;
1254
}
1255
 
1256
int
1257
frvbf_model_fr500_u_dcf (SIM_CPU *cpu, const IDESC *idesc,
1258
                         int unit_num, int referenced,
1259
                         INT in_GRi, INT in_GRj)
1260
{
1261
  int cycles;
1262
 
1263
  if (model_insn == FRV_INSN_MODEL_PASS_1)
1264
    {
1265
      /* The entire VLIW insn must wait if there is a dependency on a register
1266
         which is not ready yet.
1267
         The latency of the registers may be less than previously recorded,
1268
         depending on how they were used previously.
1269
         See Table 13-8 in the LSI.  */
1270
      if (in_GRi >= 0)
1271
        {
1272
          if (use_is_gr_complex (cpu, in_GRi))
1273
            decrease_GR_busy (cpu, in_GRi, 1);
1274
        }
1275
      if (in_GRj != in_GRi && in_GRj >= 0)
1276
        {
1277
          if (use_is_gr_complex (cpu, in_GRj))
1278
            decrease_GR_busy (cpu, in_GRj, 1);
1279
        }
1280
      vliw_wait_for_GR (cpu, in_GRi);
1281
      vliw_wait_for_GR (cpu, in_GRj);
1282
      handle_resource_wait (cpu);
1283
      load_wait_for_GR (cpu, in_GRi);
1284
      load_wait_for_GR (cpu, in_GRj);
1285
      trace_vliw_wait_cycles (cpu);
1286
      return 0;
1287
    }
1288
 
1289
  cycles = idesc->timing->units[unit_num].done;
1290
  request_cache_flush (cpu, CPU_DATA_CACHE (cpu), cycles);
1291
  return cycles;
1292
}
1293
 
1294
int
1295
frvbf_model_fr500_u_icpl (SIM_CPU *cpu, const IDESC *idesc,
1296
                          int unit_num, int referenced,
1297
                          INT in_GRi, INT in_GRj)
1298
{
1299
  int cycles;
1300
 
1301
  if (model_insn == FRV_INSN_MODEL_PASS_1)
1302
    {
1303
      /* The entire VLIW insn must wait if there is a dependency on a register
1304
         which is not ready yet.
1305
         The latency of the registers may be less than previously recorded,
1306
         depending on how they were used previously.
1307
         See Table 13-8 in the LSI.  */
1308
      if (in_GRi >= 0)
1309
        {
1310
          if (use_is_gr_complex (cpu, in_GRi))
1311
            decrease_GR_busy (cpu, in_GRi, 1);
1312
        }
1313
      if (in_GRj != in_GRi && in_GRj >= 0)
1314
        {
1315
          if (use_is_gr_complex (cpu, in_GRj))
1316
            decrease_GR_busy (cpu, in_GRj, 1);
1317
        }
1318
      vliw_wait_for_GR (cpu, in_GRi);
1319
      vliw_wait_for_GR (cpu, in_GRj);
1320
      handle_resource_wait (cpu);
1321
      load_wait_for_GR (cpu, in_GRi);
1322
      load_wait_for_GR (cpu, in_GRj);
1323
      trace_vliw_wait_cycles (cpu);
1324
      return 0;
1325
    }
1326
 
1327
  cycles = idesc->timing->units[unit_num].done;
1328
  request_cache_preload (cpu, CPU_INSN_CACHE (cpu), cycles);
1329
  return cycles;
1330
}
1331
 
1332
int
1333
frvbf_model_fr500_u_dcpl (SIM_CPU *cpu, const IDESC *idesc,
1334
                          int unit_num, int referenced,
1335
                          INT in_GRi, INT in_GRj)
1336
{
1337
  int cycles;
1338
 
1339
  if (model_insn == FRV_INSN_MODEL_PASS_1)
1340
    {
1341
      /* The entire VLIW insn must wait if there is a dependency on a register
1342
         which is not ready yet.
1343
         The latency of the registers may be less than previously recorded,
1344
         depending on how they were used previously.
1345
         See Table 13-8 in the LSI.  */
1346
      if (in_GRi >= 0)
1347
        {
1348
          if (use_is_gr_complex (cpu, in_GRi))
1349
            decrease_GR_busy (cpu, in_GRi, 1);
1350
        }
1351
      if (in_GRj != in_GRi && in_GRj >= 0)
1352
        {
1353
          if (use_is_gr_complex (cpu, in_GRj))
1354
            decrease_GR_busy (cpu, in_GRj, 1);
1355
        }
1356
      vliw_wait_for_GR (cpu, in_GRi);
1357
      vliw_wait_for_GR (cpu, in_GRj);
1358
      handle_resource_wait (cpu);
1359
      load_wait_for_GR (cpu, in_GRi);
1360
      load_wait_for_GR (cpu, in_GRj);
1361
      trace_vliw_wait_cycles (cpu);
1362
      return 0;
1363
    }
1364
 
1365
  cycles = idesc->timing->units[unit_num].done;
1366
  request_cache_preload (cpu, CPU_DATA_CACHE (cpu), cycles);
1367
  return cycles;
1368
}
1369
 
1370
int
1371
frvbf_model_fr500_u_icul (SIM_CPU *cpu, const IDESC *idesc,
1372
                          int unit_num, int referenced,
1373
                          INT in_GRi, INT in_GRj)
1374
{
1375
  int cycles;
1376
 
1377
  if (model_insn == FRV_INSN_MODEL_PASS_1)
1378
    {
1379
      /* The entire VLIW insn must wait if there is a dependency on a register
1380
         which is not ready yet.
1381
         The latency of the registers may be less than previously recorded,
1382
         depending on how they were used previously.
1383
         See Table 13-8 in the LSI.  */
1384
      if (in_GRi >= 0)
1385
        {
1386
          if (use_is_gr_complex (cpu, in_GRi))
1387
            decrease_GR_busy (cpu, in_GRi, 1);
1388
        }
1389
      if (in_GRj != in_GRi && in_GRj >= 0)
1390
        {
1391
          if (use_is_gr_complex (cpu, in_GRj))
1392
            decrease_GR_busy (cpu, in_GRj, 1);
1393
        }
1394
      vliw_wait_for_GR (cpu, in_GRi);
1395
      vliw_wait_for_GR (cpu, in_GRj);
1396
      handle_resource_wait (cpu);
1397
      load_wait_for_GR (cpu, in_GRi);
1398
      load_wait_for_GR (cpu, in_GRj);
1399
      trace_vliw_wait_cycles (cpu);
1400
      return 0;
1401
    }
1402
 
1403
  cycles = idesc->timing->units[unit_num].done;
1404
  request_cache_unlock (cpu, CPU_INSN_CACHE (cpu), cycles);
1405
  return cycles;
1406
}
1407
 
1408
int
1409
frvbf_model_fr500_u_dcul (SIM_CPU *cpu, const IDESC *idesc,
1410
                          int unit_num, int referenced,
1411
                          INT in_GRi, INT in_GRj)
1412
{
1413
  int cycles;
1414
 
1415
  if (model_insn == FRV_INSN_MODEL_PASS_1)
1416
    {
1417
      /* The entire VLIW insn must wait if there is a dependency on a register
1418
         which is not ready yet.
1419
         The latency of the registers may be less than previously recorded,
1420
         depending on how they were used previously.
1421
         See Table 13-8 in the LSI.  */
1422
      if (in_GRi >= 0)
1423
        {
1424
          if (use_is_gr_complex (cpu, in_GRi))
1425
            decrease_GR_busy (cpu, in_GRi, 1);
1426
        }
1427
      if (in_GRj != in_GRi && in_GRj >= 0)
1428
        {
1429
          if (use_is_gr_complex (cpu, in_GRj))
1430
            decrease_GR_busy (cpu, in_GRj, 1);
1431
        }
1432
      vliw_wait_for_GR (cpu, in_GRi);
1433
      vliw_wait_for_GR (cpu, in_GRj);
1434
      handle_resource_wait (cpu);
1435
      load_wait_for_GR (cpu, in_GRi);
1436
      load_wait_for_GR (cpu, in_GRj);
1437
      trace_vliw_wait_cycles (cpu);
1438
      return 0;
1439
    }
1440
 
1441
  cycles = idesc->timing->units[unit_num].done;
1442
  request_cache_unlock (cpu, CPU_DATA_CACHE (cpu), cycles);
1443
  return cycles;
1444
}
1445
 
1446
int
1447
frvbf_model_fr500_u_float_arith (SIM_CPU *cpu, const IDESC *idesc,
1448
                                 int unit_num, int referenced,
1449
                                 INT in_FRi, INT in_FRj,
1450
                                 INT in_FRdoublei, INT in_FRdoublej,
1451
                                 INT out_FRk, INT out_FRdoublek)
1452
{
1453
  int cycles;
1454
  FRV_PROFILE_STATE *ps;
1455
 
1456
  if (model_insn == FRV_INSN_MODEL_PASS_1)
1457
    return 0;
1458
 
1459
  /* The preprocessing can execute right away.  */
1460
  cycles = idesc->timing->units[unit_num].done;
1461
 
1462
  /* The post processing must wait if there is a dependency on a FR
1463
     which is not ready yet.  */
1464
  adjust_float_register_busy (cpu, in_FRi, in_FRj, out_FRk, 1);
1465
  adjust_double_register_busy (cpu, in_FRdoublei, in_FRdoublej, out_FRdoublek,
1466
                               1);
1467
  ps = CPU_PROFILE_STATE (cpu);
1468
  ps->post_wait = cycles;
1469
  post_wait_for_FR (cpu, in_FRi);
1470
  post_wait_for_FR (cpu, in_FRj);
1471
  post_wait_for_FR (cpu, out_FRk);
1472
  post_wait_for_FRdouble (cpu, in_FRdoublei);
1473
  post_wait_for_FRdouble (cpu, in_FRdoublej);
1474
  post_wait_for_FRdouble (cpu, out_FRdoublek);
1475
  if (CGEN_ATTR_VALUE(idesc, idesc->attrs, CGEN_INSN_NON_EXCEPTING))
1476
    {
1477
      post_wait_for_SPR (cpu, FNER_FOR_FR (out_FRk));
1478
      post_wait_for_SPR (cpu, FNER_FOR_FR (out_FRdoublek));
1479
    }
1480
  restore_float_register_busy (cpu, in_FRi, in_FRj, out_FRk, 1);
1481
  restore_double_register_busy (cpu, in_FRdoublei, in_FRdoublej, out_FRdoublek,
1482
                                1);
1483
 
1484
  /* The latency of FRk will be at least the latency of the other inputs.  */
1485
  update_FR_latency (cpu, out_FRk, ps->post_wait);
1486
  update_FRdouble_latency (cpu, out_FRdoublek, ps->post_wait);
1487
 
1488
  if (CGEN_ATTR_VALUE(idesc, idesc->attrs, CGEN_INSN_NON_EXCEPTING))
1489
    {
1490
      update_SPR_latency (cpu, FNER_FOR_FR (out_FRk), ps->post_wait);
1491
      update_SPR_latency (cpu, FNER_FOR_FR (out_FRdoublek), ps->post_wait);
1492
    }
1493
 
1494
  /* Once initiated, post-processing will take 3 cycles.  */
1495
  update_FR_ptime (cpu, out_FRk, 3);
1496
  update_FRdouble_ptime (cpu, out_FRdoublek, 3);
1497
 
1498
  if (CGEN_ATTR_VALUE(idesc, idesc->attrs, CGEN_INSN_NON_EXCEPTING))
1499
    {
1500
      update_SPR_ptime (cpu, FNER_FOR_FR (out_FRk), 3);
1501
      update_SPR_ptime (cpu, FNER_FOR_FR (out_FRdoublek), 3);
1502
    }
1503
 
1504
  /* Mark this use of the register as a floating point op.  */
1505
  if (out_FRk >= 0)
1506
    set_use_is_fpop (cpu, out_FRk);
1507
  if (out_FRdoublek >= 0)
1508
    {
1509
      set_use_is_fpop (cpu, out_FRdoublek);
1510
      if (out_FRdoublek < 63)
1511
        set_use_is_fpop (cpu, out_FRdoublek + 1);
1512
    }
1513
 
1514
  return cycles;
1515
}
1516
 
1517
int
1518
frvbf_model_fr500_u_float_dual_arith (SIM_CPU *cpu, const IDESC *idesc,
1519
                                      int unit_num, int referenced,
1520
                                      INT in_FRi, INT in_FRj,
1521
                                      INT in_FRdoublei, INT in_FRdoublej,
1522
                                      INT out_FRk, INT out_FRdoublek)
1523
{
1524
  int cycles;
1525
  INT dual_FRi;
1526
  INT dual_FRj;
1527
  INT dual_FRk;
1528
  INT dual_FRdoublei;
1529
  INT dual_FRdoublej;
1530
  INT dual_FRdoublek;
1531
  FRV_PROFILE_STATE *ps;
1532
 
1533
  if (model_insn == FRV_INSN_MODEL_PASS_1)
1534
    return 0;
1535
 
1536
  /* The preprocessing can execute right away.  */
1537
  cycles = idesc->timing->units[unit_num].done;
1538
 
1539
  /* The post processing must wait if there is a dependency on a FR
1540
     which is not ready yet.  */
1541
  dual_FRi = DUAL_REG (in_FRi);
1542
  dual_FRj = DUAL_REG (in_FRj);
1543
  dual_FRk = DUAL_REG (out_FRk);
1544
  dual_FRdoublei = DUAL_DOUBLE (in_FRdoublei);
1545
  dual_FRdoublej = DUAL_DOUBLE (in_FRdoublej);
1546
  dual_FRdoublek = DUAL_DOUBLE (out_FRdoublek);
1547
 
1548
  adjust_float_register_busy (cpu, in_FRi, in_FRj, out_FRk, 1);
1549
  adjust_float_register_busy (cpu, dual_FRi, dual_FRj, dual_FRk, 1);
1550
  adjust_double_register_busy (cpu, in_FRdoublei, in_FRdoublej, out_FRdoublek,
1551
                               1);
1552
  adjust_double_register_busy (cpu, dual_FRdoublei, dual_FRdoublej,
1553
                               dual_FRdoublek, 1);
1554
  ps = CPU_PROFILE_STATE (cpu);
1555
  ps->post_wait = cycles;
1556
  post_wait_for_FR (cpu, in_FRi);
1557
  post_wait_for_FR (cpu, in_FRj);
1558
  post_wait_for_FR (cpu, out_FRk);
1559
  post_wait_for_FR (cpu, dual_FRi);
1560
  post_wait_for_FR (cpu, dual_FRj);
1561
  post_wait_for_FR (cpu, dual_FRk);
1562
  post_wait_for_FRdouble (cpu, in_FRdoublei);
1563
  post_wait_for_FRdouble (cpu, in_FRdoublej);
1564
  post_wait_for_FRdouble (cpu, out_FRdoublek);
1565
  post_wait_for_FRdouble (cpu, dual_FRdoublei);
1566
  post_wait_for_FRdouble (cpu, dual_FRdoublej);
1567
  post_wait_for_FRdouble (cpu, dual_FRdoublek);
1568
  if (CGEN_ATTR_VALUE(idesc, idesc->attrs, CGEN_INSN_NON_EXCEPTING))
1569
    {
1570
      post_wait_for_SPR (cpu, FNER_FOR_FR (out_FRk));
1571
      post_wait_for_SPR (cpu, FNER_FOR_FR (dual_FRk));
1572
      post_wait_for_SPR (cpu, FNER_FOR_FR (out_FRdoublek));
1573
      post_wait_for_SPR (cpu, FNER_FOR_FR (dual_FRdoublek));
1574
    }
1575
  restore_float_register_busy (cpu, in_FRi, in_FRj, out_FRk, 1);
1576
  restore_float_register_busy (cpu, dual_FRi, dual_FRj, dual_FRk, 1);
1577
  restore_double_register_busy (cpu, in_FRdoublei, in_FRdoublej, out_FRdoublek,
1578
                                1);
1579
  restore_double_register_busy (cpu, dual_FRdoublei, dual_FRdoublej,
1580
                                dual_FRdoublek, 1);
1581
 
1582
  /* The latency of FRk will be at least the latency of the other inputs.  */
1583
  update_FR_latency (cpu, out_FRk, ps->post_wait);
1584
  update_FR_latency (cpu, dual_FRk, ps->post_wait);
1585
  update_FRdouble_latency (cpu, out_FRdoublek, ps->post_wait);
1586
  update_FRdouble_latency (cpu, dual_FRdoublek, ps->post_wait);
1587
 
1588
  if (CGEN_ATTR_VALUE(idesc, idesc->attrs, CGEN_INSN_NON_EXCEPTING))
1589
    {
1590
      update_SPR_latency (cpu, FNER_FOR_FR (out_FRk), ps->post_wait);
1591
      update_SPR_latency (cpu, FNER_FOR_FR (dual_FRk), ps->post_wait);
1592
      update_SPR_latency (cpu, FNER_FOR_FR (out_FRdoublek), ps->post_wait);
1593
      update_SPR_latency (cpu, FNER_FOR_FR (dual_FRdoublek), ps->post_wait);
1594
    }
1595
 
1596
  /* Once initiated, post-processing will take 3 cycles.  */
1597
  update_FR_ptime (cpu, out_FRk, 3);
1598
  update_FR_ptime (cpu, dual_FRk, 3);
1599
  update_FRdouble_ptime (cpu, out_FRdoublek, 3);
1600
  update_FRdouble_ptime (cpu, dual_FRdoublek, 3);
1601
 
1602
  if (CGEN_ATTR_VALUE(idesc, idesc->attrs, CGEN_INSN_NON_EXCEPTING))
1603
    {
1604
      update_SPR_ptime (cpu, FNER_FOR_FR (out_FRk), 3);
1605
      update_SPR_ptime (cpu, FNER_FOR_FR (dual_FRk), 3);
1606
      update_SPR_ptime (cpu, FNER_FOR_FR (out_FRdoublek), 3);
1607
      update_SPR_ptime (cpu, FNER_FOR_FR (dual_FRdoublek), 3);
1608
    }
1609
 
1610
  /* Mark this use of the register as a floating point op.  */
1611
  if (out_FRk >= 0)
1612
    set_use_is_fpop (cpu, out_FRk);
1613
  if (dual_FRk >= 0)
1614
    set_use_is_fpop (cpu, dual_FRk);
1615
  if (out_FRdoublek >= 0)
1616
    {
1617
      set_use_is_fpop (cpu, out_FRdoublek);
1618
      if (out_FRdoublek < 63)
1619
        set_use_is_fpop (cpu, out_FRdoublek + 1);
1620
    }
1621
  if (dual_FRdoublek >= 0)
1622
    {
1623
      set_use_is_fpop (cpu, dual_FRdoublek);
1624
      if (dual_FRdoublek < 63)
1625
        set_use_is_fpop (cpu, dual_FRdoublek + 1);
1626
    }
1627
 
1628
  return cycles;
1629
}
1630
 
1631
int
1632
frvbf_model_fr500_u_float_div (SIM_CPU *cpu, const IDESC *idesc,
1633
                               int unit_num, int referenced,
1634
                               INT in_FRi, INT in_FRj, INT out_FRk)
1635
{
1636
  int cycles;
1637
  FRV_VLIW *vliw;
1638
  int slot;
1639
  FRV_PROFILE_STATE *ps;
1640
 
1641
  if (model_insn == FRV_INSN_MODEL_PASS_1)
1642
    return 0;
1643
 
1644
  cycles = idesc->timing->units[unit_num].done;
1645
 
1646
  /* The post processing must wait if there is a dependency on a FR
1647
     which is not ready yet.  */
1648
  adjust_float_register_busy (cpu, in_FRi, in_FRj, out_FRk, 1);
1649
  ps = CPU_PROFILE_STATE (cpu);
1650
  ps->post_wait = cycles;
1651
  post_wait_for_FR (cpu, in_FRi);
1652
  post_wait_for_FR (cpu, in_FRj);
1653
  post_wait_for_FR (cpu, out_FRk);
1654
  if (CGEN_ATTR_VALUE(idesc, idesc->attrs, CGEN_INSN_NON_EXCEPTING))
1655
    post_wait_for_SPR (cpu, FNER_FOR_FR (out_FRk));
1656
  vliw = CPU_VLIW (cpu);
1657
  slot = vliw->next_slot - 1;
1658
  slot = (*vliw->current_vliw)[slot] - UNIT_FM0;
1659
  post_wait_for_fdiv (cpu, slot);
1660
  restore_float_register_busy (cpu, in_FRi, in_FRj, out_FRk, 1);
1661
 
1662
  /* The latency of FRk will be at least the latency of the other inputs.  */
1663
  /* Once initiated, post-processing will take 10 cycles.  */
1664
  update_FR_latency (cpu, out_FRk, ps->post_wait);
1665
  update_FR_ptime (cpu, out_FRk, 10);
1666
 
1667
  if (CGEN_ATTR_VALUE(idesc, idesc->attrs, CGEN_INSN_NON_EXCEPTING))
1668
    {
1669
      /* FNER has a latency of 10 cycles.  */
1670
      update_SPR_latency (cpu, FNER_FOR_FR (out_FRk), ps->post_wait);
1671
      update_SPR_ptime (cpu, FNER_FOR_FR (out_FRk), 10);
1672
    }
1673
 
1674
  /* The latency of the fdiv unit will be at least the latency of the other
1675
     inputs.  Once initiated, post-processing will take 9 cycles.  */
1676
  update_fdiv_resource_latency (cpu, slot, ps->post_wait + 9);
1677
 
1678
  /* Mark this use of the register as a floating point op.  */
1679
  set_use_is_fpop (cpu, out_FRk);
1680
 
1681
  return cycles;
1682
}
1683
 
1684
int
1685
frvbf_model_fr500_u_float_sqrt (SIM_CPU *cpu, const IDESC *idesc,
1686
                                int unit_num, int referenced,
1687
                                INT in_FRj, INT in_FRdoublej,
1688
                                INT out_FRk, INT out_FRdoublek)
1689
{
1690
  int cycles;
1691
  FRV_VLIW *vliw;
1692
  int slot;
1693
  FRV_PROFILE_STATE *ps;
1694
 
1695
  if (model_insn == FRV_INSN_MODEL_PASS_1)
1696
    return 0;
1697
 
1698
  cycles = idesc->timing->units[unit_num].done;
1699
 
1700
  /* The post processing must wait if there is a dependency on a FR
1701
     which is not ready yet.  */
1702
  adjust_float_register_busy (cpu, -1, in_FRj, out_FRk, 1);
1703
  adjust_double_register_busy (cpu, -1, in_FRdoublej, out_FRdoublek, 1);
1704
  ps = CPU_PROFILE_STATE (cpu);
1705
  ps->post_wait = cycles;
1706
  post_wait_for_FR (cpu, in_FRj);
1707
  post_wait_for_FR (cpu, out_FRk);
1708
  post_wait_for_FRdouble (cpu, in_FRdoublej);
1709
  post_wait_for_FRdouble (cpu, out_FRdoublek);
1710
  if (CGEN_ATTR_VALUE(idesc, idesc->attrs, CGEN_INSN_NON_EXCEPTING))
1711
    post_wait_for_SPR (cpu, FNER_FOR_FR (out_FRk));
1712
  vliw = CPU_VLIW (cpu);
1713
  slot = vliw->next_slot - 1;
1714
  slot = (*vliw->current_vliw)[slot] - UNIT_FM0;
1715
  post_wait_for_fsqrt (cpu, slot);
1716
  restore_float_register_busy (cpu, -1, in_FRj, out_FRk, 1);
1717
  restore_double_register_busy (cpu, -1, in_FRdoublej, out_FRdoublek, 1);
1718
 
1719
  /* The latency of FRk will be at least the latency of the other inputs.  */
1720
  update_FR_latency (cpu, out_FRk, ps->post_wait);
1721
  update_FRdouble_latency (cpu, out_FRdoublek, ps->post_wait);
1722
  if (CGEN_ATTR_VALUE(idesc, idesc->attrs, CGEN_INSN_NON_EXCEPTING))
1723
    update_SPR_latency (cpu, FNER_FOR_FR (out_FRk), ps->post_wait);
1724
 
1725
  /* Once initiated, post-processing will take 15 cycles.  */
1726
  update_FR_ptime (cpu, out_FRk, 15);
1727
  update_FRdouble_ptime (cpu, out_FRdoublek, 15);
1728
 
1729
  if (CGEN_ATTR_VALUE(idesc, idesc->attrs, CGEN_INSN_NON_EXCEPTING))
1730
    update_SPR_ptime (cpu, FNER_FOR_FR (out_FRk), 15);
1731
 
1732
  /* The latency of the sqrt unit will be the latency of the other
1733
     inputs plus 14 cycles.  */
1734
  update_fsqrt_resource_latency (cpu, slot, ps->post_wait + 14);
1735
 
1736
  /* Mark this use of the register as a floating point op.  */
1737
  if (out_FRk >= 0)
1738
    set_use_is_fpop (cpu, out_FRk);
1739
  if (out_FRdoublek >= 0)
1740
    {
1741
      set_use_is_fpop (cpu, out_FRdoublek);
1742
      if (out_FRdoublek < 63)
1743
        set_use_is_fpop (cpu, out_FRdoublek + 1);
1744
    }
1745
 
1746
  return cycles;
1747
}
1748
 
1749
int
1750
frvbf_model_fr500_u_float_dual_sqrt (SIM_CPU *cpu, const IDESC *idesc,
1751
                                     int unit_num, int referenced,
1752
                                     INT in_FRj, INT out_FRk)
1753
{
1754
  int cycles;
1755
  FRV_VLIW *vliw;
1756
  int slot;
1757
  INT dual_FRj;
1758
  INT dual_FRk;
1759
  FRV_PROFILE_STATE *ps;
1760
 
1761
  if (model_insn == FRV_INSN_MODEL_PASS_1)
1762
    return 0;
1763
 
1764
  cycles = idesc->timing->units[unit_num].done;
1765
 
1766
  /* The post processing must wait if there is a dependency on a FR
1767
     which is not ready yet.  */
1768
  dual_FRj = DUAL_REG (in_FRj);
1769
  dual_FRk = DUAL_REG (out_FRk);
1770
  adjust_float_register_busy (cpu, -1, in_FRj, out_FRk, 1);
1771
  adjust_float_register_busy (cpu, -1, dual_FRj, dual_FRk, 1);
1772
  ps = CPU_PROFILE_STATE (cpu);
1773
  ps->post_wait = cycles;
1774
  post_wait_for_FR (cpu, in_FRj);
1775
  post_wait_for_FR (cpu, out_FRk);
1776
  post_wait_for_FR (cpu, dual_FRj);
1777
  post_wait_for_FR (cpu, dual_FRk);
1778
 
1779
  vliw = CPU_VLIW (cpu);
1780
  slot = vliw->next_slot - 1;
1781
  slot = (*vliw->current_vliw)[slot] - UNIT_FM0;
1782
  post_wait_for_fsqrt (cpu, slot);
1783
  restore_float_register_busy (cpu, -1, in_FRj, out_FRk, 1);
1784
  restore_float_register_busy (cpu, -1, dual_FRj, dual_FRk, 1);
1785
 
1786
  /* The latency of FRk will be at least the latency of the other inputs.  */
1787
  update_FR_latency (cpu, out_FRk, ps->post_wait);
1788
  update_FR_latency (cpu, dual_FRk, ps->post_wait);
1789
 
1790
  /* Once initiated, post-processing will take 15 cycles.  */
1791
  update_FR_ptime (cpu, out_FRk, 15);
1792
  update_FR_ptime (cpu, dual_FRk, 15);
1793
 
1794
  /* The latency of the sqrt unit will be at least the latency of the other
1795
     inputs.  */
1796
  update_fsqrt_resource_latency (cpu, slot, ps->post_wait + 14);
1797
 
1798
  /* Mark this use of the register as a floating point op.  */
1799
  if (out_FRk >= 0)
1800
    set_use_is_fpop (cpu, out_FRk);
1801
  if (dual_FRk >= 0)
1802
    set_use_is_fpop (cpu, dual_FRk);
1803
 
1804
  return cycles;
1805
}
1806
 
1807
int
1808
frvbf_model_fr500_u_float_compare (SIM_CPU *cpu, const IDESC *idesc,
1809
                                   int unit_num, int referenced,
1810
                                   INT in_FRi, INT in_FRj,
1811
                                   INT in_FRdoublei, INT in_FRdoublej,
1812
                                   INT out_FCCi_2)
1813
{
1814
  int cycles;
1815
  FRV_PROFILE_STATE *ps;
1816
 
1817
  if (model_insn == FRV_INSN_MODEL_PASS_1)
1818
    return 0;
1819
 
1820
  /* The preprocessing can execute right away.  */
1821
  cycles = idesc->timing->units[unit_num].done;
1822
 
1823
  /* The post processing must wait if there is a dependency on a FR
1824
     which is not ready yet.  */
1825
  adjust_double_register_busy (cpu, in_FRdoublei, in_FRdoublej, -1, 1);
1826
  ps = CPU_PROFILE_STATE (cpu);
1827
  ps->post_wait = cycles;
1828
  post_wait_for_FR (cpu, in_FRi);
1829
  post_wait_for_FR (cpu, in_FRj);
1830
  post_wait_for_FRdouble (cpu, in_FRdoublei);
1831
  post_wait_for_FRdouble (cpu, in_FRdoublej);
1832
  post_wait_for_CCR (cpu, out_FCCi_2);
1833
  restore_double_register_busy (cpu, in_FRdoublei, in_FRdoublej, -1, 1);
1834
 
1835
  /* The latency of FCCi_2 will be the latency of the other inputs plus 3
1836
     cycles.  */
1837
  update_CCR_latency (cpu, out_FCCi_2, ps->post_wait + 3);
1838
 
1839
  return cycles;
1840
}
1841
 
1842
int
1843
frvbf_model_fr500_u_float_dual_compare (SIM_CPU *cpu, const IDESC *idesc,
1844
                                        int unit_num, int referenced,
1845
                                        INT in_FRi, INT in_FRj,
1846
                                        INT out_FCCi_2)
1847
{
1848
  int cycles;
1849
  INT dual_FRi;
1850
  INT dual_FRj;
1851
  INT dual_FCCi_2;
1852
  FRV_PROFILE_STATE *ps;
1853
 
1854
  if (model_insn == FRV_INSN_MODEL_PASS_1)
1855
    return 0;
1856
 
1857
  /* The preprocessing can execute right away.  */
1858
  cycles = idesc->timing->units[unit_num].done;
1859
 
1860
  /* The post processing must wait if there is a dependency on a FR
1861
     which is not ready yet.  */
1862
  ps = CPU_PROFILE_STATE (cpu);
1863
  ps->post_wait = cycles;
1864
  dual_FRi = DUAL_REG (in_FRi);
1865
  dual_FRj = DUAL_REG (in_FRj);
1866
  dual_FCCi_2 = out_FCCi_2 + 1;
1867
  adjust_float_register_busy (cpu, in_FRi, in_FRj, -1, 1);
1868
  adjust_float_register_busy (cpu, dual_FRi, dual_FRj, -1, 1);
1869
  post_wait_for_FR (cpu, in_FRi);
1870
  post_wait_for_FR (cpu, in_FRj);
1871
  post_wait_for_FR (cpu, dual_FRi);
1872
  post_wait_for_FR (cpu, dual_FRj);
1873
  post_wait_for_CCR (cpu, out_FCCi_2);
1874
  post_wait_for_CCR (cpu, dual_FCCi_2);
1875
  restore_float_register_busy (cpu, in_FRi, in_FRj, -1, 1);
1876
  restore_float_register_busy (cpu, dual_FRi, dual_FRj, -1, 1);
1877
 
1878
  /* The latency of FCCi_2 will be the latency of the other inputs plus 3
1879
     cycles.  */
1880
  update_CCR_latency (cpu, out_FCCi_2, ps->post_wait + 3);
1881
  update_CCR_latency (cpu, dual_FCCi_2, ps->post_wait + 3);
1882
 
1883
  return cycles;
1884
}
1885
 
1886
int
1887
frvbf_model_fr500_u_float_convert (SIM_CPU *cpu, const IDESC *idesc,
1888
                                   int unit_num, int referenced,
1889
                                   INT in_FRj, INT in_FRintj, INT in_FRdoublej,
1890
                                   INT out_FRk, INT out_FRintk,
1891
                                   INT out_FRdoublek)
1892
{
1893
  int cycles;
1894
  FRV_PROFILE_STATE *ps;
1895
 
1896
  if (model_insn == FRV_INSN_MODEL_PASS_1)
1897
    return 0;
1898
 
1899
  /* The preprocessing can execute right away.  */
1900
  cycles = idesc->timing->units[unit_num].done;
1901
 
1902
  /* The post processing must wait if there is a dependency on a FR
1903
     which is not ready yet.  */
1904
  ps = CPU_PROFILE_STATE (cpu);
1905
  ps->post_wait = cycles;
1906
  adjust_float_register_busy (cpu, -1, in_FRj, out_FRk, 1);
1907
  adjust_float_register_busy (cpu, -1, in_FRintj, out_FRintk, 1);
1908
  adjust_double_register_busy (cpu, -1, in_FRdoublej, out_FRdoublek, 1);
1909
  post_wait_for_FR (cpu, in_FRj);
1910
  post_wait_for_FR (cpu, in_FRintj);
1911
  post_wait_for_FRdouble (cpu, in_FRdoublej);
1912
  post_wait_for_FR (cpu, out_FRk);
1913
  post_wait_for_FR (cpu, out_FRintk);
1914
  post_wait_for_FRdouble (cpu, out_FRdoublek);
1915
  if (CGEN_ATTR_VALUE(idesc, idesc->attrs, CGEN_INSN_NON_EXCEPTING))
1916
    {
1917
      post_wait_for_SPR (cpu, FNER_FOR_FR (out_FRk));
1918
      post_wait_for_SPR (cpu, FNER_FOR_FR (out_FRintk));
1919
      post_wait_for_SPR (cpu, FNER_FOR_FR (out_FRdoublek));
1920
    }
1921
  restore_float_register_busy (cpu, -1, in_FRj, out_FRk, 1);
1922
  restore_float_register_busy (cpu, -1, in_FRintj, out_FRintk, 1);
1923
  restore_double_register_busy (cpu, -1, in_FRdoublej, out_FRdoublek, 1);
1924
 
1925
  /* The latency of FRk will be at least the latency of the other inputs.  */
1926
  update_FR_latency (cpu, out_FRk, ps->post_wait);
1927
  update_FR_latency (cpu, out_FRintk, ps->post_wait);
1928
  update_FRdouble_latency (cpu, out_FRdoublek, ps->post_wait);
1929
 
1930
  if (CGEN_ATTR_VALUE(idesc, idesc->attrs, CGEN_INSN_NON_EXCEPTING))
1931
    {
1932
      update_SPR_latency (cpu, FNER_FOR_FR (out_FRk), ps->post_wait);
1933
      update_SPR_latency (cpu, FNER_FOR_FR (out_FRintk), ps->post_wait);
1934
      update_SPR_latency (cpu, FNER_FOR_FR (out_FRdoublek), ps->post_wait);
1935
    }
1936
 
1937
  /* Once initiated, post-processing will take 3 cycles.  */
1938
  update_FR_ptime (cpu, out_FRk, 3);
1939
  update_FR_ptime (cpu, out_FRintk, 3);
1940
  update_FRdouble_ptime (cpu, out_FRdoublek, 3);
1941
 
1942
  if (CGEN_ATTR_VALUE(idesc, idesc->attrs, CGEN_INSN_NON_EXCEPTING))
1943
    {
1944
      update_SPR_ptime (cpu, FNER_FOR_FR (out_FRk), 3);
1945
      update_SPR_ptime (cpu, FNER_FOR_FR (out_FRintk), 3);
1946
      update_SPR_ptime (cpu, FNER_FOR_FR (out_FRdoublek), 3);
1947
    }
1948
 
1949
  /* Mark this use of the register as a floating point op.  */
1950
  if (out_FRk >= 0)
1951
    set_use_is_fpop (cpu, out_FRk);
1952
  if (out_FRintk >= 0)
1953
    set_use_is_fpop (cpu, out_FRintk);
1954
  if (out_FRdoublek >= 0)
1955
    {
1956
      set_use_is_fpop (cpu, out_FRdoublek);
1957
      set_use_is_fpop (cpu, out_FRdoublek + 1);
1958
    }
1959
 
1960
  return cycles;
1961
}
1962
 
1963
int
1964
frvbf_model_fr500_u_float_dual_convert (SIM_CPU *cpu, const IDESC *idesc,
1965
                                        int unit_num, int referenced,
1966
                                        INT in_FRj, INT in_FRintj,
1967
                                        INT out_FRk, INT out_FRintk)
1968
{
1969
  int cycles;
1970
  INT dual_FRj;
1971
  INT dual_FRintj;
1972
  INT dual_FRk;
1973
  INT dual_FRintk;
1974
  FRV_PROFILE_STATE *ps;
1975
 
1976
  if (model_insn == FRV_INSN_MODEL_PASS_1)
1977
    return 0;
1978
 
1979
  /* The preprocessing can execute right away.  */
1980
  cycles = idesc->timing->units[unit_num].done;
1981
 
1982
  /* The post processing must wait if there is a dependency on a FR
1983
     which is not ready yet.  */
1984
  ps = CPU_PROFILE_STATE (cpu);
1985
  ps->post_wait = cycles;
1986
  dual_FRj = DUAL_REG (in_FRj);
1987
  dual_FRintj = DUAL_REG (in_FRintj);
1988
  dual_FRk = DUAL_REG (out_FRk);
1989
  dual_FRintk = DUAL_REG (out_FRintk);
1990
  adjust_float_register_busy (cpu, -1, in_FRj, out_FRk, 1);
1991
  adjust_float_register_busy (cpu, -1, dual_FRj, dual_FRk, 1);
1992
  adjust_float_register_busy (cpu, -1, in_FRintj, out_FRintk, 1);
1993
  adjust_float_register_busy (cpu, -1, dual_FRintj, dual_FRintk, 1);
1994
  post_wait_for_FR (cpu, in_FRj);
1995
  post_wait_for_FR (cpu, in_FRintj);
1996
  post_wait_for_FR (cpu, out_FRk);
1997
  post_wait_for_FR (cpu, out_FRintk);
1998
  post_wait_for_FR (cpu, dual_FRj);
1999
  post_wait_for_FR (cpu, dual_FRintj);
2000
  post_wait_for_FR (cpu, dual_FRk);
2001
  post_wait_for_FR (cpu, dual_FRintk);
2002
  restore_float_register_busy (cpu, -1, in_FRj, out_FRk, 1);
2003
  restore_float_register_busy (cpu, -1, dual_FRj, dual_FRk, 1);
2004
  restore_float_register_busy (cpu, -1, in_FRintj, out_FRintk, 1);
2005
  restore_float_register_busy (cpu, -1, dual_FRintj, dual_FRintk, 1);
2006
 
2007
  /* The latency of FRk will be at least the latency of the other inputs.  */
2008
  update_FR_latency (cpu, out_FRk, ps->post_wait);
2009
  update_FR_latency (cpu, out_FRintk, ps->post_wait);
2010
  update_FR_latency (cpu, dual_FRk, ps->post_wait);
2011
  update_FR_latency (cpu, dual_FRintk, ps->post_wait);
2012
 
2013
  /* Once initiated, post-processing will take 3 cycles.  */
2014
  update_FR_ptime (cpu, out_FRk, 3);
2015
  update_FR_ptime (cpu, out_FRintk, 3);
2016
  update_FR_ptime (cpu, dual_FRk, 3);
2017
  update_FR_ptime (cpu, dual_FRintk, 3);
2018
 
2019
  /* Mark this use of the register as a floating point op.  */
2020
  if (out_FRk >= 0)
2021
    set_use_is_fpop (cpu, out_FRk);
2022
  if (out_FRintk >= 0)
2023
    set_use_is_fpop (cpu, out_FRintk);
2024
 
2025
  return cycles;
2026
}
2027
 
2028
int
2029
frvbf_model_fr500_u_media (SIM_CPU *cpu, const IDESC *idesc,
2030
                           int unit_num, int referenced,
2031
                           INT in_FRi, INT in_FRj, INT in_ACC40Si, INT in_ACCGi,
2032
                           INT out_FRk,
2033
                           INT out_ACC40Sk, INT out_ACC40Uk, INT out_ACCGk)
2034
{
2035
  int cycles;
2036
  FRV_PROFILE_STATE *ps;
2037
  const CGEN_INSN *insn;
2038
  int is_media_s1;
2039
  int is_media_s2;
2040
  int busy_adjustment[] = {0, 0, 0};
2041
  int *fr;
2042
  int *acc;
2043
 
2044
  if (model_insn == FRV_INSN_MODEL_PASS_1)
2045
    return 0;
2046
 
2047
  /* The preprocessing can execute right away.  */
2048
  cycles = idesc->timing->units[unit_num].done;
2049
 
2050
  ps = CPU_PROFILE_STATE (cpu);
2051
  insn = idesc->idata;
2052
 
2053
  /* If the previous use of the registers was a media op,
2054
     then their latency will be less than previously recorded.
2055
     See Table 13-13 in the LSI.  */
2056
  if (in_FRi >= 0)
2057
    {
2058
      if (use_is_media (cpu, in_FRi))
2059
        {
2060
          busy_adjustment[0] = 2;
2061
          decrease_FR_busy (cpu, in_FRi, busy_adjustment[0]);
2062
        }
2063
      else
2064
        enforce_full_fr_latency (cpu, in_FRi);
2065
    }
2066
  if (in_FRj >= 0 && in_FRj != in_FRi)
2067
    {
2068
      if (use_is_media (cpu, in_FRj))
2069
        {
2070
          busy_adjustment[1] = 2;
2071
          decrease_FR_busy (cpu, in_FRj, busy_adjustment[1]);
2072
        }
2073
      else
2074
        enforce_full_fr_latency (cpu, in_FRj);
2075
    }
2076
  if (out_FRk >= 0 && out_FRk != in_FRi && out_FRk != in_FRj)
2077
    {
2078
      if (use_is_media (cpu, out_FRk))
2079
        {
2080
          busy_adjustment[2] = 2;
2081
          decrease_FR_busy (cpu, out_FRk, busy_adjustment[2]);
2082
        }
2083
      else
2084
        enforce_full_fr_latency (cpu, out_FRk);
2085
    }
2086
 
2087
  /* The post processing must wait if there is a dependency on a FR
2088
     which is not ready yet.  */
2089
  ps->post_wait = cycles;
2090
  post_wait_for_FR (cpu, in_FRi);
2091
  post_wait_for_FR (cpu, in_FRj);
2092
  post_wait_for_FR (cpu, out_FRk);
2093
  post_wait_for_ACC (cpu, in_ACC40Si);
2094
  post_wait_for_ACC (cpu, in_ACCGi);
2095
  post_wait_for_ACC (cpu, out_ACC40Sk);
2096
  post_wait_for_ACC (cpu, out_ACC40Uk);
2097
  post_wait_for_ACC (cpu, out_ACCGk);
2098
 
2099
  /* Restore the busy cycles of the registers we used.  */
2100
  fr = ps->fr_busy;
2101
  if (in_FRi >= 0)
2102
    fr[in_FRi] += busy_adjustment[0];
2103
  if (in_FRj >= 0)
2104
    fr[in_FRj] += busy_adjustment[1];
2105
  if (out_FRk >= 0)
2106
    fr[out_FRk] += busy_adjustment[2];
2107
 
2108
  /* The latency of tht output register will be at least the latency of the
2109
     other inputs.  Once initiated, post-processing will take 3 cycles.  */
2110
  if (out_FRk >= 0)
2111
    {
2112
      update_FR_latency (cpu, out_FRk, ps->post_wait);
2113
      update_FR_ptime (cpu, out_FRk, 3);
2114
      /* Mark this use of the register as a media op.  */
2115
      set_use_is_media (cpu, out_FRk);
2116
    }
2117
  /* The latency of tht output accumulator will be at least the latency of the
2118
     other inputs.  Once initiated, post-processing will take 1 cycle.  */
2119
  if (out_ACC40Sk >= 0)
2120
    update_ACC_latency (cpu, out_ACC40Sk, ps->post_wait + 1);
2121
  if (out_ACC40Uk >= 0)
2122
    update_ACC_latency (cpu, out_ACC40Uk, ps->post_wait + 1);
2123
  if (out_ACCGk >= 0)
2124
    update_ACC_latency (cpu, out_ACCGk, ps->post_wait + 1);
2125
 
2126
  return cycles;
2127
}
2128
 
2129
int
2130
frvbf_model_fr500_u_media_quad_arith (SIM_CPU *cpu, const IDESC *idesc,
2131
                                       int unit_num, int referenced,
2132
                                       INT in_FRi, INT in_FRj,
2133
                                       INT out_FRk)
2134
{
2135
  int cycles;
2136
  INT dual_FRi;
2137
  INT dual_FRj;
2138
  INT dual_FRk;
2139
  FRV_PROFILE_STATE *ps;
2140
  int busy_adjustment[] = {0, 0, 0, 0, 0, 0};
2141
  int *fr;
2142
 
2143
  if (model_insn == FRV_INSN_MODEL_PASS_1)
2144
    return 0;
2145
 
2146
  /* The preprocessing can execute right away.  */
2147
  cycles = idesc->timing->units[unit_num].done;
2148
 
2149
  ps = CPU_PROFILE_STATE (cpu);
2150
  dual_FRi = DUAL_REG (in_FRi);
2151
  dual_FRj = DUAL_REG (in_FRj);
2152
  dual_FRk = DUAL_REG (out_FRk);
2153
 
2154
  /* If the previous use of the registers was a media op,
2155
     then their latency will be less than previously recorded.
2156
     See Table 13-13 in the LSI.  */
2157
  if (use_is_media (cpu, in_FRi))
2158
    {
2159
      busy_adjustment[0] = 2;
2160
      decrease_FR_busy (cpu, in_FRi, busy_adjustment[0]);
2161
    }
2162
  else
2163
    enforce_full_fr_latency (cpu, in_FRi);
2164
  if (dual_FRi >= 0 && use_is_media (cpu, dual_FRi))
2165
    {
2166
      busy_adjustment[1] = 2;
2167
      decrease_FR_busy (cpu, dual_FRi, busy_adjustment[1]);
2168
    }
2169
  else
2170
    enforce_full_fr_latency (cpu, dual_FRi);
2171
  if (in_FRj != in_FRi)
2172
    {
2173
      if (use_is_media (cpu, in_FRj))
2174
        {
2175
          busy_adjustment[2] = 2;
2176
          decrease_FR_busy (cpu, in_FRj, busy_adjustment[2]);
2177
        }
2178
      else
2179
        enforce_full_fr_latency (cpu, in_FRj);
2180
      if (dual_FRj >= 0 && use_is_media (cpu, dual_FRj))
2181
        {
2182
          busy_adjustment[3] = 2;
2183
          decrease_FR_busy (cpu, dual_FRj, busy_adjustment[3]);
2184
        }
2185
      else
2186
        enforce_full_fr_latency (cpu, dual_FRj + 1);
2187
    }
2188
  if (out_FRk != in_FRi && out_FRk != in_FRj)
2189
    {
2190
      if (use_is_media (cpu, out_FRk))
2191
        {
2192
          busy_adjustment[4] = 2;
2193
          decrease_FR_busy (cpu, out_FRk, busy_adjustment[4]);
2194
        }
2195
      else
2196
        enforce_full_fr_latency (cpu, out_FRk);
2197
      if (dual_FRk >= 0 && use_is_media (cpu, dual_FRk))
2198
        {
2199
          busy_adjustment[5] = 2;
2200
          decrease_FR_busy (cpu, dual_FRk, busy_adjustment[5]);
2201
        }
2202
      else
2203
        enforce_full_fr_latency (cpu, dual_FRk);
2204
    }
2205
 
2206
  /* The post processing must wait if there is a dependency on a FR
2207
     which is not ready yet.  */
2208
  ps->post_wait = cycles;
2209
  post_wait_for_FR (cpu, in_FRi);
2210
  post_wait_for_FR (cpu, dual_FRi);
2211
  post_wait_for_FR (cpu, in_FRj);
2212
  post_wait_for_FR (cpu, dual_FRj);
2213
  post_wait_for_FR (cpu, out_FRk);
2214
  post_wait_for_FR (cpu, dual_FRk);
2215
 
2216
  /* Restore the busy cycles of the registers we used.  */
2217
  fr = ps->fr_busy;
2218
  fr[in_FRi] += busy_adjustment[0];
2219
  if (dual_FRi >= 0)
2220
    fr[dual_FRi] += busy_adjustment[1];
2221
  fr[in_FRj] += busy_adjustment[2];
2222
  if (dual_FRj >= 0)
2223
    fr[dual_FRj] += busy_adjustment[3];
2224
  fr[out_FRk] += busy_adjustment[4];
2225
  if (dual_FRk >= 0)
2226
    fr[dual_FRk] += busy_adjustment[5];
2227
 
2228
  /* The latency of tht output register will be at least the latency of the
2229
     other inputs.  */
2230
  update_FR_latency (cpu, out_FRk, ps->post_wait);
2231
 
2232
  /* Once initiated, post-processing will take 3 cycles.  */
2233
  update_FR_ptime (cpu, out_FRk, 3);
2234
 
2235
  /* Mark this use of the register as a media op.  */
2236
  set_use_is_media (cpu, out_FRk);
2237
  if (dual_FRk >= 0)
2238
    {
2239
      update_FR_latency (cpu, dual_FRk, ps->post_wait);
2240
      update_FR_ptime (cpu, dual_FRk, 3);
2241
      /* Mark this use of the register as a media op.  */
2242
      set_use_is_media (cpu, dual_FRk);
2243
    }
2244
 
2245
  return cycles;
2246
}
2247
 
2248
int
2249
frvbf_model_fr500_u_media_dual_mul (SIM_CPU *cpu, const IDESC *idesc,
2250
                                    int unit_num, int referenced,
2251
                                    INT in_FRi, INT in_FRj,
2252
                                    INT out_ACC40Sk, INT out_ACC40Uk)
2253
{
2254
  int cycles;
2255
  INT dual_ACC40Sk;
2256
  INT dual_ACC40Uk;
2257
  FRV_PROFILE_STATE *ps;
2258
  int busy_adjustment[] = {0, 0, 0, 0, 0, 0};
2259
  int *fr;
2260
  int *acc;
2261
 
2262
  if (model_insn == FRV_INSN_MODEL_PASS_1)
2263
    return 0;
2264
 
2265
  /* The preprocessing can execute right away.  */
2266
  cycles = idesc->timing->units[unit_num].done;
2267
 
2268
  ps = CPU_PROFILE_STATE (cpu);
2269
  dual_ACC40Sk = DUAL_REG (out_ACC40Sk);
2270
  dual_ACC40Uk = DUAL_REG (out_ACC40Uk);
2271
 
2272
  /* If the previous use of the registers was a media op,
2273
     then their latency will be less than previously recorded.
2274
     See Table 13-13 in the LSI.  */
2275
  if (use_is_media (cpu, in_FRi))
2276
    {
2277
      busy_adjustment[0] = 2;
2278
      decrease_FR_busy (cpu, in_FRi, busy_adjustment[0]);
2279
    }
2280
  else
2281
    enforce_full_fr_latency (cpu, in_FRi);
2282
  if (in_FRj != in_FRi)
2283
    {
2284
      if (use_is_media (cpu, in_FRj))
2285
        {
2286
          busy_adjustment[1] = 2;
2287
          decrease_FR_busy (cpu, in_FRj, busy_adjustment[1]);
2288
        }
2289
      else
2290
        enforce_full_fr_latency (cpu, in_FRj);
2291
    }
2292
  if (out_ACC40Sk >= 0)
2293
    {
2294
      busy_adjustment[2] = 1;
2295
      decrease_ACC_busy (cpu, out_ACC40Sk, busy_adjustment[2]);
2296
    }
2297
  if (dual_ACC40Sk >= 0)
2298
    {
2299
      busy_adjustment[3] = 1;
2300
      decrease_ACC_busy (cpu, dual_ACC40Sk, busy_adjustment[3]);
2301
    }
2302
  if (out_ACC40Uk >= 0)
2303
    {
2304
      busy_adjustment[4] = 1;
2305
      decrease_ACC_busy (cpu, out_ACC40Uk, busy_adjustment[4]);
2306
    }
2307
  if (dual_ACC40Uk >= 0)
2308
    {
2309
      busy_adjustment[5] = 1;
2310
      decrease_ACC_busy (cpu, dual_ACC40Uk, busy_adjustment[5]);
2311
    }
2312
 
2313
  /* The post processing must wait if there is a dependency on a FR
2314
     which is not ready yet.  */
2315
  ps->post_wait = cycles;
2316
  post_wait_for_FR (cpu, in_FRi);
2317
  post_wait_for_FR (cpu, in_FRj);
2318
  post_wait_for_ACC (cpu, out_ACC40Sk);
2319
  post_wait_for_ACC (cpu, dual_ACC40Sk);
2320
  post_wait_for_ACC (cpu, out_ACC40Uk);
2321
  post_wait_for_ACC (cpu, dual_ACC40Uk);
2322
 
2323
  /* Restore the busy cycles of the registers we used.  */
2324
  fr = ps->fr_busy;
2325
  acc = ps->acc_busy;
2326
  fr[in_FRi] += busy_adjustment[0];
2327
  fr[in_FRj] += busy_adjustment[1];
2328
  if (out_ACC40Sk >= 0)
2329
    acc[out_ACC40Sk] += busy_adjustment[2];
2330
  if (dual_ACC40Sk >= 0)
2331
    acc[dual_ACC40Sk] += busy_adjustment[3];
2332
  if (out_ACC40Uk >= 0)
2333
    acc[out_ACC40Uk] += busy_adjustment[4];
2334
  if (dual_ACC40Uk >= 0)
2335
    acc[dual_ACC40Uk] += busy_adjustment[5];
2336
 
2337
  /* The latency of tht output register will be at least the latency of the
2338
     other inputs.  Once initiated, post-processing will take 1 cycle.  */
2339
  if (out_ACC40Sk >= 0)
2340
    update_ACC_latency (cpu, out_ACC40Sk, ps->post_wait + 1);
2341
  if (dual_ACC40Sk >= 0)
2342
    update_ACC_latency (cpu, dual_ACC40Sk, ps->post_wait + 1);
2343
  if (out_ACC40Uk >= 0)
2344
    update_ACC_latency (cpu, out_ACC40Uk, ps->post_wait + 1);
2345
  if (dual_ACC40Uk >= 0)
2346
    update_ACC_latency (cpu, dual_ACC40Uk, ps->post_wait + 1);
2347
 
2348
  return cycles;
2349
}
2350
 
2351
int
2352
frvbf_model_fr500_u_media_quad_mul (SIM_CPU *cpu, const IDESC *idesc,
2353
                                    int unit_num, int referenced,
2354
                                    INT in_FRi, INT in_FRj,
2355
                                    INT out_ACC40Sk, INT out_ACC40Uk)
2356
{
2357
  int cycles;
2358
  INT FRi_1;
2359
  INT FRj_1;
2360
  INT ACC40Sk_1;
2361
  INT ACC40Sk_2;
2362
  INT ACC40Sk_3;
2363
  INT ACC40Uk_1;
2364
  INT ACC40Uk_2;
2365
  INT ACC40Uk_3;
2366
  FRV_PROFILE_STATE *ps;
2367
  int busy_adjustment[] = {0, 0, 0, 0, 0, 0, 0 ,0};
2368
  int *fr;
2369
  int *acc;
2370
 
2371
  if (model_insn == FRV_INSN_MODEL_PASS_1)
2372
    return 0;
2373
 
2374
  /* The preprocessing can execute right away.  */
2375
  cycles = idesc->timing->units[unit_num].done;
2376
 
2377
  FRi_1 = DUAL_REG (in_FRi);
2378
  FRj_1 = DUAL_REG (in_FRj);
2379
  ACC40Sk_1 = DUAL_REG (out_ACC40Sk);
2380
  ACC40Sk_2 = DUAL_REG (ACC40Sk_1);
2381
  ACC40Sk_3 = DUAL_REG (ACC40Sk_2);
2382
  ACC40Uk_1 = DUAL_REG (out_ACC40Uk);
2383
  ACC40Uk_2 = DUAL_REG (ACC40Uk_1);
2384
  ACC40Uk_3 = DUAL_REG (ACC40Uk_2);
2385
 
2386
  /* If the previous use of the registers was a media op,
2387
     then their latency will be less than previously recorded.
2388
     See Table 13-13 in the LSI.  */
2389
  ps = CPU_PROFILE_STATE (cpu);
2390
  if (use_is_media (cpu, in_FRi))
2391
    {
2392
      busy_adjustment[0] = 2;
2393
      decrease_FR_busy (cpu, in_FRi, busy_adjustment[0]);
2394
    }
2395
  else
2396
    enforce_full_fr_latency (cpu, in_FRi);
2397
  if (FRi_1 >= 0)
2398
    {
2399
      if (use_is_media (cpu, FRi_1))
2400
        {
2401
          busy_adjustment[1] = 2;
2402
          decrease_FR_busy (cpu, FRi_1, busy_adjustment[1]);
2403
        }
2404
      else
2405
        enforce_full_fr_latency (cpu, FRi_1);
2406
    }
2407
  if (in_FRj != in_FRi)
2408
    {
2409
      if (use_is_media (cpu, in_FRj))
2410
        {
2411
          busy_adjustment[2] = 2;
2412
          decrease_FR_busy (cpu, in_FRj, busy_adjustment[2]);
2413
        }
2414
      else
2415
        enforce_full_fr_latency (cpu, in_FRj);
2416
      if (FRj_1 >= 0)
2417
        {
2418
          if (use_is_media (cpu, FRj_1))
2419
            {
2420
              busy_adjustment[3] = 2;
2421
              decrease_FR_busy (cpu, FRj_1, busy_adjustment[3]);
2422
            }
2423
          else
2424
            enforce_full_fr_latency (cpu, FRj_1);
2425
        }
2426
    }
2427
  if (out_ACC40Sk >= 0)
2428
    {
2429
      busy_adjustment[4] = 1;
2430
      decrease_ACC_busy (cpu, out_ACC40Sk, busy_adjustment[4]);
2431
 
2432
      if (ACC40Sk_1 >= 0)
2433
        {
2434
          busy_adjustment[5] = 1;
2435
          decrease_ACC_busy (cpu, ACC40Sk_1, busy_adjustment[5]);
2436
        }
2437
      if (ACC40Sk_2 >= 0)
2438
        {
2439
          busy_adjustment[6] = 1;
2440
          decrease_ACC_busy (cpu, ACC40Sk_2, busy_adjustment[6]);
2441
        }
2442
      if (ACC40Sk_3 >= 0)
2443
        {
2444
          busy_adjustment[7] = 1;
2445
          decrease_ACC_busy (cpu, ACC40Sk_3, busy_adjustment[7]);
2446
        }
2447
    }
2448
  else if (out_ACC40Uk >= 0)
2449
    {
2450
      busy_adjustment[4] = 1;
2451
      decrease_ACC_busy (cpu, out_ACC40Uk, busy_adjustment[4]);
2452
 
2453
      if (ACC40Uk_1 >= 0)
2454
        {
2455
          busy_adjustment[5] = 1;
2456
          decrease_ACC_busy (cpu, ACC40Uk_1, busy_adjustment[5]);
2457
        }
2458
      if (ACC40Uk_2 >= 0)
2459
        {
2460
          busy_adjustment[6] = 1;
2461
          decrease_ACC_busy (cpu, ACC40Uk_2, busy_adjustment[6]);
2462
        }
2463
      if (ACC40Uk_3 >= 0)
2464
        {
2465
          busy_adjustment[7] = 1;
2466
          decrease_ACC_busy (cpu, ACC40Uk_3, busy_adjustment[7]);
2467
        }
2468
    }
2469
 
2470
  /* The post processing must wait if there is a dependency on a FR
2471
     which is not ready yet.  */
2472
  ps->post_wait = cycles;
2473
  post_wait_for_FR (cpu, in_FRi);
2474
  post_wait_for_FR (cpu, FRi_1);
2475
  post_wait_for_FR (cpu, in_FRj);
2476
  post_wait_for_FR (cpu, FRj_1);
2477
  post_wait_for_ACC (cpu, out_ACC40Sk);
2478
  post_wait_for_ACC (cpu, ACC40Sk_1);
2479
  post_wait_for_ACC (cpu, ACC40Sk_2);
2480
  post_wait_for_ACC (cpu, ACC40Sk_3);
2481
  post_wait_for_ACC (cpu, out_ACC40Uk);
2482
  post_wait_for_ACC (cpu, ACC40Uk_1);
2483
  post_wait_for_ACC (cpu, ACC40Uk_2);
2484
  post_wait_for_ACC (cpu, ACC40Uk_3);
2485
 
2486
  /* Restore the busy cycles of the registers we used.  */
2487
  fr = ps->fr_busy;
2488
  acc = ps->acc_busy;
2489
  fr[in_FRi] += busy_adjustment[0];
2490
  if (FRi_1 >= 0)
2491
    fr[FRi_1] += busy_adjustment[1];
2492
  fr[in_FRj] += busy_adjustment[2];
2493
  if (FRj_1 > 0)
2494
    fr[FRj_1] += busy_adjustment[3];
2495
  if (out_ACC40Sk >= 0)
2496
    {
2497
      acc[out_ACC40Sk] += busy_adjustment[4];
2498
      if (ACC40Sk_1 >= 0)
2499
        acc[ACC40Sk_1] += busy_adjustment[5];
2500
      if (ACC40Sk_2 >= 0)
2501
        acc[ACC40Sk_2] += busy_adjustment[6];
2502
      if (ACC40Sk_3 >= 0)
2503
        acc[ACC40Sk_3] += busy_adjustment[7];
2504
    }
2505
  else if (out_ACC40Uk >= 0)
2506
    {
2507
      acc[out_ACC40Uk] += busy_adjustment[4];
2508
      if (ACC40Uk_1 >= 0)
2509
        acc[ACC40Uk_1] += busy_adjustment[5];
2510
      if (ACC40Uk_2 >= 0)
2511
        acc[ACC40Uk_2] += busy_adjustment[6];
2512
      if (ACC40Uk_3 >= 0)
2513
        acc[ACC40Uk_3] += busy_adjustment[7];
2514
    }
2515
 
2516
  /* The latency of tht output register will be at least the latency of the
2517
     other inputs.  Once initiated, post-processing will take 1 cycle.  */
2518
  if (out_ACC40Sk >= 0)
2519
    {
2520
      update_ACC_latency (cpu, out_ACC40Sk, ps->post_wait + 1);
2521
      if (ACC40Sk_1 >= 0)
2522
        update_ACC_latency (cpu, ACC40Sk_1, ps->post_wait + 1);
2523
      if (ACC40Sk_2 >= 0)
2524
        update_ACC_latency (cpu, ACC40Sk_2, ps->post_wait + 1);
2525
      if (ACC40Sk_3 >= 0)
2526
        update_ACC_latency (cpu, ACC40Sk_3, ps->post_wait + 1);
2527
    }
2528
  else if (out_ACC40Uk >= 0)
2529
    {
2530
      update_ACC_latency (cpu, out_ACC40Uk, ps->post_wait + 1);
2531
      if (ACC40Uk_1 >= 0)
2532
        update_ACC_latency (cpu, ACC40Uk_1, ps->post_wait + 1);
2533
      if (ACC40Uk_2 >= 0)
2534
        update_ACC_latency (cpu, ACC40Uk_2, ps->post_wait + 1);
2535
      if (ACC40Uk_3 >= 0)
2536
        update_ACC_latency (cpu, ACC40Uk_3, ps->post_wait + 1);
2537
    }
2538
 
2539
  return cycles;
2540
}
2541
 
2542
int
2543
frvbf_model_fr500_u_media_quad_complex (SIM_CPU *cpu, const IDESC *idesc,
2544
                                        int unit_num, int referenced,
2545
                                        INT in_FRi, INT in_FRj,
2546
                                        INT out_ACC40Sk)
2547
{
2548
  int cycles;
2549
  INT FRi_1;
2550
  INT FRj_1;
2551
  INT ACC40Sk_1;
2552
  FRV_PROFILE_STATE *ps;
2553
  int busy_adjustment[] = {0, 0, 0, 0, 0, 0};
2554
  int *fr;
2555
  int *acc;
2556
 
2557
  if (model_insn == FRV_INSN_MODEL_PASS_1)
2558
    return 0;
2559
 
2560
  /* The preprocessing can execute right away.  */
2561
  cycles = idesc->timing->units[unit_num].done;
2562
 
2563
  FRi_1 = DUAL_REG (in_FRi);
2564
  FRj_1 = DUAL_REG (in_FRj);
2565
  ACC40Sk_1 = DUAL_REG (out_ACC40Sk);
2566
 
2567
  /* If the previous use of the registers was a media op,
2568
     then their latency will be less than previously recorded.
2569
     See Table 13-13 in the LSI.  */
2570
  ps = CPU_PROFILE_STATE (cpu);
2571
  if (use_is_media (cpu, in_FRi))
2572
    {
2573
      busy_adjustment[0] = 2;
2574
      decrease_FR_busy (cpu, in_FRi, busy_adjustment[0]);
2575
    }
2576
  else
2577
    enforce_full_fr_latency (cpu, in_FRi);
2578
  if (FRi_1 >= 0)
2579
    {
2580
      if (use_is_media (cpu, FRi_1))
2581
        {
2582
          busy_adjustment[1] = 2;
2583
          decrease_FR_busy (cpu, FRi_1, busy_adjustment[1]);
2584
        }
2585
      else
2586
        enforce_full_fr_latency (cpu, FRi_1);
2587
    }
2588
  if (in_FRj != in_FRi)
2589
    {
2590
      if (use_is_media (cpu, in_FRj))
2591
        {
2592
          busy_adjustment[2] = 2;
2593
          decrease_FR_busy (cpu, in_FRj, busy_adjustment[2]);
2594
        }
2595
      else
2596
        enforce_full_fr_latency (cpu, in_FRj);
2597
      if (FRj_1 >= 0)
2598
        {
2599
          if (use_is_media (cpu, FRj_1))
2600
            {
2601
              busy_adjustment[3] = 2;
2602
              decrease_FR_busy (cpu, FRj_1, busy_adjustment[3]);
2603
            }
2604
          else
2605
            enforce_full_fr_latency (cpu, FRj_1);
2606
        }
2607
    }
2608
  if (out_ACC40Sk >= 0)
2609
    {
2610
      busy_adjustment[4] = 1;
2611
      decrease_ACC_busy (cpu, out_ACC40Sk, busy_adjustment[4]);
2612
 
2613
      if (ACC40Sk_1 >= 0)
2614
        {
2615
          busy_adjustment[5] = 1;
2616
          decrease_ACC_busy (cpu, ACC40Sk_1, busy_adjustment[5]);
2617
        }
2618
    }
2619
 
2620
  /* The post processing must wait if there is a dependency on a FR
2621
     which is not ready yet.  */
2622
  ps->post_wait = cycles;
2623
  post_wait_for_FR (cpu, in_FRi);
2624
  post_wait_for_FR (cpu, FRi_1);
2625
  post_wait_for_FR (cpu, in_FRj);
2626
  post_wait_for_FR (cpu, FRj_1);
2627
  post_wait_for_ACC (cpu, out_ACC40Sk);
2628
  post_wait_for_ACC (cpu, ACC40Sk_1);
2629
 
2630
  /* Restore the busy cycles of the registers we used.  */
2631
  fr = ps->fr_busy;
2632
  acc = ps->acc_busy;
2633
  fr[in_FRi] += busy_adjustment[0];
2634
  if (FRi_1 >= 0)
2635
    fr[FRi_1] += busy_adjustment[1];
2636
  fr[in_FRj] += busy_adjustment[2];
2637
  if (FRj_1 > 0)
2638
    fr[FRj_1] += busy_adjustment[3];
2639
  if (out_ACC40Sk >= 0)
2640
    {
2641
      acc[out_ACC40Sk] += busy_adjustment[4];
2642
      if (ACC40Sk_1 >= 0)
2643
        acc[ACC40Sk_1] += busy_adjustment[5];
2644
    }
2645
 
2646
  /* The latency of tht output register will be at least the latency of the
2647
     other inputs.  Once initiated, post-processing will take 1 cycle.  */
2648
  if (out_ACC40Sk >= 0)
2649
    {
2650
      update_ACC_latency (cpu, out_ACC40Sk, ps->post_wait + 1);
2651
      if (ACC40Sk_1 >= 0)
2652
        update_ACC_latency (cpu, ACC40Sk_1, ps->post_wait + 1);
2653
    }
2654
 
2655
  return cycles;
2656
}
2657
 
2658
int
2659
frvbf_model_fr500_u_media_dual_expand (SIM_CPU *cpu, const IDESC *idesc,
2660
                                       int unit_num, int referenced,
2661
                                       INT in_FRi,
2662
                                       INT out_FRk)
2663
{
2664
  int cycles;
2665
  INT dual_FRk;
2666
  FRV_PROFILE_STATE *ps;
2667
  int busy_adjustment[] = {0, 0, 0};
2668
  int *fr;
2669
 
2670
  if (model_insn == FRV_INSN_MODEL_PASS_1)
2671
    return 0;
2672
 
2673
  /* The preprocessing can execute right away.  */
2674
  cycles = idesc->timing->units[unit_num].done;
2675
 
2676
  /* If the previous use of the registers was a media op,
2677
     then their latency will be less than previously recorded.
2678
     See Table 13-13 in the LSI.  */
2679
  dual_FRk = DUAL_REG (out_FRk);
2680
  ps = CPU_PROFILE_STATE (cpu);
2681
  if (use_is_media (cpu, in_FRi))
2682
    {
2683
      busy_adjustment[0] = 2;
2684
      decrease_FR_busy (cpu, in_FRi, busy_adjustment[0]);
2685
    }
2686
  else
2687
    enforce_full_fr_latency (cpu, in_FRi);
2688
  if (out_FRk != in_FRi)
2689
    {
2690
      if (use_is_media (cpu, out_FRk))
2691
        {
2692
          busy_adjustment[1] = 2;
2693
          decrease_FR_busy (cpu, out_FRk, busy_adjustment[1]);
2694
        }
2695
      else
2696
        enforce_full_fr_latency (cpu, out_FRk);
2697
    }
2698
  if (dual_FRk >= 0 && dual_FRk != in_FRi)
2699
    {
2700
      if (use_is_media (cpu, dual_FRk))
2701
        {
2702
          busy_adjustment[2] = 2;
2703
          decrease_FR_busy (cpu, dual_FRk, busy_adjustment[2]);
2704
        }
2705
      else
2706
        enforce_full_fr_latency (cpu, dual_FRk);
2707
    }
2708
 
2709
  /* The post processing must wait if there is a dependency on a FR
2710
     which is not ready yet.  */
2711
  ps->post_wait = cycles;
2712
  post_wait_for_FR (cpu, in_FRi);
2713
  post_wait_for_FR (cpu, out_FRk);
2714
  post_wait_for_FR (cpu, dual_FRk);
2715
 
2716
  /* Restore the busy cycles of the registers we used.  */
2717
  fr = ps->fr_busy;
2718
  fr[in_FRi] += busy_adjustment[0];
2719
  fr[out_FRk] += busy_adjustment[1];
2720
  if (dual_FRk >= 0)
2721
    fr[dual_FRk] += busy_adjustment[2];
2722
 
2723
  /* The latency of the output register will be at least the latency of the
2724
     other inputs.  Once initiated, post-processing will take 3 cycles.  */
2725
  update_FR_latency (cpu, out_FRk, ps->post_wait);
2726
  update_FR_ptime (cpu, out_FRk, 3);
2727
 
2728
  /* Mark this use of the register as a media op.  */
2729
  set_use_is_media (cpu, out_FRk);
2730
  if (dual_FRk >= 0)
2731
    {
2732
      update_FR_latency (cpu, dual_FRk, ps->post_wait);
2733
      update_FR_ptime (cpu, dual_FRk, 3);
2734
 
2735
      /* Mark this use of the register as a media op.  */
2736
      set_use_is_media (cpu, dual_FRk);
2737
    }
2738
 
2739
  return cycles;
2740
}
2741
 
2742
int
2743
frvbf_model_fr500_u_media_dual_unpack (SIM_CPU *cpu, const IDESC *idesc,
2744
                                       int unit_num, int referenced,
2745
                                       INT in_FRi,
2746
                                       INT out_FRk)
2747
{
2748
  int cycles;
2749
  INT FRi_1;
2750
  INT FRk_1;
2751
  INT FRk_2;
2752
  INT FRk_3;
2753
  FRV_PROFILE_STATE *ps;
2754
  int busy_adjustment[] = {0, 0, 0, 0, 0, 0};
2755
  int *fr;
2756
 
2757
  if (model_insn == FRV_INSN_MODEL_PASS_1)
2758
    return 0;
2759
 
2760
  /* The preprocessing can execute right away.  */
2761
  cycles = idesc->timing->units[unit_num].done;
2762
 
2763
  FRi_1 = DUAL_REG (in_FRi);
2764
  FRk_1 = DUAL_REG (out_FRk);
2765
  FRk_2 = DUAL_REG (FRk_1);
2766
  FRk_3 = DUAL_REG (FRk_2);
2767
 
2768
  /* If the previous use of the registers was a media op,
2769
     then their latency will be less than previously recorded.
2770
     See Table 13-13 in the LSI.  */
2771
  ps = CPU_PROFILE_STATE (cpu);
2772
  if (use_is_media (cpu, in_FRi))
2773
    {
2774
      busy_adjustment[0] = 2;
2775
      decrease_FR_busy (cpu, in_FRi, busy_adjustment[0]);
2776
    }
2777
  else
2778
    enforce_full_fr_latency (cpu, in_FRi);
2779
  if (FRi_1 >= 0 && use_is_media (cpu, FRi_1))
2780
    {
2781
      busy_adjustment[1] = 2;
2782
      decrease_FR_busy (cpu, FRi_1, busy_adjustment[1]);
2783
    }
2784
  else
2785
    enforce_full_fr_latency (cpu, FRi_1);
2786
  if (out_FRk != in_FRi)
2787
    {
2788
      if (use_is_media (cpu, out_FRk))
2789
        {
2790
          busy_adjustment[2] = 2;
2791
          decrease_FR_busy (cpu, out_FRk, busy_adjustment[2]);
2792
        }
2793
      else
2794
        enforce_full_fr_latency (cpu, out_FRk);
2795
      if (FRk_1 >= 0 && FRk_1 != in_FRi)
2796
        {
2797
          if (use_is_media (cpu, FRk_1))
2798
            {
2799
              busy_adjustment[3] = 2;
2800
              decrease_FR_busy (cpu, FRk_1, busy_adjustment[3]);
2801
            }
2802
          else
2803
            enforce_full_fr_latency (cpu, FRk_1);
2804
        }
2805
      if (FRk_2 >= 0 && FRk_2 != in_FRi)
2806
        {
2807
          if (use_is_media (cpu, FRk_2))
2808
            {
2809
              busy_adjustment[4] = 2;
2810
              decrease_FR_busy (cpu, FRk_2, busy_adjustment[4]);
2811
            }
2812
          else
2813
            enforce_full_fr_latency (cpu, FRk_2);
2814
        }
2815
      if (FRk_3 >= 0 && FRk_3 != in_FRi)
2816
        {
2817
          if (use_is_media (cpu, FRk_3))
2818
            {
2819
              busy_adjustment[5] = 2;
2820
              decrease_FR_busy (cpu, FRk_3, busy_adjustment[5]);
2821
            }
2822
          else
2823
            enforce_full_fr_latency (cpu, FRk_3);
2824
        }
2825
    }
2826
 
2827
  /* The post processing must wait if there is a dependency on a FR
2828
     which is not ready yet.  */
2829
  ps->post_wait = cycles;
2830
  post_wait_for_FR (cpu, in_FRi);
2831
  post_wait_for_FR (cpu, FRi_1);
2832
  post_wait_for_FR (cpu, out_FRk);
2833
  post_wait_for_FR (cpu, FRk_1);
2834
  post_wait_for_FR (cpu, FRk_2);
2835
  post_wait_for_FR (cpu, FRk_3);
2836
 
2837
  /* Restore the busy cycles of the registers we used.  */
2838
  fr = ps->fr_busy;
2839
  fr[in_FRi] += busy_adjustment[0];
2840
  if (FRi_1 >= 0)
2841
    fr[FRi_1] += busy_adjustment[1];
2842
  fr[out_FRk] += busy_adjustment[2];
2843
  if (FRk_1 >= 0)
2844
    fr[FRk_1] += busy_adjustment[3];
2845
  if (FRk_2 >= 0)
2846
    fr[FRk_2] += busy_adjustment[4];
2847
  if (FRk_3 >= 0)
2848
    fr[FRk_3] += busy_adjustment[5];
2849
 
2850
  /* The latency of tht output register will be at least the latency of the
2851
     other inputs.  Once initiated, post-processing will take 3 cycles.  */
2852
  update_FR_latency (cpu, out_FRk, ps->post_wait);
2853
  update_FR_ptime (cpu, out_FRk, 3);
2854
 
2855
  /* Mark this use of the register as a media op.  */
2856
  set_use_is_media (cpu, out_FRk);
2857
  if (FRk_1 >= 0)
2858
    {
2859
      update_FR_latency (cpu, FRk_1, ps->post_wait);
2860
      update_FR_ptime (cpu, FRk_1, 3);
2861
 
2862
      /* Mark this use of the register as a media op.  */
2863
      set_use_is_media (cpu, FRk_1);
2864
    }
2865
  if (FRk_2 >= 0)
2866
    {
2867
      update_FR_latency (cpu, FRk_2, ps->post_wait);
2868
      update_FR_ptime (cpu, FRk_2, 3);
2869
 
2870
      /* Mark this use of the register as a media op.  */
2871
      set_use_is_media (cpu, FRk_2);
2872
    }
2873
  if (FRk_3 >= 0)
2874
    {
2875
      update_FR_latency (cpu, FRk_3, ps->post_wait);
2876
      update_FR_ptime (cpu, FRk_3, 3);
2877
 
2878
      /* Mark this use of the register as a media op.  */
2879
      set_use_is_media (cpu, FRk_3);
2880
    }
2881
 
2882
  return cycles;
2883
}
2884
 
2885
int
2886
frvbf_model_fr500_u_media_dual_btoh (SIM_CPU *cpu, const IDESC *idesc,
2887
                                     int unit_num, int referenced,
2888
                                     INT in_FRj,
2889
                                     INT out_FRk)
2890
{
2891
  return frvbf_model_fr500_u_media_dual_expand (cpu, idesc, unit_num,
2892
                                                referenced, in_FRj, out_FRk);
2893
}
2894
 
2895
int
2896
frvbf_model_fr500_u_media_dual_htob (SIM_CPU *cpu, const IDESC *idesc,
2897
                                     int unit_num, int referenced,
2898
                                     INT in_FRj,
2899
                                     INT out_FRk)
2900
{
2901
  int cycles;
2902
  INT dual_FRj;
2903
  FRV_PROFILE_STATE *ps;
2904
  int busy_adjustment[] = {0, 0, 0};
2905
  int *fr;
2906
 
2907
  if (model_insn == FRV_INSN_MODEL_PASS_1)
2908
    return 0;
2909
 
2910
  /* The preprocessing can execute right away.  */
2911
  cycles = idesc->timing->units[unit_num].done;
2912
 
2913
  /* If the previous use of the registers was a media op,
2914
     then their latency will be less than previously recorded.
2915
     See Table 13-13 in the LSI.  */
2916
  dual_FRj = DUAL_REG (in_FRj);
2917
  ps = CPU_PROFILE_STATE (cpu);
2918
  if (use_is_media (cpu, in_FRj))
2919
    {
2920
      busy_adjustment[0] = 2;
2921
      decrease_FR_busy (cpu, in_FRj, busy_adjustment[0]);
2922
    }
2923
  else
2924
    enforce_full_fr_latency (cpu, in_FRj);
2925
  if (dual_FRj >= 0)
2926
    {
2927
      if (use_is_media (cpu, dual_FRj))
2928
        {
2929
          busy_adjustment[1] = 2;
2930
          decrease_FR_busy (cpu, dual_FRj, busy_adjustment[1]);
2931
        }
2932
      else
2933
        enforce_full_fr_latency (cpu, dual_FRj);
2934
    }
2935
  if (out_FRk != in_FRj)
2936
    {
2937
      if (use_is_media (cpu, out_FRk))
2938
        {
2939
          busy_adjustment[2] = 2;
2940
          decrease_FR_busy (cpu, out_FRk, busy_adjustment[2]);
2941
        }
2942
      else
2943
        enforce_full_fr_latency (cpu, out_FRk);
2944
    }
2945
 
2946
  /* The post processing must wait if there is a dependency on a FR
2947
     which is not ready yet.  */
2948
  ps->post_wait = cycles;
2949
  post_wait_for_FR (cpu, in_FRj);
2950
  post_wait_for_FR (cpu, dual_FRj);
2951
  post_wait_for_FR (cpu, out_FRk);
2952
 
2953
  /* Restore the busy cycles of the registers we used.  */
2954
  fr = ps->fr_busy;
2955
  fr[in_FRj] += busy_adjustment[0];
2956
  if (dual_FRj >= 0)
2957
    fr[dual_FRj] += busy_adjustment[1];
2958
  fr[out_FRk] += busy_adjustment[2];
2959
 
2960
  /* The latency of tht output register will be at least the latency of the
2961
     other inputs.  */
2962
  update_FR_latency (cpu, out_FRk, ps->post_wait);
2963
 
2964
  /* Once initiated, post-processing will take 3 cycles.  */
2965
  update_FR_ptime (cpu, out_FRk, 3);
2966
 
2967
  /* Mark this use of the register as a media op.  */
2968
  set_use_is_media (cpu, out_FRk);
2969
 
2970
  return cycles;
2971
}
2972
 
2973
int
2974
frvbf_model_fr500_u_media_dual_btohe (SIM_CPU *cpu, const IDESC *idesc,
2975
                                      int unit_num, int referenced,
2976
                                      INT in_FRj,
2977
                                      INT out_FRk)
2978
{
2979
  int cycles;
2980
  INT FRk_1;
2981
  INT FRk_2;
2982
  INT FRk_3;
2983
  FRV_PROFILE_STATE *ps;
2984
  int busy_adjustment[] = {0, 0, 0, 0, 0};
2985
  int *fr;
2986
 
2987
  if (model_insn == FRV_INSN_MODEL_PASS_1)
2988
    return 0;
2989
 
2990
  /* The preprocessing can execute right away.  */
2991
  cycles = idesc->timing->units[unit_num].done;
2992
 
2993
  FRk_1 = DUAL_REG (out_FRk);
2994
  FRk_2 = DUAL_REG (FRk_1);
2995
  FRk_3 = DUAL_REG (FRk_2);
2996
 
2997
  /* If the previous use of the registers was a media op,
2998
     then their latency will be less than previously recorded.
2999
     See Table 13-13 in the LSI.  */
3000
  ps = CPU_PROFILE_STATE (cpu);
3001
  if (use_is_media (cpu, in_FRj))
3002
    {
3003
      busy_adjustment[0] = 2;
3004
      decrease_FR_busy (cpu, in_FRj, busy_adjustment[0]);
3005
    }
3006
  else
3007
    enforce_full_fr_latency (cpu, in_FRj);
3008
  if (out_FRk != in_FRj)
3009
    {
3010
      if (use_is_media (cpu, out_FRk))
3011
        {
3012
          busy_adjustment[1] = 2;
3013
          decrease_FR_busy (cpu, out_FRk, busy_adjustment[1]);
3014
        }
3015
      else
3016
        enforce_full_fr_latency (cpu, out_FRk);
3017
      if (FRk_1 >= 0 && FRk_1 != in_FRj)
3018
        {
3019
          if (use_is_media (cpu, FRk_1))
3020
            {
3021
              busy_adjustment[2] = 2;
3022
              decrease_FR_busy (cpu, FRk_1, busy_adjustment[2]);
3023
            }
3024
          else
3025
            enforce_full_fr_latency (cpu, FRk_1);
3026
        }
3027
      if (FRk_2 >= 0 && FRk_2 != in_FRj)
3028
        {
3029
          if (use_is_media (cpu, FRk_2))
3030
            {
3031
              busy_adjustment[3] = 2;
3032
              decrease_FR_busy (cpu, FRk_2, busy_adjustment[3]);
3033
            }
3034
          else
3035
            enforce_full_fr_latency (cpu, FRk_2);
3036
        }
3037
      if (FRk_3 >= 0 && FRk_3 != in_FRj)
3038
        {
3039
          if (use_is_media (cpu, FRk_3))
3040
            {
3041
              busy_adjustment[4] = 2;
3042
              decrease_FR_busy (cpu, FRk_3, busy_adjustment[4]);
3043
            }
3044
          else
3045
            enforce_full_fr_latency (cpu, FRk_3);
3046
        }
3047
    }
3048
 
3049
  /* The post processing must wait if there is a dependency on a FR
3050
     which is not ready yet.  */
3051
  ps->post_wait = cycles;
3052
  post_wait_for_FR (cpu, in_FRj);
3053
  post_wait_for_FR (cpu, out_FRk);
3054
  post_wait_for_FR (cpu, FRk_1);
3055
  post_wait_for_FR (cpu, FRk_2);
3056
  post_wait_for_FR (cpu, FRk_3);
3057
 
3058
  /* Restore the busy cycles of the registers we used.  */
3059
  fr = ps->fr_busy;
3060
  fr[in_FRj] += busy_adjustment[0];
3061
  fr[out_FRk] += busy_adjustment[1];
3062
  if (FRk_1 >= 0)
3063
    fr[FRk_1] += busy_adjustment[2];
3064
  if (FRk_2 >= 0)
3065
    fr[FRk_2] += busy_adjustment[3];
3066
  if (FRk_3 >= 0)
3067
    fr[FRk_3] += busy_adjustment[4];
3068
 
3069
  /* The latency of tht output register will be at least the latency of the
3070
     other inputs.  Once initiated, post-processing will take 3 cycles.  */
3071
  update_FR_latency (cpu, out_FRk, ps->post_wait);
3072
  update_FR_ptime (cpu, out_FRk, 3);
3073
 
3074
  /* Mark this use of the register as a media op.  */
3075
  set_use_is_media (cpu, out_FRk);
3076
  if (FRk_1 >= 0)
3077
    {
3078
      update_FR_latency (cpu, FRk_1, ps->post_wait);
3079
      update_FR_ptime (cpu, FRk_1, 3);
3080
 
3081
      /* Mark this use of the register as a media op.  */
3082
      set_use_is_media (cpu, FRk_1);
3083
    }
3084
  if (FRk_2 >= 0)
3085
    {
3086
      update_FR_latency (cpu, FRk_2, ps->post_wait);
3087
      update_FR_ptime (cpu, FRk_2, 3);
3088
 
3089
      /* Mark this use of the register as a media op.  */
3090
      set_use_is_media (cpu, FRk_2);
3091
    }
3092
  if (FRk_3 >= 0)
3093
    {
3094
      update_FR_latency (cpu, FRk_3, ps->post_wait);
3095
      update_FR_ptime (cpu, FRk_3, 3);
3096
 
3097
      /* Mark this use of the register as a media op.  */
3098
      set_use_is_media (cpu, FRk_3);
3099
    }
3100
 
3101
  return cycles;
3102
}
3103
 
3104
int
3105
frvbf_model_fr500_u_barrier (SIM_CPU *cpu, const IDESC *idesc,
3106
                             int unit_num, int referenced)
3107
{
3108
  int cycles;
3109
  if (model_insn == FRV_INSN_MODEL_PASS_1)
3110
    {
3111
      int i;
3112
      /* Wait for ALL resources.  */
3113
      for (i = 0; i < 64; ++i)
3114
        {
3115
          enforce_full_fr_latency (cpu, i);
3116
          vliw_wait_for_GR (cpu, i);
3117
          vliw_wait_for_FR (cpu, i);
3118
          vliw_wait_for_ACC (cpu, i);
3119
        }
3120
      for (i = 0; i < 8; ++i)
3121
        vliw_wait_for_CCR (cpu, i);
3122
      for (i = 0; i < 2; ++i)
3123
        {
3124
          vliw_wait_for_idiv_resource (cpu, i);
3125
          vliw_wait_for_fdiv_resource (cpu, i);
3126
          vliw_wait_for_fsqrt_resource (cpu, i);
3127
        }
3128
      handle_resource_wait (cpu);
3129
      for (i = 0; i < 64; ++i)
3130
        {
3131
          load_wait_for_GR (cpu, i);
3132
          load_wait_for_FR (cpu, i);
3133
        }
3134
      trace_vliw_wait_cycles (cpu);
3135
      return 0;
3136
    }
3137
 
3138
  cycles = idesc->timing->units[unit_num].done;
3139
  return cycles;
3140
}
3141
 
3142
int
3143
frvbf_model_fr500_u_membar (SIM_CPU *cpu, const IDESC *idesc,
3144
                            int unit_num, int referenced)
3145
{
3146
  int cycles;
3147
  if (model_insn == FRV_INSN_MODEL_PASS_1)
3148
    {
3149
      int i;
3150
      /* Wait for ALL resources, except GR and ICC.  */
3151
      for (i = 0; i < 64; ++i)
3152
        {
3153
          enforce_full_fr_latency (cpu, i);
3154
          vliw_wait_for_FR (cpu, i);
3155
          vliw_wait_for_ACC (cpu, i);
3156
        }
3157
      for (i = 0; i < 4; ++i)
3158
        vliw_wait_for_CCR (cpu, i);
3159
      for (i = 0; i < 2; ++i)
3160
        {
3161
          vliw_wait_for_idiv_resource (cpu, i);
3162
          vliw_wait_for_fdiv_resource (cpu, i);
3163
          vliw_wait_for_fsqrt_resource (cpu, i);
3164
        }
3165
      handle_resource_wait (cpu);
3166
      for (i = 0; i < 64; ++i)
3167
        {
3168
          load_wait_for_FR (cpu, i);
3169
        }
3170
      trace_vliw_wait_cycles (cpu);
3171
      return 0;
3172
    }
3173
 
3174
  cycles = idesc->timing->units[unit_num].done;
3175
  return cycles;
3176
}
3177
 
3178
/* The frv machine is a fictional implementation of the fr500 which implements
3179
   all frv architectural features.  */
3180
int
3181
frvbf_model_frv_u_exec (SIM_CPU *cpu, const IDESC *idesc,
3182
                            int unit_num, int referenced)
3183
{
3184
  return idesc->timing->units[unit_num].done;
3185
}
3186
 
3187
/* The simple machine is a fictional implementation of the fr500 which
3188
   implements limited frv architectural features.  */
3189
int
3190
frvbf_model_simple_u_exec (SIM_CPU *cpu, const IDESC *idesc,
3191
                            int unit_num, int referenced)
3192
{
3193
  return idesc->timing->units[unit_num].done;
3194
}
3195
 
3196
/* The tomcat machine is models a prototype fr500 machine which had a few
3197
   bugs and restrictions to work around.  */
3198
int
3199
frvbf_model_tomcat_u_exec (SIM_CPU *cpu, const IDESC *idesc,
3200
                            int unit_num, int referenced)
3201
{
3202
  return idesc->timing->units[unit_num].done;
3203
}
3204
 
3205
#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.