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