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

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