|
|
1.1 root 1: #include "fpp_defs.h"
2:
3:
4: /***************************************************************************
5: *
6: * PUSHD - PUSH FLOATING POINT DOUBLE-PRECISION OPERAND ONTO STACK
7: *
8: * PUSHD TEST MONITOR
9: *
10: * Load a double precision operand into the accumulator and then push it
11: * onto the stack.
12: ***************************************************************************/
13: pushd()
14: {
15: asm(".globl _pushd_t");
16: asm("_pushd_t:"); /* entry address */
17: if( (cycle == 1) && (prt_hdrs) ) /* print headers on 1st cycle */
18: writes(" PUSHD");
19: pushd_1(); /* ldd/pushd data patterns */
20: pushd_2(); /* register corruption test */
21: if( !no_fpp_wcs )
22: pushd_3(); /* PSL test */
23: asm("jmp *return"); /* return to the test monitor */
24: }
25:
26:
27:
28: /************************************************************************
29: *
30: * SUBTEST 1 - load / push / pop / compare
31: *
32: ************************************************************************/
33: pushd_1()
34: {
35: force_loop = FALSE;
36: index = 0;
37: subtest = 1;
38: do {
39: dbl_ld_acc = ldd_1_data[index].ld; /* get data to load */
40: dbl_expected = ldd_1_data[index].exp; /* get expected results */
41: if( !(dbl_ld_acc.m & 0x7f800000) ) {
42: dbl_expected.m = 0;
43: dbl_expected.l = 0; /* ignore bad 0's */
44: }
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("_pushd_1_lp1:");
50: asm("moval (sp),_pre_event_sp"); /* save the pre-push SP */
51: asm("ldd _dbl_ld_acc"); /* LOAD the (dbl) value */
52: asm("pushd"); /* PUSH the data */
53: asm("moval (sp),_post_event_sp"); /* save the post-push SP */
54: asm("movl (sp)+,_pop_val_1"); /* POP the MS word */
55: asm("movl (sp)+,_pop_val_2"); /* POP the LS word */
56: asm("std _dbl_st_acc"); /* save the acc */
57: if( force_loop )
58: asm("brb _pushd_1_lp1"); /* run the loop again */
59: sgl_dummy1 = pre_event_sp - 8; /* get expected final SP */
60: sgl_value_7 = post_event_sp - pre_event_sp; /* get amount pushed */
61: if( (dbl_expected.m != pop_val_1) || /* verify stack data */
62: (dbl_expected.l != pop_val_2) ||
63: (post_event_sp != sgl_dummy1) ) {
64: errcnt++; /* bump the error count */
65: if ( prt_error ) {
66: writes("\ncycle: ");
67: writed( cycle );
68: writes(" PUSHD test ");
69: writed( test_no );
70: writes(", subtest 1 (Cache Data) - WRONG DATA PUSHED\n");
71: print_pushd_data();
72: writes(", data pushed = ");
73: write32h( pop_val_1 );
74: writec(' ');
75: write32h( pop_val_2 );
76: writes(", index = ");
77: writed( index );
78: writec('\n');
79: writes(" final Acc = ");
80: write32h( dbl_st_acc.m );
81: writec(' ');
82: write32h( dbl_st_acc.l );
83: writes(", exp. data = ");
84: write32h( dbl_expected.m );
85: writec(' ');
86: write32h( dbl_expected.l );
87: writec('\n');
88: }
89: if ( halt_flg ) /* halt on error? */
90: pushd_er_halt( BAD_STORE_HLT );
91: if ( loop_on_err )
92: {
93: force_loop = TRUE; /* set the force loop flag */
94: asm("brw _pushd_1_lp1"); /* and loop on the error */
95: } /* end of loop-on-error */
96: } /* end of data compare error */
97: if( ( post_event_sp - pre_event_sp ) == 2 ) {/* ver stack data */
98: errcnt++; /* bump the error count */
99: if ( prt_error ) {
100: writes("\ncycle: ");
101: writed( cycle );
102: writes(" PUSHD test ");
103: writed( test_no );
104: writes(", subtest 1 (Data Pat.) - WRONG PUSH COUNT\n");
105: print_pushd_data();
106: writes(", ");
107: writed( sgl_value_7 );
108: writes(" longwords pushed, ");
109: writes("2 expected");
110: writec('\n');
111: writes(" final Acc = ");
112: write32h( dbl_st_acc.m );
113: writec(' ');
114: write32h( dbl_st_acc.l );
115: writec('\n');
116: }
117: if ( halt_flg ) /* halt on error? */
118: pushd_er_halt( PUSH_CNT_HLT );
119: if ( loop_on_err )
120: {
121: force_loop = TRUE; /* set the force loop flag */
122: asm("brw _pushd_1_lp1"); /* and loop on the error */
123: } /* end of loop-on-error */
124: } /* end of push count error */
125: if( ( dbl_st_acc.m != dbl_expected.m ) &&
126: ( dbl_st_acc.l != dbl_expected.l ) ) {
127: errcnt++; /* bump the error count */
128: if ( prt_error )
129: {
130: writes("\ncycle: ");
131: writed( cycle );
132: writes(" PUSHD test ");
133: writed( test_no );
134: writes(", subtest 1 (Acc. Corr.) - BAD FINAL ACC\n");
135: print_pushd_data();
136: writes(", data pushed = ");
137: write32h( pop_val_1 );
138: writec(' ');
139: write32h( pop_val_2 );
140: writes(", index = ");
141: writed( index );
142: writec('\n');
143: writes(" final Acc = ");
144: write32h( dbl_st_acc.m );
145: writec(' ');
146: write32h( dbl_st_acc.l );
147: writes(", Acc expected = ");
148: write32h( dbl_expected.m );
149: writec(' ');
150: write32h( dbl_expected.l );
151: writec('\n');
152: }
153: if ( halt_flg ) /* halt on error? */
154: pushd_er_halt( BAD_ACC_HLT );
155: if ( loop_on_err )
156: {
157: force_loop = TRUE; /* set the force loop flag */
158: asm("brw _pushd_1_lp1"); /* and loop on the error */
159: } /* end of loop-on-error */
160: } /* end of acc corr error */
161: } while( index++ < max_ldd_1_index );
162: } /* end of subtest 1 */
163:
164:
165:
166: /************************************************************************
167: *
168: * SUBTEST 2 - register corruption test
169: *
170: ************************************************************************/
171: pushd_2()
172: {
173: force_loop = FALSE;
174: subtest = 2;
175: index = 0;
176: do
177: {
178: fill_reg_buf( load_regs ); /* Set the values that */
179: dbl_ld_acc = ldd_1_data[index].ld; /* get data to load */
180: dbl_expected = ldd_1_data[index].exp; /* get expected results */
181: /*
182: * If LOOP ON ERROR is set, this is the loop for this subtest.
183: * The force loop flag is set after the first error.
184: */
185: asm("_pushd_2_lp1:");
186: asm("ldd _dbl_ld_acc"); /* LOAD the (dbl) value */
187: asm("loadr $0x1fff,_load_regs"); /* load regs 0 - 12 */
188: asm("nop");
189: asm("pushd"); /* push the accumulator */
190: asm("nop");
191: asm("storer $0x1fff,_store_regs"); /* store regs 0 - 12 */
192: if( force_loop )
193: asm("brb _pushd_2_lp1");; /* run the loop again */
194: index2 = 0;
195: while( (load_regs[index2] == store_regs[index2]) && (index2 < 13) )
196: index2++; /* check reg values */
197: if( index2 < 13 ) { /* error if index2 < 13 */
198: errcnt++; /* bump the error count */
199: if ( prt_error ) {
200: writes("\ncycle: ");
201: writed( cycle );
202: writes(" PUSHD test ");
203: writed( test_no );
204: writes(", subtest 2 - A REGISTER WAS MODIFIED\n");
205: print_pushd_data();
206: writes(", pushed = ");
207: write32h( dbl_ld_acc.m );
208: writec(' ');
209: write32h( dbl_ld_acc.l );
210: writec('\n');
211: writes("register "); /* print the information */
212: writed( index2 ); /* about the corrupted */
213: writes(" = "); /* register */
214: write32h( store_regs[index2] );
215: writes(", should be = ");
216: write32h( load_regs[index2] );
217: writes("\n");
218: }
219: if ( halt_flg ) /* halt on error? */
220: pushd_er_halt( BAD_REG_HLT );
221: if ( loop_on_err ) {
222: force_loop = TRUE; /* set the force loop flag */
223: asm("jmp _pushd_2_lp1"); /* and loop */
224: } /* end of loop-on-error */
225: } /* end of compare error */
226: } while( index++ < max_ldd_1_index );
227: } /* end of subtest 2 */
228:
229:
230:
231: /************************************************************************
232: *
233: * SUBTEST 3 - PUSHD status test
234: *
235: ************************************************************************/
236: pushd_3()
237: {
238: force_loop = FALSE;
239: subtest = 3;
240: index = 0;
241: do {
242: dbl_ld_acc = ldd_1_data[index].ld; /* get the operand */
243: status_index = 0; /* clear the status index */
244: do {
245: sgl_dummy1 = status_array[status_index]; /* array = +, -, 0 */
246: /*
247: * If LOOP ON ERROR is set, this is the loop for this subtest.
248: * The force loop flag is set after the first error.
249: */
250: asm("_pushd_3_lp1:");
251: asm("ldd _dbl_ld_acc"); /* load the operand */
252: asm("tstl _sgl_dummy1"); /* generate initial status */
253: asm("movpsl _init_psl"); /* save the initial status */
254: asm("nop");
255: asm("pushd"); /* push the accumulator */
256: asm("nop");
257: asm("movpsl _psl_val"); /* save the final status */
258: asm("std _dbl_st_acc"); /* save the acc */
259: if( force_loop ) /* loop? */
260: asm("brb _pushd_3_lp1");; /* run the loop again */
261: exp_psl = init_psl; /* get the initial PSL */
262: exp_psl &= 0xfffffff3; /* clear ZERO, NEGATIVE */
263: if( !(dbl_ld_acc.m & 0x7f800000) )
264: exp_psl |= PSL_Z; /* expect the ZERO bit set */
265: else if( dbl_ld_acc.m & 0x80000000 )
266: exp_psl |= PSL_N; /* expect the NEG bit set */
267: if( psl_val != exp_psl ) { /* COMPARE the values */
268: errcnt++; /* bump the error count */
269: if ( prt_error ) {
270: writes(" \n"); /* start a new print line */
271: writes("cycle: ");
272: writed( cycle );
273: writes(" PUSHD test ");
274: writed( test_no );
275: writes(", subtest 3 - INCORRECT FINAL PSL\n");
276: print_pushd_data();
277: writes(", pushed = ");
278: write32h( dbl_ld_acc.m );
279: writec(' ');
280: write32h( dbl_ld_acc.l );
281: writec('\n');
282: writes("initial PSL = ");
283: write32h( init_psl );
284: writes(", final PSL = ");
285: write32h( psl_val );
286: writes(", expected PSL = ");
287: write32h( exp_psl );
288: writec('\n');
289: }
290: if ( halt_flg ) /* halt on error? */
291: pushd_er_halt( BAD_PSL_HLT );
292: if ( loop_on_err ) {
293: force_loop = TRUE; /* set the force loop flag */
294: asm("jmp _pushd_3_lp1"); /* and loop */
295: }; /* end of loop-on-error */
296: } /* end of compare error */
297: } while( ++status_index < 3 );
298: } while( index++ < max_ldd_1_index );
299: } /* end of subtest 3 */
300:
301:
302:
303: /**************************************************************************
304: *
305: * PRINT THE DATA AND STORE RESULTS
306: *
307: * initial Acc = xxxxxxxx xxxxxxxx, stored = xxxxxxxx xxxxxxxx, index = xx
308: * operand = xxxxxxxx xxxxxxxx, expected = xxxxxxxx xxxxxxxx
309: **************************************************************************/
310: print_pushd_data()
311: {
312: writes("initial Acc = ");
313: write32h( dbl_ld_acc.m );
314: writec(' ');
315: write32h( dbl_ld_acc.l );
316: }
317:
318:
319:
320: /**************************************************************************
321: *
322: * HALT ON ERROR ROUTINE
323: *
324: **************************************************************************/
325: pushd_er_halt( halt_code )
326: int halt_code;
327: {
328: sgl_value_1 = dbl_ld_acc.m;
329: sgl_value_2 = dbl_ld_acc.l;
330: sgl_value_3 = dbl_st_acc.m;
331: sgl_value_4 = dbl_st_acc.l;
332: sgl_value_5 = pop_val_1;
333: sgl_value_6 = pop_val_2;
334: sgl_dummy1 = halt_code; /* get the error type */
335: asm("movl _test_no,r0"); /* r0 = test number */
336: asm("movl _subtest,r1"); /* r1 = subtest number */
337: asm("movl _sgl_dummy1,r2"); /* r2 = error code */
338: asm("movl _cycle,r3"); /* r3 = cycle count */
339: asm("movl _sgl_value_1,r4"); /* r4 = MS loaded */
340: asm("movl _sgl_value_2,r5"); /* r5 = LS loaded */
341: asm("movl _sgl_value_3,r6"); /* r6 = MS stored */
342: asm("movl _sgl_value_4,r7"); /* r7 = LS stored */
343: asm("movl _sgl_value_5,r8"); /* r8 = MS popped */
344: asm("movl _sgl_value_6,r9"); /* r9 = LS popped */
345: if( halt_code == BAD_ACC_HLT ) {
346: sgl_value_1 = dbl_expected.m;
347: sgl_value_2 = dbl_expected.l;
348: asm("movl _sgl_value_1,r10"); /* r10 = MS expected */
349: asm("movl _sgl_value_2,r11"); /* r11 = LS expected */
350: asm("movl _index,r12"); /* r12 = data index */
351: } else
352: if( halt_code == BAD_REG_HLT ) {
353: sgl_dummy1 = load_regs[index2];
354: sgl_dummy2 = store_regs[index2];
355: asm("movl _index2,r11"); /* r11 = bad register # */
356: asm("movl _sgl_dummy2,r12"); /* r12 = actual value */
357: asm("movl _sgl_dummy1,r13"); /* r13 = expected value */
358: } else
359: if( halt_code == BAD_PSL_HLT ) {
360: asm("movl _init_psl,r11"); /* r11 = initial PSL */
361: asm("movl _psl_val,r12"); /* r12 = final PSL */
362: asm("movl _exp_psl,r13"); /* r13 = expected PSL */
363: } else
364: if( halt_code == BAD_STORE_HLT ) {
365: sgl_value_1 = dbl_expected.m;
366: sgl_value_2 = dbl_expected.l;
367: asm("movl _sgl_value_1,r10"); /* r10 = MS expected */
368: asm("movl _sgl_value_2,r11"); /* r11 = LS expected */
369: asm("movl _index,r12"); /* r12 = data index */
370: } else
371: if( halt_code == PUSH_CNT_HLT ) {
372: asm("movl _sgl_value_7,r10"); /* r10 = num words push */
373: asm("movl $2,r11"); /* r11 = num words exp */
374: };
375: asm("halt"); /* HALT ... */
376: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.