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

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