|
|
1.1 root 1:
2: #include "fpp_defs.h"
3:
4:
5: /*****************************************************************************
6: *
7: * NEGD - DOUBLE PRECISION FLOATING POINT LOAD_NEGATE TEST
8: *
9: *****************************************************************************/
10: negd()
11: {
12: asm(".globl _negd_t");
13: asm("_negd_t:"); /* entry address */
14: if( ( cycle ==1 ) && ( prt_hdrs ) ) /* print headers on 1st pass */
15: writes(" NEGD");
16: negd_1(); /* negate through the cache */
17: negd_2(); /* register stability */
18: negd_3(); /* PSL stability test */
19: asm("jmp *return"); /* return to the test monitor */
20: }
21:
22:
23:
24: /************************************************************************
25: *
26: * SUBTEST 1 - negate through memory
27: *
28: ************************************************************************/
29: negd_1()
30: {
31: force_loop = FALSE;
32: subtest = 1;
33: for( index = 0; index < max_lnd_1_index; index++ ) {
34: dbl_ld_acc = lnd_1_data[index].ld; /* get value to negate */
35: dbl_expected = lnd_1_data[index].exp; /* expected result */
36: /*
37: * If LOOP ON ERROR is set, this is the loop for this subtest.
38: * The force loop flag is set after the first error.
39: */
40: asm("_negd_1_lp1:");
41: asm("ldd _dbl_ld_acc"); /* load the value */
42: asm("negd"); /* negate the value */
43: asm("std _dbl_st_acc"); /* store the result */
44: if( force_loop )
45: asm("brb _negd_1_lp1");; /* loop on the error */
46: /*
47: * end error loop - test the results
48: */
49: if( (dbl_st_acc.m != dbl_expected.m ) || /* COMPARE the values*/
50: (dbl_st_acc.l != dbl_expected.l ) ) {
51: errcnt++; /* bump the error count */
52: if( prt_error ) {
53: writes(" \n"); /* start a new print line */
54: writes("cycle: ");
55: writed( cycle );
56: writes(" NEGD test ");
57: writed( test_no );
58: writes(", subtest 1 (Cache Data) - BAD FINAL ACC\n");
59: print_negd_data();
60: writes(", index = ");
61: writed( index );
62: writec('\n');
63: writes(" Acc expected = ");
64: write32h( dbl_expected.m );
65: writec(' ');
66: write32h( dbl_expected.l );
67: writec('\n');
68: }
69: if( halt_flg )
70: negd_er_halt( BAD_ACC_HLT ); /* halt on the error */
71: if( loop_on_err ) {
72: force_loop = TRUE; /* set the force loop flag */
73: asm("brw _negd_1_lp1");; /* and loop on the error */
74: } /* end of loop on error */
75: } /* end of compare error */
76: } /* end of WHILE loop */
77: } /* end of subtest 1 */
78:
79:
80:
81: /************************************************************************
82: *
83: * SUBTEST 2 - Check for register corruption
84: *
85: ************************************************************************/
86: negd_2()
87: {
88: force_loop = FALSE; /* clear force_loop flg */
89: subtest = 2;
90: fill_reg_buf( load_regs ); /* get patterns for regs */
91: index = 0;
92: dbl_ld_acc = lnd_1_data[0].ld; /* get value to negate */
93: /* if( no_fpp_wcs ) /* */
94: /* dbl_expected = dbl_ld_acc; /* expected = loaded */
95: /* else /* */
96: /* dbl_expected = lnd_1_data[index].exp; /* expected result */
97: /*
98: * If LOOP ON ERROR is set, this is the loop for this subtest.
99: * The force loop flag is set after the first error.
100: */
101: asm("ldd _dbl_ld_acc"); /* load the initial value */
102: asm("_negd_2_lp1:");
103: asm("loadr $0x1fff,_load_regs"); /* load regs 0 - 12 */
104: asm("nop");
105: asm("negd"); /* negate the value */
106: asm("nop");
107: asm("storer $0x1fff,_store_regs"); /* store regs 0 - 12 */
108: asm("std _dbl_st_acc"); /* save the accumulator */
109: if( force_loop )
110: asm("brb _negd_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(" NEGD test ");
124: writed( test_no );
125: writes(", subtest 2 - A REGISTER WAS MODIFIED\n");
126: print_negd_data(); /* print the operands */
127: writes("\n");
128: writes("register "); /* print the information */
129: writed( index2 ); /* about the corrupted */
130: writes(" = "); /* register */
131: write32h( store_regs[index2] );
132: writes(", should be = ");
133: write32h( load_regs[index2] );
134: writes("\n");
135: }
136: if( halt_flg )
137: negd_er_halt( BAD_REG_HLT ); /* halt on the error */
138: if( loop_on_err ) {
139: force_loop = TRUE; /* set the force loop flag */
140: asm("brw _negd_2_lp1");; /* and loop on the error */
141: } /* end of loop on error */
142: } /* end of register corruption error */
143: } /* end of subtest 2 */
144:
145:
146:
147: /************************************************************************
148: *
149: * SUBTEST 3 - Check for PSL corruption
150: *
151: ************************************************************************/
152: negd_3()
153: {
154: force_loop = FALSE; /* clear force_loop flg */
155: subtest = 3;
156: fill_reg_buf( load_regs ); /* get patterns for regs */
157: for( index = 0; index < 3; index++ ) {
158: dbl_ld_acc = lnd_1_data[index].ld; /* get value to negate */
159: /* if( no_fpp_wcs ) /* */
160: /* dbl_expected = dbl_ld_acc; /* expected = loaded */
161: /* else /* */
162: /* dbl_expected = lnd_1_data[index].exp; /* expected result */
163: sgl_dummy1 = status_array[status_index]; /* status = +, -, 0 */
164: /*
165: * If LOOP ON ERROR is set, this is the loop for this subtest.
166: * The force loop flag is set after the first error.
167: */
168: asm("_negd_3_lp1:");
169: asm("ldd _dbl_ld_acc"); /* load the initial value */
170: asm("tstl _sgl_dummy1"); /* set the PSL status */
171: asm("movpsl _init_psl"); /* save the initial PSL */
172: asm("negd"); /* negate the value */
173: asm("nop");
174: asm("movpsl _psl_val"); /* save the final PSL */
175: asm("std _dbl_st_acc"); /* save the accumulator */
176: if( force_loop )
177: asm("brb _negd_3_lp1");; /* loop on the error */
178: /*
179: * Now compare the final PSL to the initial PSL -they should be the same
180: */
181: exp_psl = init_psl;
182: if( psl_val != exp_psl ) {
183: errcnt++; /* bump the error count */
184: if( prt_error ) {
185: writes(" \n"); /* start a new print line */
186: writes("cycle: ");
187: writed( cycle );
188: writes(" NEGD test ");
189: writed( test_no );
190: writes(", subtest 3 - INCORRECT FINAL PSL\n");
191: print_negd_data(); /* print the operands */
192: writes("\n");
193: writes("initial PSL = ");
194: write32h( init_psl );
195: writes(", final PSL = ");
196: write32h( psl_val );
197: writes(", expected PSL = ");
198: write32h( exp_psl );
199: writes("\n");
200: }
201: if( halt_flg )
202: negd_er_halt( BAD_PSL_HLT ); /* halt on the error */
203: if( loop_on_err ) {
204: force_loop = TRUE; /* set the force loop flag */
205: asm("brw _negd_3_lp1");; /* and loop on the error */
206: } /* end of loop on error */
207: } /* end of PSL corruption error */
208: } /* end of WHILE loop */
209: } /* end of subtest 3 */
210:
211:
212:
213: /**************************************************************************
214: *
215: * PRINT THE DATA AND STORE RESULTS
216: *
217: * initial Acc = xxxxxxxx xxxxxxxx, final Acc = xxxxxxxx xxxxxxxx, index = xx
218: * expected = xxxxxxxx xxxxxxxx
219: **************************************************************************/
220: print_negd_data()
221: {
222: writes("initial Acc = ");
223: write32h( dbl_ld_acc.m );
224: writec(' ');
225: write32h( dbl_ld_acc.l );
226: writes(", final Acc = ");
227: write32h( dbl_st_acc.m );
228: writec(' ');
229: write32h( dbl_st_acc.l );
230: }
231:
232:
233:
234: /**************************************************************************
235: *
236: * HALT ON ERROR ROUTINE
237: *
238: **************************************************************************/
239: negd_er_halt( halt_code )
240: int halt_code;
241: {
242: sgl_value_1 = dbl_ld_acc.m;
243: sgl_value_2 = dbl_ld_acc.l;
244: sgl_value_3 = dbl_st_acc.m;
245: sgl_value_4 = dbl_st_acc.l;
246: sgl_dummy1 = halt_code; /* get the error type */
247: asm("movl _test_no,r0"); /* r0 = test number */
248: asm("movl _subtest,r1"); /* r1 = subtest number */
249: asm("movl _sgl_dummy1,r2"); /* r2 = error code */
250: asm("movl _cycle,r3"); /* r3 = cycle count */
251: asm("movl _sgl_value_1,r4"); /* r4 = MS operand 1 */
252: asm("movl _sgl_value_2,r5"); /* r5 = LS operand 1 */
253: asm("movl _sgl_value_3,r6"); /* r6 = MS stored */
254: asm("movl _sgl_value_4,r7"); /* r7 = LS stored */
255: if( halt_code == BAD_ACC_HLT ) {
256: sgl_value_1 = dbl_expected.m;
257: sgl_value_2 = dbl_expected.l;
258: asm("movl _sgl_value_1,r8"); /* r8 = MS expected */
259: asm("movl _sgl_value_2,r9"); /* r9 = LS expected */
260: asm("movl _index,r10"); /* r10 = data index */
261: } else
262: if( halt_code == BAD_REG_HLT ) {
263: sgl_dummy1 = load_regs[index2];
264: sgl_dummy2 = store_regs[index2];
265: asm("movl _index2,r8"); /* r8 = bad register # */
266: asm("movl _sgl_dummy2,r9"); /* r9 = actual value */
267: asm("movl _sgl_dummy1,r10"); /* r10 = expected value */
268: } else
269: if( halt_code == BAD_PSL_HLT ) {
270: asm("movl _init_psl,r8"); /* r8 = initial PSL */
271: asm("movl _psl_val,r9"); /* r9 = final PSL */
272: asm("movl _exp_psl,r10"); /* r10 = expected PSL */
273: };
274: asm("halt"); /* HALT ... */
275: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.