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