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

1.1       root        1: 
                      2: 
                      3: #include "fpp_defs.h"
                      4: 
                      5: 
                      6: /*****************************************************************************
                      7: *
                      8: *                      PIPELINE TEST #1 MONITOR
                      9: *
                     10: *  This test will do:
                     11: *
                     12: *      LDF(x), SUBF(x), SUBF(x), ADDF(x), ADDF(x), STF
                     13: *
                     14: *  where the x's are the fmacro1 LDF data patterns.
                     15: *****************************************************************************/
                     16: pipe_1()
                     17: {
                     18:        asm(".globl _pipeline_1_t");
                     19:        asm("_pipeline_1_t:");                  /* entry address            */
                     20:        if( (cycle == 1) && (prt_hdrs) )        /* print headers on 1st cycle */
                     21:        {
                     22:           writes("\n PIPE_1 ");
                     23:        }
                     24:        subtest = 1;
                     25:        pipe1_1();                              /* data in REGs,  no NOPs */
                     26:        subtest++;                              /* increment subtest num  */
                     27:        pipe1_2();                              /* data in REGs,   1 NOP  */
                     28:        subtest++;                              /* increment subtest num  */
                     29:        pipe1_3();                              /* data in REGs,   2 NOPs */
                     30:        subtest++;                              /* increment subtest num  */
                     31:        pipe1_4();                              /* data in REGs,   3 NOPs */
                     32:        subtest++;                              /* increment subtest num  */
                     33:        pipe1_5();                              /* data in CACHE, no NOPs */
                     34:        subtest++;                              /* increment subtest num  */
                     35:        pipe1_6();                              /* data in CACHE,  1 NOP  */
                     36:        subtest++;                              /* increment subtest num  */
                     37:        pipe1_7();                              /* data in CACHE,  2 NOPs */
                     38:        subtest++;                              /* increment subtest num  */
                     39:        pipe1_8();                              /* data in CACHE,  3 NOPs */
                     40:        subtest++;                              /* increment subtest num  */
                     41:        pipe1_9();                              /* data on STACK, no NOPs */
                     42:        subtest++;                              /* increment subtest num  */
                     43:        pipe1_10();                             /* data via FP  no NOPs */
                     44:        asm("jmp *return");                     /* return to the test monitor */
                     45: }
                     46: 
                     47: 
                     48: 
                     49: 
                     50: 
                     51: 
                     52: /************************************************************************
                     53: *
                     54: *                      SUBTEST 1  
                     55: *              data in registers, no NO-OPs
                     56: *
                     57: ************************************************************************/
                     58: pipe1_1() 
                     59: {
                     60:        force_loop = FALSE;                     /* clear the force_loop flg */
                     61:        index = 0;
                     62:        do 
                     63:        {
                     64:           sgl_value_1  = ldf_1_data[index].ld;   /* get operand 1        */
                     65:           sgl_expected = ldf_1_data[index].exp;  /* get expected results */
                     66: /*
                     67:  * If LOOP ON ERROR is set, this is the loop for this subtest.
                     68:  * The force loop flag is set after the first error.
                     69: */
                     70:           asm("_pipe1_1_lp1:");
                     71:           asm("movl _sgl_value_1,r4");         /* move the data to r4     */
                     72:           asm("ldf r4");                       /* load the operand        */
                     73:           asm("subf r4");                      /* subtract it (twice )    */
                     74:           asm("subf r4");
                     75:           asm("addf r4");                      /* add it back (twice)     */
                     76:           asm("addf r4");
                     77:           asm("stf r5");                       /* store the result        */
                     78:           if ( force_loop );
                     79:              asm("brb _pipe1_1_lp1");;         /* loop on the error       */
                     80: /* 
                     81:  * verify the results
                     82: */
                     83:           asm("movl r5,_sgl_st_acc");          /* get the result          */
                     84:           if( sgl_st_acc != sgl_expected )     /* COMPARE the values      */
                     85:           {
                     86:              errcnt++;                         /* bump the error count    */
                     87:              if ( prt_error ) 
                     88:                 print_pipe1_er("Reg. Data, no NO-OPs");
                     89:              if ( halt_flg )                   /* halt on error?          */
                     90:                 pipe1_er_hlt( subtest );
                     91:              if ( loop_on_err ) {
                     92:                 force_loop = TRUE;             /* set the force loop flag */
                     93:                 asm("brw _pipe1_1_lp1");       /* and loop                */
                     94:              }
                     95:           }   /* end of compare error */
                     96:        } while( index++ < max_ldf_1_index );
                     97: }  /* end of subtest 1 */
                     98: 
                     99: 
                    100: 
                    101: 
                    102: 
                    103: 
                    104: /************************************************************************
                    105: *
                    106: *                      SUBTEST 2  
                    107: *              data in registers, 1 NO-OP
                    108: *
                    109: ************************************************************************/
                    110: pipe1_2() 
                    111: {
                    112:        force_loop = FALSE;                     /* clear force_loop flag */
                    113:        index = 0;
                    114:        do 
                    115:        {
                    116:           sgl_value_1  = ldf_1_data[index].ld;   /* get operand 1        */
                    117:           sgl_expected = ldf_1_data[index].exp;  /* get expected results */
                    118: /*
                    119:  * If LOOP ON ERROR is set, this is the loop for this subtest.
                    120:  * The force loop flag is set after the first error.
                    121: */
                    122:           asm("_pipe1_2_lp1:");
                    123:           asm("movl _sgl_value_1,r4");         /* move the data to r4     */
                    124:           asm("ldf r4");                       /* load the data operand   */
                    125:           asm("nop");
                    126:           asm("subf r4");                      /* subtract the data (2xs) */
                    127:           asm("nop");
                    128:           asm("subf r4");
                    129:           asm("nop");
                    130:           asm("addf r4");                      /* add it back (2xs)       */
                    131:           asm("nop");
                    132:           asm("addf r4");
                    133:           asm("nop");
                    134:           asm("stf r5");                       /* store the result        */
                    135:           if ( force_loop );
                    136:              asm("brb _pipe1_2_lp1");;         /* loop on the error       */
                    137: /* 
                    138:  * verify the results
                    139: */
                    140:           asm("movl r5,_sgl_st_acc");          /* get the result          */
                    141:           if( sgl_st_acc != sgl_expected )     /* COMPARE the values      */
                    142:           {
                    143:              errcnt++;                         /* bump the error count    */
                    144:              if ( prt_error ) 
                    145:                 print_pipe1_er("Reg. Data, 1 NO-OP");
                    146:              if ( halt_flg )                   /* halt on error?          */
                    147:                 pipe1_er_hlt( subtest );
                    148:              if ( loop_on_err ) {
                    149:                 force_loop = TRUE;             /* set the force loop flag */
                    150:                 asm("brw _pipe1_2_lp1");       /* and loop                */
                    151:              }
                    152:           }   /* end of compare error */
                    153:        } while( index++ < max_ldf_1_index );
                    154: }  /* end of subtest 2 */
                    155: 
                    156: 
                    157: 
                    158: 
                    159: 
                    160: 
                    161: /************************************************************************
                    162: *
                    163: *                      SUBTEST 3  
                    164: *              data in registers, 2 NO-OPs
                    165: *
                    166: ************************************************************************/
                    167: pipe1_3() 
                    168: {
                    169:        force_loop = FALSE;                     /* clear force_loop flag */
                    170:        index = 0;
                    171:        do 
                    172:        {
                    173:           sgl_value_1  = ldf_1_data[index].ld;   /* get operand 1        */
                    174:           sgl_expected = ldf_1_data[index].exp;  /* get expected results */
                    175: /*
                    176:  * If LOOP ON ERROR is set, this is the loop for this subtest.
                    177:  * The force loop flag is set after the first error.
                    178: */
                    179:           asm("_pipe1_3_lp1:");
                    180:           asm("movl _sgl_value_1,r4");         /* move the data to r4     */
                    181:           asm("ldf r4");                       /* loadthe operand         */
                    182:           asm("nop");
                    183:           asm("nop");
                    184:           asm("subf r4");                      /* subtract the data (2xs) */
                    185:           asm("nop");
                    186:           asm("nop");
                    187:           asm("subf r4");
                    188:           asm("nop");
                    189:           asm("nop");
                    190:           asm("addf r4");                      /* add it back (2xs)       */
                    191:           asm("nop");
                    192:           asm("nop");
                    193:           asm("addf r4");
                    194:           asm("nop");
                    195:           asm("nop");
                    196:           asm("stf r5");                       /* store the result        */
                    197:           if ( force_loop );
                    198:              asm("brb _pipe1_3_lp1");;         /* loop on the error       */
                    199: /* 
                    200:  * verify the results
                    201: */
                    202:           asm("movl r5,_sgl_st_acc");          /* get the result          */
                    203:           if( sgl_st_acc != sgl_expected )     /* COMPARE the values      */
                    204:           {
                    205:              errcnt++;                         /* bump the error count    */
                    206:              if ( prt_error ) 
                    207:                 print_pipe1_er("Reg. Data, 2 NO-OPs");
                    208:              if ( halt_flg )                   /* halt on error?          */
                    209:                 pipe1_er_hlt( subtest );
                    210:              if ( loop_on_err ) {
                    211:                 force_loop = TRUE;             /* set the force loop flag */
                    212:                 asm("brw _pipe1_3_lp1");       /* and loop                */
                    213:              }
                    214:           }   /* end of compare error */
                    215:        } while( index++ < max_ldf_1_index );
                    216: }  /* end of subtest 3 */
                    217: 
                    218: 
                    219: 
                    220: 
                    221: 
                    222: 
                    223: /************************************************************************
                    224: *
                    225: *                      SUBTEST 4  
                    226: *              data in registers, 3 NO-OPs
                    227: *
                    228: ************************************************************************/
                    229: pipe1_4() 
                    230: {
                    231:        force_loop = FALSE;                     /* clear force_loop flag */
                    232:        index = 0;
                    233:        do 
                    234:        {
                    235:           sgl_value_1  = ldf_1_data[index].ld;   /* get operand 1        */
                    236:           sgl_expected = ldf_1_data[index].exp;  /* get expected results */
                    237: /*
                    238:  * If LOOP ON ERROR is set, this is the loop for this subtest.
                    239:  * The force loop flag is set after the first error.
                    240: */
                    241:           asm("_pipe1_4_lp1:");
                    242:           asm("movl _sgl_value_1,r4");         /* move the data to r4     */
                    243:           asm("ldf r4");                       /* load the operand        */
                    244:           asm("nop");
                    245:           asm("nop");
                    246:           asm("nop");
                    247:           asm("subf r4");                      /* subtract the data (2xs) */
                    248:           asm("nop");
                    249:           asm("nop");
                    250:           asm("nop");
                    251:           asm("subf r4");
                    252:           asm("nop");
                    253:           asm("nop");
                    254:           asm("nop");
                    255:           asm("addf r4");                      /* add it back (2xs)       */
                    256:           asm("nop");
                    257:           asm("nop");
                    258:           asm("nop");
                    259:           asm("addf r4");
                    260:           asm("nop");
                    261:           asm("nop");
                    262:           asm("nop");
                    263:           asm("stf r5");                       /* store the result        */
                    264:           if ( force_loop );
                    265:              asm("brb _pipe1_4_lp1");;         /* loop on the error       */
                    266: /* 
                    267:  * verify the results
                    268: */
                    269:           asm("movl r5,_sgl_st_acc");          /* get the result          */
                    270:           if( sgl_st_acc != sgl_expected )     /* COMPARE the values      */
                    271:           {
                    272:              errcnt++;                         /* bump the error count    */
                    273:              if ( prt_error ) 
                    274:                 print_pipe1_er("Reg. Data, 3 NO-OPs");
                    275:              if ( halt_flg )                   /* halt on error?          */
                    276:                 pipe1_er_hlt( subtest );
                    277:              if ( loop_on_err ) {
                    278:                 force_loop = TRUE;             /* set the force loop flag */
                    279:                 asm("brw _pipe1_4_lp1");       /* and loop                */
                    280:              }
                    281:           }   /* end of compare error */
                    282:        } while( index++ < max_ldf_1_index );
                    283: }  /* end of subtest 4 */
                    284: 
                    285: 
                    286: 
                    287: 
                    288: 
                    289: 
                    290: 
                    291: /************************************************************************
                    292: *
                    293: *                      SUBTEST 5  
                    294: *              data in Cache, no NO-OPs
                    295: *
                    296: ************************************************************************/
                    297: pipe1_5() 
                    298: {
                    299:        force_loop = FALSE;                     /* clear force_loop flag */
                    300:        index = 0;
                    301:        do 
                    302:        {
                    303:           sgl_value_1  = ldf_1_data[index].ld;   /* get operand 1        */
                    304:           sgl_expected = ldf_1_data[index].exp;  /* get expected results */
                    305: /*
                    306:  * If LOOP ON ERROR is set, this is the loop for this subtest.
                    307:  * The force loop flag is set after the first error.
                    308: */
                    309:           asm("_pipe1_5_lp1:");
                    310:           asm("ldf _sgl_value_1");             /* load the operand        */
                    311:           asm("subf _sgl_value_1");            /* subtract it (twice)     */
                    312:           asm("subf _sgl_value_1");
                    313:           asm("addf _sgl_value_1");            /* add it back (twice)     */
                    314:           asm("addf _sgl_value_1");
                    315:           asm("stf _sgl_st_acc");              /* store the result        */
                    316:           if ( force_loop );
                    317:              asm("brb _pipe1_5_lp1");;         /* loop on the error       */
                    318: /* 
                    319:  * verify the results
                    320: */
                    321:           if( sgl_st_acc != sgl_expected )     /* COMPARE the values      */
                    322:           {
                    323:              errcnt++;                         /* bump the error count    */
                    324:              if ( prt_error ) 
                    325:                 print_pipe1_er("Cache Data, no NO-OPs");
                    326:              if ( halt_flg )                   /* halt on error?          */
                    327:                 pipe1_er_hlt( subtest );
                    328:              if ( loop_on_err ) {
                    329:                 force_loop = TRUE;             /* set the force loop flag */
                    330:                 asm("brw _pipe1_5_lp1");       /* and loop                */
                    331:              }
                    332:           }   /* end of compare error */
                    333:        } while( index++ < max_ldf_1_index );
                    334: }  /* end of subtest 5 */
                    335: 
                    336: 
                    337: 
                    338: 
                    339: 
                    340: 
                    341: /************************************************************************
                    342: *
                    343: *                      SUBTEST 6  
                    344: *              data in Cache, 1 NO-OP
                    345: *
                    346: ************************************************************************/
                    347: pipe1_6() 
                    348: {
                    349:        force_loop = FALSE;                     /* clear force_loop flag */
                    350:        index = 0;
                    351:        do 
                    352:        {
                    353:           sgl_value_1  = ldf_1_data[index].ld;   /* get operand 1        */
                    354:           sgl_expected = ldf_1_data[index].exp;  /* get expected results */
                    355: /*
                    356:  * If LOOP ON ERROR is set, this is the loop for this subtest.
                    357:  * The force loop flag is set after the first error.
                    358: */
                    359:           asm("_pipe1_6_lp1:");
                    360:           asm("ldf _sgl_value_1");             /* load the operand        */
                    361:           asm("nop");
                    362:           asm("subf _sgl_value_1");            /* subtract it (twice)     */
                    363:           asm("nop");
                    364:           asm("subf _sgl_value_1");
                    365:           asm("nop");
                    366:           asm("addf _sgl_value_1");            /* add it back (twice)     */
                    367:           asm("nop");
                    368:           asm("addf _sgl_value_1");
                    369:           asm("nop");
                    370:           asm("stf _sgl_st_acc");              /* store the result        */
                    371:           if ( force_loop );
                    372:              asm("brb _pipe1_6_lp1");;         /* loop on the error       */
                    373: /* 
                    374:  * verify the results
                    375: */
                    376:           if( sgl_st_acc != sgl_expected )     /* COMPARE the values      */
                    377:           {
                    378:              errcnt++;                         /* bump the error count    */
                    379:              if ( prt_error ) 
                    380:                 print_pipe1_er("Cache Data, 1 NO-OP");
                    381:              if ( halt_flg )                   /* halt on error?          */
                    382:                 pipe1_er_hlt( subtest );
                    383:              if ( loop_on_err ) {
                    384:                 force_loop = TRUE;             /* set the force loop flag */
                    385:                 asm("brw _pipe1_6_lp1");       /* and loop                */
                    386:              }
                    387:           }   /* end of compare error */
                    388:        } while( index++ < max_ldf_1_index );
                    389: }  /* end of subtest 6 */
                    390: 
                    391: 
                    392: 
                    393: 
                    394: 
                    395: 
                    396: /************************************************************************
                    397: *
                    398: *                      SUBTEST 7  
                    399: *              data in Cache, 2 NO-OPs
                    400: *
                    401: ************************************************************************/
                    402: pipe1_7() 
                    403: {
                    404:        force_loop = FALSE;                     /* clear force_loop flag */
                    405:        index = 0;
                    406:        do 
                    407:        {
                    408:           sgl_value_1  = ldf_1_data[index].ld;   /* get operand 1        */
                    409:           sgl_expected = ldf_1_data[index].exp;  /* get expected results */
                    410: /*
                    411:  * If LOOP ON ERROR is set, this is the loop for this subtest.
                    412:  * The force loop flag is set after the first error.
                    413: */
                    414:           asm("_pipe1_7_lp1:");
                    415:           asm("ldf _sgl_value_1");             /* load the operand        */
                    416:           asm("nop");
                    417:           asm("nop");
                    418:           asm("subf _sgl_value_1");            /* subtract it (twice)     */
                    419:           asm("nop");
                    420:           asm("nop");
                    421:           asm("subf _sgl_value_1");
                    422:           asm("nop");
                    423:           asm("nop");
                    424:           asm("addf _sgl_value_1");            /* add it back (twice)     */
                    425:           asm("nop");
                    426:           asm("nop");
                    427:           asm("addf _sgl_value_1");
                    428:           asm("nop");
                    429:           asm("nop");
                    430:           asm("stf _sgl_st_acc");              /* store the result        */
                    431:           if ( force_loop );
                    432:              asm("brb _pipe1_7_lp1");;         /* loop on the error       */
                    433: /* 
                    434:  * verify the results
                    435: */
                    436:           if( sgl_st_acc != sgl_expected )     /* COMPARE the values      */
                    437:           {
                    438:              errcnt++;                         /* bump the error count    */
                    439:              if ( prt_error ) 
                    440:                 print_pipe1_er("Cache Data, 2 NO-OPs");
                    441:              if ( halt_flg )                   /* halt on error?          */
                    442:                 pipe1_er_hlt( subtest );
                    443:              if ( loop_on_err ) {
                    444:                 force_loop = TRUE;             /* set the force loop flag */
                    445:                 asm("brw _pipe1_7_lp1");       /* and loop                */
                    446:              }
                    447:           }   /* end of compare error */
                    448:        } while( index++ < max_ldf_1_index );
                    449: }  /* end of subtest 7 */
                    450: 
                    451: 
                    452: 
                    453: 
                    454: 
                    455: 
                    456: /************************************************************************
                    457: *
                    458: *                      SUBTEST 8  
                    459: *              data in Cache, 3 NO-OPs
                    460: *
                    461: ************************************************************************/
                    462: pipe1_8() 
                    463: {
                    464:        force_loop = FALSE;                     /* clear force_loop flag */
                    465:        index = 0;
                    466:        do 
                    467:        {
                    468:           sgl_value_1  = ldf_1_data[index].ld;   /* get operand 1        */
                    469:           sgl_expected = ldf_1_data[index].exp;  /* get expected results */
                    470: /*
                    471:  * If LOOP ON ERROR is set, this is the loop for this subtest.
                    472:  * The force loop flag is set after the first error.
                    473: */
                    474:           asm("_pipe1_8_lp1:");
                    475:           asm("ldf _sgl_value_1");             /* load the operand        */
                    476:           asm("nop");
                    477:           asm("nop");
                    478:           asm("nop");
                    479:           asm("subf _sgl_value_1");            /* subtract it (twice)     */
                    480:           asm("nop");
                    481:           asm("nop");
                    482:           asm("nop");
                    483:           asm("subf _sgl_value_1");
                    484:           asm("nop");
                    485:           asm("nop");
                    486:           asm("nop");
                    487:           asm("addf _sgl_value_1");            /* add it back (twice)     */
                    488:           asm("nop");
                    489:           asm("nop");
                    490:           asm("nop");
                    491:           asm("addf _sgl_value_1");
                    492:           asm("nop");
                    493:           asm("nop");
                    494:           asm("nop");
                    495:           asm("stf _sgl_st_acc");              /* store the result        */
                    496:           if ( force_loop );
                    497:              asm("brb _pipe1_8_lp1");;         /* loop on the error       */
                    498: /* 
                    499:  * verify the results
                    500: */
                    501:           if( sgl_st_acc != sgl_expected )     /* COMPARE the values      */
                    502:           {
                    503:              errcnt++;                         /* bump the error count    */
                    504:              if ( prt_error ) 
                    505:                 print_pipe1_er("Cache Data, 3 NO-OPs");
                    506:              if ( halt_flg )                   /* halt on error?          */
                    507:                 pipe1_er_hlt( subtest );
                    508:              if ( loop_on_err ) {
                    509:                 force_loop = TRUE;             /* set the force loop flag */
                    510:                 asm("brw _pipe1_8_lp1");       /* and loop                */
                    511:              }
                    512:           }   /* end of compare error */
                    513:        } while( index++ < max_ldf_1_index );
                    514: }  /* end of subtest 8 */
                    515: 
                    516: 
                    517: 
                    518: 
                    519: 
                    520: 
                    521: /*****************************************************************************
                    522: *
                    523: *                      SUBTEST 9  
                    524: *              data on the stack, no NO-OPs
                    525: *
                    526: *****************************************************************************/
                    527: pipe1_9() 
                    528: {
                    529:        asm("moval (r13),_pre_event_fp");       /* save the frame pointer   */ 
                    530:        asm("moval (r14),_pre_event_sp");       /* save the stack pointer   */ 
                    531:        force_loop = FALSE;                     /* clear force_loop flag */
                    532:        index = 0;
                    533:        do 
                    534:        {
                    535:           sgl_value_1  = ldf_1_data[index].ld;   /* get operand 1          */
                    536:           sgl_expected = ldf_1_data[index].exp;  /* get expected results   */
                    537:           asm("moval _pointer_data,_sgl_value_2");/* init / final SP value */
                    538: /*
                    539:  * If LOOP ON ERROR is set, this is the loop for this subtest.
                    540:  * The force loop flag is set after the first error.
                    541: */
                    542:           asm("_pipe1_9_lp1:");
                    543:           asm("moval _pointer_data,r14");      /* set the stack pointer    */
                    544:           asm("movl _sgl_value_1,-(r14)");     /* push the operand 5 times */
                    545:           asm("movl _sgl_value_1,-(r14)");
                    546:           asm("movl _sgl_value_1,-(r14)");
                    547:           asm("movl _sgl_value_1,-(r14)");
                    548:           asm("movl _sgl_value_1,-(r14)");
                    549: /*
                    550:  * now pop the data off the stack
                    551: */
                    552:           asm("ldf (r14)+");                   /* pop the data & load it  */
                    553:           asm("subf (r14)+");                  /* subtract it (twice)     */
                    554:           asm("subf (r14)+");
                    555:           asm("addf (r14)+");                  /* add it back (twice)     */
                    556:           asm("addf (r14)+");
                    557:           asm("stf r5");                       /* store the result        */
                    558:           if ( force_loop );
                    559:              asm("brb _pipe1_9_lp1");; /* loop on the error       */
                    560: /* 
                    561:  * verify the results
                    562: */
                    563:           asm("movl r5,_sgl_st_acc");          /* get the result          */
                    564:           asm("moval (r14),_sgl_value_3");     /* save the stack pointer  */
                    565:           if( (sgl_st_acc  != sgl_expected) || /* verify the result...    */
                    566:               (sgl_value_3 != sgl_value_2) )   /* ... and the final SP    */
                    567:           {
                    568:              asm("movl _pre_event_fp,r13");    /* restore frame pointer   */
                    569:              asm("movl _pre_event_sp,r14");    /* restore stack pointer   */
                    570:              errcnt++;                         /* bump the error count    */
                    571:              if ( prt_error ) {
                    572:                 print_pipe1_er("POP data from the SP");
                    573:                 writes("final Stack Pointer = ");
                    574:                 write32h( sgl_value_3 );
                    575:                 writes(",  expected SP = ");
                    576:                 write32h( sgl_value_2 );
                    577:                 writes(" \n");
                    578:              }
                    579:              if ( halt_flg )                   /* halt on error?          */
                    580:                 pipe1_er_hlt( subtest );
                    581:              if ( loop_on_err ) {
                    582:                 force_loop = TRUE;             /* set the force loop flag */
                    583:                 asm("brw _pipe1_9_lp1");       /* and loop                */
                    584:              }
                    585:           }   /* end of compare error */
                    586:        } while( index++ < max_ldf_1_index );
                    587:        asm("movl _pre_event_fp,r13");          /* restore the frame pointer */
                    588:        asm("movl _pre_event_sp,r14");          /* restore the stack pointer */
                    589: }  /* end of subtest 9 */
                    590: 
                    591: 
                    592: 
                    593: 
                    594: 
                    595: 
                    596: /******************************************************************************
                    597: *
                    598: *                      SUBTEST 10  
                    599: *      load 0, add operand 4 times  -get data via indexed FRAME pointer
                    600: *
                    601: *      ADDR            INDEX   DATA
                    602: *      pointer_data      4     <the STF result goes here>
                    603: *      pointer_data-4    3     <operand data>
                    604: *      pointer_data-16   0     point the frame pointer here
                    605: *
                    606: ******************************************************************************/
                    607: pipe1_10() 
                    608: {
                    609:        asm("moval (r13),_pre_event_fp");       /* save the frame pointer   */ 
                    610:        asm("moval (r14),_pre_event_sp");       /* save the stack pointer   */ 
                    611:        force_loop = FALSE;                     /* clear force_loop flag */
                    612:        index = 0;
                    613:        do 
                    614:        {
                    615:           sgl_value_1  = ldf_1_data[index].ld;    /* get operand 1         */
                    616:           sgl_expected = ldf_1_data[index].exp;   /* get expected results  */
                    617:           asm("moval _pointer_data,_sgl_value_2");/* init / final SP value */
                    618: /*
                    619:  * If LOOP ON ERROR is set, this is the loop for this subtest.
                    620:  * The force loop flag is set after the first error.
                    621: */
                    622:           asm("_pipe1_10_lp1:");
                    623:           asm("moval _pointer_data,_sgl_value_2");/* get store data's addr */
                    624:           sgl_value_2 -= 4;                    /* decrement it by 4 (bytes)*/
                    625:           asm("movl _sgl_value_1,*_sgl_value_2");/* set the operand data   */
                    626:           sgl_value_2 -= 12;                   /* get the FP addr to use   */
                    627:           asm("movl _sgl_value_2,r13");        /* set the FRAME POINTER    */
                    628:           asm("movl $3,r5");                   /* r5 index = 3 longwords   */
                    629:           asm("movl $4,r6");                   /* r6 index = 4 longwords   */
                    630:           asm("ldf (r13)[r5]");                /* load  -indexed by r5     */
                    631:           asm("subf (r13)[r5]");               /* subtract it (twice)      */
                    632:           asm("subf (r13)[r5]");
                    633:           asm("addf (r13)[r5]");               /* add it back (twice)      */
                    634:           asm("addf (r13)[r5]");
                    635:           asm("stf (r13)[r6]");                /* store -indexed by r6     */
                    636:           if ( force_loop );
                    637:              asm("brw _pipe1_10_lp1");;        /* loop on the error       */
                    638: /* 
                    639:  * verify the results
                    640: */
                    641:           sgl_st_acc = pointer_data;           /* move the stored result  */
                    642:           asm("moval (r13),_sgl_value_3");     /* save the frame pointer  */
                    643:           if( (sgl_st_acc  != sgl_expected) || /* verify the result...    */
                    644:               (sgl_value_3 != sgl_value_2) )   /* ... and the final FP    */
                    645:           {
                    646:              asm("movl _pre_event_fp,r13");    /* restore frame pointer   */
                    647:              asm("movl _pre_event_sp,r14");    /* restore stack pointer   */
                    648:              errcnt++;                         /* bump the error count    */
                    649:              if ( prt_error ) {
                    650:                 print_pipe1_er("indexed FP addressing");
                    651:                 writes("final Frame Pointer = ");
                    652:                 writeh( sgl_value_3 );
                    653:                 writes(",  expected FP = ");
                    654:                 writeh( sgl_value_2 );
                    655:                 writes(" \n");
                    656:              }
                    657:              if ( halt_flg )                   /* halt on error?          */
                    658:                 pipe1_er_hlt( subtest );
                    659:              if ( loop_on_err ) {
                    660:                 force_loop = TRUE;             /* set the force loop flag */
                    661:                 asm("brw _pipe1_10_lp1");      /* and loop                */
                    662:              }
                    663:           }   /* end of compare error */
                    664:        } while( index++ < max_ldf_1_index );
                    665:        asm("movl _pre_event_fp,r13");          /* restore the frame pointer */
                    666:        asm("movl _pre_event_sp,r14");          /* restore the stack pointer */
                    667: }  /* end of subtest 10 */
                    668: 
                    669: 
                    670: 
                    671: 
                    672: 
                    673: /******************************************************************************
                    674: *
                    675: *                      ERROR ROUTINE
                    676: *
                    677: *      print an error in the following form
                    678: *
                    679: *  operand = xxxxxxxx,   final Acc = xxxxxxxx,   data index = dd
                    680: *                     expected Acc = xxxxxxxx
                    681: *
                    682: ******************************************************************************/
                    683: print_pipe1_er(msg)
                    684: char *msg;
                    685: {
                    686:        writes(" \n");          /* start a new print line   */
                    687:        writes("cycle: ");
                    688:        writed( cycle );
                    689:        writes(" test ");
                    690:        writed( test_no );
                    691:        writes("  (Pipe 1), subtest ");
                    692:        writed( subtest );
                    693:        writes(" error - ");
                    694:        writes( msg );
                    695:        writec('\n');
                    696: writes(" LDF(op1), SUBF(op1), SUBF(op1), ADDF(op1), ADDF(op1), STF\n");
                    697:        writes("operand = ");
                    698:        write32h( sgl_value_1 );
                    699:        writes(",   final Acc = ");
                    700:        write32h( sgl_st_acc );
                    701:        writes(",   data index = ");
                    702:        writed( index );
                    703:        writec('\n');
                    704:        writes("                   expected Acc = ");
                    705:        write32h( sgl_expected );
                    706:        writec('\n');
                    707: }
                    708: 
                    709: 
                    710: 
                    711: 
                    712: 
                    713: /******************************************************************************
                    714: *
                    715: *                      HALT ON ERROR ROUTINE
                    716: *
                    717: *      halt with the necessary information saved in the registers
                    718: *
                    719: ******************************************************************************/
                    720: pipe1_er_hlt( subtest )
                    721: int subtest;
                    722: {
                    723:        asm("movl _test_no,r0");                /* r0 = test number        */
                    724:        asm("movl _subtest,r1");                /* r1 = subtest number     */
                    725:        asm("movl $1,r2");                      /* r2 = error code         */
                    726:        asm("movl _cycle,r3");                  /* r3 = cycle count        */
                    727:        asm("movl _sgl_value_1,r4");            /* r4 = sgl operand        */
                    728:        asm("movl _sgl_st_acc,r5");             /* r5 = sgl stored         */
                    729:        asm("movl _sgl_expected,r6");           /* r6 = sgl expected       */
                    730:        asm("movl _index,r7");                  /* r7 = data index         */
                    731:        if( subtest == 9 ) {
                    732:                asm("movl _sgl_value_3,r8");    /* r8 = final SP value     */
                    733:                asm("movl _sgl_value_2,r9");    /* r9 = expected SP value  */
                    734:        } else
                    735:        if( subtest == 10 ) {
                    736:                asm("movl _sgl_value_3,r8");    /* r8 = final FP value     */
                    737:                asm("movl _sgl_value_2,r9");    /* r9 = expected FP value  */
                    738:        };
                    739:        asm(".globl _pipe1_1_hlt");
                    740:        asm("_pipe1_1_hlt:");                   /* PC after the halt       */
                    741:        asm("halt");                            /* HALT ...                */
                    742: }  /* end of halt on error */

unix.superglobalmegacorp.com

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