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