Annotation of cci/d/macro4/expf.c, revision 1.1.1.1

1.1       root        1: #include "fpp_defs.h"
                      2: 
                      3: 
                      4: 
                      5: /***************************************************************************
                      6: *
                      7: *      EXPF - SINGLE PRECISION FLOATING POINT EXPF FUNCTION TEST
                      8: *
                      9: *                      EXPF TEST MONITOR
                     10: *
                     11: *****************************************************************************/
                     12: expf()
                     13: {
                     14:        asm(".globl _expf_t");
                     15:        asm("_expf_t:");                        /* entry address            */
                     16:        if( ( cycle == 1 ) && ( prt_hdrs ) )    /* print headers on 1st pass */
                     17:        {
                     18:           writes(" EXPF");
                     19:        }
                     20:        expf_1();                               /* test expf with delay       */
                     21:        expf_2();                               /* test expf                  */
                     22:        expf_3();                               /* register corruption        */
                     23:        expf_4();                               /* test the PSL               */
                     24:        expf_5();                               /* pipelined entry            */
                     25:        expf_6();                               /* pipelined exit             */
                     26:        asm("jmp *return");                     /* return to the test monitor */
                     27: }
                     28:   
                     29: 
                     30: 
                     31: /***************************************************************************
                     32: *
                     33: *      SUBTEST 1 - EXPF 
                     34: *
                     35: ***************************************************************************/
                     36: expf_1() 
                     37: {
                     38: #define DELAY 10               /* wait 20 ticks between EXPF & STF */
                     39:        force_loop = FALSE;                        /* clear the LOOP flag */
                     40:        subtest = 1;
                     41:         index = 0;
                     42:        do 
                     43:        {
                     44:           sgl_ld_acc   = expf_1_data[index].ld;   /* get the operand      */
                     45:           sgl_expected = expf_1_data[index].exp;  /* get expected results */
                     46:           sgl_dummy1 = DELAY;
                     47: /*
                     48:  * If LOOP ON ERROR is set, this is the loop for this subtest.
                     49:  * The force loop flag is set after the first error.
                     50: */
                     51:           asm("_expf_1_lp1:");
                     52:           asm("movl _sgl_ld_acc,r4");          /* set the data to load     */
                     53:           asm("ldf r4");                       /* load the accumulator     */
                     54:           asm("movl _sgl_dummy1,r0");          /* get the delay factor     */
                     55:            asm("expf");                                /* get ACC.s' exponent      */
                     56:           asm("1:");
                     57:           asm("decl r0");                      /* delay to let the EXPF    */
                     58:           asm("bgtr 1b");                      /*   instruction finish     */
                     59:           asm("stf r5");                       /* store the result         */
                     60:            if( force_loop )
                     61:                 asm("brb _expf_1_lp1");;      /* loop on the error     */
                     62: /* 
                     63:  * end error loop 
                     64: */
                     65:           asm("movl r5,_sgl_st_acc");          /* save the result          */
                     66:           if( sgl_st_acc != sgl_expected )     /* COMPARE the values       */
                     67:           {
                     68:              errcnt++;                         /* bump the error count     */
                     69:              if ( prt_error ) 
                     70:              {
                     71:                 writes(" \n");         /* start a new print line   */
                     72:                 writes("cycle: ");
                     73:                 writed( cycle );
                     74:                 writes("   EXPF test ");
                     75:                 writed( test_no );
                     76:                 writes(", subtest 1 (delayed store) - BAD FINAL ACC\n");
                     77:                 print_expf_data();
                     78:                  writes(",  data index = ");
                     79:                  writed( index );
                     80:                  writec('\n');
                     81:                  writes("                      Acc expected = ");
                     82:                  write32h( sgl_expected );
                     83:                  writec('\n');
                     84:               }
                     85:               if ( halt_flg )                  /* halt on error?        */
                     86:                 expf_er_halt( BAD_ACC_HLT );
                     87:               if ( loop_on_err ) 
                     88:              {
                     89:                 force_loop = TRUE;             /* set the force loop flag */
                     90:                 asm("jmp _expf_1_lp1");        /* and loop                */
                     91:              }
                     92:           }   /* end of compare error */
                     93:        } while( index++ < max_expf_1_index );
                     94: }  /* end of subtest 1 */
                     95:   
                     96: 
                     97: 
                     98: /***************************************************************************
                     99: *
                    100: *      SUBTEST 2 - EXPF FUNCTION 
                    101: *
                    102: ***************************************************************************/
                    103: expf_2() 
                    104: {
                    105:        force_loop = FALSE;                        /* clear the LOOP flag */
                    106:        subtest = 2;
                    107:         index = 0;
                    108:        do 
                    109:        {
                    110:           sgl_ld_acc   = expf_1_data[index].ld;   /* get the operand      */
                    111:           sgl_expected = expf_1_data[index].exp;  /* get expected results */
                    112: /*
                    113:  * If LOOP ON ERROR is set, this is the loop for this subtest.
                    114:  * The force loop flag is set after the first error.
                    115: */
                    116:           asm("_expf_2_lp1:");
                    117:           asm("movl _sgl_ld_acc,r4");          /* set the data to load     */
                    118:           asm("ldf r4");                       /* load the accumulator     */
                    119:            asm("expf");                                /* get ACC.'s exponent      */
                    120:           asm("stf r5");                       /* store the result         */
                    121:            if( force_loop )
                    122:                   asm("brb _expf_2_lp1");;      /* loop on the error     */
                    123: /* 
                    124:  * end error loop 
                    125: */
                    126:           asm("movl r5,_sgl_st_acc");          /* save the result          */
                    127:           if( sgl_st_acc != sgl_expected )     /* COMPARE the values       */
                    128:           {
                    129:              errcnt++;                         /* bump the error count     */
                    130:              if ( prt_error ) 
                    131:              {
                    132:                 writes(" \n");         /* start a new print line   */
                    133:                 writes("cycle: ");
                    134:                 writed( cycle );
                    135:                 writes("   EXPF test ");
                    136:                 writed( test_no );
                    137:                 writes(", subtest 2 (immediate store) - BAD FINAL ACC\n");
                    138:                 print_expf_data();
                    139:                  writes(",  data index = ");
                    140:                  writed( index );
                    141:                  writec('\n');
                    142:                  writes("                      Acc expected = ");
                    143:                  write32h( sgl_expected );
                    144:                  writec('\n');
                    145:               }
                    146:               if ( halt_flg )                  /* halt on error?        */
                    147:                 expf_er_halt( BAD_ACC_HLT );
                    148:               if ( loop_on_err ) 
                    149:              {
                    150:                 force_loop = TRUE;             /* set the force loop flag */
                    151:                 asm("jmp _expf_2_lp1");        /* and loop                */
                    152:              }
                    153:           }   /* end of compare error */
                    154:        } while( index++ < max_expf_1_index );
                    155: }  /* end of subtest 2 */
                    156:   
                    157: 
                    158: 
                    159: /***************************************************************************
                    160: *
                    161: *      SUBTEST 3 - REGISTER INTEGRITY WITH THE EXPF FUNCTION 
                    162: *
                    163: ***************************************************************************/
                    164: expf_3() 
                    165: {
                    166:        fill_reg_buf( load_regs );              /* set reg values to load */
                    167:        force_loop = FALSE;                     /* clear the LOOP flag */
                    168:        subtest = 3;
                    169:         index = 0;
                    170:        do 
                    171:        {
                    172:           sgl_ld_acc   = expf_1_data[index].ld;   /* get the operand      */
                    173:           sgl_expected = expf_1_data[index].exp;  /* get expected results */
                    174: /*
                    175:  * If LOOP ON ERROR is set, this is the loop for this subtest.
                    176:  * The force loop flag is set after the first error.
                    177: */
                    178:           asm("_expf_3_lp1:");
                    179:           asm("loadr $0x1fff,_load_regs");     /* load regs 0 - 12 (FP)    */
                    180:           asm("ldf _sgl_ld_acc");              /* load the accumulator     */
                    181:           asm("expf");                         /* get ACC.'s exponent      */
                    182:           asm("stf _sgl_st_acc");              /* store the result         */
                    183:           asm("storer $0x1fff,_store_regs");   /* store regs 0 - 12        */
                    184:            if( force_loop )
                    185:                 asm("brb _expf_3_lp1");;      /* loop on the error     */
                    186: /* 
                    187:  * end error loop 
                    188: */
                    189:           reg_no = 0;
                    190:           regs_ok = TRUE;
                    191:           while( (reg_no < 13) && (regs_ok) )  /* check 1st 12 regs */
                    192:              if( store_regs[ reg_no ] == load_regs[ reg_no ] )
                    193:                  reg_no++;
                    194:              else
                    195:                  regs_ok = FALSE;
                    196:           if( !regs_ok )
                    197:           {
                    198:              errcnt++;                         /* bump the error count     */
                    199:              if ( prt_error ) 
                    200:              {
                    201:                 writes(" \n");         /* start a new print line   */
                    202:                 writes("cycle: ");
                    203:                 writed( cycle );
                    204:                 writes("   EXPF test ");
                    205:                 writed( test_no );
                    206:                 writes(", subtest 3 - A REGISTER WAS MODIFIED\n"); {
                    207:                 print_expf_data();
                    208:                 writec('\n');
                    209:                 writes("register ");
                    210:                  writed( reg_no );
                    211:                 writes(" = ");
                    212:                 write32h( load_regs[reg_no] );
                    213:                 writes(",  should be = ");
                    214:                 write32h( store_regs[reg_no] );
                    215:                 writec('\n');
                    216:              }
                    217:              if ( halt_flg )                   /* halt on error?        */
                    218:                 expf_er_halt( BAD_REG_HLT );
                    219:              if ( loop_on_err ) 
                    220:              {
                    221:                 force_loop = TRUE;             /* get the force loop flag */
                    222:                 asm("jmp _expf_3_lp1");        /* and loop                */
                    223:              }
                    224:           }   /* end of compare error */
                    225:        } /* end of while loop */
                    226:     } while( index++ < max_expf_1_index );
                    227: }  /* end of subtest 3 */
                    228:   
                    229: 
                    230: 
                    231: /************************************************************************
                    232: *
                    233: *       SUBTEST 4 - Check for PSL corruption
                    234: *
                    235: ************************************************************************/
                    236: expf_4() 
                    237: {
                    238:         force_loop = FALSE;                     /* clear force_loop flg */
                    239:         subtest = 4;
                    240:         fill_reg_buf( load_regs );              /* get patterns for regs */
                    241:         for( index = 0; index < 3; index++ ) {
                    242:              sgl_ld_acc   = expf_1_data[index].ld;    /* get operand 1 */
                    243:              sgl_expected = expf_1_data[index].exp;   /* get expected  */
                    244:              sgl_dummy1 = status_array[status_index];    /* status = +, -, 0 */
                    245: /*
                    246:  * If LOOP ON ERROR is set, this is the loop for this subtest.
                    247:  * The force loop flag is set after the first error.
                    248: */
                    249:              asm("_expf_4_lp1:");
                    250:              asm("ldf _sgl_ld_acc");            /* LOAD the accumulator  */
                    251:              asm("nop");
                    252:              asm("tstl _sgl_dummy1");          /* set the PSL status    */
                    253:             asm("movpsl _init_psl");           /* save the initial PSL  */
                    254:              asm("expf");                       /* do the expf           */
                    255:              asm("nop");
                    256:              asm("movpsl _psl_val");            /* save the final PSL    */
                    257:              asm("stf _sgl_st_acc");            /* save the accumulator  */
                    258:              if( force_loop )
                    259:                   asm("brb _expf_4_lp1");;      /* loop on the error     */
                    260: /*
                    261:  * Now compare the final PSL to the initial PSL -they should be the same
                    262: */
                    263:              exp_psl = init_psl;
                    264:             if( psl_val != exp_psl ) {
                    265:                   errcnt++;                     /* bump the error count    */
                    266:                   if( prt_error ) {
                    267:                        writes(" \n");      /* start a new print line  */
                    268:                        writes("cycle: ");
                    269:                        writed( cycle );
                    270:                       writes("   EXPF test ");
                    271:                       writed( test_no );
                    272:                        writes(", subtest 4 - INCORRECT FINAL PSL\n");
                    273:                        print_expf_data();       /* print the operands      */
                    274:                       writec('\n');
                    275:                        writes("initial PSL = ");
                    276:                        write32h( init_psl );
                    277:                        writes(",  final PSL = ");
                    278:                        write32h( psl_val );
                    279:                        writes(",  expected PSL = ");
                    280:                        write32h( exp_psl );
                    281:                        writes("\n");
                    282:                   }
                    283:                   if( halt_flg )   
                    284:                        expf_er_halt( BAD_PSL_HLT );   /* halt on the error */
                    285:                    if( loop_on_err ) {
                    286:                         force_loop = TRUE;        /* set the force loop flag */
                    287:                         asm("brw _expf_4_lp1");;  /* and loop on the error   */
                    288:                    }  /* end of loop on error */
                    289:              }  /* end of PSL corruption error */
                    290:         }  /* end of WHILE loop */
                    291: }  /* end of subtest 4 */
                    292:  
                    293: 
                    294: 
                    295: /************************************************************************
                    296: *
                    297: *               SUBTEST 5 - pipelined entry test
                    298: *
                    299: ************************************************************************/
                    300: expf_5() 
                    301: {
                    302:         force_loop = FALSE;
                    303:         subtest = 8;
                    304:         for( index = 0; index < max_expf_1_index; index++ ) {
                    305:              sgl_ld_acc   = expf_1_data[index].ld;   /* get operand 1       */
                    306:              sgl_expected = expf_1_data[index].exp;  /* get expected result */
                    307: /*
                    308:  * If LOOP ON ERROR is set, this is the loop for this subtest.
                    309:  * The force loop flag is set after the first error.
                    310: */
                    311:              asm("_expf_5_lp1:");
                    312:              asm("movl $0,r0");                 /* clear r0                */
                    313:              asm("ldf r0");                     /* load the Acc. with 0.0  */
                    314:              asm("addf _sgl_ld_acc");           /* add the 1st operand     */
                    315:              asm("expf");                       /* get the expf            */
                    316:              asm("stf _sgl_st_acc");            /* store the result        */
                    317:              if( force_loop )
                    318:                   asm("brb _expf_5_lp1");;      /* loop on the error       */
                    319: /* 
                    320:  * end error loop - test the results
                    321: */
                    322:              if( sgl_st_acc != sgl_expected ) { /* COMPARE the values     */
                    323:                    errcnt++;                    /* bump the error count   */
                    324:                    if( prt_error ) {
                    325:                         writes(" \n");      /* start a new print line */
                    326:                         writes("cycle: ");
                    327:                         writed( cycle );
                    328:                        writes("   EXPF test ");
                    329:                        writed( test_no );
                    330:                         writes(", subtest 5 (Piped Entry) - BAD FINAL ACC\n");
                    331:                         print_expf_data();
                    332:                         writes(",  data index = ");
                    333:                         writed( index );
                    334:                         writec('\n');
                    335:                         writes("                      Acc expected = ");
                    336:                         write32h( sgl_expected );
                    337:                         writec('\n');
                    338:                    }
                    339:                    if( halt_flg ) 
                    340:                         expf_er_halt( BAD_ACC_HLT );    /* halt on the error */
                    341:                    if( loop_on_err ) {
                    342:                         force_loop = TRUE;        /* set the force loop flag */
                    343:                         asm("brw _expf_5_lp1");;  /* and loop on the error   */
                    344:                    }  /* end of loop on error */
                    345:              }   /* end of compare error */
                    346:         }  /* end of WHILE loop */
                    347: }  /* end of subtest 5 */
                    348:   
                    349: 
                    350: 
                    351: /************************************************************************
                    352: *
                    353: *               SUBTEST 6 - pipelined exit test
                    354: *
                    355: ************************************************************************/
                    356: expf_6() 
                    357: {
                    358:         force_loop = FALSE;
                    359:         subtest = 8;
                    360:         for( index = 0; index < max_expf_1_index; index++ ) {
                    361:              sgl_ld_acc   = expf_1_data[index].ld;   /* get operand 1       */
                    362:              sgl_expected = expf_1_data[index].exp;  /* get expected result */
                    363: /*
                    364:  * If LOOP ON ERROR is set, this is the loop for this subtest.
                    365:  * The force loop flag is set after the first error.
                    366: */
                    367:              asm("_expf_6_lp1:");
                    368:              asm("movl $0,r0");                 /* clear r0                */
                    369:              asm("ldf _sgl_ld_acc");             /* load the Acc.           */
                    370:              asm("expf");                       /* get the expf            */
                    371:              asm("addf r0");                    /* add a zero to the acc   */
                    372:              asm("stf _sgl_st_acc");            /* store the result        */
                    373:              if( force_loop )
                    374:                   asm("brb _expf_6_lp1");;      /* loop on the error       */
                    375: /* 
                    376:  * end error loop - test the results
                    377: */
                    378:              if( sgl_st_acc != sgl_expected ) { /* COMPARE the values     */
                    379:                    errcnt++;                    /* bump the error count   */
                    380:                    if( prt_error ) {
                    381:                         writes(" \n");      /* start a new print line */
                    382:                         writes("cycle: ");
                    383:                         writed( cycle );
                    384:                        writes("   EXPF test ");
                    385:                        writed( test_no );
                    386:                         writes(", subtest 6 (Piped Exit) - BAD FINAL ACC\n");
                    387:                         print_expf_data();
                    388:                         writes(",  data index = ");
                    389:                         writed( index );
                    390:                         writec('\n');
                    391:                         writes("                      Acc expected = ");
                    392:                         write32h( sgl_expected );
                    393:                         writec('\n');
                    394:                    }
                    395:                    if( halt_flg ) 
                    396:                         expf_er_halt( BAD_ACC_HLT );    /* halt on the error */
                    397:                    if( loop_on_err ) {
                    398:                         force_loop = TRUE;        /* set the force loop flag */
                    399:                         asm("brw _expf_6_lp1");;  /* and loop on the error   */
                    400:                    }  /* end of loop on error */
                    401:              }   /* end of compare error */
                    402:         }  /* end of WHILE loop */
                    403: }  /* end of subtest 6 */
                    404:   
                    405: 
                    406: 
                    407: /**************************************************************************
                    408: *
                    409: *       PRINT THE DATA AND STORE RESULTS
                    410: *
                    411: *  initial Acc = xxxxxxxx,     stored = xxxxxxxx,   data index = xx
                    412: *                        Acc expected = xxxxxxxx
                    413: **************************************************************************/
                    414: print_expf_data()
                    415: {
                    416:         writes("initial Acc = ");
                    417:         write32h( sgl_ld_acc );
                    418:         writes(",  final Acc = ");
                    419:         write32h( sgl_st_acc );
                    420: }
                    421:  
                    422: 
                    423: 
                    424: /**************************************************************************
                    425: *
                    426: *               HALT ON ERROR ROUTINE 
                    427: *
                    428: **************************************************************************/
                    429: expf_er_halt( halt_code )
                    430: int halt_code;
                    431: {
                    432:         sgl_dummy1 = halt_code;                 /* get the error type    */
                    433:         asm("movl _test_no,r0");                /* r0  = test number     */
                    434:         asm("movl _subtest,r1");                /* r1  = subtest number  */
                    435:         asm("movl _sgl_dummy1,r2");             /* r2  = error code      */
                    436:         asm("movl _cycle,r3");                  /* r3  = cycle count     */
                    437:         asm("movl _sgl_ld_acc,r4");             /* r4  = initial data    */
                    438:         asm("movl _sgl_st_acc,r5");             /* r5  = data stored     */
                    439:         asm("movl _sgl_expected,r6");           /* r6  = data expected   */
                    440:         asm("movl _index,r7");                  /* r7  = data index      */
                    441:         if( halt_code == BAD_REG_HLT ) {
                    442:              sgl_dummy1 = load_regs[index2];
                    443:              sgl_dummy2 = store_regs[index2];
                    444:              asm("movl _index2,r6");            /* r6  = bad register #  */
                    445:              asm("movl _sgl_dummy2,r7");        /* r7  = actual value    */
                    446:              asm("movl _sgl_dummy1,r8");        /* r8  = expected value  */
                    447:         } else
                    448:           if( halt_code == BAD_PSL_HLT ) {
                    449:              asm("movl _init_psl,r6");          /* r6  = initial PSL     */
                    450:              asm("movl _psl_val,r7");           /* r7  = final PSL       */
                    451:              asm("movl _exp_psl,r8");           /* r8  = expected PSL    */
                    452:         };
                    453:         asm("halt");                            /* HALT ...              */
                    454: }  

unix.superglobalmegacorp.com

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