|
|
1.1 root 1: #include "fpp_defs.h"
2:
3:
4:
5: /***************************************************************************
6: *
7: * SINF - SINGLE PRECISION FLOATING POINT SINF FUNCTION TEST
8: *
9: * SINF TEST MONITOR
10: *
11: *****************************************************************************/
12: sinf()
13: {
14: asm(".globl _sinf_t");
15: asm("_sinf_t:"); /* entry address */
16: if( ( cycle == 1 ) && ( prt_hdrs ) ) /* print headers on 1st pass */
17: {
18: writes(" SINF");
19: }
20: sinf_1(); /* test square root -w/ delay */
21: sinf_2(); /* test square root */
22: sinf_3(); /* register corruption */
23: /* sinf_4(); /* test the PSL */
24: sinf_5(); /* pipelined entry */
25: sinf_6(); /* pipelined exit */
26: asm("jmp *return"); /* return to the test monitor */
27: }
28:
29: /***************************************************************************
30: *
31: * SUBTEST 1 - SINF FUNCTION -wait till done to store
32: *
33: ***************************************************************************/
34: sinf_1()
35: {
36: #define DELAY 20 /* delay 40 ticks between SINF & STF */
37: force_loop = FALSE; /* clear the LOOP flag */
38: subtest = 1;
39: index = 0;
40: do
41: {
42: sgl_ld_acc = sinf_1_data[index].ld; /* get the operand */
43: sgl_expected = sinf_1_data[index].exp; /* get expected results */
44: sgl_dummy1 = DELAY;
45: /*
46: * If LOOP ON ERROR is set, this is the loop for this subtest.
47: * The force loop flag is set after the first error.
48: */
49: asm("_sinf_1_lp1:");
50: asm("movl _sgl_ld_acc,r4"); /* set the data to load */
51: asm("ldf r4"); /* load the accumulator */
52: asm("movl _sgl_dummy1,r0"); /* get the delay factor */
53: asm("sinf"); /* get ACC.'s sine */
54: asm("1:");
55: asm("decl r0"); /* delay to let the SINF */
56: asm("bgtr 1b"); /* instruction finish */
57: asm("stf r5"); /* store the result */
58: if( force_loop )
59: asm("brb _sinf_1_lp1");; /* loop on the error */
60: /*
61: * end error loop
62: */
63: asm("movl r5,_sgl_st_acc"); /* save the result */
64: if( sgl_st_acc != sgl_expected ) { /* COMPARE the 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(" SINF test ");
71: writed( test_no );
72: writes(", subtest 1 (delayed store) - BAD FINAL ACC\n");
73: print_sinf_data();
74: writes(", data index = ");
75: writed( index );
76: writec('\n');
77: writes(" Acc expected = ");
78: write32h( sgl_expected );
79: writec('\n');
80: }
81: if ( halt_flg ) /* halt on error? */
82: sinf_er_halt( BAD_ACC_HLT );
83: if ( loop_on_err )
84: {
85: force_loop = TRUE; /* set the force loop flag */
86: asm("jmp _sinf_1_lp1"); /* and loop */
87: }
88: } /* end of compare error */
89: } while( index++ < max_sinf_1_index );
90: } /* end of subtest 1 */
91:
92:
93:
94: /***************************************************************************
95: *
96: * SUBTEST 2 - SINF FUNCTION
97: *
98: ***************************************************************************/
99: sinf_2()
100: {
101: force_loop = FALSE; /* clear the LOOP flag */
102: subtest = 2;
103: index = 0;
104: do
105: {
106: sgl_ld_acc = sinf_1_data[index].ld; /* get the operand */
107: sgl_expected = sinf_1_data[index].exp; /* get expected results */
108: /*
109: * If LOOP ON ERROR is set, this is the loop for this subtest.
110: * The force loop flag is set after the first error.
111: */
112: asm("_sinf_2_lp1:");
113: asm("movl _sgl_ld_acc,r4"); /* set the data to load */
114: asm("ldf r4"); /* load the accumulator */
115: asm("sinf"); /* get ACC.'s sine */
116: asm("stf r5"); /* store the result */
117: if( force_loop )
118: asm("brb _sinf_2_lp1");; /* loop on the error */
119: /*
120: * end error loop
121: */
122: asm("movl r5,_sgl_st_acc"); /* save the result */
123: if( sgl_st_acc != sgl_expected ) { /* COMPARE the values */
124: errcnt++; /* bump the error count */
125: if ( prt_error ) {
126: writes(" \n"); /* start a new print line */
127: writes("cycle: ");
128: writed( cycle );
129: writes(" SINF test ");
130: writed( test_no );
131: writes(", subtest 2 (immediate store) - BAD FINAL ACC\n");
132: print_sinf_data();
133: writes(", data index = ");
134: writed( index );
135: writec('\n');
136: writes(" Acc expected = ");
137: write32h( sgl_expected );
138: writec('\n');
139: }
140: if ( halt_flg ) /* halt on error? */
141: sinf_er_halt( BAD_ACC_HLT );
142: if ( loop_on_err )
143: {
144: force_loop = TRUE; /* set the force loop flag */
145: asm("jmp _sinf_2_lp1"); /* and loop */
146: }
147: } /* end of compare error */
148: } while( index++ < max_sinf_1_index );
149: } /* end of subtest 2 */
150:
151:
152:
153: /***************************************************************************
154: *
155: * SUBTEST 3 - REGISTER INTEGRITY WITH THE SINF FUNCTION
156: *
157: ***************************************************************************/
158: sinf_3()
159: {
160: fill_reg_buf( load_regs ); /* set reg values to load */
161: force_loop = FALSE; /* clear the LOOP flag */
162: subtest = 3;
163: index = 0;
164: do
165: {
166: sgl_ld_acc = sinf_1_data[index].ld; /* get the operand */
167: sgl_expected = sinf_1_data[index].exp; /* get expected results */
168: /*
169: * If LOOP ON ERROR is set, this is the loop for this subtest.
170: * The force loop flag is set after the first error.
171: */
172: asm("_sinf_3_lp1:");
173: asm("loadr $0x1fff,_load_regs"); /* load regs 0 - 12 */
174: asm("ldf _sgl_ld_acc"); /* load the accumulator */
175: asm("sinf"); /* get ACC.'s sine */
176: asm("stf _sgl_st_acc"); /* store the result */
177: asm("storer $0x1fff,_store_regs"); /* store regs 0 - 12 */
178: if( force_loop )
179: asm("brb _sinf_3_lp1");; /* loop on the error */
180: /*
181: * end error loop
182: */
183: reg_no = 0;
184: regs_ok = TRUE;
185: while( (reg_no < 13) && (regs_ok) ) /* check 1st 12 regs */
186: if( store_regs[ reg_no ] == load_regs[ reg_no ] )
187: reg_no++;
188: else
189: regs_ok = FALSE;
190: if( !regs_ok ) {
191: errcnt++; /* bump the error count */
192: if ( prt_error ) {
193: writes(" \n"); /* start a new print line */
194: writes("cycle: ");
195: writed( cycle );
196: writes(" SINF test ");
197: writed( test_no );
198: writes(", subtest 3 - A REGISTER WAS MODIFIED\n"); {
199: print_sinf_data();
200: writec('\n');
201: writes("register ");
202: writed( reg_no );
203: writes(" = ");
204: write32h( load_regs[reg_no] );
205: writes(", should be = ");
206: write32h( store_regs[reg_no] );
207: writec('\n');
208: }
209: if ( halt_flg ) /* halt on error? */
210: sinf_er_halt( BAD_REG_HLT );
211: if ( loop_on_err )
212: {
213: force_loop = TRUE; /* get the force loop flag */
214: asm("jmp _sinf_3_lp1"); /* and loop */
215: }
216: } /* end of compare error */
217: } /* end of while loop */
218: } while( index++ < max_sinf_1_index );
219: } /* end of subtest 3 */
220:
221:
222:
223: /************************************************************************
224: *
225: * SUBTEST 4 - Check for PSL corruption
226: *
227: ************************************************************************/
228: sinf_4()
229: {
230: force_loop = FALSE; /* clear force_loop flg */
231: subtest = 4;
232: fill_reg_buf( load_regs ); /* get patterns for regs */
233: for( index = 0; index < 3; index++ ) {
234: sgl_ld_acc = sinf_1_data[index].ld; /* get operand 1 */
235: sgl_expected = sinf_1_data[index].exp; /* get expected */
236: sgl_dummy1 = status_array[status_index]; /* status = +, -, 0 */
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("_sinf_4_lp1:");
242: asm("ldf _sgl_ld_acc"); /* LOAD the accumulator */
243: asm("nop");
244: asm("tstl _sgl_dummy1"); /* set the PSL status */
245: asm("movpsl _init_psl"); /* save the initial PSL */
246: asm("sinf"); /* do the sine */
247: asm("nop");
248: asm("movpsl _psl_val"); /* save the final PSL */
249: asm("stf _sgl_st_acc"); /* save the accumulator */
250: if( force_loop )
251: asm("brb _sinf_4_lp1");; /* loop on the error */
252: /*
253: * Now compare the final PSL to the initial PSL -they should be the same
254: */
255: exp_psl = init_psl;
256: if( psl_val != exp_psl ) {
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(" SINF test ");
263: writed( test_no );
264: writes(", subtest 4 - INCORRECT FINAL PSL\n");
265: print_sinf_data(); /* print the operands */
266: writes("\n");
267: writes("initial PSL = ");
268: write32h( init_psl );
269: writes(", final PSL = ");
270: write32h( psl_val );
271: writes(", expected PSL = ");
272: write32h( exp_psl );
273: writes("\n");
274: }
275: if( halt_flg )
276: sinf_er_halt( BAD_PSL_HLT ); /* halt on the error */
277: if( loop_on_err ) {
278: force_loop = TRUE; /* set the force loop flag */
279: asm("brw _sinf_4_lp1");; /* and loop on the error */
280: } /* end of loop on error */
281: } /* end of PSL corruption error */
282: } /* end of WHILE loop */
283: } /* end of subtest 4 */
284:
285:
286:
287: /************************************************************************
288: *
289: * SUBTEST 5 - pipelined entry test
290: *
291: ************************************************************************/
292: sinf_5()
293: {
294: force_loop = FALSE;
295: subtest = 8;
296: for( index = 0; index < max_sinf_1_index; index++ ) {
297: sgl_ld_acc = sinf_1_data[index].ld; /* get operand 1 */
298: sgl_expected = sinf_1_data[index].exp; /* get expected result */
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("_sinf_5_lp1:");
304: asm("movl $0,r0"); /* clear r0 */
305: asm("ldf r0"); /* load the Acc. with 0.0 */
306: asm("addf _sgl_ld_acc"); /* add the 1st operand */
307: asm("sinf"); /* get the sine */
308: asm("stf _sgl_st_acc"); /* store the result */
309: if( force_loop )
310: asm("brb _sinf_5_lp1");; /* loop on the error */
311: /*
312: * end error loop - test the results
313: */
314: if( sgl_st_acc != sgl_expected ) { /* COMPARE the values */
315: errcnt++; /* bump the error count */
316: if( prt_error ) {
317: writes(" \n"); /* start a new print line */
318: writes("cycle: ");
319: writed( cycle );
320: writes(" SINF test ");
321: writed( test_no );
322: writes(", subtest 5 (Piped Entry) - BAD FINAL ACC\n");
323: print_sinf_data();
324: writes(", data index = ");
325: writed( index );
326: writec('\n');
327: writes(" Acc expected = ");
328: write32h( sgl_expected );
329: writec('\n');
330: }
331: if( halt_flg )
332: sinf_er_halt( BAD_ACC_HLT ); /* halt on the error */
333: if( loop_on_err ) {
334: force_loop = TRUE; /* set the force loop flag */
335: asm("brw _sinf_5_lp1");; /* and loop on the error */
336: } /* end of loop on error */
337: } /* end of compare error */
338: } /* end of WHILE loop */
339: } /* end of subtest 5 */
340:
341:
342:
343: /************************************************************************
344: *
345: * SUBTEST 6 - pipelined exit test
346: *
347: ************************************************************************/
348: sinf_6()
349: {
350: force_loop = FALSE;
351: subtest = 8;
352: for( index = 0; index < max_sinf_1_index; index++ ) {
353: sgl_ld_acc = sinf_1_data[index].ld; /* get operand 1 */
354: sgl_expected = sinf_1_data[index].exp; /* get expected result */
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("_sinf_6_lp1:");
360: asm("movl $0,r0"); /* clear r0 */
361: asm("ldf _sgl_ld_acc"); /* load the Acc. */
362: asm("sinf"); /* get the sine */
363: asm("addf r0"); /* add a zero to the acc */
364: asm("stf _sgl_st_acc"); /* store the result */
365: if( force_loop )
366: asm("brb _sinf_6_lp1");; /* loop on the error */
367: /*
368: * end error loop - test the results
369: */
370: if( sgl_st_acc != sgl_expected ) { /* COMPARE the values */
371: errcnt++; /* bump the error count */
372: if( prt_error ) {
373: writes(" \n"); /* start a new print line */
374: writes("cycle: ");
375: writed( cycle );
376: writes(" SINF test ");
377: writed( test_no );
378: writes(", subtest 6 (Piped Exit) - BAD FINAL ACC\n");
379: print_sinf_data();
380: writes(", data index = ");
381: writed( index );
382: writec('\n');
383: writes(" Acc expected = ");
384: write32h( sgl_expected );
385: writec('\n');
386: }
387: if( halt_flg )
388: sinf_er_halt( BAD_ACC_HLT ); /* halt on the error */
389: if( loop_on_err ) {
390: force_loop = TRUE; /* set the force loop flag */
391: asm("brw _sinf_6_lp1");; /* and loop on the error */
392: } /* end of loop on error */
393: } /* end of compare error */
394: } /* end of WHILE loop */
395: } /* end of subtest 6 */
396:
397:
398: /**************************************************************************
399: *
400: * PRINT THE DATA AND STORE RESULTS
401: *
402: * initial Acc = xxxxxxxx, stored = xxxxxxxx, data index = xx
403: * Acc expected = xxxxxxxx
404: **************************************************************************/
405: print_sinf_data()
406: {
407: writes("initial Acc = ");
408: write32h( sgl_ld_acc );
409: writes(", final Acc = ");
410: write32h( sgl_st_acc );
411: }
412:
413:
414:
415: /**************************************************************************
416: *
417: * HALT ON ERROR ROUTINE
418: *
419: **************************************************************************/
420: sinf_er_halt( halt_code )
421: int halt_code;
422: {
423: sgl_dummy1 = halt_code; /* get the error type */
424: asm("movl _test_no,r0"); /* r0 = test number */
425: asm("movl _subtest,r1"); /* r1 = subtest number */
426: asm("movl _sgl_dummy1,r2"); /* r2 = error code */
427: asm("movl _cycle,r3"); /* r3 = cycle count */
428: asm("movl _sgl_ld_acc,r4"); /* r4 = initial data */
429: asm("movl _sgl_st_acc,r5"); /* r5 = data stored */
430: asm("movl _sgl_expected,r6"); /* r6 = data expected */
431: asm("movl _index,r7"); /* r7 = data index */
432: if( halt_code == BAD_REG_HLT ) {
433: sgl_dummy1 = load_regs[index2];
434: sgl_dummy2 = store_regs[index2];
435: asm("movl _index2,r6"); /* r6 = bad register # */
436: asm("movl _sgl_dummy2,r7"); /* r7 = actual value */
437: asm("movl _sgl_dummy1,r8"); /* r8 = expected value */
438: } else
439: if( halt_code == BAD_PSL_HLT ) {
440: asm("movl _init_psl,r6"); /* r6 = initial PSL */
441: asm("movl _psl_val,r7"); /* r7 = final PSL */
442: asm("movl _exp_psl,r8"); /* r8 = expected PSL */
443: };
444: asm("halt"); /* HALT ... */
445: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.