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