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