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