Annotation of cci/d/macro4/pipe12.c, revision 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.