|
|
1.1 root 1:
2:
3: #include "fpp_defs.h"
4:
5:
6: /*****************************************************************************
7: *
8: * PIPELINE TEST #1 MONITOR
9: *
10: * This test will do:
11: *
12: * LDF(x), SUBF(x), SUBF(x), ADDF(x), ADDF(x), STF
13: *
14: * where the x's are the fmacro1 LDF data patterns.
15: *****************************************************************************/
16: pipe_1()
17: {
18: asm(".globl _pipeline_1_t");
19: asm("_pipeline_1_t:"); /* entry address */
20: if( (cycle == 1) && (prt_hdrs) ) /* print headers on 1st cycle */
21: {
22: writes("\n PIPE_1 ");
23: }
24: subtest = 1;
25: pipe1_1(); /* data in REGs, no NOPs */
26: subtest++; /* increment subtest num */
27: pipe1_2(); /* data in REGs, 1 NOP */
28: subtest++; /* increment subtest num */
29: pipe1_3(); /* data in REGs, 2 NOPs */
30: subtest++; /* increment subtest num */
31: pipe1_4(); /* data in REGs, 3 NOPs */
32: subtest++; /* increment subtest num */
33: pipe1_5(); /* data in CACHE, no NOPs */
34: subtest++; /* increment subtest num */
35: pipe1_6(); /* data in CACHE, 1 NOP */
36: subtest++; /* increment subtest num */
37: pipe1_7(); /* data in CACHE, 2 NOPs */
38: subtest++; /* increment subtest num */
39: pipe1_8(); /* data in CACHE, 3 NOPs */
40: subtest++; /* increment subtest num */
41: pipe1_9(); /* data on STACK, no NOPs */
42: subtest++; /* increment subtest num */
43: pipe1_10(); /* data via FP no NOPs */
44: asm("jmp *return"); /* return to the test monitor */
45: }
46:
47:
48:
49:
50:
51:
52: /************************************************************************
53: *
54: * SUBTEST 1
55: * data in registers, no NO-OPs
56: *
57: ************************************************************************/
58: pipe1_1()
59: {
60: force_loop = FALSE; /* clear the force_loop flg */
61: index = 0;
62: do
63: {
64: sgl_value_1 = ldf_1_data[index].ld; /* get operand 1 */
65: sgl_expected = ldf_1_data[index].exp; /* get expected results */
66: /*
67: * If LOOP ON ERROR is set, this is the loop for this subtest.
68: * The force loop flag is set after the first error.
69: */
70: asm("_pipe1_1_lp1:");
71: asm("movl _sgl_value_1,r4"); /* move the data to r4 */
72: asm("ldf r4"); /* load the operand */
73: asm("subf r4"); /* subtract it (twice ) */
74: asm("subf r4");
75: asm("addf r4"); /* add it back (twice) */
76: asm("addf r4");
77: asm("stf r5"); /* store the result */
78: if ( force_loop );
79: asm("brb _pipe1_1_lp1");; /* loop on the error */
80: /*
81: * verify the results
82: */
83: asm("movl r5,_sgl_st_acc"); /* get the result */
84: if( sgl_st_acc != sgl_expected ) /* COMPARE the values */
85: {
86: errcnt++; /* bump the error count */
87: if ( prt_error )
88: print_pipe1_er("Reg. Data, no NO-OPs");
89: if ( halt_flg ) /* halt on error? */
90: pipe1_er_hlt( subtest );
91: if ( loop_on_err ) {
92: force_loop = TRUE; /* set the force loop flag */
93: asm("brw _pipe1_1_lp1"); /* and loop */
94: }
95: } /* end of compare error */
96: } while( index++ < max_ldf_1_index );
97: } /* end of subtest 1 */
98:
99:
100:
101:
102:
103:
104: /************************************************************************
105: *
106: * SUBTEST 2
107: * data in registers, 1 NO-OP
108: *
109: ************************************************************************/
110: pipe1_2()
111: {
112: force_loop = FALSE; /* clear force_loop flag */
113: index = 0;
114: do
115: {
116: sgl_value_1 = ldf_1_data[index].ld; /* get operand 1 */
117: sgl_expected = ldf_1_data[index].exp; /* get expected results */
118: /*
119: * If LOOP ON ERROR is set, this is the loop for this subtest.
120: * The force loop flag is set after the first error.
121: */
122: asm("_pipe1_2_lp1:");
123: asm("movl _sgl_value_1,r4"); /* move the data to r4 */
124: asm("ldf r4"); /* load the data operand */
125: asm("nop");
126: asm("subf r4"); /* subtract the data (2xs) */
127: asm("nop");
128: asm("subf r4");
129: asm("nop");
130: asm("addf r4"); /* add it back (2xs) */
131: asm("nop");
132: asm("addf r4");
133: asm("nop");
134: asm("stf r5"); /* store the result */
135: if ( force_loop );
136: asm("brb _pipe1_2_lp1");; /* loop on the error */
137: /*
138: * verify the results
139: */
140: asm("movl r5,_sgl_st_acc"); /* get the result */
141: if( sgl_st_acc != sgl_expected ) /* COMPARE the values */
142: {
143: errcnt++; /* bump the error count */
144: if ( prt_error )
145: print_pipe1_er("Reg. Data, 1 NO-OP");
146: if ( halt_flg ) /* halt on error? */
147: pipe1_er_hlt( subtest );
148: if ( loop_on_err ) {
149: force_loop = TRUE; /* set the force loop flag */
150: asm("brw _pipe1_2_lp1"); /* and loop */
151: }
152: } /* end of compare error */
153: } while( index++ < max_ldf_1_index );
154: } /* end of subtest 2 */
155:
156:
157:
158:
159:
160:
161: /************************************************************************
162: *
163: * SUBTEST 3
164: * data in registers, 2 NO-OPs
165: *
166: ************************************************************************/
167: pipe1_3()
168: {
169: force_loop = FALSE; /* clear force_loop flag */
170: index = 0;
171: do
172: {
173: sgl_value_1 = ldf_1_data[index].ld; /* get operand 1 */
174: sgl_expected = ldf_1_data[index].exp; /* get expected results */
175: /*
176: * If LOOP ON ERROR is set, this is the loop for this subtest.
177: * The force loop flag is set after the first error.
178: */
179: asm("_pipe1_3_lp1:");
180: asm("movl _sgl_value_1,r4"); /* move the data to r4 */
181: asm("ldf r4"); /* loadthe operand */
182: asm("nop");
183: asm("nop");
184: asm("subf r4"); /* subtract the data (2xs) */
185: asm("nop");
186: asm("nop");
187: asm("subf r4");
188: asm("nop");
189: asm("nop");
190: asm("addf r4"); /* add it back (2xs) */
191: asm("nop");
192: asm("nop");
193: asm("addf r4");
194: asm("nop");
195: asm("nop");
196: asm("stf r5"); /* store the result */
197: if ( force_loop );
198: asm("brb _pipe1_3_lp1");; /* loop on the error */
199: /*
200: * verify the results
201: */
202: asm("movl r5,_sgl_st_acc"); /* get the result */
203: if( sgl_st_acc != sgl_expected ) /* COMPARE the values */
204: {
205: errcnt++; /* bump the error count */
206: if ( prt_error )
207: print_pipe1_er("Reg. Data, 2 NO-OPs");
208: if ( halt_flg ) /* halt on error? */
209: pipe1_er_hlt( subtest );
210: if ( loop_on_err ) {
211: force_loop = TRUE; /* set the force loop flag */
212: asm("brw _pipe1_3_lp1"); /* and loop */
213: }
214: } /* end of compare error */
215: } while( index++ < max_ldf_1_index );
216: } /* end of subtest 3 */
217:
218:
219:
220:
221:
222:
223: /************************************************************************
224: *
225: * SUBTEST 4
226: * data in registers, 3 NO-OPs
227: *
228: ************************************************************************/
229: pipe1_4()
230: {
231: force_loop = FALSE; /* clear force_loop flag */
232: index = 0;
233: do
234: {
235: sgl_value_1 = ldf_1_data[index].ld; /* get operand 1 */
236: sgl_expected = ldf_1_data[index].exp; /* get expected results */
237: /*
238: * If LOOP ON ERROR is set, this is the loop for this subtest.
239: * The force loop flag is set after the first error.
240: */
241: asm("_pipe1_4_lp1:");
242: asm("movl _sgl_value_1,r4"); /* move the data to r4 */
243: asm("ldf r4"); /* load the operand */
244: asm("nop");
245: asm("nop");
246: asm("nop");
247: asm("subf r4"); /* subtract the data (2xs) */
248: asm("nop");
249: asm("nop");
250: asm("nop");
251: asm("subf r4");
252: asm("nop");
253: asm("nop");
254: asm("nop");
255: asm("addf r4"); /* add it back (2xs) */
256: asm("nop");
257: asm("nop");
258: asm("nop");
259: asm("addf r4");
260: asm("nop");
261: asm("nop");
262: asm("nop");
263: asm("stf r5"); /* store the result */
264: if ( force_loop );
265: asm("brb _pipe1_4_lp1");; /* loop on the error */
266: /*
267: * verify the results
268: */
269: asm("movl r5,_sgl_st_acc"); /* get the result */
270: if( sgl_st_acc != sgl_expected ) /* COMPARE the values */
271: {
272: errcnt++; /* bump the error count */
273: if ( prt_error )
274: print_pipe1_er("Reg. Data, 3 NO-OPs");
275: if ( halt_flg ) /* halt on error? */
276: pipe1_er_hlt( subtest );
277: if ( loop_on_err ) {
278: force_loop = TRUE; /* set the force loop flag */
279: asm("brw _pipe1_4_lp1"); /* and loop */
280: }
281: } /* end of compare error */
282: } while( index++ < max_ldf_1_index );
283: } /* end of subtest 4 */
284:
285:
286:
287:
288:
289:
290:
291: /************************************************************************
292: *
293: * SUBTEST 5
294: * data in Cache, no NO-OPs
295: *
296: ************************************************************************/
297: pipe1_5()
298: {
299: force_loop = FALSE; /* clear force_loop flag */
300: index = 0;
301: do
302: {
303: sgl_value_1 = ldf_1_data[index].ld; /* get operand 1 */
304: sgl_expected = ldf_1_data[index].exp; /* get expected results */
305: /*
306: * If LOOP ON ERROR is set, this is the loop for this subtest.
307: * The force loop flag is set after the first error.
308: */
309: asm("_pipe1_5_lp1:");
310: asm("ldf _sgl_value_1"); /* load the operand */
311: asm("subf _sgl_value_1"); /* subtract it (twice) */
312: asm("subf _sgl_value_1");
313: asm("addf _sgl_value_1"); /* add it back (twice) */
314: asm("addf _sgl_value_1");
315: asm("stf _sgl_st_acc"); /* store the result */
316: if ( force_loop );
317: asm("brb _pipe1_5_lp1");; /* loop on the error */
318: /*
319: * verify the results
320: */
321: if( sgl_st_acc != sgl_expected ) /* COMPARE the values */
322: {
323: errcnt++; /* bump the error count */
324: if ( prt_error )
325: print_pipe1_er("Cache Data, no NO-OPs");
326: if ( halt_flg ) /* halt on error? */
327: pipe1_er_hlt( subtest );
328: if ( loop_on_err ) {
329: force_loop = TRUE; /* set the force loop flag */
330: asm("brw _pipe1_5_lp1"); /* and loop */
331: }
332: } /* end of compare error */
333: } while( index++ < max_ldf_1_index );
334: } /* end of subtest 5 */
335:
336:
337:
338:
339:
340:
341: /************************************************************************
342: *
343: * SUBTEST 6
344: * data in Cache, 1 NO-OP
345: *
346: ************************************************************************/
347: pipe1_6()
348: {
349: force_loop = FALSE; /* clear force_loop flag */
350: index = 0;
351: do
352: {
353: sgl_value_1 = ldf_1_data[index].ld; /* get operand 1 */
354: sgl_expected = ldf_1_data[index].exp; /* get expected results */
355: /*
356: * If LOOP ON ERROR is set, this is the loop for this subtest.
357: * The force loop flag is set after the first error.
358: */
359: asm("_pipe1_6_lp1:");
360: asm("ldf _sgl_value_1"); /* load the operand */
361: asm("nop");
362: asm("subf _sgl_value_1"); /* subtract it (twice) */
363: asm("nop");
364: asm("subf _sgl_value_1");
365: asm("nop");
366: asm("addf _sgl_value_1"); /* add it back (twice) */
367: asm("nop");
368: asm("addf _sgl_value_1");
369: asm("nop");
370: asm("stf _sgl_st_acc"); /* store the result */
371: if ( force_loop );
372: asm("brb _pipe1_6_lp1");; /* loop on the error */
373: /*
374: * verify the results
375: */
376: if( sgl_st_acc != sgl_expected ) /* COMPARE the values */
377: {
378: errcnt++; /* bump the error count */
379: if ( prt_error )
380: print_pipe1_er("Cache Data, 1 NO-OP");
381: if ( halt_flg ) /* halt on error? */
382: pipe1_er_hlt( subtest );
383: if ( loop_on_err ) {
384: force_loop = TRUE; /* set the force loop flag */
385: asm("brw _pipe1_6_lp1"); /* and loop */
386: }
387: } /* end of compare error */
388: } while( index++ < max_ldf_1_index );
389: } /* end of subtest 6 */
390:
391:
392:
393:
394:
395:
396: /************************************************************************
397: *
398: * SUBTEST 7
399: * data in Cache, 2 NO-OPs
400: *
401: ************************************************************************/
402: pipe1_7()
403: {
404: force_loop = FALSE; /* clear force_loop flag */
405: index = 0;
406: do
407: {
408: sgl_value_1 = ldf_1_data[index].ld; /* get operand 1 */
409: sgl_expected = ldf_1_data[index].exp; /* get expected results */
410: /*
411: * If LOOP ON ERROR is set, this is the loop for this subtest.
412: * The force loop flag is set after the first error.
413: */
414: asm("_pipe1_7_lp1:");
415: asm("ldf _sgl_value_1"); /* load the operand */
416: asm("nop");
417: asm("nop");
418: asm("subf _sgl_value_1"); /* subtract it (twice) */
419: asm("nop");
420: asm("nop");
421: asm("subf _sgl_value_1");
422: asm("nop");
423: asm("nop");
424: asm("addf _sgl_value_1"); /* add it back (twice) */
425: asm("nop");
426: asm("nop");
427: asm("addf _sgl_value_1");
428: asm("nop");
429: asm("nop");
430: asm("stf _sgl_st_acc"); /* store the result */
431: if ( force_loop );
432: asm("brb _pipe1_7_lp1");; /* loop on the error */
433: /*
434: * verify the results
435: */
436: if( sgl_st_acc != sgl_expected ) /* COMPARE the values */
437: {
438: errcnt++; /* bump the error count */
439: if ( prt_error )
440: print_pipe1_er("Cache Data, 2 NO-OPs");
441: if ( halt_flg ) /* halt on error? */
442: pipe1_er_hlt( subtest );
443: if ( loop_on_err ) {
444: force_loop = TRUE; /* set the force loop flag */
445: asm("brw _pipe1_7_lp1"); /* and loop */
446: }
447: } /* end of compare error */
448: } while( index++ < max_ldf_1_index );
449: } /* end of subtest 7 */
450:
451:
452:
453:
454:
455:
456: /************************************************************************
457: *
458: * SUBTEST 8
459: * data in Cache, 3 NO-OPs
460: *
461: ************************************************************************/
462: pipe1_8()
463: {
464: force_loop = FALSE; /* clear force_loop flag */
465: index = 0;
466: do
467: {
468: sgl_value_1 = ldf_1_data[index].ld; /* get operand 1 */
469: sgl_expected = ldf_1_data[index].exp; /* get expected results */
470: /*
471: * If LOOP ON ERROR is set, this is the loop for this subtest.
472: * The force loop flag is set after the first error.
473: */
474: asm("_pipe1_8_lp1:");
475: asm("ldf _sgl_value_1"); /* load the operand */
476: asm("nop");
477: asm("nop");
478: asm("nop");
479: asm("subf _sgl_value_1"); /* subtract it (twice) */
480: asm("nop");
481: asm("nop");
482: asm("nop");
483: asm("subf _sgl_value_1");
484: asm("nop");
485: asm("nop");
486: asm("nop");
487: asm("addf _sgl_value_1"); /* add it back (twice) */
488: asm("nop");
489: asm("nop");
490: asm("nop");
491: asm("addf _sgl_value_1");
492: asm("nop");
493: asm("nop");
494: asm("nop");
495: asm("stf _sgl_st_acc"); /* store the result */
496: if ( force_loop );
497: asm("brb _pipe1_8_lp1");; /* loop on the error */
498: /*
499: * verify the results
500: */
501: if( sgl_st_acc != sgl_expected ) /* COMPARE the values */
502: {
503: errcnt++; /* bump the error count */
504: if ( prt_error )
505: print_pipe1_er("Cache Data, 3 NO-OPs");
506: if ( halt_flg ) /* halt on error? */
507: pipe1_er_hlt( subtest );
508: if ( loop_on_err ) {
509: force_loop = TRUE; /* set the force loop flag */
510: asm("brw _pipe1_8_lp1"); /* and loop */
511: }
512: } /* end of compare error */
513: } while( index++ < max_ldf_1_index );
514: } /* end of subtest 8 */
515:
516:
517:
518:
519:
520:
521: /*****************************************************************************
522: *
523: * SUBTEST 9
524: * data on the stack, no NO-OPs
525: *
526: *****************************************************************************/
527: pipe1_9()
528: {
529: asm("moval (r13),_pre_event_fp"); /* save the frame pointer */
530: asm("moval (r14),_pre_event_sp"); /* save the stack pointer */
531: force_loop = FALSE; /* clear force_loop flag */
532: index = 0;
533: do
534: {
535: sgl_value_1 = ldf_1_data[index].ld; /* get operand 1 */
536: sgl_expected = ldf_1_data[index].exp; /* get expected results */
537: asm("moval _pointer_data,_sgl_value_2");/* init / final SP value */
538: /*
539: * If LOOP ON ERROR is set, this is the loop for this subtest.
540: * The force loop flag is set after the first error.
541: */
542: asm("_pipe1_9_lp1:");
543: asm("moval _pointer_data,r14"); /* set the stack pointer */
544: asm("movl _sgl_value_1,-(r14)"); /* push the operand 5 times */
545: asm("movl _sgl_value_1,-(r14)");
546: asm("movl _sgl_value_1,-(r14)");
547: asm("movl _sgl_value_1,-(r14)");
548: asm("movl _sgl_value_1,-(r14)");
549: /*
550: * now pop the data off the stack
551: */
552: asm("ldf (r14)+"); /* pop the data & load it */
553: asm("subf (r14)+"); /* subtract it (twice) */
554: asm("subf (r14)+");
555: asm("addf (r14)+"); /* add it back (twice) */
556: asm("addf (r14)+");
557: asm("stf r5"); /* store the result */
558: if ( force_loop );
559: asm("brb _pipe1_9_lp1");; /* loop on the error */
560: /*
561: * verify the results
562: */
563: asm("movl r5,_sgl_st_acc"); /* get the result */
564: asm("moval (r14),_sgl_value_3"); /* save the stack pointer */
565: if( (sgl_st_acc != sgl_expected) || /* verify the result... */
566: (sgl_value_3 != sgl_value_2) ) /* ... and the final SP */
567: {
568: asm("movl _pre_event_fp,r13"); /* restore frame pointer */
569: asm("movl _pre_event_sp,r14"); /* restore stack pointer */
570: errcnt++; /* bump the error count */
571: if ( prt_error ) {
572: print_pipe1_er("POP data from the SP");
573: writes("final Stack Pointer = ");
574: write32h( sgl_value_3 );
575: writes(", expected SP = ");
576: write32h( sgl_value_2 );
577: writes(" \n");
578: }
579: if ( halt_flg ) /* halt on error? */
580: pipe1_er_hlt( subtest );
581: if ( loop_on_err ) {
582: force_loop = TRUE; /* set the force loop flag */
583: asm("brw _pipe1_9_lp1"); /* and loop */
584: }
585: } /* end of compare error */
586: } while( index++ < max_ldf_1_index );
587: asm("movl _pre_event_fp,r13"); /* restore the frame pointer */
588: asm("movl _pre_event_sp,r14"); /* restore the stack pointer */
589: } /* end of subtest 9 */
590:
591:
592:
593:
594:
595:
596: /******************************************************************************
597: *
598: * SUBTEST 10
599: * load 0, add operand 4 times -get data via indexed FRAME pointer
600: *
601: * ADDR INDEX DATA
602: * pointer_data 4 <the STF result goes here>
603: * pointer_data-4 3 <operand data>
604: * pointer_data-16 0 point the frame pointer here
605: *
606: ******************************************************************************/
607: pipe1_10()
608: {
609: asm("moval (r13),_pre_event_fp"); /* save the frame pointer */
610: asm("moval (r14),_pre_event_sp"); /* save the stack pointer */
611: force_loop = FALSE; /* clear force_loop flag */
612: index = 0;
613: do
614: {
615: sgl_value_1 = ldf_1_data[index].ld; /* get operand 1 */
616: sgl_expected = ldf_1_data[index].exp; /* get expected results */
617: asm("moval _pointer_data,_sgl_value_2");/* init / final SP value */
618: /*
619: * If LOOP ON ERROR is set, this is the loop for this subtest.
620: * The force loop flag is set after the first error.
621: */
622: asm("_pipe1_10_lp1:");
623: asm("moval _pointer_data,_sgl_value_2");/* get store data's addr */
624: sgl_value_2 -= 4; /* decrement it by 4 (bytes)*/
625: asm("movl _sgl_value_1,*_sgl_value_2");/* set the operand data */
626: sgl_value_2 -= 12; /* get the FP addr to use */
627: asm("movl _sgl_value_2,r13"); /* set the FRAME POINTER */
628: asm("movl $3,r5"); /* r5 index = 3 longwords */
629: asm("movl $4,r6"); /* r6 index = 4 longwords */
630: asm("ldf (r13)[r5]"); /* load -indexed by r5 */
631: asm("subf (r13)[r5]"); /* subtract it (twice) */
632: asm("subf (r13)[r5]");
633: asm("addf (r13)[r5]"); /* add it back (twice) */
634: asm("addf (r13)[r5]");
635: asm("stf (r13)[r6]"); /* store -indexed by r6 */
636: if ( force_loop );
637: asm("brw _pipe1_10_lp1");; /* loop on the error */
638: /*
639: * verify the results
640: */
641: sgl_st_acc = pointer_data; /* move the stored result */
642: asm("moval (r13),_sgl_value_3"); /* save the frame pointer */
643: if( (sgl_st_acc != sgl_expected) || /* verify the result... */
644: (sgl_value_3 != sgl_value_2) ) /* ... and the final FP */
645: {
646: asm("movl _pre_event_fp,r13"); /* restore frame pointer */
647: asm("movl _pre_event_sp,r14"); /* restore stack pointer */
648: errcnt++; /* bump the error count */
649: if ( prt_error ) {
650: print_pipe1_er("indexed FP addressing");
651: writes("final Frame Pointer = ");
652: writeh( sgl_value_3 );
653: writes(", expected FP = ");
654: writeh( sgl_value_2 );
655: writes(" \n");
656: }
657: if ( halt_flg ) /* halt on error? */
658: pipe1_er_hlt( subtest );
659: if ( loop_on_err ) {
660: force_loop = TRUE; /* set the force loop flag */
661: asm("brw _pipe1_10_lp1"); /* and loop */
662: }
663: } /* end of compare error */
664: } while( index++ < max_ldf_1_index );
665: asm("movl _pre_event_fp,r13"); /* restore the frame pointer */
666: asm("movl _pre_event_sp,r14"); /* restore the stack pointer */
667: } /* end of subtest 10 */
668:
669:
670:
671:
672:
673: /******************************************************************************
674: *
675: * ERROR ROUTINE
676: *
677: * print an error in the following form
678: *
679: * operand = xxxxxxxx, final Acc = xxxxxxxx, data index = dd
680: * expected Acc = xxxxxxxx
681: *
682: ******************************************************************************/
683: print_pipe1_er(msg)
684: char *msg;
685: {
686: writes(" \n"); /* start a new print line */
687: writes("cycle: ");
688: writed( cycle );
689: writes(" test ");
690: writed( test_no );
691: writes(" (Pipe 1), subtest ");
692: writed( subtest );
693: writes(" error - ");
694: writes( msg );
695: writec('\n');
696: writes(" LDF(op1), SUBF(op1), SUBF(op1), ADDF(op1), ADDF(op1), STF\n");
697: writes("operand = ");
698: write32h( sgl_value_1 );
699: writes(", final Acc = ");
700: write32h( sgl_st_acc );
701: writes(", data index = ");
702: writed( index );
703: writec('\n');
704: writes(" expected Acc = ");
705: write32h( sgl_expected );
706: writec('\n');
707: }
708:
709:
710:
711:
712:
713: /******************************************************************************
714: *
715: * HALT ON ERROR ROUTINE
716: *
717: * halt with the necessary information saved in the registers
718: *
719: ******************************************************************************/
720: pipe1_er_hlt( subtest )
721: int subtest;
722: {
723: asm("movl _test_no,r0"); /* r0 = test number */
724: asm("movl _subtest,r1"); /* r1 = subtest number */
725: asm("movl $1,r2"); /* r2 = error code */
726: asm("movl _cycle,r3"); /* r3 = cycle count */
727: asm("movl _sgl_value_1,r4"); /* r4 = sgl operand */
728: asm("movl _sgl_st_acc,r5"); /* r5 = sgl stored */
729: asm("movl _sgl_expected,r6"); /* r6 = sgl expected */
730: asm("movl _index,r7"); /* r7 = data index */
731: if( subtest == 9 ) {
732: asm("movl _sgl_value_3,r8"); /* r8 = final SP value */
733: asm("movl _sgl_value_2,r9"); /* r9 = expected SP value */
734: } else
735: if( subtest == 10 ) {
736: asm("movl _sgl_value_3,r8"); /* r8 = final FP value */
737: asm("movl _sgl_value_2,r9"); /* r9 = expected FP value */
738: };
739: asm(".globl _pipe1_1_hlt");
740: asm("_pipe1_1_hlt:"); /* PC after the halt */
741: asm("halt"); /* HALT ... */
742: } /* end of halt on error */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.