Initial commit of OpenSPARC T2 design and verification files.
[OpenSPARC-T2-DV] / verif / diag / assembly / include / RF_8win_macros.h
CommitLineData
86530b38
AT
1/*
2* ========== Copyright Header Begin ==========================================
3*
4* OpenSPARC T2 Processor File: RF_8win_macros.h
5* Copyright (C) 1995-2007 Sun Microsystems, Inc. All Rights Reserved
6* 4150 Network Circle, Santa Clara, California 95054, U.S.A.
7*
8* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
9*
10* This program is free software; you can redistribute it and/or modify
11* it under the terms of the GNU General Public License as published by
12* the Free Software Foundation; version 2 of the License.
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, write to the Free Software
21* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22*
23* For the avoidance of doubt, and except that if any non-GPL license
24* choice is available it will apply instead, Sun elects to use only
25* the General Public License version 2 (GPLv2) at this time for any
26* software where a choice of GPL license versions is made
27* available with the language indicating that GPLv2 or any later version
28* may be used, or where a choice of which version of the GPL is applied is
29* otherwise unspecified.
30*
31* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
32* CA 95054 USA or visit www.sun.com if you need additional information or
33* have any questions.
34*
35*
36* ========== Copyright Header End ============================================
37*/
38!----------------------------------------------------------------------
39! These macros read out a block of registers by using store inst
40
41#define read_locals(reg) \
42 st %l0, [reg]; \
43 st %l1, [reg]; \
44 st %l2, [reg]; \
45 st %l3, [reg]; \
46 st %l4, [reg]; \
47 st %l5, [reg]; \
48 st %l6, [reg]; \
49 st %l7, [reg]
50
51#define read_globals(reg) \
52 st %g0, [reg]; \
53 st %g1, [reg]; \
54 st %g2, [reg]; \
55 st %g3, [reg]; \
56 st %g4, [reg]; \
57 st %g5, [reg]; \
58 st %g6, [reg]; \
59 st %g7, [reg]
60
61#define read_ins(reg) \
62 st %i0, [reg]; \
63 st %i1, [reg]; \
64 st %i2, [reg]; \
65 st %i3, [reg]; \
66 st %i4, [reg]; \
67 st %i5, [reg]; \
68 st %i6, [reg]; \
69 st %i7, [reg]
70
71#define read_outs(reg) \
72 st %o0, [reg]; \
73 st %o1, [reg]; \
74 st %o2, [reg]; \
75 st %o3, [reg]; \
76 st %o4, [reg]; \
77 st %o5, [reg]; \
78 st %o6, [reg]; \
79 st %o7, [reg]
80
81!----------------------------------------------------------------------
82! This macro loads a register file block from memory
83
84#define load_local_block(addr) \
85 ldd [addr], %l0; \
86 ldd [addr + 8], %l2; \
87 ldd [addr + 16], %l4; \
88 ldd [addr + 24], %l6; \
89
90#define load_global_block(addr) \
91 ldd [addr], %g0; \
92 ldd [addr + 8], %g2; \
93 ldd [addr + 16], %g4; \
94 ldd [addr + 24], %g6; \
95
96#define load_out_block(addr) \
97 ldd [addr], %o0; \
98 ldd [addr + 8], %o2; \
99 ldd [addr + 16], %o4; \
100 ldd [addr + 24], %o6; \
101
102#define load_in_block(addr) \
103 ldd [addr], %i0; \
104 ldd [addr + 8], %i2; \
105 ldd [addr + 16], %i4; \
106 ldd [addr + 24], %i6; \
107
108!----------------------------------------------------------------------
109! This macro loads up all of the visible registers including globals
110! from the address supplied in the "reg". %g1 is assumed to be
111! this register. This will not map in a block.
112
113#define ld_no_incr_mapped(reg) \
114 mov 0x1,%l1; \
115 mov 0x2,%l2; \
116 wrpr %l1,%l2,%cansave; \
117 wrpr %l1,%l2,%canrestore; \
118 load_out_block(reg); \
119 load_local_block(reg); \
120 load_in_block(reg); \
121 mov 0x1,%l1; \
122 mov 0x2,%l2; \
123 wrpr %l1,%l2,%cansave; \
124 wrpr %l1,%l2,%canrestore; \
125 restore %g0, %g0, %g0; \
126 load_local_block(reg); \
127 load_in_block(reg); \
128 mov 0x1,%l1; \
129 mov 0x2,%l2; \
130 wrpr %l1,%l2,%cansave; \
131 wrpr %l1,%l2,%canrestore; \
132 restore %g0, %g0, %g0; \
133 load_local_block(reg); \
134 load_in_block(reg); \
135 mov 0x1,%l1; \
136 mov 0x2,%l2; \
137 wrpr %l1,%l2,%cansave; \
138 wrpr %l1,%l2,%canrestore; \
139 restore %g0, %g0, %g0; \
140 load_local_block(reg); \
141 load_in_block(reg); \
142 mov 0x1,%l1; \
143 mov 0x2,%l2; \
144 wrpr %l1,%l2,%cansave; \
145 wrpr %l1,%l2,%canrestore; \
146 restore %g0, %g0, %g0; \
147 load_local_block(reg); \
148 load_in_block(reg); \
149 mov 0x1,%l1; \
150 mov 0x2,%l2; \
151 wrpr %l1,%l2,%cansave; \
152 wrpr %l1,%l2,%canrestore; \
153 restore %g0, %g0, %g0; \
154 load_local_block(reg); \
155 load_in_block(reg); \
156 mov 0x1,%l1; \
157 mov 0x2,%l2; \
158 wrpr %l1,%l2,%cansave; \
159 wrpr %l1,%l2,%canrestore; \
160 restore %g0, %g0, %g0; \
161 load_local_block(reg); \
162 load_in_block(reg); \
163 mov 0x1,%l1; \
164 mov 0x2,%l2; \
165 wrpr %l1,%l2,%cansave; \
166 wrpr %l1,%l2,%canrestore; \
167 restore %g0, %g0, %g0; \
168 load_local_block(reg); \
169 mov 0x1,%l1; \
170 mov 0x2,%l2; \
171 wrpr %l1,%l2,%cansave; \
172 wrpr %l1,%l2,%canrestore; \
173 restore %g0, %g0, %g0; \
174 ldd [reg + 8], %g2; \
175 ldd [reg + 16], %g4; \
176 ldd [reg + 24], %g6; \
177 ldd [reg], %g0
178
179
180!----------------------------------------------------------------------
181! This macro does the read out of the specified register by
182! doing stores
183
184#define read_em_out(reg) \
185 st reg, [%l0]; \
186 or reg, reg, %g1; \
187 ld [%l0],%l1; \
188 cmp %l1,%g1; \
189 tne %icc,BAD_TRAP; \
190 st %g1, [%l0]; \
191 and reg, reg, %g1; \
192 st %g1, [%l0]
193
194!-------------------------------------------------------------------
195! These macros read all of the registers out in a block
196! Because of the way Read_em_out works, %g1 must be the first one
197! that is read out using these macros (otherwise it will get clobbered)
198
199#define read_locals_out() \
200 read_em_out(%l0); \
201 read_em_out(%l1); \
202 read_em_out(%l2); \
203 read_em_out(%l3); \
204 read_em_out(%l4); \
205 read_em_out(%l5); \
206 read_em_out(%l6); \
207 read_em_out(%l7)
208
209#define read_outs_out() \
210 read_em_out(%o0); \
211 read_em_out(%o1); \
212 read_em_out(%o2); \
213 read_em_out(%o3); \
214 read_em_out(%o4); \
215 read_em_out(%o5); \
216 read_em_out(%o6); \
217 read_em_out(%o7)
218
219#define read_ins_out() \
220 read_em_out(%i0); \
221 read_em_out(%i1); \
222 read_em_out(%i2); \
223 read_em_out(%i3); \
224 read_em_out(%i4); \
225 read_em_out(%i5); \
226 read_em_out(%i6); \
227 read_em_out(%i7)
228
229#define read_globals_out() \
230 read_em_out(%g1); \
231 read_em_out(%g0); \
232 read_em_out(%g2); \
233 read_em_out(%g3); \
234 read_em_out(%g4); \
235 read_em_out(%g5); \
236 read_em_out(%g6); \
237 read_em_out(%g7)
238
239!----------------------------------------------------------------------
240! This macro reads out the entire register file (except for any
241! blocks that are mapped out). read the globals out first
242
243#define read_em_all() \
244 mov 0x1,%l1; \
245 mov 0x2,%l2; \
246 wrpr %l1,%l2,%cansave; \
247 wrpr %l1,%l2,%canrestore; \
248 read_globals_out(); \
249 read_outs_out(); \
250 read_locals_out(); \
251 read_ins_out(); \
252 mov 0x1,%l1; \
253 mov 0x2,%l2; \
254 wrpr %l1,%l2,%cansave; \
255 wrpr %l1,%l2,%canrestore; \
256 restore %g0, %g0, %g0; \
257 read_locals_out(); \
258 read_ins_out(); \
259 mov 0x1,%l1; \
260 mov 0x2,%l2; \
261 wrpr %l1,%l2,%cansave; \
262 wrpr %l1,%l2,%canrestore; \
263 restore %g0, %g0, %g0; \
264 read_locals_out(); \
265 read_ins_out(); \
266 mov 0x1,%l1; \
267 mov 0x2,%l2; \
268 wrpr %l1,%l2,%cansave; \
269 wrpr %l1,%l2,%canrestore; \
270 restore %g0, %g0, %g0; \
271 read_locals_out(); \
272 read_ins_out(); \
273 mov 0x1,%l1; \
274 mov 0x2,%l2; \
275 wrpr %l1,%l2,%cansave; \
276 wrpr %l1,%l2,%canrestore; \
277 restore %g0, %g0, %g0; \
278 read_locals_out(); \
279 read_ins_out(); \
280 mov 0x1,%l1; \
281 mov 0x2,%l2; \
282 wrpr %l1,%l2,%cansave; \
283 wrpr %l1,%l2,%canrestore; \
284 restore %g0, %g0, %g0; \
285 read_locals_out(); \
286 read_ins_out(); \
287 mov 0x1,%l1; \
288 mov 0x2,%l2; \
289 wrpr %l1,%l2,%cansave; \
290 wrpr %l1,%l2,%canrestore; \
291 restore %g0, %g0, %g0; \
292 read_locals_out(); \
293 read_ins_out(); \
294 mov 0x1,%l1; \
295 mov 0x2,%l2; \
296 wrpr %l1,%l2,%cansave; \
297 wrpr %l1,%l2,%canrestore; \
298 restore %g0, %g0, %g0; \
299 read_locals_out(); \
300 mov 0x1,%l1; \
301 mov 0x2,%l2; \
302 wrpr %l1,%l2,%cansave; \
303 wrpr %l1,%l2,%canrestore; \
304 restore %g0, %g0, %g0
305
306!----------------------------------------------------------------------
307! These macros load up registers with the cumulative sum of the two
308! specified registers.
309
310#define load_local_sum(reg1, reg2) \
311 mov reg1, %l0; \
312 add reg1, reg2, reg1; \
313 mov reg1, %l1; \
314 add reg1, reg2, reg1; \
315 mov reg1, %l2; \
316 add reg1, reg2, reg1; \
317 mov reg1, %l3; \
318 add reg1, reg2, reg1; \
319 mov reg1, %l4; \
320 add reg1, reg2, reg1; \
321 mov reg1, %l5; \
322 add reg1, reg2, reg1; \
323 mov reg1, %l6; \
324 add reg1, reg2, reg1; \
325 mov reg1, %l7; \
326 add reg1, reg2, reg1
327
328#define load_global_sum(reg1, reg2) \
329 mov reg1, %g0; \
330 add reg1, reg2, reg1; \
331 mov reg1, %g1; \
332 add reg1, reg2, reg1; \
333 mov reg1, %g2; \
334 add reg1, reg2, reg1; \
335 mov reg1, %g3; \
336 add reg1, reg2, reg1; \
337 mov reg1, %g4; \
338 add reg1, reg2, reg1; \
339 mov reg1, %g5; \
340 add reg1, reg2, reg1; \
341 mov reg1, %g6; \
342 add reg1, reg2, reg1; \
343 mov reg1, %g7; \
344 add reg1, reg2, reg1
345
346#define load_in_sum(reg1, reg2) \
347 mov reg1, %i0; \
348 add reg1, reg2, reg1; \
349 mov reg1, %i1; \
350 add reg1, reg2, reg1; \
351 mov reg1, %i2; \
352 add reg1, reg2, reg1; \
353 mov reg1, %i3; \
354 add reg1, reg2, reg1; \
355 mov reg1, %i4; \
356 add reg1, reg2, reg1; \
357 mov reg1, %i5; \
358 add reg1, reg2, reg1; \
359 mov reg1, %i6; \
360 add reg1, reg2, reg1; \
361 mov reg1, %i7; \
362 add reg1, reg2, reg1
363
364#define load_out_sum(reg1, reg2) \
365 mov reg1, %o0; \
366 add reg1, reg2, reg1; \
367 mov reg1, %o1; \
368 add reg1, reg2, reg1; \
369 mov reg1, %o2; \
370 add reg1, reg2, reg1; \
371 mov reg1, %o3; \
372 add reg1, reg2, reg1; \
373 mov reg1, %o4; \
374 add reg1, reg2, reg1; \
375 mov reg1, %o5; \
376 add reg1, reg2, reg1; \
377 mov reg1, %o6; \
378 add reg1, reg2, reg1; \
379 mov reg1, %o7; \
380 add reg1, reg2, reg1
381
382! same as above 4 macros but also forces a read immediately
383! after the write
384
385#define load_local_sum_read(reg1, reg2) \
386 mov reg1, %l0; \
387 add reg1, reg2, reg1; \
388 mov reg1, %l1; \
389 add reg1, reg2, reg1; \
390 add %l0, %l0, %g0; \
391 mov reg1, %l2; \
392 add %l1, %l1, %g0; \
393 add reg1, reg2, reg1; \
394 mov reg1, %l3; \
395 add %l2, %l2, %g0; \
396 add reg1, reg2, reg1; \
397 mov reg1, %l4; \
398 add %l3, %l3, %g0; \
399 add reg1, reg2, reg1; \
400 mov reg1, %l5; \
401 add %l4, %l4, %g0; \
402 add reg1, reg2, reg1; \
403 mov reg1, %l6; \
404 add %l5, %l5, %g0; \
405 add reg1, reg2, reg1; \
406 mov reg1, %l7; \
407 add %l6, %l6, %g0; \
408 add reg1, reg2, reg1; \
409 nop; \
410 add %l7, %l7, %g0
411
412
413#define load_global_sum_read(reg1, reg2) \
414 mov reg1, %g0; \
415 add reg1, reg2, reg1; \
416 mov reg1, %g1; \
417 add reg1, reg2, reg1; \
418 add %g0, %g0, %g0; \
419 mov reg1, %g2; \
420 add %g1, %g1, %g0; \
421 add reg1, reg2, reg1; \
422 mov reg1, %g3; \
423 add %g2, %g2, %g0; \
424 add reg1, reg2, reg1; \
425 mov reg1, %g4; \
426 add %g3, %g3, %g0; \
427 add reg1, reg2, reg1; \
428 mov reg1, %g5; \
429 add %g4, %g4, %g0; \
430 add reg1, reg2, reg1; \
431 mov reg1, %g6; \
432 add %g5, %g5, %g0; \
433 add reg1, reg2, reg1; \
434 mov reg1, %g7; \
435 add %g6, %g6, %g0; \
436 add reg1, reg2, reg1; \
437 nop; \
438 add %g7, %g7, %g0
439
440#define load_in_sum_read(reg1, reg2) \
441 mov reg1, %i0; \
442 add reg1, reg2, reg1; \
443 mov reg1, %i1; \
444 add reg1, reg2, reg1; \
445 add %i0, %i0, %g0; \
446 mov reg1, %i2; \
447 add %i1, %i1, %g0; \
448 add reg1, reg2, reg1; \
449 mov reg1, %i3; \
450 add %i2, %i2, %g0; \
451 add reg1, reg2, reg1; \
452 mov reg1, %i4; \
453 add %i3, %i3, %g0; \
454 add reg1, reg2, reg1; \
455 mov reg1, %i5; \
456 add %i4, %i4, %g0; \
457 add reg1, reg2, reg1; \
458 mov reg1, %i6; \
459 add %i5, %i5, %g0; \
460 add reg1, reg2, reg1; \
461 mov reg1, %i7; \
462 add %i6, %i6, %g0; \
463 add reg1, reg2, reg1; \
464 nop; \
465 add %i7, %i7, %g0
466
467#define load_out_sum_read(reg1, reg2) \
468 mov reg1, %o0; \
469 add reg1, reg2, reg1; \
470 mov reg1, %o1; \
471 add reg1, reg2, reg1; \
472 add %o0, %o0, %g0; \
473 mov reg1, %o2; \
474 add %o1, %o1, %g0; \
475 add reg1, reg2, reg1; \
476 mov reg1, %o3; \
477 add %o2, %o2, %g0; \
478 add reg1, reg2, reg1; \
479 mov reg1, %o4; \
480 add %o3, %o3, %g0; \
481 add reg1, reg2, reg1; \
482 mov reg1, %o5; \
483 add %o4, %o4, %g0; \
484 add reg1, reg2, reg1; \
485 mov reg1, %o6; \
486 add %o5, %o5, %g0; \
487 add reg1, reg2, reg1; \
488 mov reg1, %o7; \
489 add %o6, %o6, %g0; \
490 add reg1, reg2, reg1; \
491 nop; \
492 add %o7, %o7, %g0
493
494!----------------------------------------------------------------------
495! This macro loads up all the visible registers (including globals)
496! using a accumulating sum.
497
498#define ld_sum_mapped(accum, incr, dum1) \
499 mov 0x1,%l1; \
500 mov 0x2,%l2; \
501 wrpr %l1,%l2,%cansave; \
502 wrpr %l1,%l2,%canrestore; \
503 mov accum, %l0; \
504 mov incr, %l1; \
505 mov dum1, %l2; \
506 load_global_sum(accum, incr); \
507 mov %l0, accum; \
508 mov %l1, incr; \
509 mov %l2, dum1; \
510 load_out_sum(accum, incr); \
511 load_local_sum(accum, incr); \
512 load_in_sum(accum, incr); \
513 set 6, dum1; \
514 3: mov 0x1,%l1; \
515 mov 0x2,%l2; \
516 wrpr %l1,%l2,%cansave; \
517 wrpr %l1,%l2,%canrestore; \
518 restore %g0, %g0, %g0; \
519 load_local_sum(accum, incr); \
520 load_in_sum(accum, incr); \
521 subcc dum1, 1, dum1; \
522 bne 3b; \
523 nop; \
524 mov 0x1,%l1; \
525 mov 0x2,%l2; \
526 wrpr %l1,%l2,%cansave; \
527 wrpr %l1,%l2,%canrestore; \
528 restore %g0, %g0, %g0; \
529 load_local_sum(accum, incr)
530
531! Same as above, but uses the macros that cause a read to
532! the just written register
533
534#define ld_sum_mapped_read(accum, incr, dum1) \
535 mov 0x1,%l1; \
536 mov 0x2,%l2; \
537 wrpr %l1,%l2,%cansave; \
538 wrpr %l1,%l2,%canrestore; \
539 mov accum, %l0; \
540 mov incr, %l1; \
541 mov dum1, %l2; \
542 load_global_sum_read(accum, incr); \
543 mov %l0, accum; \
544 mov %l1, incr; \
545 mov %l2, dum1; \
546 load_out_sum_read(accum, incr); \
547 load_local_sum_read(accum, incr); \
548 load_in_sum_read(accum, incr); \
549 set 6, dum1; \
550 3: mov 0x1,%l1; \
551 mov 0x2,%l2; \
552 wrpr %l1,%l2,%cansave; \
553 wrpr %l1,%l2,%canrestore; \
554 restore %g0, %g0, %g0; \
555 load_local_sum_read(accum, incr); \
556 load_in_sum_read(accum, incr); \
557 subcc dum1, 1, dum1; \
558 bne 3b; \
559 nop; \
560 mov 0x1,%l1; \
561 mov 0x2,%l2; \
562 wrpr %l1,%l2,%cansave; \
563 wrpr %l1,%l2,%canrestore; \
564 restore %g0, %g0, %g0; \
565 load_local_sum_read(accum, incr)