|
|
1.1 root 1:
2: #include "fpp_defs.h"
3:
4:
5: /*****************************************************************************
6: *
7: * NEGF - SINGLE PRECISION FLOATING POINT LOAD_NEGATE TEST
8: *
9: *****************************************************************************/
10: negf()
11: {
12: asm(".globl _negf_t");
13: asm("_negf_t:"); /* entry address */
14: if( ( cycle == 1 ) && ( prt_hdrs ) ) /* print headers on 1st pass */
15: writes(" NEGF");
16: negf_1(); /* negate through the cache */
17: negf_2(); /* register stability */
18: negf_3(); /* PSL stability test */
19: if( !no_fpp_wcs ) {
20: negf_4(); /* pipelined entry test */
21: negf_5(); /* pipelined exit test */
22: };
23: asm("jmp *return"); /* return to the test monitor */
24: }
25:
26:
27:
28: /************************************************************************
29: *
30: * SUBTEST 1 - negate through memory
31: *
32: ************************************************************************/
33: negf_1()
34: {
35: force_loop = FALSE;
36: subtest = 1;
37: for( index = 0; index < max_lnf_1_index; index++ ) {
38: sgl_ld_acc = lnf_1_data[index].ld; /* get value to negate */
39: sgl_expected = lnf_1_data[index].exp; /* get expected result */
40: /*
41: * If LOOP ON ERROR is set, this is the loop for this subtest.
42: * The force loop flag is set after the first error.
43: */
44: asm("_negf_1_lp1:");
45: asm("ldf _sgl_ld_acc"); /* load the value */
46: asm("negf"); /* negate the value */
47: asm("stf _sgl_st_acc"); /* store the result */
48: if( force_loop )
49: asm("brb _negf_1_lp1");; /* loop on the error */
50: /*
51: * end error loop - test the results
52: */
53: if( sgl_st_acc != sgl_expected ) { /* COMPARE the values */
54: errcnt++; /* bump the error count */
55: if( prt_error ) {
56: writes(" \n"); /* start a new print line */
57: writes("cycle: ");
58: writed( cycle );
59: writes(" NEGF test ");
60: writed( test_no );
61: writes(", subtest 1 (Cache Data) - BAD FINAL ACC\n");
62: print_negf_data();
63: writes(", data index = ");
64: writed( index );
65: writec('\n');
66: writes(" ");
67: writes("Acc expected = ");
68: write32h( sgl_expected );
69: writec('\n');
70: }
71: if( halt_flg )
72: negf_er_halt( BAD_ACC_HLT ); /* halt on the error */
73: if( loop_on_err ) {
74: force_loop = TRUE; /* set the force loop flag */
75: asm("brw _negf_1_lp1");; /* and loop on the error */
76: } /* end of loop on error */
77: } /* end of compare error */
78: } /* end of WHILE loop */
79: } /* end of subtest 1 */
80:
81:
82:
83: /************************************************************************
84: *
85: * SUBTEST 2 - Check for register corruption
86: *
87: ************************************************************************/
88: negf_2()
89: {
90: force_loop = FALSE; /* clear force_loop flg */
91: subtest = 2;
92: fill_reg_buf( load_regs ); /* get patterns for regs */
93: index = 0;
94: sgl_ld_acc = lnf_1_data[0].ld; /* get value to negate */
95: sgl_expected = lnf_1_data[0].exp; /* get expected result */
96: /*
97: * If LOOP ON ERROR is set, this is the loop for this subtest.
98: * The force loop flag is set after the first error.
99: */
100: asm("_negf_2_lp1:");
101: asm("ldf _sgl_ld_acc"); /* load the initial value */
102: asm("nop");
103: asm("loadr $0x1fff,_load_regs"); /* load regs 0 - 12 */
104: asm("nop");
105: asm("negf"); /* negate the value */
106: asm("nop");
107: asm("storer $0x1fff,_store_regs"); /* store regs 0 - 12 */
108: asm("stf _sgl_st_acc"); /* save the accumulator */
109: if( force_loop )
110: asm("brb _negf_2_lp1");; /* loop on the error */
111: /*
112: * Now compare the stored register values to those that were loaded
113: */
114: index2 = 0;
115: while( (load_regs[index2] == store_regs[index2]) && (index2 < 13) )
116: index2++; /* check reg values */
117: if( index2 < 13 ) { /* error if index2 < 13 */
118: errcnt++; /* bump the error count */
119: if( prt_error ) {
120: writes(" \n"); /* start a new print line */
121: writes("cycle: ");
122: writed( cycle );
123: writes(" NEGF test ");
124: writed( test_no );
125: writes(", subtest 2 (Reg. Corr.) - A REGISTER WAS MODIFIED\n");
126: print_negf_data(); /* print the operands */
127: writes("\nregister "); /* print the information */
128: writed( index2 ); /* about the corrupted */
129: writes(" = "); /* register */
130: write32h( store_regs[index2] );
131: writes(", should be = ");
132: write32h( load_regs[index2] );
133: writes("\n");
134: }
135: if( halt_flg )
136: negf_er_halt( BAD_REG_HLT ); /* halt on the error */
137: if( loop_on_err ) {
138: force_loop = TRUE; /* set the force loop flag */
139: asm("brw _negf_2_lp1");; /* and loop on the error */
140: } /* end of loop on error */
141: } /* end of register corruption error */
142: } /* end of subtest 2 */
143:
144:
145:
146: /************************************************************************
147: *
148: * SUBTEST 3 - Check for PSL corruption
149: *
150: ************************************************************************/
151: negf_3()
152: {
153: force_loop = FALSE; /* clear force_loop flg */
154: subtest = 3;
155: fill_reg_buf( load_regs ); /* get patterns for regs */
156: for( index = 0; index < 3; index++ ) {
157: sgl_ld_acc = lnf_1_data[index].ld; /* get value to negate */
158: sgl_expected = lnf_1_data[index].exp; /* get expected */
159: sgl_dummy1 = status_array[status_index]; /* status = +, -, 0 */
160: /*
161: * If LOOP ON ERROR is set, this is the loop for this subtest.
162: * The force loop flag is set after the first error.
163: */
164: asm("_negf_3_lp1:");
165: asm("ldf _sgl_ld_acc"); /* load the initial value */
166: asm("nop");
167: asm("tstl _sgl_dummy1"); /* set the PSL status */
168: asm("movpsl _init_psl"); /* save the initial PSL */
169: asm("negf"); /* negate the value */
170: asm("nop");
171: asm("movpsl _psl_val"); /* save the final PSL */
172: asm("stf _sgl_st_acc"); /* save the accumulator */
173: if( force_loop )
174: asm("brb _negf_3_lp1");; /* loop on the error */
175: /*
176: * Now compare the final PSL to the initial PSL -they should be the same
177: */
178: exp_psl = init_psl;
179: if( psl_val != init_psl ) {
180: errcnt++; /* bump the error count */
181: if( prt_error ) {
182: writes(" \n"); /* start a new print line */
183: writes("cycle: ");
184: writed( cycle );
185: writes(" NEGF test ");
186: writed( test_no );
187: writes(", subtest 3 (PSL Corr.) - INCORRECT FINAL PSL\n");
188: print_negf_data(); /* print the operands */
189: writec('\n');
190: writes("initial PSL = ");
191: write32h( init_psl );
192: writes(", final PSL = ");
193: write32h( psl_val );
194: writes(", expected PSL = ");
195: write32h( exp_psl );
196: writec('\n');
197: }
198: if( halt_flg )
199: negf_er_halt( BAD_PSL_HLT ); /* halt on the error */
200: if( loop_on_err ) {
201: force_loop = TRUE; /* set the force loop flag */
202: asm("brw _negf_3_lp1");; /* and loop on the error */
203: } /* end of loop on error */
204: } /* end of PSL corruption error */
205: } /* end of WHILE loop */
206: } /* end of subtest 3 */
207:
208:
209:
210: /************************************************************************
211: *
212: * SUBTEST 4 - pipelined entry test
213: *
214: ************************************************************************/
215: negf_4()
216: {
217: force_loop = FALSE;
218: subtest = 4;
219: for( index = 0; index < max_lnf_1_index; index++ ) {
220: sgl_ld_acc = lnf_1_data[index].ld; /* get value to negate */
221: sgl_expected = lnf_1_data[index].exp; /* get expected result */
222: /*
223: * If LOOP ON ERROR is set, this is the loop for this subtest.
224: * The force loop flag is set after the first error.
225: */
226: asm("_negf_4_lp1:");
227: asm("movl $0,r0"); /* clear r0 */
228: asm("ldf r0"); /* load the Acc. with 0.0 */
229: asm("addf _sgl_ld_acc"); /* add the value to negate */
230: asm("negf"); /* negate the value */
231: asm("stf _sgl_st_acc"); /* store the result */
232: if( force_loop )
233: asm("brb _negf_4_lp1");; /* loop on the error */
234: /*
235: * end error loop - test the results
236: */
237: if( sgl_st_acc != sgl_expected ) { /* COMPARE the values */
238: errcnt++; /* bump the error count */
239: if( prt_error ) {
240: writes(" \n"); /* start a new print line */
241: writes("cycle: ");
242: writed( cycle );
243: writes(" NEGF test ");
244: writed( test_no );
245: writes(", subtest 4 (Piped Entry) - BAD FINAL ACC\n");
246: print_negf_data();
247: writes(", data index = ");
248: writed( index );
249: writec('\n');
250: writes(" ");
251: writes("Acc expected = ");
252: write32h( sgl_expected );
253: writec('\n');
254: }
255: if( halt_flg )
256: negf_er_halt( BAD_ACC_HLT ); /* halt on the error */
257: if( loop_on_err ) {
258: force_loop = TRUE; /* set the force loop flag */
259: asm("brw _negf_4_lp1");; /* and loop on the error */
260: } /* end of loop on error */
261: } /* end of compare error */
262: } /* end of WHILE loop */
263: } /* end of subtest 4 */
264:
265:
266:
267: /************************************************************************
268: *
269: * SUBTEST 5 - pipelined exit test
270: *
271: ************************************************************************/
272: negf_5()
273: {
274: force_loop = FALSE;
275: subtest = 5;
276: for( index = 0; index < max_lnf_1_index; index++ ) {
277: sgl_ld_acc = lnf_1_data[index].ld; /* get value to negate */
278: sgl_expected = lnf_1_data[index].exp; /* get expected result */
279: /*
280: * If LOOP ON ERROR is set, this is the loop for this subtest.
281: * The force loop flag is set after the first error.
282: */
283: asm("_negf_5_lp1:");
284: asm("movl $0,r0"); /* clear r0 */
285: asm("ldf _sgl_ld_acc"); /* load the value */
286: asm("negf"); /* negate the value */
287: asm("addf r0"); /* add a zero to the acc */
288: asm("stf _sgl_st_acc"); /* store the result */
289: if( force_loop )
290: asm("brb _negf_5_lp1");; /* loop on the error */
291: /*
292: * end error loop - test the results
293: */
294: if( sgl_st_acc != sgl_expected ) { /* COMPARE the values */
295: errcnt++; /* bump the error count */
296: if( prt_error ) {
297: writes(" \n"); /* start a new print line */
298: writes("cycle: ");
299: writed( cycle );
300: writes(" NEGF test ");
301: writed( test_no );
302: writes(", subtest 5 (Piped Exit) - BAD FINAL ACC\n");
303: print_negf_data();
304: writes(", data index = ");
305: writed( index );
306: writec('\n');
307: writes(" ");
308: writes("Acc expected = ");
309: write32h( sgl_expected );
310: writec('\n');
311: }
312: if( halt_flg )
313: negf_er_halt( BAD_ACC_HLT ); /* halt on the error */
314: if( loop_on_err ) {
315: force_loop = TRUE; /* set the force loop flag */
316: asm("brw _negf_5_lp1");; /* and loop on the error */
317: } /* end of loop on error */
318: } /* end of compare error */
319: } /* end of WHILE loop */
320: } /* end of subtest 5 */
321:
322:
323:
324: /**************************************************************************
325: *
326: * PRINT THE DATA AND STORE RESULTS
327: *
328: * initial Acc = xxxxxxxx, stored = xxxxxxxx, data index = xx
329: * expected = xxxxxxxx
330: **************************************************************************/
331: print_negf_data()
332: {
333: writes("initial Acc = ");
334: write32h( sgl_ld_acc );
335: writes(", final Acc = ");
336: write32h( sgl_st_acc );
337: }
338:
339:
340:
341: /**************************************************************************
342: *
343: * HALT ON ERROR ROUTINE
344: *
345: **************************************************************************/
346: negf_er_halt( halt_code )
347: int halt_code;
348: {
349: sgl_dummy1 = halt_code; /* get the error type */
350: asm("movl _test_no,r0"); /* r0 = test number */
351: asm("movl _subtest,r1"); /* r1 = subtest number */
352: asm("movl _sgl_dummy1,r2"); /* r2 = error code */
353: asm("movl _cycle,r3"); /* r3 = cycle count */
354: asm("movl _sgl_ld_acc,r4"); /* r4 = initial data */
355: asm("movl _sgl_value_1,r5"); /* r5 = data loaded */
356: if( halt_code == BAD_ACC_HLT ) {
357: asm("movl _sgl_st_acc,r6"); /* r6 = data stored */
358: asm("movl _sgl_expected,r7"); /* r7 = data expected */
359: } else
360: if( halt_code == BAD_REG_HLT ) {
361: sgl_dummy1 = load_regs[index2];
362: sgl_dummy2 = store_regs[index2];
363: asm("movl _index2,r6"); /* r6 = bad register # */
364: asm("movl _sgl_dummy1,r7"); /* r7 = actual value */
365: asm("movl _sgl_dummy2,r8"); /* r8 = expected value */
366: } else
367: if( halt_code == BAD_PSL_HLT ) {
368: asm("movl _init_psl,r6"); /* r6 = initial PSL */
369: asm("movl _psl_val,r7"); /* r7 = final PSL */
370: asm("movl _exp_psl,r8"); /* r8 = expected PSL */
371: };
372: asm("halt"); /* HALT ... */
373: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.