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