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