|
|
1.1 root 1:
2: #include "fpp_defs.h"
3:
4:
5: /*****************************************************************************
6: *
7: * LDD_STD - DOUBLE PRECISION FLOATING POINT LOAD_STORE TEST
8: *
9: *****************************************************************************/
10: ldd()
11: {
12: asm(".globl _ldd_t");
13: asm("_ldd_t:"); /* entry address */
14: if( ( cycle == 1 ) && ( prt_hdrs ) ) /* print headers on 1st pass */
15: writes("\n LDD_STD");
16: ldd_1(); /* load through a register */
17: ldd_2(); /* load through the cache */
18: ldd_3(); /* register stability ldd */
19: ldd_4(); /* register stability std */
20: ldd_5(); /* PSL stability test ldd */
21: ldd_6(); /* PSL stability test std */
22: asm("jmp *return"); /* return to the test monitor */
23: }
24:
25:
26:
27: /************************************************************************
28: *
29: * SUBTEST 1 - load through a register
30: *
31: ************************************************************************/
32: ldd_1()
33: {
34: force_loop = FALSE;
35: subtest = 1;
36: for( index = 0; index < max_ldd_1_index; index++ ) {
37: dbl_ld_acc = ldd_1_data[index].ld; /* get the operand */
38: if( dbl_ld_acc.m & 0x7f800000 )
39: dbl_expected = dbl_ld_acc; /* expected = loaded */
40: else {
41: dbl_expected.m = 0; /* expect a '0' */
42: dbl_expected.l = 0;
43: }
44: sgl_value_1 = dbl_ld_acc.m;
45: sgl_value_2 = dbl_ld_acc.l;
46: /*
47: * If LOOP ON ERROR is set, this is the loop for this subtest.
48: * The force loop flag is set after the first error.
49: */
50: asm("_ldd_1_lp1:");
51: asm("movl _sgl_value_1,r4"); /* move the operand to r4/r5 */
52: asm("movl _sgl_value_2,r5");
53: asm("ldd r4"); /* load the value */
54: asm("nop");
55: asm("std r8"); /* store the result in R8 */
56: if( force_loop )
57: asm("brb _ldd_1_lp1");; /* loop on the error */
58: /*
59: * end error loop - test the results
60: */
61: asm("movl r8,_dbl_st_acc"); /* save the stored data */
62: asm("movl r9,_dbl_st_acc+4");
63: if( ( dbl_st_acc.m != dbl_expected.m ) || /* COMPARE the */
64: ( dbl_st_acc.l != dbl_expected.l ) ) { /* values */
65: errcnt++; /* bump the error count */
66: if( prt_error ) {
67: writes(" \n"); /* start a new print line */
68: writes("cycle: ");
69: writed( cycle );
70: writes(" LDD_STD test ");
71: writed( test_no );
72: writes(", subtest 1 (Reg. Data) - BAD FINAL ACC\n");
73: print_ldd_data();
74: writes(", index = ");
75: writed( index );
76: writec('\n');
77: writes(" Acc expected = ");
78: write32h( dbl_expected.m );
79: writec(' ');
80: write32h(dbl_expected.l );
81: writec('\n');
82: }
83: if( halt_flg )
84: ldd_er_halt( BAD_ACC_HLT ); /* halt on the error */
85: if( loop_on_err ) {
86: force_loop = TRUE; /* set the force loop flag */
87: asm("brw _ldd_1_lp1");; /* and loop on the error */
88: } /* end of loop on error */
89: } /* end of compare error */
90: } /* end of WHILE loop */
91: } /* end of subtest 1 */
92:
93:
94:
95: /************************************************************************
96: *
97: * SUBTEST 2 - load through cache
98: *
99: ************************************************************************/
100: ldd_2()
101: {
102: force_loop = FALSE;
103: subtest = 2;
104: for( index = 0; index < max_ldd_1_index; index++ ) {
105: dbl_ld_acc = ldd_1_data[index].ld; /* get the operand */
106: if( dbl_ld_acc.m & 0x7f800000 )
107: dbl_expected = dbl_ld_acc; /* expected = loaded */
108: else {
109: dbl_expected.m = 0; /* expect a '0' */
110: dbl_expected.l = 0;
111: }
112: /*
113: * If LOOP ON ERROR is set, this is the loop for this subtest.
114: * The force loop flag is set after the first error.
115: */
116: asm("_ldd_2_lp1:");
117: asm("ldd _dbl_ld_acc"); /* load the value */
118: asm("nop");
119: asm("std _dbl_st_acc"); /* store the result */
120: if( force_loop )
121: asm("brb _ldd_2_lp1");; /* loop on the error */
122: /*
123: * end error loop - test the results
124: */
125: if( ( dbl_st_acc.m != dbl_expected.m ) || /* COMPARE the */
126: ( dbl_st_acc.l != dbl_expected.l ) ) { /* values */
127: errcnt++; /* bump the error count */
128: if( prt_error ) {
129: writes(" \n"); /* start a new print line */
130: writes("cycle: ");
131: writed( cycle );
132: writes(" LDD_STD test ");
133: writed( test_no );
134: writes(", subtest 2 (Cache Data) - BAD FINAL ACC\n");
135: print_ldd_data();
136: writes(", index = ");
137: writed( index );
138: writec('\n');
139: writes(" Acc expected = ");
140: write32h( dbl_expected.m );
141: writec(' ');
142: write32h( dbl_expected.l );
143: writec('\n');
144: }
145: if( halt_flg )
146: ldd_er_halt( BAD_ACC_HLT ); /* halt on the error */
147: if( loop_on_err ) {
148: force_loop = TRUE; /* set the force loop flag */
149: asm("brw _ldd_2_lp1");; /* and loop on the error */
150: } /* end of loop on error */
151: } /* end of compare error */
152: } /* end of WHILE loop */
153: } /* end of subtest 2 */
154:
155:
156:
157: /************************************************************************
158: *
159: * SUBTEST 3 - Check for register corruption (ldd)
160: *
161: ************************************************************************/
162: ldd_3()
163: {
164: force_loop = FALSE; /* clear force_loop flg */
165: subtest = 3;
166: fill_reg_buf( load_regs ); /* get patterns for regs */
167: index = 0;
168: dbl_ld_acc = ldd_1_data[0].ld; /* get value to load */
169: if( dbl_ld_acc.m & 0x7f800000 )
170: dbl_expected = dbl_ld_acc; /* expected = loaded */
171: else {
172: dbl_expected.m = 0; /* expect a '0' */
173: dbl_expected.l = 0;
174: }
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("_ldd_3_lp1:");
180: asm("loadr $0x1fff,_load_regs"); /* load regs 0 - 12 */
181: asm("nop");
182: asm("ldd _dbl_ld_acc"); /* load the accumulator */
183: asm("nop");
184: asm("storer $0x1fff,_store_regs"); /* store regs 0 - 12 */
185: asm("nop");
186: asm("std _dbl_st_acc"); /* save the accumulator */
187: if( force_loop )
188: asm("brb _ldd_3_lp1");; /* loop on the error */
189: /*
190: * Now compare the stored register values to those that were loaded
191: */
192: index2 = 0;
193: while( (load_regs[index2] == store_regs[index2]) && (index2 < 13) )
194: index2++; /* check reg values */
195: if( index2 < 13 ) { /* error if index2 < 13 */
196: errcnt++; /* bump the error count */
197: if( prt_error ) {
198: writes(" \n"); /* start a new print line */
199: writes("cycle: ");
200: writed( cycle );
201: writes(" LDD_STD test ");
202: writed( test_no );
203: writes(", subtest 3 - A REGISTER WAS MODIFIED\n");
204: print_ldd_data(); /* print the operands */
205: writes("\nregister "); /* print the information */
206: writed( index2 ); /* about the corrupted */
207: writes(" = "); /* register */
208: write32h( store_regs[index2] );
209: writes(", should be = ");
210: write32h( load_regs[index2] );
211: writes("\n");
212: }
213: if( halt_flg )
214: ldd_er_halt( BAD_REG_HLT ); /* halt on the error */
215: if( loop_on_err ) {
216: force_loop = TRUE; /* set the force loop flag */
217: asm("brw _ldd_3_lp1");; /* and loop on the error */
218: } /* end of loop on error */
219: } /* end of register corruption error */
220: } /* end of subtest 3 */
221:
222:
223:
224: /************************************************************************
225: *
226: * SUBTEST 4 - Check for register corruption (std)
227: *
228: ************************************************************************/
229: ldd_4()
230: {
231: force_loop = FALSE; /* clear force_loop flg */
232: subtest = 4;
233: fill_reg_buf( load_regs ); /* get patterns for regs */
234: index = 0;
235: dbl_ld_acc = ldd_1_data[0].ld; /* get value to store */
236: /*
237: * If LOOP ON ERROR is set, this is the loop for this subtest.
238: * The force loop flag is set after the first error.
239: */
240: asm("_ldd_4_lp1:");
241: asm("ldd _dbl_ld_acc"); /* load the accumulator */
242: asm("nop");
243: asm("loadr $0x1fff,_load_regs"); /* load regs 0 - 12 */
244: asm("nop");
245: asm("std _dbl_st_acc"); /* save the accumulator */
246: asm("nop");
247: asm("storer $0x1fff,_store_regs"); /* store regs 0 - 12 */
248: if( force_loop )
249: asm("brb _ldd_4_lp1");; /* loop on the error */
250: /*
251: * Now compare the stored register values to those that were loaded
252: */
253: index2 = 0;
254: while( (load_regs[index2] == store_regs[index2]) && (index2 < 13) )
255: index2++; /* check reg values */
256: if( index2 < 13 ) { /* error if index2 < 13 */
257: errcnt++; /* bump the error count */
258: if( prt_error ) {
259: writes(" \n"); /* start a new print line */
260: writes("cycle: ");
261: writed( cycle );
262: writes(" LDD_STD test ");
263: writed( test_no );
264: writes(", subtest 4 - A REGISTER WAS MODIFIED\n");
265: print_ldd_data(); /* print the operands */
266: writes("\nregister "); /* print the information */
267: writed( index2 ); /* about the corrupted */
268: writes(" = "); /* register */
269: write32h( store_regs[index2] );
270: writes(", should be = ");
271: write32h( load_regs[index2] );
272: writes("\n");
273: }
274: if( halt_flg )
275: ldd_er_halt( BAD_REG_HLT ); /* halt on the error */
276: if( loop_on_err ) {
277: force_loop = TRUE; /* set the force loop flag */
278: asm("brw _ldd_4_lp1");; /* and loop on the error */
279: } /* end of loop on error */
280: } /* end of register corruption error */
281: } /* end of subtest 4 */
282:
283:
284:
285: /************************************************************************
286: *
287: * SUBTEST 5 - Check for PSL corruption (ldd)
288: *
289: ************************************************************************/
290: ldd_5()
291: {
292: force_loop = FALSE; /* clear force_loop flg */
293: subtest = 5;
294: status_index = 0;
295: fill_reg_buf( load_regs ); /* get patterns for regs */
296: for( index = 0; index < 3; index++ ) {
297: dbl_ld_acc = ldd_1_data[index].ld; /* get value to load */
298: sgl_dummy1 = status_array[status_index]; /* status = +, -, 0 */
299: /*
300: * If LOOP ON ERROR is set, this is the loop for this subtest.
301: * The force loop flag is set after the first error.
302: */
303: asm("_ldd_5_lp1:");
304: asm("tstl _sgl_dummy1"); /* set the PSL status */
305: asm("movpsl _init_psl"); /* save the initial PSL */
306: asm("nop");
307: asm("ldd _dbl_ld_acc"); /* load the accumulator */
308: asm("nop");
309: asm("movpsl _psl_val"); /* save the final PSL */
310: asm("nop");
311: asm("std _dbl_st_acc"); /* save the accumulator */
312: if( force_loop )
313: asm("brb _ldd_5_lp1");; /* loop on the error */
314: /*
315: * Now compare the final PSL to the initial PSL -they should be the same
316: */
317: exp_psl = init_psl;
318: if( psl_val != exp_psl ) {
319: errcnt++; /* bump the error count */
320: if( prt_error ) {
321: writes(" \n"); /* start a new print line */
322: writes("cycle: ");
323: writed( cycle );
324: writes(" LDD_STD test ");
325: writed( test_no );
326: writes(", subtest 5 - INCORRECT FINAL PSL - LDD\n");
327: print_ldd_data(); /* print the operands */
328: writes("\ninitial PSL = ");
329: write32h( init_psl );
330: writes(", final PSL = ");
331: write32h( psl_val );
332: writes(", expected PSL = ");
333: write32h( exp_psl );
334: writes("\n");
335: }
336: if( halt_flg )
337: ldd_er_halt( BAD_PSL_HLT ); /* halt on the error */
338: if( loop_on_err ) {
339: force_loop = TRUE; /* set the force loop flag */
340: asm("brw _ldd_5_lp1");; /* and loop on the error */
341: } /* end of loop on error */
342: } /* end of PSL corruption error */
343: } /* end of WHILE loop */
344: } /* end of subtest 5 */
345:
346:
347:
348: /************************************************************************
349: *
350: * SUBTEST 6 - STD status test
351: *
352: ************************************************************************/
353: ldd_6()
354: {
355: force_loop = FALSE;
356: index = 0; /* clear the data index */
357: status_index = 0; /* clear the status index */
358: do {
359: dbl_ld_acc = ldd_1_data[index].ld; /* get the dbl operand */
360: sgl_dummy1 = status_array[status_index]; /* array = +, -, 0 */
361: /*
362: * If LOOP ON ERROR is set, this is the loop for this subtest.
363: * The force loop flag is set after the first error.
364: */
365: asm("_ldd_6_lp1:");
366: asm("ldd _dbl_ld_acc"); /* load the operand */
367: asm("tstl _sgl_dummy1"); /* generate initial status */
368: asm("movpsl _init_psl"); /* save the initial status */
369: asm("std _dbl_st_acc"); /* save the accumulator */
370: asm("movpsl _psl_val"); /* save the final status */
371: if( force_loop ) /* loop? */
372: asm("jmp _ldd_6_lp1");; /* run the loop again */
373: exp_psl = init_psl; /* get the initial PSL */
374: exp_psl &= 0xfffffff3; /* clear ZERO, NEGATIVE */
375: sgl_dummy2 = dbl_ld_acc.m; /* get MSW of the operand */
376: /* if( !no_fpp_wcs ) /* why? */
377: sgl_dummy2 &= 0xff800000; /* clear the fraction part */
378: if( !sgl_dummy2 )
379: exp_psl |= PSL_Z; /* expect the ZERO bit set */
380: if( sgl_dummy2 < 0 )
381: exp_psl |= PSL_N; /* expect the NEG bit set */
382: if( psl_val != exp_psl ) { /* COMPARE the values */
383: errcnt++; /* bump the error count */
384: if( prt_error ) {
385: writes(" \n"); /* start a new print line */
386: writes("cycle: ");
387: writed( cycle );
388: writes(" LDD_STD test ");
389: writed( test_no );
390: writes(", subtest 6 - INCORRECT FINAL PSL - STD\n");
391: print_ldd_data(); /* print the operands */
392: writes("\ninitial PSL = ");
393: write32h( init_psl );
394: writes(", final PSL = ");
395: write32h( psl_val );
396: writes(", expected PSL = ");
397: write32h( exp_psl );
398: writes("\n");
399: }
400: if( halt_flg )
401: ldd_er_halt( BAD_PSL_HLT ); /* halt on the error */
402: if( loop_on_err ) {
403: force_loop = TRUE; /* set the force loop flag */
404: asm("brw _ldd_6_lp1");; /* and loop */
405: }; /* end of loop-on-error */
406: } /* end of compare error */
407: if( ++status_index >= 3 )
408: status_index = 0; /* reset the status index */
409: } while( index++ < max_ldd_1_index );
410: } /* end of subtest 6 */
411:
412:
413:
414: /**************************************************************************
415: *
416: * PRINT THE DATA AND STORE RESULTS
417: *
418: * Acc loaded = xxxxxxxx xxxxxxxx, Acc stored = xxxxxxxx xxxxxxxx, index = xx
419: **************************************************************************/
420: print_ldd_data()
421: {
422: writes(" Acc loaded = ");
423: write32h( dbl_ld_acc.m );
424: writec(' ');
425: write32h( dbl_ld_acc.l );
426: writes(", Acc stored = ");
427: write32h( dbl_st_acc.m );
428: writec(' ');
429: write32h( dbl_st_acc.l );
430: }
431:
432:
433:
434: /**************************************************************************
435: *
436: * HALT ON ERROR ROUTINE
437: *
438: **************************************************************************/
439: ldd_er_halt( halt_code )
440: int halt_code;
441: {
442: sgl_value_1 = dbl_ld_acc.m;
443: sgl_value_2 = dbl_ld_acc.l;
444: sgl_value_3 = dbl_st_acc.m;
445: sgl_value_4 = dbl_st_acc.l;
446: sgl_dummy1 = halt_code; /* get the error type */
447: asm("movl _test_no,r0"); /* r0 = test number */
448: asm("movl _subtest,r1"); /* r1 = subtest number */
449: asm("movl _sgl_dummy1,r2"); /* r2 = error code */
450: asm("movl _cycle,r3"); /* r3 = cycle count */
451: asm("movl _sgl_value_1,r4"); /* r4 = MS operand */
452: asm("movl _sgl_value_2,r5"); /* r5 = LS operand */
453: asm("movl _sgl_value_3,r6"); /* r6 = MS actual value */
454: asm("movl _sgl_value_4,r7"); /* r7 = LS actual value */
455: if( halt_code == BAD_ACC_HLT ) {
456: sgl_value_1 = dbl_expected.m;
457: sgl_value_2 = dbl_expected.l;
458: asm("movl _sgl_value_1,r8"); /* r8 = MS expected */
459: asm("movl _sgl_value_2,r9"); /* r9 = LS expected */
460: asm("movl _index,r10"); /* r10 = data index */
461: } else
462: if( halt_code == BAD_REG_HLT ) {
463: sgl_dummy1 = load_regs[index2];
464: sgl_dummy2 = store_regs[index2];
465: asm("movl _index2,r8"); /* r8 = bad register # */
466: asm("movl _sgl_dummy2,r9"); /* r9 = actual value */
467: asm("movl _sgl_dummy1,r10"); /* r10 = expected value */
468: } else
469: if( halt_code == BAD_PSL_HLT ) {
470: asm("movl _init_psl,r8"); /* r8 = initial PSL */
471: asm("movl _psl_val,r9"); /* r9 = final PSL */
472: asm("movl _exp_psl,r10"); /* r10 = expected PSL */
473: };
474: asm("halt"); /* HALT ... */
475: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.