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

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