|
|
1.1 root 1:
2: #include "evt_defs.h"
3:
4: /*
5: *********************************************************************
6: * FPP PIPELINED EVENTS TEST #1
7: *
8: * This test will execute the following code: "LDD DIVD MOVL CVDL"
9: * with an alignment fault on the MOVL. We will make sure that:
10: * 1. The fault is detected,
11: * 2. the divide operation completes, and
12: * 3. the convert double to integer isn't executed.
13: *
14: * NOTE: pipe14 also uses this tests data patterns
15: *********************************************************************
16: */
17: pipe1()
18: {
19: asm("moval (r13),_pre_event_fp"); /* save the frame pointer */
20: asm("moval (r14),_pre_event_sp"); /* save the stack pointer */
21: precision = DBL;
22: test_event = ALIGN_CODE; /* alignment fault expected */
23: exp_event = FALSE; /* ... but not yet */
24: asm("movab _pipe1_ret,_event_return"); /* post event addr */
25: for( index = 0; index < max_pipe1_index; index++ )
26: {
27: dbl_value_1 = pipe1_data[index].op_1; /* get the data */
28: dbl_value_2 = pipe1_data[index].op_2;
29: dbl_expected = pipe1_data[index].exp;
30: sgl_value_10 = 0;
31: asm(".globl _pipe1_lp1"); /* start of error loop */
32: asm("_pipe1_lp1:");
33: asm("bispsw $0x60"); /* enable ovfl & undfl */
34: asm("ldd _dbl_value_1"); /* load the Acc. */
35: exp_event = test_event; /* expect event soon */
36: asm("divd _dbl_value_2"); /* start the divide */
37: asm("movl _sgl_dummy1+1,_sgl_dummy2+2"); /* trigger the fault */
38: asm("cvdl _sgl_value_10"); /* we shouldn't get to here */
39: /*
40: * If we got to here then there was no event
41: */
42: if( force_loop )
43: asm("brw _pipe1_lp1");; /* loop on the error */
44: exp_event = FALSE; /* reset event expected flag */
45: asm("bicpsw $0x60"); /* disable ovfl & undfl evts */
46: asm("movl _pre_event_fp,fp"); /* restore the frame pointer */
47: asm("movl _pre_event_sp,sp"); /* restore the stack pointer */
48: no_pipe1_evt();; /* report the error */
49: /*
50: * Come here after the event
51: */
52: asm(".globl _pipe1_ret");
53: asm("_pipe1_ret:");
54: asm("movl _pre_event_fp,fp"); /* restore the frame pointer */
55: asm("movl _pre_event_sp,sp"); /* restore the stack pointer */
56: if( force_loop )
57: asm("brw _pipe1_lp1");; /* loop on the error */
58: asm("bicpsw $0x60"); /* disable ovfl & undfl evts */
59: if( (post_evt_acc.m != dbl_expected.m) ||
60: (post_evt_acc.l != dbl_expected.l) )
61: bad_pipe1_result(); /* incorrect result error */
62: else if( sgl_value_10 )
63: pipe1_queue_err(); /* queue not cleared error */
64: }
65: }
66:
67:
68:
69: /****************************************************************************
70: * Report an "EVENT NOT DETECTED" error
71: *
72: * Cycle: xx. EVT test xx. subtest xx. index = xx. No alignment fault occurred.
73: * inst = LDD op1, DIVD op2, MOVL op3,op4; CVDL op5 (alignment fault on the MOVL)
74: * op1 = xxxxxxxx xxxxxxxx, op2 = xxxxxxxx xxxxxxxx
75: * addr. of op3 = xxxxxxxx, addr. of op4 = xxxxxxxx
76: ****************************************************************************/
77: no_pipe1_evt()
78: {
79: errcnt++; /* bump the error count */
80: if ( prt_error )
81: {
82: print_pipe1_err( ". No alignment fault occurred.");
83: writes("op1 = ");
84: write32h( dbl_value_1.m );
85: writes(" ");
86: write32h( dbl_value_1.l );
87: writes(", op2 = ");
88: write32h( dbl_value_2.m );
89: writes(" ");
90: write32h( dbl_value_2.l );
91: writes("\naddr. of ad_1 = ");
92: write32h( ( (int)&sgl_dummy1 )+1 );
93: writes(", addr. of ad_2 = ");
94: write32h( ( (int)&sgl_dummy2 )+2 );
95: writec('\n');
96: }
97: if ( halt_flg ) /* halt on error? */
98: pipe1_halt( 1 );
99: if ( loop_on_err )
100: {
101: force_loop = TRUE; /* set the force loop flag */
102: asm("jmp _pipe1_lp1"); /* and loop */
103: };
104: }
105:
106:
107:
108:
109: /****************************************************************************
110: * Report an "BAD ACCUMULATOR AFTER THE EVENT" error
111: *
112: * Cycle: xx. EVT test xx. subtest xx. index = xx. Bad final Accumulator.
113: * inst = LDD op1, DIVD op2, MOVL op3,op4; CVDL op5 (alignment fault on the MOVL)
114: * op1 = xxxxxxxx xxxxxxxx, final Acc. = xxxxxxxx xxxxxxxx
115: * op2 = xxxxxxxx xxxxxxxx, expected = xxxxxxxx xxxxxxxx
116: ****************************************************************************/
117: bad_pipe1_result()
118: {
119: errcnt++; /* bump the error count */
120: if ( prt_error )
121: {
122: print_pipe1_err( ". bad final accumulator.");
123: writes("op1 = ");
124: write32h( dbl_value_1.m );
125: writes(" ");
126: write32h( dbl_value_1.l );
127: writes(", final Acc. = ");
128: write32h( post_evt_acc.m );
129: writec(' ');
130: write32h( post_evt_acc.l );
131: writes("\nop2 = ");
132: write32h( dbl_value_2.m );
133: writes(" ");
134: write32h( dbl_value_2.l );
135: writes(", expected = ");
136: write32h( dbl_expected.m );
137: writes(" ");
138: write32h( dbl_expected.l );
139: writec('\n');
140: }
141: if ( halt_flg ) /* halt on error? */
142: pipe1_halt( 2 );
143: if ( loop_on_err )
144: {
145: force_loop = TRUE; /* set the force loop flag */
146: asm("jmp _pipe1_lp1"); /* and loop */
147: };
148: }
149:
150:
151:
152:
153: /****************************************************************************
154: * Report an "FPP QUEUE NOT CLEARED BY THE EVENT" error
155: *
156: * Cycle: xx. EVT test xx. subtest xx. index = xx. FPP queue not cleared.
157: * inst = LDD op1, DIVD op2, MOVL op3,op4; CVDL op5 (alignment fault on the MOVL)
158: * op1 = xxxxxxxx xxxxxxxx, final Acc. = xxxxxxxx xxxxxxxx
159: * op2 = xxxxxxxx xxxxxxxx, final op5 = xxxxxxxx
160: ****************************************************************************/
161: pipe1_queue_err()
162: {
163: errcnt++; /* bump the error count */
164: if ( prt_error )
165: {
166: print_pipe1_err( ". FPP queue not cleared." );
167: writes("op1 = ");
168: write32h( dbl_value_1.m );
169: writes(" ");
170: write32h( dbl_value_1.l );
171: writes(", final Acc. = ");
172: write32h( post_evt_acc.m );
173: writec(' ');
174: write32h( post_evt_acc.l );
175: writes("\nop2 = ");
176: write32h( dbl_value_2.m );
177: writes(" ");
178: write32h( dbl_value_2.l );
179: writes(", final op5 = ");
180: write32h( sgl_value_10 );
181: writec('\n');
182: }
183: if ( halt_flg ) /* halt on error? */
184: pipe1_halt( 3 );
185: if ( loop_on_err )
186: {
187: force_loop = TRUE; /* set the force loop flag */
188: asm("jmp _pipe1_lp1"); /* and loop */
189: };
190: }
191:
192:
193: /****************************************************************************
194: * Print an error message of the form:
195: *
196: * Cycle: xx. EVT test xx. subtest xx. <your message here>. index = xx
197: * inst = LDD op1, DIVD op2, MOVL op3,op4; CVDL op5 (alignment fault on the MOVL)
198: ****************************************************************************/
199: print_pipe1_err( msg )
200: char *msg; /* pointer to error message */
201: {
202: if( errcnt == 1 ) /* 1st error? */
203: writes(" \n"); /* start a new print line */
204: writes("Cycle: ");
205: writed( cycle );
206: writes(" EVT test ");
207: writed( test_no );
208: writes(". subtest ");
209: writed( subtest );
210: writes(". ");
211: writes( msg ); /* write the message */
212: writes(" index = ");
213: writed( index );
214: writes( "\ninst = LDD op1, DIVD op2, MOVL op3,op4; CVDL op5 " );
215: writes( "(alignment fault on the MOVL)\n" );
216: }
217:
218:
219: /****************************************************************************
220: * Error Halt Routine
221: ****************************************************************************/
222: pipe1_halt( code )
223: int code; /* halt code to use */
224: {
225: err_code = code;
226: sgl_value_1 = dbl_value_1.m;
227: sgl_value_2 = dbl_value_1.l;
228: sgl_value_3 = dbl_value_2.m;
229: sgl_value_4 = dbl_value_2.l;
230: asm("movl _test_no,r0"); /* r0 = test number */
231: asm("movl _subtest,r1"); /* r1 = subtest number */
232: asm("movl _err_code,r2"); /* r2 = error code */
233: asm("movl _cycle,r3"); /* r3 = cycle count */
234: asm("movl _sgl_value_1,r4"); /* r4 = MSW of operand 1 */
235: asm("movl _sgl_value_2,r5"); /* r5 = LSW of operand 1 */
236: asm("movl _sgl_value_3,r6"); /* r6 = MSW of operand 2 */
237: asm("movl _sgl_value_4,r7"); /* r7 = LSW of operand 2 */
238: if( code == 1 ) {
239: asm("movab _sgl_dummy1+1,r8"); /* r8 = 1st movl op addr. */
240: asm("movab _sgl_dummy2+2,r9"); /* r9 = 2nd movl op addr. */
241: asm("movl _index,r10"); /* r10 = data index */
242: }
243: else if( code == 2 ) {
244: sgl_value_5 = post_evt_acc.m;
245: sgl_value_6 = post_evt_acc.l;
246: sgl_value_7 = dbl_expected.m;
247: sgl_value_8 = dbl_expected.l;
248: asm("movl _sgl_value_5,r8"); /* r8 = MSW of final acc. */
249: asm("movl _sgl_value_6,r9"); /* r9 = LSW of final acc. */
250: asm("movl _sgl_value_7,r10"); /* r10 = MSW of expected */
251: asm("movl _sgl_value_8,r11"); /* r11 = LSW of expected */
252: asm("movl _index,r12"); /* r12 = data index */
253: }
254: else if( code == 3 ) {
255: sgl_value_5 = post_evt_acc.m;
256: sgl_value_6 = post_evt_acc.l;
257: sgl_value_7 = sgl_value_10;
258: asm("movl _sgl_value_5,r8"); /* r8 = MSW of final acc. */
259: asm("movl _sgl_value_6,r9"); /* r9 = LSW of final acc. */
260: asm("movl _sgl_value_7,r10"); /* r10 = integer stored */
261: asm("movl _index,r11"); /* r11 = data index */
262: };
263: asm("halt");; /* HALT ... */
264: };
265:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.