|
|
1.1 ! root 1: ! 2: #include "evt_defs.h" ! 3: ! 4: /* ! 5: ********************************************************************* ! 6: * FPP PIPELINED EVENTS TEST #9 ! 7: * ! 8: * This test will execute the following code: "LDF DIVF CVLF $2" ! 9: * with a divide by zero fault on the DIVF. We will make sure that: ! 10: * 1. The fault is detected, and ! 11: * 2. the convert instruction is not executed. ! 12: ********************************************************************* ! 13: */ ! 14: pipe9() ! 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 = SGL; ! 19: test_event = ARITH_CODE; /* expect an arithmetic fault */ ! 20: exp_code = FLT_0_DIV_CODE; /* - specificly div by 0 */ ! 21: exp_event = FALSE; /* ... but not yet */ ! 22: asm("movab _pipe9_ret,_event_return"); /* set event return address */ ! 23: max_index = zero_divide_cnt; /* set max operand index */ ! 24: for( index = 0; index < max_index; index++ ) ! 25: { ! 26: dbl_ld_acc = zero_divide_data[index].op_1; /* get the Acc data */ ! 27: dbl_value_1 = zero_divide_data[index].op_2; /* get the '0' data */ ! 28: if( dbl_ld_acc.m & 0x7f800000 ) ! 29: dbl_expected.m = dbl_ld_acc.m; /* The final Acc s/b */ ! 30: else ! 31: dbl_expected.m = 0; /* = the initial Acc */ ! 32: asm("bispsw $0x60"); /* enable ovfl,undfl */ ! 33: asm(".globl _pipe9_lp1"); ! 34: asm("_pipe9_lp1:"); ! 35: asm("ldf _dbl_ld_acc"); /* load the Acc. */ ! 36: exp_event = test_event; /* expect event soon */ ! 37: asm("divf _dbl_value_1"); /* trigger the event */ ! 38: asm("cvlf $2"); /* shouldn't get here*/ ! 39: /* ! 40: * If we got to here then there was no event ! 41: */ ! 42: if( force_loop ) ! 43: asm("brw _pipe9_lp1");; /* loop on the error */ ! 44: exp_event = FALSE; /* reset event expected flag */ ! 45: asm("movl _pre_event_fp,fp"); /* restore the frame pointer */ ! 46: asm("movl _pre_event_sp,sp"); /* restore the stack pointer */ ! 47: asm("bicpsw $0x60"); /* disable ovfl & undfl evts */ ! 48: no_pipe9_evt();; /* report the error */ ! 49: /* ! 50: * Come here after the event ! 51: */ ! 52: asm(".globl _pipe9_ret"); ! 53: asm("_pipe9_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 _pipe9_lp1");; /* loop on the error */ ! 58: asm("bicpsw $0x60"); /* disable ovfl & undfl evts */ ! 59: if( post_evt_acc.m != dbl_expected.m ) /* was the Acc modified? */ ! 60: { ! 61: if( post_evt_acc.m == 0x41000000 ) /* is Acc. = 2.0 ? */ ! 62: pipe9_queue_er(); /* queue not cleared error */ ! 63: else ! 64: bad_pipe9_result(); /* incorrect result error */ ! 65: } ! 66: } ! 67: } ! 68: ! 69: ! 70: ! 71: /**************************************************************************** ! 72: * Report an "EVENT NOT DETECTED" error ! 73: * ! 74: * Cycle: xx. EVT test xx. subtest xx. No 'divide by 0' fault seen. index = xx ! 75: * inst = LDF op1, DIVF op2, CVLF '2' ('divide by 0' fault on DIVF) ! 76: * op1 = xxxxxxxx, op2 = xxxxxxxx ! 77: ****************************************************************************/ ! 78: no_pipe9_evt() ! 79: { ! 80: errcnt++; /* bump the error count */ ! 81: if ( prt_error ) ! 82: { ! 83: print_pipe9_er( ". No 'divide by 0' fault seen." ); ! 84: writes("op1 = "); ! 85: write32h( dbl_ld_acc.m ); ! 86: writes(", op2 = "); ! 87: write32h( dbl_value_1.m ); ! 88: writec('\n'); ! 89: } ! 90: if ( halt_flg ) /* halt on error? */ ! 91: pipe9_halt( 1 ); /* halt with a code of 1 */ ! 92: if ( loop_on_err ) ! 93: { ! 94: force_loop = TRUE; /* set the force loop flag */ ! 95: asm("jmp _pipe9_lp1"); /* and loop */ ! 96: }; ! 97: } ! 98: ! 99: ! 100: ! 101: ! 102: /**************************************************************************** ! 103: * Report an "BAD ACCUMULATOR AFTER THE EVENT" error ! 104: * ! 105: * Cycle: xx. EVT test xx. subtest xx. Bad final Accumulator. index = xx ! 106: * inst = LDF op1, DIVF op2, CVLF '2' ('divide by 0' fault on DIVF) ! 107: * The 'Convert '2' to Floating Point' should not be executed. ! 108: * op_1 = xxxxxxxx, op2 = xxxxxxxx, final Acc. = xxxxxxxx, expected = xxxxxxxx ! 109: ****************************************************************************/ ! 110: bad_pipe9_result() ! 111: { ! 112: errcnt++; /* bump the error count */ ! 113: if ( prt_error ) ! 114: { ! 115: print_pipe9_er( ". Bad final Accumulator" ); ! 116: writes( ! 117: "The 'Convert '2' to Floating Point' should not be executed\n"); ! 118: writes("op1 = "); ! 119: write32h( dbl_ld_acc.m ); ! 120: writes(", op1 = "); ! 121: write32h( dbl_value_1.m ); ! 122: writes(", final Acc. = "); ! 123: write32h( post_evt_acc.m ); ! 124: writes(", expected = "); ! 125: write32h( dbl_expected.m ); /* the expected result = 0 */ ! 126: writec('\n'); ! 127: } ! 128: if ( halt_flg ) /* halt on error? */ ! 129: pipe9_halt( 2 ); /* halt with a code of 2 */ ! 130: if ( loop_on_err ) ! 131: { ! 132: force_loop = TRUE; /* set the force loop flag */ ! 133: asm("jmp _pipe9_lp1"); /* and loop */ ! 134: }; ! 135: } ! 136: ! 137: ! 138: ! 139: ! 140: ! 141: /**************************************************************************** ! 142: * Report an "FPP queue not cleared" message ! 143: * ! 144: * Cycle: xx. EVT test xx. subtest xx. Fpp queue not cleared. index = xx ! 145: * inst = LDF op1, DIVF op2, CVLF '2' ('divide by 0' fault on DIVF) ! 146: * The 'Convert '2' to Floating Point' was apparently executed. ! 147: * op1 = xxxxxxxx, op2 = xxxxxxxx, final Acc. = xxxxxxxx, expected = xxxxxxxx ! 148: ****************************************************************************/ ! 149: pipe9_queue_er() ! 150: { ! 151: errcnt++; /* bump the error count */ ! 152: if ( prt_error ) ! 153: { ! 154: print_pipe9_er( ". Fpp queue not cleared" ); ! 155: writes( ! 156: "The 'Convert '2' to Floating Point' was apparently executed.\n"); ! 157: writes("op1 = "); ! 158: write32h( dbl_ld_acc.m ); ! 159: writes(", op1 = "); ! 160: write32h( dbl_value_1.m ); ! 161: writes(", final Acc. = "); ! 162: write32h( post_evt_acc.m ); ! 163: writes(", expected = "); ! 164: write32h( 0x80000000 ); /* the expected result = 0 */ ! 165: writec('\n'); ! 166: } ! 167: if ( halt_flg ) /* halt on error? */ ! 168: pipe9_halt( 3 ); /* halt with a code of 3 */ ! 169: if ( loop_on_err ) ! 170: { ! 171: force_loop = TRUE; /* set the force loop flag */ ! 172: asm("jmp _pipe9_lp1"); /* and loop */ ! 173: }; ! 174: } ! 175: ! 176: ! 177: ! 178: ! 179: /**************************************************************************** ! 180: * Report an error message of the form: ! 181: * ! 182: * Cycle: xx. EVT test xx. subtest xx. <your message here> index = xx ! 183: * inst = LDF op1, DIVF op2, CVLF '2' ('divide by 0' fault on DIVF) ! 184: ****************************************************************************/ ! 185: print_pipe9_er( msg ) ! 186: char *msg; /* error message to print */ ! 187: { ! 188: if( errcnt == 1 ) /* 1st error? */ ! 189: writes(" \n"); /* start a new print line */ ! 190: writes("Cycle: "); ! 191: writed( cycle ); ! 192: writes(" EVT test "); ! 193: writed( test_no ); ! 194: writes(". subtest "); ! 195: writed( subtest ); ! 196: writes( msg ); /* print the message */ ! 197: writes(" index = "); ! 198: writed( index ); ! 199: writes("\ninst = LDF op1, DIVF op2, CVLF '2'"); ! 200: writes(" ('divide by 0' fault on DIVF)\n"); ! 201: } ! 202: ! 203: ! 204: ! 205: /**************************************************************************** ! 206: * halt on error routine ! 207: ****************************************************************************/ ! 208: pipe9_halt( code ) ! 209: int code; /* error code to halt with */ ! 210: { ! 211: err_code = code; ! 212: sgl_value_1 = dbl_ld_acc.m; ! 213: sgl_value_2 = dbl_value_1.m; ! 214: sgl_value_3 = post_evt_acc.m; ! 215: asm("movl _test_no,r0"); /* r0 = test number */ ! 216: asm("movl _subtest,r1"); /* r1 = subtest number */ ! 217: asm("movl _err_code,r2"); /* r2 = error code */ ! 218: asm("movl _cycle,r3"); /* r3 = cycle count */ ! 219: asm("movl _sgl_value_1,r4"); /* r4 = initial accumulator */ ! 220: asm("movl _sgl_value_2,r5"); /* r5 = divide operand */ ! 221: asm("movl _sgl_value_3,r6"); /* r6 = final accumulator */ ! 222: asm("movl $0x80000000,r7"); /* r7 = expected accumulator */ ! 223: asm("movl _index,r8"); /* r8 = data index */ ! 224: asm("halt"); /* HALT ... */ ! 225: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.