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

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