Annotation of cci/d/entry/div.c, revision 1.1.1.1

1.1       root        1: #define error_hdl0 error
                      2: #define error_hdl2 error
                      3: #define ediv_errhdl error
                      4: 
                      5: extern long scoplp;
                      6: extern long force_lp;
                      7: 
                      8: #define C      0x1
                      9: #define V      0x2
                     10: #define Z      0x4
                     11: #define N      0x8
                     12: 
                     13: /*     DIV instructions                */
                     14: 
                     15: 
                     16: /* Some global variables */
                     17: 
                     18: static long flag_msk, divr, quo, rem, psl, quotient, divd[2];
                     19: 
                     20: 
                     21: 
                     22: div()
                     23: {
                     24:        asm("movl       $2,_no_opr");
                     25:        divl2();                /* DIVIDE LONG WITH 2 OPERANDS */
                     26:        divl3();                /* DIVIDE LONG WITH 3 OPERANDS */
                     27: /*     divl2u();       */      /* DIVIDE LONG WITH 2 UNSIGNED OPERANDS */
                     28: /*     divl3u();       */      /* DIVIDE LONG WITH 3 UNSIGNED OPERANDS */
                     29:        exdiv();                /* EXTENDED DIVISION */
                     30:        asm("jmp *return");
                     31: }
                     32: 
                     33: static divl2()
                     34: {
                     35:        long exp_psw;
                     36:        int unsign, no_op;
                     37: 
                     38:        unsign = 0;     /* signed division */
                     39:        no_op = 2;      /* 2 operands      */
                     40: 
                     41:        asm("d1:        movab   d1,_stpc");
                     42:        flag_msk = exp_psw = C;
                     43:        flag_msk = N|Z|V|C;
                     44:        divr = 0x47;
                     45:        quo = 0x5678ffff;
                     46:        divl(unsign,no_op,0x137c9ea,exp_psw);
                     47:        
                     48:        asm("d2:        movab   d2,_stpc");
                     49:        flag_msk = exp_psw = 0;
                     50:        flag_msk = N|V|C;               /* set all flags except Z */
                     51:        exp_psw = exp_psw | Z | C;
                     52:        divr = 1234;
                     53:        quo = 0;
                     54:        divl(unsign,no_op,0,exp_psw);
                     55: 
                     56:        asm("d3:        movab   d3,_stpc");
                     57:        flag_msk = exp_psw = 0;
                     58:        flag_msk = Z|V|C;               /* set all flags except N */
                     59:        exp_psw = exp_psw | N | C;
                     60:        divr = 4;
                     61:        quo = -80;
                     62:        divl(unsign,no_op,-20,exp_psw);
                     63: 
                     64:        /* test V bit                   */
                     65:        asm("d4:        movab   d4,_stpc");
                     66:        flag_msk = exp_psw = 0;
                     67:        flag_msk = Z|C;                 /* set Z,C flags  */
                     68:        exp_psw = exp_psw | (V|C);
                     69:        /* divide largest negative no. by -1 */
                     70:        divr = -1;
                     71:        quo = 0x80000000;
                     72:        divl(unsign,no_op,0x80000000,exp_psw);
                     73: 
                     74: }
                     75: 
                     76: static divl3()
                     77: {
                     78:        long exp_psw;
                     79:        int unsign, no_op;
                     80: 
                     81:        unsign = 0;     /* signed division */
                     82:        no_op = 3;      /* 3 operands      */
                     83: 
                     84:        asm("d5:        movab   d5,_stpc");
                     85:        flag_msk = exp_psw = C;
                     86:        flag_msk = N|Z|V|C;
                     87:        divr = 0x47;
                     88:        quo = 0x5678ffff;
                     89:        divl(unsign,no_op,0x137c9ea,exp_psw);
                     90:        
                     91:        asm("d6:        movab   d6,_stpc");
                     92:        flag_msk = exp_psw = 0;
                     93:        flag_msk = N|V|C;               /* set all flags except Z */
                     94:        exp_psw = exp_psw | Z | C;
                     95:        divr = 1234;
                     96:        quo = 0;
                     97:        divl(unsign,no_op,0,exp_psw);
                     98: 
                     99:        asm("d7:        movab   d7,_stpc");
                    100:        flag_msk = exp_psw = 0;
                    101:        flag_msk = Z|V|C;               /* set all flags except N */
                    102:        exp_psw = exp_psw | N | C;
                    103:        divr = 4;
                    104:        quo = -80;
                    105:        divl(unsign,no_op,-20,exp_psw);
                    106: 
                    107:        /* test V bit                   */
                    108:        asm("d8:        movab   d8,_stpc");
                    109:        flag_msk = exp_psw = 0;
                    110:        flag_msk = Z|C;                 /* set Z,C flags  */
                    111:        exp_psw = exp_psw | (V|C);
                    112:        /* divide largest negative no. by -1 */
                    113:        divr = -1;
                    114:        quo = 0x80000000;
                    115:        divl(unsign,no_op,0x80000000,exp_psw);
                    116: 
                    117: }
                    118: 
                    119: 
                    120: static exdiv()
                    121: {
                    122:        long exp_rem,  exp_psw;
                    123: 
                    124:        /* EXTENDED DIVISION            */
                    125:        asm("d9:        movab   d9,_stpc");
                    126:        flag_msk = exp_psw = C;
                    127:        flag_msk = N|Z|V|C;             /* set all flags        */
                    128:        divd[0] = 0;
                    129:        divd[1] = 0xfffffff;
                    130:        divr = 0xffffff0;
                    131:        ediv(1,0xf,exp_psw);
                    132: 
                    133:        asm("d10:       movab   d10,_stpc");
                    134:        flag_msk = exp_psw = 0;
                    135:        flag_msk = N|V|C;               /* set N,V,C flags      */
                    136:        exp_psw = exp_psw | Z | C;
                    137:        divd[0] = 0;
                    138:        divd[1] = 0;
                    139:        divr = 4;
                    140:        ediv(0,0,exp_psw);
                    141: 
                    142:        asm("d11:       movab   d11,_stpc");
                    143:        flag_msk = exp_psw = 0;
                    144:        flag_msk = Z|V|C;               /* set Z,V,C flags      */
                    145:        exp_psw = exp_psw | N | C;
                    146:        divd[0] = 0xffffffff;
                    147:        divd[1] = -4005;
                    148:        divr = 50;
                    149:        ediv(-80,-5,exp_psw);
                    150: 
                    151:        asm("d12:       movab   d12,_stpc");
                    152:        flag_msk = exp_psw = C;
                    153:        flag_msk = Z|N|C;               /* set Z,N,C flags  */
                    154:        exp_psw = exp_psw | N | C;
                    155:        divd[0] = 0x6000;
                    156:        divd[1] = 0xb000;       /* divd = 0x60000000b000 */
                    157:        divr =  0xaeaeaeae;
                    158:        ediv(0xfffed1c8,0x48482a10,exp_psw);
                    159: 
                    160: 
                    161:        /* check overflow bit on extended division */
                    162:        asm("d13:       movab   d13,_stpc");
                    163:        flag_msk = exp_psw = 0;
                    164:        flag_msk = Z|C;                 /* set Z,C flags  */
                    165:        exp_psw = exp_psw | (Z|V|C);
                    166:        /* divide largest negative no. by -1 */
                    167:        divd[0] = 0x80000000;
                    168:        divd[1] = 0;            /* divd = 0x8000000000000000 */
                    169:        divr = -1;
                    170:        ediv(0,0,exp_psw);
                    171: 
                    172:        asm("d14:       movab   d14,_stpc");
                    173:        flag_msk = exp_psw = 0;
                    174:        flag_msk = Z|N|C;               /* set Z,N,C flags  */
                    175:        exp_psw = exp_psw | (Z|V|C);
                    176:        divd[0] = 0xff;
                    177:        divd[1] = 0;            /* divd = 0x000000ff00000000 */
                    178:        divr = 2;
                    179:        ediv(0,0,exp_psw);
                    180: 
                    181: 
                    182: }
                    183: 
                    184: /*     THIS ROUTINE EXECUTE DIVL2,DIVL3,DIVL2U,DIVL3U INSTRUCTIONS     */
                    185: 
                    186: static divl(unsign,no_op,exp_result,exp_psw)
                    187: long exp_result,exp_psw;
                    188: int unsign, no_op;
                    189: {      
                    190:        long op1, op2, op3, psw, type;
                    191: 
                    192:    flag_msk = flag_msk << 16;
                    193:    op1 = divr;
                    194:    op2 = quo;
                    195:    for(;;)
                    196:         {
                    197:        for (type=0;type<8;type++)
                    198:        {
                    199:        divr = op1;
                    200:        quo = op2;
                    201: 
                    202:            if (no_op==2)  {
                    203:                    if (type==0)  {     /* Memory to memory */
                    204:                        setjmp();
                    205:                        asm("movl       $1,_subtst");
                    206:                        asm("bicpsw $0xf");             /* clear all flags */
                    207:                        asm("bispsw _flag_msk");        /* set flags       */
                    208:                        asm("divl2  _divr,_quo");
                    209:                        asm("movpsl _psl");     /* save PSL */
                    210:                        quotient = quo;
                    211:                                 }
                    212:                    if (type==1) {      /* Register to register */
                    213:                        setjmp();
                    214:                        asm("movl       $2,_subtst");
                    215:                        asm("movl _divr,r3");
                    216:                        asm("movl _quo,r4");
                    217:                        asm("bicpsw $0xf");             /* clear all flags */
                    218:                        asm("bispsw _flag_msk");        /* set flags       */
                    219:                        asm("divl2  r3,r4");
                    220:                        asm("movpsl _psl");     /* save PSL */
                    221:                        asm("movl r4,_quo");
                    222:                        quotient = quo;
                    223:                                 }
                    224:                    if (type==2) {      /* Register to Memory */
                    225:                        setjmp();
                    226:                        asm("movl       $3,_subtst");
                    227:                        asm("movl _divr,r3");
                    228:                        asm("bicpsw $0xf");             /* clear all flags */
                    229:                        asm("bispsw _flag_msk");        /* set flags       */
                    230:                        asm("divl2  r3,_quo");
                    231:                        asm("movpsl _psl");     /* save PSL */
                    232:                        quotient = quo;
                    233:                                 }
                    234:                    if (type==3) {      /* Memory to Register */
                    235:                        setjmp();
                    236:                        asm("movl       $4,_subtst");
                    237:                        asm("movl _quo,r4");
                    238:                        asm("bicpsw $0xf");             /* clear all flags */
                    239:                        asm("bispsw _flag_msk");        /* set flags       */
                    240:                        asm("divl2  _divr,r4");
                    241:                        asm("movpsl _psl");     /* save PSL */
                    242:                        asm("movl r4,_quo");
                    243:                        quotient = quo;
                    244:                                 }
                    245:                      
                    246:                    }
                    247:                    if (type==0) {      /* Memory to memory  to memory */
                    248:                        setjmp();
                    249:                        asm("movl       $5,_subtst");
                    250:                        asm("bicpsw $0xf");             /* clear all flags */
                    251:                        asm("bispsw _flag_msk");        /* set flags       */
                    252:                        asm("divl3  _divr,_quo,_quotient");
                    253:                        asm("movpsl _psl");     /* save PSL */
                    254:                                 }
                    255:                    if (type==1) {      /* Register to register  to memory */
                    256:                        setjmp();
                    257:                        asm("movl       $6,_subtst");
                    258:                        asm("movl _divr,r3");
                    259:                        asm("movl _quo,r4");
                    260:                        asm("bicpsw $0xf");             /* clear all flags */
                    261:                        asm("bispsw _flag_msk");        /* set flags       */
                    262:                        asm("divl3  r3,r4,_quotient");
                    263:                        asm("movpsl _psl");     /* save PSL */
                    264:                                 }
                    265:                    if (type==2) {      /* Register to Memory  to memory */
                    266:                        setjmp();
                    267:                        asm("movl       $7,_subtst");
                    268:                        asm("movl _divr,r3");
                    269:                        asm("bicpsw $0xf");             /* clear all flags */
                    270:                        asm("bispsw _flag_msk");        /* set flags       */
                    271:                        asm("divl3  r3,_quo,_quotient");
                    272:                        asm("movpsl _psl");     /* save PSL */
                    273:                                 }
                    274:                    if (type==3) {      /* Memory to Register  to register */
                    275:                        setjmp();
                    276:                        asm("movl       $8,_subtst");
                    277:                        asm("movl _quo,r4");
                    278:                        asm("bicpsw $0xf");             /* clear all flags */
                    279:                        asm("bispsw _flag_msk");        /* set flags       */
                    280:                        asm("divl3  _divr,r4,r5");
                    281:                        asm("movpsl _psl");     /* save PSL */
                    282:                        asm("movl r5,_quotient");
                    283:                                 }
                    284:                    if (type==4) {      /* Register to register to register */
                    285:                        setjmp();
                    286:                        asm("movl       $9,_subtst");
                    287:                        asm("movl _divr,r3");
                    288:                        asm("movl _quo,r4");
                    289:                        asm("bicpsw $0xf");             /* clear all flags */
                    290:                        asm("bispsw _flag_msk");        /* set flags       */
                    291:                        asm("divl3  r3,r4,r5");
                    292:                        asm("movpsl _psl");     /* save PSL */
                    293:                        asm("movl r5,_quotient");
                    294:                                 }
                    295:                    if (type==5) {      /* Register to memory to register */
                    296:                        setjmp();
                    297:                        asm("movl       $0xa,_subtst");
                    298:                        asm("movl _divr,r3");
                    299:                        asm("bicpsw $0xf");             /* clear all flags */
                    300:                        asm("bispsw _flag_msk");        /* set flags       */
                    301:                        asm("divl3  r3,_quo,r5");
                    302:                        asm("movpsl _psl");     /* save PSL */
                    303:                        asm("movl r5,_quotient");
                    304:                                 }
                    305:                    if (type==6) {      /* Memory to  memory to Register */
                    306:                        setjmp();
                    307:                        asm("movl       $0xb,_subtst");
                    308:                        asm("bicpsw $0xf");             /* clear all flags */
                    309:                        asm("bispsw _flag_msk");        /* set flags       */
                    310:                        asm("divl3  _divr,_quo,r5");
                    311:                        asm("movpsl _psl");     /* save PSL */
                    312:                        asm("movl r5,_quotient");
                    313:                                 }
                    314:                    if (type==7) {      /* Memory to Register to memory */
                    315:                        setjmp();
                    316:                        asm("movl       $0xc,_subtst");
                    317:                        asm("movl _quo,r4");
                    318:                        asm("bicpsw $0xf");             /* clear all flags */
                    319:                        asm("bispsw _flag_msk");        /* set flags       */
                    320:                        asm("divl3  _divr,r4,_quotient");
                    321:                        asm("movpsl _psl");     /* save PSL */
                    322:                                 }
                    323:                }
                    324:        psw =  psl & 0xf;
                    325: 
                    326:        /*  check flags */
                    327:        if (psw != exp_psw) 
                    328:                {
                    329:                asm("movl       $2,_ercode");
                    330:                if (scoplp) longjmp();
                    331:                error_hdl2(psw,exp_psw,op1,op2);
                    332:                }
                    333: 
                    334:        if (divr != op1)
                    335:                {
                    336:                asm("movl       $3,_ercode");
                    337:                if (scoplp) longjmp();
                    338:                error_hdl2(divr,op1,op1,op2);
                    339:                }
                    340:        if (no_op == 3)
                    341:                {
                    342:                if (quo != op2)
                    343:                   {
                    344:                        asm("movl       $3,_ercode");
                    345:                        if (scoplp) longjmp();
                    346:                        error_hdl2(quo,op2,op1,op2);
                    347:                   }
                    348:                }
                    349:        if (quotient != exp_result)
                    350:                {
                    351:                asm("movl       $1,_ercode");
                    352:                if (scoplp) longjmp();
                    353:                error_hdl2(quotient,exp_result,op1,op2);
                    354:                }
                    355:                if (force_lp) longjmp();
                    356:        break;
                    357:        }
                    358: }
                    359: 
                    360: 
                    361: static ediv(exp_quo,exp_rem,exp_psw)
                    362: long exp_quo, exp_rem, exp_psw;
                    363: {      
                    364:        long op1, op2[2], psw, type;
                    365: 
                    366:    flag_msk = flag_msk << 16;
                    367:    op1 = divr;
                    368:    op2[0] = divd[0];
                    369:    op2[1] = divd[1];
                    370:    for(;;)
                    371:         {
                    372:        for (type=0;type<4;type++) {
                    373:        divr = op1;
                    374:        divd[0] = op2[0];
                    375:        divd[1] = op2[1];
                    376: 
                    377:        if (type==0) {          /* Memory to memory to memory to register */
                    378:                setjmp();
                    379:                asm("movl       $0xd,_subtst");
                    380:                asm("bicpsw $0xf");             /* clear all flags */
                    381:                asm("bispsw _flag_msk");        /* set flags       */
                    382:                asm("ediv  _divr,_divd,_quo,r7");
                    383:                asm("movpsl _psl");             /* save PSL */
                    384:                asm("movl r7,_rem");
                    385:                }
                    386:        if (type==1) {  /* Register to register to register to register */
                    387:                setjmp();
                    388:                asm("movl       $0xe,_subtst");
                    389:                asm("movl _divr,r3");
                    390:                asm("movl _divd,r4");
                    391:                asm("movl _divd+4,r5");
                    392:                asm("bicpsw $0xf");             /* clear all flags */
                    393:                asm("bispsw _flag_msk");        /* set flags       */
                    394:                asm("ediv  r3,r4,r6,r7");
                    395:                asm("movpsl _psl");             /* save PSL */
                    396:                asm("movl r6,_quo");
                    397:                asm("movl r7,_rem");
                    398:                }
                    399:        if (type==2) {  /* Register to memory to register to register */
                    400:                setjmp();
                    401:                asm("movl       $0xf,_subtst");
                    402:                asm("movl _divr,r3");
                    403:                asm("bicpsw $0xf");             /* clear all flags */
                    404:                asm("bispsw _flag_msk");        /* set flags       */
                    405:                asm("ediv  r3,_divd,r6,r7");
                    406:                asm("movpsl _psl");             /* save PSL */
                    407:                asm("movl r6,_quo");
                    408:                asm("movl r7,_rem");
                    409:                }
                    410:        if (type==3) {  /* Memory to register to memory to register */
                    411:                setjmp();
                    412:                asm("movl       $0x10,_subtst");
                    413:                asm("movl _divd,r4");
                    414:                asm("movl _divd+4,r5");
                    415:                asm("bicpsw $0xf");             /* clear all flags */
                    416:                asm("bispsw _flag_msk");        /* set flags       */
                    417:                asm("ediv  _divr,r4,_quo,r6");
                    418:                asm("movpsl _psl");             /* save PSL */
                    419:                asm("movl r6,_rem");
                    420:                }
                    421: 
                    422:        psw =  psl & 0xf;
                    423:        if (quo != exp_quo)
                    424:                {               /* error in multiply operation */
                    425:                asm("movl       $1,_ercode");
                    426:                if (scoplp) longjmp();
                    427:                ediv_errhdl(quo,exp_quo,op1,op2);
                    428:                }
                    429: 
                    430:        /*  check flags */
                    431:        if  (psw != exp_psw) 
                    432:                {
                    433:                asm("movl       $2,_ercode");
                    434:                if (scoplp) longjmp();
                    435:                ediv_errhdl(psw,exp_psw,op1,op2);
                    436:                }
                    437: 
                    438:        if (divr != op1)
                    439:                {
                    440:                asm("movl       $3,_ercode");
                    441:                if (scoplp) longjmp();
                    442:                ediv_errhdl(divr,op1,op1,op2);
                    443:                }
                    444:        if ( (divd[0]!=op2[0]) || (divd[1]!=op2[1]) )
                    445:                {
                    446:                asm("movl       $3,_ercode");
                    447:                if (scoplp) longjmp();
                    448:                error_hdl0(divd,op2,op1,op2);
                    449:                }
                    450:        if (rem != exp_rem)
                    451:                {
                    452:                asm("movl       $1,_ercode");
                    453:                if (scoplp) longjmp();
                    454:                ediv_errhdl(rem,exp_rem,op1,op2);
                    455:                }
                    456:                if (force_lp) longjmp();
                    457:        }
                    458:        break;
                    459:        }
                    460: }
                    461: 
                    462: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.