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

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

unix.superglobalmegacorp.com

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