|
|
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:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.