|
|
1.1 ! root 1: #define error_hdl2 error ! 2: ! 3: #define C 0x1 ! 4: #define V 0x2 ! 5: #define Z 0x4 ! 6: #define N 0x8 ! 7: ! 8: static long error_count, SS1, SS2, SS3; ! 9: ! 10: /* Some global variables */ ! 11: static long flag_msk, psl, divr, rem, remainder; ! 12: int ix; ! 13: ! 14: /* MOD intructions */ ! 15: ! 16: mod() ! 17: { ! 18: SS1 = 0; /* Print error message */ ! 19: SS2 = 0; /* Do not loop on error */ ! 20: modl2(); ! 21: modl3(); ! 22: modl2u(); ! 23: modl3u(); ! 24: asm("jmp *return"); ! 25: } ! 26: ! 27: static modl2() ! 28: { ! 29: long exp_psw; ! 30: int unsign, no_op; ! 31: ! 32: unsign = 0; ! 33: no_op = 2; ! 34: ix = 1; ! 35: ! 36: /* MOD OF 2 LONG_OPERANDS */ ! 37: flag_msk = exp_psw = 0; ! 38: flag_msk = Z|V|C; ! 39: exp_psw = N | C; ! 40: divr = 98765; ! 41: rem = -345678; ! 42: modl(unsign,no_op,-49383,exp_psw); ! 43: ! 44: ++ix; ! 45: flag_msk = exp_psw = 0; ! 46: flag_msk = N|V|C; ! 47: exp_psw = Z | C; ! 48: divr = 2; ! 49: rem = -345678; ! 50: modl(unsign,no_op,0,exp_psw); ! 51: ! 52: ++ix; ! 53: flag_msk = exp_psw = 0; ! 54: flag_msk = N|V|C; ! 55: exp_psw = C | N; ! 56: asm("movl $-2,_divr"); ! 57: rem = -345679; ! 58: modl(unsign,no_op,-1,exp_psw); ! 59: ! 60: /* check overflow bit */ ! 61: ! 62: ++ix; ! 63: flag_msk = exp_psw = 0; ! 64: flag_msk = N|Z|C; ! 65: exp_psw = V | C | N; ! 66: /* divide largest neg. no by -1 */ ! 67: asm("movl $-1,_divr"); ! 68: rem = 0x80000000; ! 69: modl(unsign,no_op,0x80000000,exp_psw); ! 70: ! 71: } ! 72: ! 73: static modl2u() ! 74: { ! 75: long exp_psw; ! 76: int unsign, no_op; ! 77: ! 78: unsign = 1; ! 79: no_op = 2; ! 80: ix = 1; ! 81: ! 82: /* MOD OF 2 UNSIGNED LONG_OPERANDS */ ! 83: flag_msk = exp_psw = 0; ! 84: flag_msk = N|Z|V|C; ! 85: exp_psw = C; ! 86: divr = 0xaaaaaaaa; ! 87: rem = 0xaaaaaaad; ! 88: modl(unsign,no_op,3,exp_psw); ! 89: ! 90: ++ix; ! 91: flag_msk = exp_psw = 0; ! 92: flag_msk = Z|V|C; ! 93: exp_psw = C ; ! 94: divr = 0xaaaaaaad; ! 95: rem = 0xaaaaaaaa; ! 96: modl(unsign,no_op,0xaaaaaaaa,exp_psw); ! 97: ! 98: ++ix; ! 99: flag_msk = exp_psw = 0; ! 100: flag_msk = N|V|C; ! 101: exp_psw = Z | C; ! 102: divr = 2; ! 103: rem = 0xffffff00; ! 104: modl(unsign,no_op,0,exp_psw); ! 105: ! 106: ++ix; ! 107: flag_msk = exp_psw = 0; ! 108: flag_msk = N|Z|C; ! 109: exp_psw = C ; ! 110: asm("movl $0xffffffff,_divr"); ! 111: rem = 0x80000000; ! 112: modl(unsign,no_op,0x80000000,exp_psw); ! 113: } ! 114: ! 115: static modl3() ! 116: { ! 117: long exp_psw; ! 118: int unsign, no_op; ! 119: ! 120: unsign = 0; ! 121: no_op = 3; ! 122: ix = 1; ! 123: ! 124: /* MOD OF 3 LONG_OPERANDS */ ! 125: flag_msk = exp_psw = 0; ! 126: flag_msk = Z|V|C; ! 127: exp_psw = N | C; ! 128: divr = 98765; ! 129: rem = -345678; ! 130: modl(unsign,no_op,-49383,exp_psw); ! 131: ! 132: ++ix; ! 133: flag_msk = exp_psw = 0; ! 134: flag_msk = N|V|C; ! 135: exp_psw = Z | C; ! 136: divr = 3; ! 137: rem = -345678; ! 138: modl(unsign,no_op,0,exp_psw); ! 139: ! 140: ++ix; ! 141: flag_msk = exp_psw = 0; ! 142: flag_msk = N|V|C; ! 143: exp_psw = C | N; ! 144: asm("movl $-3,_divr"); ! 145: rem = -345679; ! 146: modl(unsign,no_op,-1,exp_psw); ! 147: ! 148: ++ix; ! 149: /* check overflow bit */ ! 150: flag_msk = exp_psw = 0; ! 151: flag_msk = N|Z|C; ! 152: exp_psw = V | C | N; ! 153: /* divide largest neg. no by -1 */ ! 154: asm("movl $-1,_divr"); ! 155: rem = 0x80000000; ! 156: modl(unsign,no_op,0x80000000,exp_psw); ! 157: ! 158: ++ix; ! 159: flag_msk = exp_psw = 0; ! 160: flag_msk = Z|V|C; ! 161: exp_psw = N | C; ! 162: divr = 98765; ! 163: rem = -345678; ! 164: modl(unsign,no_op,-49383,exp_psw); ! 165: ! 166: ++ix; ! 167: flag_msk = exp_psw = 0; ! 168: flag_msk = N|V|C; ! 169: exp_psw = Z | C; ! 170: divr = 3; ! 171: rem = -345678; ! 172: modl(unsign,no_op,0,exp_psw); ! 173: ! 174: ++ix; ! 175: flag_msk = exp_psw = 0; ! 176: flag_msk = N|V|C; ! 177: exp_psw = C | N; ! 178: asm("movl $-3,_divr"); ! 179: rem = -345679; ! 180: modl(unsign,no_op,-1,exp_psw); ! 181: ! 182: ++ix; ! 183: /* check overflow bit */ ! 184: flag_msk = exp_psw = 0; ! 185: flag_msk = N|Z|C; ! 186: exp_psw = V | C | N; ! 187: /* divide largest neg. no by -1 */ ! 188: asm("movl $-1,_divr"); ! 189: rem = 0x80000000; ! 190: modl(unsign,no_op,0x80000000,exp_psw); ! 191: } ! 192: ! 193: static modl3u() ! 194: { ! 195: long exp_psw; ! 196: int unsign, no_op; ! 197: ! 198: unsign = 1; ! 199: no_op = 3; ! 200: ix = 1; ! 201: ! 202: /* MOD OF 3 UNSIGNED LONG_OPERANDS */ ! 203: flag_msk = exp_psw = 0; ! 204: flag_msk = N|Z|V|C; ! 205: exp_psw = C; ! 206: divr = 0xaaaaaaaa; ! 207: rem = 0xaaaaaaad; ! 208: modl(unsign,no_op,3,exp_psw); ! 209: ! 210: ++ix; ! 211: flag_msk = exp_psw = 0; ! 212: flag_msk = Z|V|C; ! 213: exp_psw = C; ! 214: divr = 0xbbbbbbbc; ! 215: rem = 0xbbbbbbbb; ! 216: modl(unsign,no_op,0xbbbbbbbb,exp_psw); ! 217: ! 218: ++ix; ! 219: flag_msk = exp_psw = 0; ! 220: flag_msk = N|V|C; ! 221: exp_psw = Z | C; ! 222: divr = 2; ! 223: rem = 0xffffff00; ! 224: modl(unsign,no_op,0,exp_psw); ! 225: ! 226: ++ix; ! 227: flag_msk = exp_psw = 0; ! 228: flag_msk = N|Z|C; ! 229: exp_psw = C; ! 230: asm("movl $-1,_divr"); ! 231: rem = 0x80000000; ! 232: modl(unsign,no_op,0x80000000,exp_psw); ! 233: ! 234: ++ix; ! 235: flag_msk = exp_psw = 0; ! 236: flag_msk = N|Z|V|C; ! 237: exp_psw = C; ! 238: divr = 0xaaaaaaaa; ! 239: rem = 0xaaaaaaad; ! 240: modl(unsign,no_op,3,exp_psw); ! 241: ! 242: ++ix; ! 243: flag_msk = exp_psw = 0; ! 244: flag_msk = Z|V|C; ! 245: exp_psw = C; ! 246: divr = 0xbbbbbbbc; ! 247: rem = 0xbbbbbbbb; ! 248: modl(unsign,no_op,0xbbbbbbbb,exp_psw); ! 249: ! 250: ++ix; ! 251: flag_msk = exp_psw = 0; ! 252: flag_msk = N|V|C; ! 253: exp_psw = Z | C; ! 254: divr = 2; ! 255: rem = 0xffffff00; ! 256: modl(unsign,no_op,0,exp_psw); ! 257: ! 258: ++ix; ! 259: flag_msk = exp_psw = 0; ! 260: flag_msk = N|Z|C; ! 261: exp_psw = C; ! 262: asm("movl $-1,_divr"); ! 263: rem = 0x80000000; ! 264: modl(unsign,no_op,0x80000000,exp_psw); ! 265: } ! 266: ! 267: static modl(unsign,no_op,exp_reslt,exp_psw) ! 268: long exp_reslt, exp_psw; ! 269: int unsign, no_op; ! 270: { ! 271: char *msg1, *msg2; ! 272: long op1, op2, op3, psw; ! 273: ! 274: flag_msk = flag_msk << 16; ! 275: op1 = divr; ! 276: op3 = op2 = rem; ! 277: for(;;) ! 278: { ! 279: if (unsign) ! 280: { ! 281: if (no_op==2) msg1 = "** Test MODL2U **\n"; ! 282: else msg1 = "** Test MODL3U **\n"; ! 283: } ! 284: else ! 285: { ! 286: if (no_op==2) msg1 = "** Test MODL2 **\n"; ! 287: else msg1 = "** Test MODL3 **\n"; ! 288: } ! 289: ! 290: divr = op1; ! 291: rem = op2; ! 292: ! 293: if (unsign) ! 294: { /* unsigned division */ ! 295: if (no_op==2) ! 296: { ! 297: if (ix==1){ ! 298: /* unsigned division */ ! 299: asm("bicpsw $0xf"); /* clear all flags */ ! 300: asm("bispsw _flag_msk"); /* set flags */ ! 301: asm("modl2u _divr,_rem"); /* mem to mem */ ! 302: asm("movpsl _psl"); /* save PSL */ ! 303: remainder = rem; ! 304: } ! 305: if (ix==2){ ! 306: /* unsigned division */ ! 307: asm("movl _rem,r7"); /* load rem reg */ ! 308: asm("bicpsw $0xf"); /* clear all flags */ ! 309: asm("bispsw _flag_msk"); /* set flags */ ! 310: asm("modl2u _divr,r7"); /* mem to reg */ ! 311: asm("movpsl _psl"); /* save PSL */ ! 312: asm("movl r7,_rem"); /* reload rem adres */ ! 313: remainder = rem; ! 314: } ! 315: if (ix==3){ ! 316: /* unsigned division */ ! 317: asm("movl _divr,r6"); /* load divr reg */ ! 318: asm("bicpsw $0xf"); /* clear all flags */ ! 319: asm("bispsw _flag_msk"); /* set flags */ ! 320: asm("modl2u r6,_rem"); /* reg to mem */ ! 321: asm("movpsl _psl"); /* save PSL */ ! 322: remainder = rem; ! 323: } ! 324: if (ix==4){ ! 325: /* unsigned division */ ! 326: asm("movl _divr,r6"); /* load divr reg */ ! 327: asm("movl _rem,r7"); /* load rem reg */ ! 328: asm("bicpsw $0xf"); /* clear all flags */ ! 329: asm("bispsw _flag_msk"); /* set flags */ ! 330: asm("modl2u r6,r7"); /* reg to reg */ ! 331: asm("movpsl _psl"); /* save PSL */ ! 332: asm("movl r7,_rem"); /* reload rem adres */ ! 333: remainder = rem; ! 334: } ! 335: } ! 336: else ! 337: { ! 338: if (ix==1){ ! 339: asm("bicpsw $0xf"); /* clear all flags */ ! 340: asm("bispsw _flag_msk"); /* set flags */ ! 341: asm("modl3u _divr,_rem,_remainder");/* mem mem mem */ ! 342: asm("movpsl _psl"); /* save PSL */ ! 343: } ! 344: if (ix==2){ ! 345: asm("movl _divr,r6"); /* load divr reg */ ! 346: asm("movl _rem,r7"); /* load rem reg */ ! 347: asm("bicpsw $0xf"); /* clear all flags */ ! 348: asm("bispsw _flag_msk"); /* set flags */ ! 349: asm("modl3u r6,r7,_remainder");/* reg to reg to mem */ ! 350: asm("movpsl _psl"); /* save PSL */ ! 351: } ! 352: if (ix==3){ ! 353: asm("movl _divr,r6"); /* load divr reg */ ! 354: asm("movl _rem,r7"); /* load rem reg */ ! 355: asm("movl _remainder,r8"); /* load remainder reg */ ! 356: asm("bicpsw $0xf"); /* clear all flags */ ! 357: asm("bispsw _flag_msk"); /* set flags */ ! 358: asm("modl3u r6,r7,r8"); /* reg reg reg */ ! 359: asm("movpsl _psl"); /* save PSL */ ! 360: asm("movl r8,_remainder"); /* reload remainder */ ! 361: } ! 362: if (ix==4){ ! 363: asm("movl _rem,r7"); /* load rem reg */ ! 364: asm("movl _remainder,r8"); /* load remainder reg */ ! 365: asm("bicpsw $0xf"); /* clear all flags */ ! 366: asm("bispsw _flag_msk"); /* set flags */ ! 367: asm("modl3u _divr,r7,r8"); /* mem reg reg */ ! 368: asm("movpsl _psl"); /* save PSL */ ! 369: asm("movl r8,_remainder"); /* reload remainder */ ! 370: } ! 371: if (ix==5){ ! 372: asm("movl _rem,r7"); /* load rem reg */ ! 373: asm("bicpsw $0xf"); /* clear all flags */ ! 374: asm("bispsw _flag_msk"); /* set flags */ ! 375: asm("modl3u _divr,r7,_remainder"); /* mem reg mem */ ! 376: asm("movpsl _psl"); /* save PSL */ ! 377: } ! 378: if (ix==6){ ! 379: asm("bicpsw $0xf"); /* clear all flags */ ! 380: asm("bispsw _flag_msk"); /* set flags */ ! 381: asm("modl3u _divr,_rem,r8"); /* mem mem reg */ ! 382: asm("movpsl _psl"); /* save PSL */ ! 383: asm("movl r8,_remainder"); /* reload remainder */ ! 384: } ! 385: if (ix==7){ ! 386: asm("movl _divr,r6"); /* load divr reg */ ! 387: asm("movl _rem,r7"); /* load rem reg */ ! 388: asm("bicpsw $0xf"); /* clear all flags */ ! 389: asm("bispsw _flag_msk"); /* set flags */ ! 390: asm("modl3u r6,_rem,_remainder");/* reg mem mem */ ! 391: asm("movpsl _psl"); /* save PSL */ ! 392: } ! 393: if (ix==8){ ! 394: asm("movl _divr,r6"); /* load divr reg */ ! 395: asm("movl _remainder,r8"); /* load remainder reg */ ! 396: asm("bicpsw $0xf"); /* clear all flags */ ! 397: asm("bispsw _flag_msk"); /* set flags */ ! 398: asm("modl3u r6,_rem,r8"); /* reg mem reg */ ! 399: asm("movpsl _psl"); /* save PSL */ ! 400: asm("movl r8,_remainder"); /* reload remainder */ ! 401: } ! 402: } ! 403: } ! 404: else ! 405: { /* signed division */ ! 406: if (no_op==2) ! 407: { ! 408: if (ix==1){ ! 409: asm("bicpsw $0xf"); /* clear all flags */ ! 410: asm("bispsw _flag_msk"); /* set flags */ ! 411: asm("modl2 _divr,_rem"); /* mem to mem */ ! 412: asm("movpsl _psl"); /* save PSL */ ! 413: remainder = rem; ! 414: } ! 415: if (ix==2){ ! 416: asm("movl _rem,r7"); ! 417: asm("bicpsw $0xf"); /* clear all flags */ ! 418: asm("bispsw _flag_msk"); /* set flags */ ! 419: asm("modl2 _divr,r7"); /* mem to reg */ ! 420: asm("movpsl _psl"); /* save PSL */ ! 421: asm("movl r7,_rem"); /* reload dest */ ! 422: remainder = rem; ! 423: } ! 424: if (ix==3){ ! 425: asm("movl _divr,r6"); /* load divr reg */ ! 426: asm("bicpsw $0xf"); /* clear all flags */ ! 427: asm("bispsw _flag_msk"); /* set flags */ ! 428: asm("modl2 r6,_rem"); /* reg to mem */ ! 429: asm("movpsl _psl"); /* save PSL */ ! 430: remainder = rem; ! 431: } ! 432: if (ix==4){ ! 433: asm("movl _divr,r6"); /* load divr reg */ ! 434: asm("movl _rem,r7"); /* load rem reg */ ! 435: asm("bicpsw $0xf"); /* clear all flags */ ! 436: asm("bispsw _flag_msk"); /* set flags */ ! 437: asm("modl2 r6,r7"); /* reg to reg */ ! 438: asm("movpsl _psl"); /* save PSL */ ! 439: asm("movl r7,_rem"); /* rload dest adres */ ! 440: remainder = rem; ! 441: } ! 442: } ! 443: else ! 444: if (ix==1){ ! 445: asm("bicpsw $0xf"); /* clear all flags */ ! 446: asm("bispsw _flag_msk"); /* set flags */ ! 447: asm("modl3 _divr,_rem,_remainder"); /* mem mem mem */ ! 448: asm("movpsl _psl"); /* save PSL */ ! 449: } ! 450: if (ix==2){ ! 451: asm("movl _divr,r6"); /* load divr reg */ ! 452: asm("movl _rem,r7"); /* load rem reg */ ! 453: asm("bicpsw $0xf"); /* clear all flags */ ! 454: asm("bispsw _flag_msk"); /* set flags */ ! 455: asm("modl3 r6,r7,_remainder");/* reg to reg to mem */ ! 456: asm("movpsl _psl"); /* save PSL */ ! 457: } ! 458: if (ix==3){ ! 459: asm("movl _divr,r6"); /* load divr reg */ ! 460: asm("movl _rem,r7"); /* load rem reg */ ! 461: asm("movl _remainder,r8"); /* load remainder reg */ ! 462: asm("bicpsw $0xf"); /* clear all flags */ ! 463: asm("bispsw _flag_msk"); /* set flags */ ! 464: asm("modl3 r6,r7,r8"); /* reg reg reg */ ! 465: asm("movpsl _psl"); /* save PSL */ ! 466: asm("movl r8,_remainder"); /* reload remainder */ ! 467: } ! 468: if (ix==4){ ! 469: asm("movl _rem,r7"); /* load rem reg */ ! 470: asm("movl _remainder,r8"); /* load remainder reg */ ! 471: asm("bicpsw $0xf"); /* clear all flags */ ! 472: asm("bispsw _flag_msk"); /* set flags */ ! 473: asm("modl3 _divr,r7,r8"); /* mem reg reg */ ! 474: asm("movpsl _psl"); /* save PSL */ ! 475: asm("movl r8,_remainder"); /* reload remainder */ ! 476: } ! 477: if (ix==5){ ! 478: asm("movl _rem,r7"); /* load rem reg */ ! 479: asm("bicpsw $0xf"); /* clear all flags */ ! 480: asm("bispsw _flag_msk"); /* set flags */ ! 481: asm("modl3 _divr,r7,_remainder"); /* mem reg mem */ ! 482: asm("movpsl _psl"); /* save PSL */ ! 483: } ! 484: if (ix==6){ ! 485: asm("movl _remainder,r8"); /* load remainder reg */ ! 486: asm("bicpsw $0xf"); /* clear all flags */ ! 487: asm("bispsw _flag_msk"); /* set flags */ ! 488: asm("modl3 _divr,_rem,r8"); /* mem mem reg */ ! 489: asm("movpsl _psl"); /* save PSL */ ! 490: asm("movl r8,_remainder"); /* reload remainder */ ! 491: } ! 492: if (ix==7){ ! 493: asm("movl _divr,r6"); /* load divr reg */ ! 494: asm("movl _rem,r7"); /* load rem reg */ ! 495: asm("bicpsw $0xf"); /* clear all flags */ ! 496: asm("bispsw _flag_msk"); /* set flags */ ! 497: asm("modl3 r6,_rem,_remainder");/* reg mem mem */ ! 498: asm("movpsl _psl"); /* save PSL */ ! 499: } ! 500: if (ix==8){ ! 501: asm("movl _divr,r6"); /* load divr reg */ ! 502: asm("movl _remainder,r8"); /* load remainder reg */ ! 503: asm("bicpsw $0xf"); /* clear all flags */ ! 504: asm("bispsw _flag_msk"); /* set flags */ ! 505: asm("modl3 r6,_rem,r8"); /* reg mem reg */ ! 506: asm("movpsl _psl"); /* save PSL */ ! 507: asm("movl r8,_remainder"); /* reload remainder */ ! 508: } ! 509: } ! 510: psw = psl & 0xf; ! 511: ! 512: /* check flags */ ! 513: if (psw != exp_psw) ! 514: { ! 515: msg2 = "** error in psw flags ... \n"; ! 516: if (!SS1) error_hdl2(msg1,msg2,op1,op2,psw,exp_psw); ! 517: else error_count++; ! 518: if (!SS2) break; ! 519: else continue; ! 520: } ! 521: ! 522: if (divr != op1) ! 523: { ! 524: msg2 = "** divisor get changed in modulus operation \n"; ! 525: if (!SS1) error_hdl2(msg1,msg2,op1,op2,divr,op1); ! 526: else error_count++; ! 527: if (!SS2) break; ! 528: else continue; ! 529: } ! 530: if (no_op == 3) ! 531: { ! 532: if (rem != op3) ! 533: { ! 534: msg2="** dividend get changed in modulus operation \n"; ! 535: if (!SS1) error_hdl2(msg1,msg2,op1,op2,rem,op3); ! 536: else error_count++; ! 537: if (!SS2) break; ! 538: else continue; ! 539: } ! 540: } ! 541: if (remainder != exp_reslt) ! 542: { ! 543: msg2 = "** incorrect result in modulus operation \n"; ! 544: if (!SS1) error_hdl2(msg1,msg2,op1,op2,remainder,exp_reslt); ! 545: else error_count++; ! 546: if (!SS2) break; ! 547: else continue; ! 548: } ! 549: break; ! 550: } ! 551: ! 552: ! 553: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.