|
|
1.1 root 1:
2: #include "dmp_defs.h"
3:
4: /***********************************************************************
5: *
6: * Verify double precision results for a store type operation
7: *
8: * The operand is in dbl_value_3. This test assumes that the flag bits
9: * of the PSL will be set by the operation. This test also assumes that
10: * the accumulator shouldn't be changed by the operation.
11: * The "no-fpp" firmware will not clear double precison "bad 0" accumulators.
12: ***********************************************************************/
13: chk_dbl_s()
14: {
15: if( (dbl_ld_acc.m & 0x7f800000) || (no_fpp_wcs) ) {
16: sgl_value_1 = dbl_ld_acc.m;
17: sgl_value_2 = dbl_ld_acc.l;
18: } else { /* zero accumulator */
19: sgl_value_1 = 0;
20: sgl_value_2 = 0;
21: }
22: if( op_code == CVDL_OP_CODE )
23: dbl_value_3.l = dbl_expected.l; /* correct for sgl store */
24: exp_psl = init_psl & 0xfffffff1; /* clear PSL flag bits */
25: exp_psl |= PSL_DBL; /* set the DBL Acc. bit */
26: exp_psl |= PSL_C; /* set the CARRY bit */
27: if( dbl_expected.m & 0x80000000 )
28: exp_psl |= PSL_N; /* set the NEGATIVE bit */
29: else if( !dbl_expected.m )
30: exp_psl |= PSL_Z; /* set the ZERO bit */
31: /* */
32: if( (dbl_value_3.m != dbl_expected.m) || /* check the stored value */
33: (dbl_value_3.l != dbl_expected.l) )
34: {
35: errcnt++;
36: if( prt_error )
37: prt_d_st_e( bad_result_msg );
38: if( halt_flg )
39: hlt_d_st_e( 1 ); /* error code 1 */
40: if( loop_on_err )
41: force_loop = TRUE; /* set loop flag */
42: }
43: else if( (psl_val != exp_psl) && (!no_fpp_wcs) ) {
44: errcnt++;
45: if( prt_error )
46: prt_d_st_e( bad_psl_msg );
47: if( halt_flg )
48: hlt_d_st_e( 2 ); /* error code 2 */
49: if( loop_on_err )
50: force_loop = TRUE; /* set loop flag */
51: }
52: else if( no_page_faults != exp_page_faults ) {
53: errcnt++;
54: if( prt_error )
55: prt_d_st_e( trans_flt_cnt_msg );
56: if( halt_flg )
57: hlt_d_st_e( 3 ); /* error code 3 */
58: if( loop_on_err )
59: force_loop = TRUE; /* set loop flag */
60: }
61: else if( (dbl_st_acc.m != sgl_value_1) ||
62: (dbl_st_acc.l != sgl_value_2) ) {
63: errcnt++;
64: if( prt_error )
65: prt_d_st_e( acc_modified_msg );
66: if( halt_flg )
67: hlt_d_st_e( 5 ); /* error code 5 */
68: if( loop_on_err )
69: force_loop = TRUE; /* set loop flag */
70: }
71: else {
72: reg_no = 0;
73: regs_ok = TRUE;
74: while( (reg_no <= 13) && (regs_ok) ) /* check 1st 13 regs */
75: if( store_regs[ reg_no ] == exp_regs[ reg_no ] )
76: reg_no++;
77: else
78: regs_ok = FALSE;
79: if( !regs_ok ) {
80: errcnt++;
81: if( prt_error )
82: prt_d_st_e( reg_modified_msg );
83: if( halt_flg )
84: hlt_d_st_e( 4 ); /* error code 4 */
85: if( loop_on_err )
86: force_loop = TRUE; /* set loop flag */
87: }
88: }
89: }
90:
91:
92:
93: /************************************************************************
94: * PRINT AN ERROR MESSAGE OF THE FORM
95: *
96: * cycle: xx. DMP test xx. <inst>. <error message>, index = xx
97: * addressing mode: <addressing mode description>
98: * inst buf= xx xx xx xx xx xx xx xx xx xx xx -page faults on byte(s) 0, x
99: * initial Acc = xxxxxxxx xxxxxxxx, stored = xxxxxxxx xxxxxxxx, xx pg faults
100: * final Acc = xxxxxxxx xxxxxxxx, expected = xxxxxxxx xxxxxxxx, xx expected
101: * expected Acc = xxxxxxxx xxxxxxxx
102: ************************************************************************/
103: prt_d_st_e( message )
104: char *message;
105: {
106: prt_dmp_er_msg( message ); /* print the error header */
107: writes(" initial Acc = ");
108: write32h( dbl_ld_acc.m ); /* print accumulator data */
109: writec(' ');
110: write32h( dbl_ld_acc.l );
111: writes(", stored = ");
112: write32h( dbl_value_3.m ); /* print the final result */
113: if( op_code == CVDL_OP_CODE )
114: writes(", ");
115: else {
116: writec(' ');
117: write32h( dbl_value_3.l ); /* print LS stored */
118: writes(", ");
119: }
120: writed( no_page_faults ); /* print page fault data */
121: writes(" pg faults\n");
122: writes(" final Acc = "); /* print final Acc value */
123: write32h( dbl_st_acc.m );
124: writec(' ');
125: write32h( dbl_st_acc.l );
126: writes(", expected = "); /* print expected result */
127: write32h( dbl_expected.m );
128: if( op_code == CVDL_OP_CODE )
129: writes(", "); /* longword store only */
130: else {
131: writec(' '); /* print LS of the */
132: write32h( dbl_expected.l ); /* quadword store */
133: writes(", ");
134: }
135: writed( exp_page_faults ); /* print exp # page faults */
136: writes(" expected\n");
137: if( message == acc_modified_msg ) { /* print acc expected */
138: writes("expected Acc = ");
139: write32h( sgl_value_1 ); /* print the expected Acc */
140: writec(' ');
141: write32h( sgl_value_2 );
142: }
143: if( message == bad_psl_msg ) { /* print PSL data */
144: writes("initial PSL = ");
145: write32h( init_psl );
146: writes(", final PSL = ");
147: write32h( psl_val );
148: writes(", expected PSL = ");
149: write32h( exp_psl );
150: }
151: writec('\n');
152: if( message == reg_modified_msg ) /* print modified register */
153: prt_reg_data(); /* print bad register */
154: }
155:
156:
157:
158: /**************************************************************************
159: * Set up the registers and halt
160: **************************************************************************/
161: hlt_d_st_e( code )
162: int code;
163: {
164: int dbl_operand;
165: if( op_code == CVDL_OP_CODE )
166: dbl_operand = FALSE;
167: else
168: dbl_operand = TRUE;
169: sgl_dummy1 = code;
170: asm("movl _test_no,r0"); /* r0 = test number */
171: asm("movl _addr_code,r1"); /* r1 = addressing mode */
172: asm("movl _sgl_dummy1,r2"); /* r2 = error code */
173: asm("movl _cycle,r3"); /* r3 = cycle count */
174: sgl_dummy1 = dbl_ld_acc.m;
175: sgl_dummy2 = dbl_ld_acc.l;
176: asm("movl _sgl_dummy1,r4"); /* r4 = MS of initial Acc */
177: asm("movl _sgl_dummy2,r5"); /* r5 = LS of initial Acc */
178: sgl_dummy1 = dbl_value_3.m;
179: sgl_dummy2 = dbl_value_3.l;
180: asm("movl _sgl_dummy1,r6"); /* r4 = MS of stored data */
181: if( dbl_operand )
182: asm("movl _sgl_dummy2,r7"); /* r7 = LS of stored data */
183: else
184: asm("clrl r7");;
185: if( code == 1 ) { /* bad data stored */
186: sgl_dummy1 = dbl_expected.m;
187: sgl_dummy2 = dbl_expected.l;
188: asm("movl _sgl_dummy1,r8"); /* r8 = MS of expected */
189: asm("movl _sgl_dummy2,r9"); /* r9 = LS of expected */
190: }
191: else if( code == 2 ) { /* bad final PSL */
192: asm("movl _init_psl,r8"); /* r8 = initial psl */
193: asm("movl _psl_val,r9"); /* r9 = final psl */
194: asm("movl _exp_psl,r10"); /* r10 = expected psl */
195: }
196: else if( code == 3 ) { /* wrong # page faults */
197: asm("movl _no_page_faults,r8"); /* r8 = # page faults */
198: asm("movl _exp_page_faults,r9"); /* r9 = # faults expected */
199: }
200: else if( code == 4 ) { /* corrupted accumulator */
201: asm("movl _dbl_expected,r8"); /* r8 = MS expected Acc */
202: asm("movl _dbl_expected+4,r9"); /* r9 = LS expected Acc */
203: }
204: else { /* register corrupted */
205: asm("movl _reg_no,r8"); /* r8 = bad register # */
206: asm("movl _store_regs[r8],r9"); /* r9 = final (bad) value */
207: asm("movl _exp_regs[r8],r10"); /* r10 = expected value */
208: }
209: asm(".globl _hlt_dbl_st");
210: asm("_hlt_dbl_st:");
211: asm("halt");
212: }
213:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.