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