Annotation of cci/d/fpevent/pipe8.c, revision 1.1.1.1

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.