|
|
1.1 ! root 1: #define error_hdl2 error ! 2: #define error_hdl3 error ! 3: ! 4: #define C 0x1 ! 5: #define V 0x2 ! 6: #define Z 0x4 ! 7: #define N 0x8 ! 8: ! 9: extern long scoplp; ! 10: extern long force_lp; ! 11: ! 12: /* MUL instruction */ ! 13: ! 14: /* some global variables used in ASM */ ! 15: static long flag_msk, psl, product, mult, muld, mulp, add, prod1, prod2; ! 16: static long exp_reslt1, exp_reslt2; ! 17: ! 18: mul() ! 19: { ! 20: asm("movl $2,_no_opr"); /* number of operands in use */ ! 21: mull2(); /* Test MULL2 instruction */ ! 22: mull3(); /* Test MULL3 instruction */ ! 23: exmul(); /* Test EMUL instruction */ ! 24: asm("jmp *return"); ! 25: } ! 26: ! 27: static mull2() ! 28: { long exp_psw , ix; ! 29: ! 30: /* multiply long with 2 operands */ ! 31: for(ix=0;ix<2;ix++) ! 32: { ! 33: setjmp(); ! 34: asm("m1: movab m1,_stpc"); ! 35: flag_msk = exp_psw = C; ! 36: flag_msk = N|Z|V|C; ! 37: if (ix==0) { ! 38: mult = 0xabcde; ! 39: mulp = 0xaba; } ! 40: else { ! 41: mulp = 0xabcde; ! 42: mult = 0xaba; } ! 43: mull(2,0x732de54c,exp_psw); ! 44: } ! 45: ! 46: for(ix=0;ix<2;ix++) ! 47: { ! 48: asm("m2: movab m2,_stpc"); ! 49: flag_msk = exp_psw = C; ! 50: flag_msk = N|Z|V|C; ! 51: if (ix==0) { ! 52: mult = -200; ! 53: mulp = -1000; } ! 54: else { ! 55: mulp = -200; ! 56: mult = -1000; } ! 57: mull(2,200000,exp_psw); ! 58: } ! 59: ! 60: for(ix=0;ix<2;ix++) ! 61: { ! 62: asm("m3: movab m3,_stpc"); ! 63: flag_msk = exp_psw = 0; ! 64: flag_msk = Z|V|C; /* set all flags except N */ ! 65: exp_psw = N | C; ! 66: if (ix==0) { ! 67: mult = 1234; ! 68: mulp = -500; } ! 69: else { ! 70: mulp = 1234; ! 71: mult = -500; } ! 72: mull(2,-617000,exp_psw); ! 73: } ! 74: ! 75: for(ix=0;ix<2;ix++) ! 76: { ! 77: asm("m4: movab m4,_stpc"); ! 78: flag_msk = exp_psw = 0; ! 79: flag_msk = N|V|C; /* set all flags except Z */ ! 80: exp_psw = Z | C; ! 81: if (ix==0) { ! 82: mult = 0x1234; ! 83: mulp = 0; } ! 84: else { ! 85: mulp = 0x1234; ! 86: mult = 0; } ! 87: mull(2,0,exp_psw); ! 88: } ! 89: ! 90: /* test V bit, Overflow */ ! 91: for(ix=0;ix<2;ix++) ! 92: { ! 93: asm("m5: movab m5,_stpc"); ! 94: flag_msk = exp_psw = 0; ! 95: exp_psw = (V); /* any other flags may be set */ ! 96: if (ix==0) { ! 97: mult = 0x80000000; /* Max negative no. */ ! 98: mulp = -1; } ! 99: else { ! 100: mulp = 0x80000000; ! 101: mult = -1; } ! 102: mull(2,0,exp_psw); ! 103: } ! 104: ! 105: for(ix=0;ix<2;ix++) ! 106: { ! 107: asm("m6: movab m6,_stpc"); ! 108: flag_msk = exp_psw = 0; ! 109: exp_psw = (V); /* any other flags may be set */ ! 110: if (ix==0) { ! 111: mult = -65646; ! 112: mulp = 65646; } ! 113: else { ! 114: mulp = -65646; ! 115: mult = 65646; } ! 116: mull(2,0,exp_psw); ! 117: } ! 118: } ! 119: ! 120: static mull3() ! 121: { long exp_psw , ix; ! 122: ! 123: /* multiply long with 3 operands */ ! 124: for(ix=0;ix<2;ix++) ! 125: { ! 126: asm("m7: movab m7,_stpc"); ! 127: flag_msk = exp_psw = C; ! 128: flag_msk = N|Z|V|C; ! 129: if (ix==0) { ! 130: mult = 0x12345; ! 131: mulp = 0xbff; } ! 132: else { ! 133: mulp = 0x12345; ! 134: mult = 0xbff; } ! 135: mull(3,0xda618bb,exp_psw); ! 136: } ! 137: ! 138: for(ix=0;ix<2;ix++) ! 139: { ! 140: asm("m8: movab m8,_stpc"); ! 141: flag_msk = exp_psw = C; ! 142: flag_msk = N|Z|V|C; ! 143: if (ix==0) { ! 144: mult = -3001; ! 145: mulp = -300; } ! 146: else { ! 147: mulp = -3001; ! 148: mult = -300; } ! 149: mull(3,900300,exp_psw); ! 150: } ! 151: ! 152: for(ix=0;ix<2;ix++) ! 153: { ! 154: asm("m9: movab m9,_stpc"); ! 155: flag_msk = exp_psw = 0; ! 156: flag_msk = Z|V|C; /* set all flags except N */ ! 157: exp_psw = N | C; ! 158: if (ix==0) { ! 159: mult = 1234; ! 160: mulp = -500; } ! 161: else { ! 162: mulp = 1234; ! 163: mult = -500; } ! 164: mull(3,-617000,exp_psw); ! 165: } ! 166: ! 167: for(ix=0;ix<2;ix++) ! 168: { ! 169: asm("m10: movab m10,_stpc"); ! 170: flag_msk = exp_psw = 0; ! 171: flag_msk = N|V; /* set all flags except Z,C */ ! 172: exp_psw = Z | C; ! 173: if (ix==0) { ! 174: mult = 0x1234; ! 175: mulp = 0; } ! 176: else { ! 177: mulp = 0x1234; ! 178: mult = 0; } ! 179: mull(3,0,exp_psw); ! 180: } ! 181: ! 182: /* test V bit */ ! 183: for(ix=0;ix<2;ix++) ! 184: { ! 185: asm("m11: movab m11,_stpc"); ! 186: flag_msk = exp_psw = 0; ! 187: exp_psw = (V); /* any other flags may be set */ ! 188: if (ix==0) { ! 189: mult = 0x80000000; /* Max negative no. */ ! 190: mulp = -1; } ! 191: else { ! 192: mulp = 0x80000000; /* Max negative no. */ ! 193: mult = -1; } ! 194: mull(3,0,exp_psw); ! 195: } ! 196: ! 197: for(ix=0;ix<2;ix++) ! 198: { ! 199: asm("m12: movab m12,_stpc"); ! 200: flag_msk = exp_psw = 0; ! 201: exp_psw = (V); /* any other flags may be set */ ! 202: if (ix==0) { ! 203: mult = -65646; ! 204: mulp = 65646; } ! 205: else { ! 206: mulp = -65646; ! 207: mult = 65646; } ! 208: mull(3,0,exp_psw); ! 209: } ! 210: } ! 211: ! 212: static exmul() ! 213: { long exp_psw ; ! 214: ! 215: /* extended multiply */ ! 216: ! 217: asm("m13: movab m13,_stpc"); ! 218: flag_msk = exp_psw = 0; ! 219: flag_msk = N|V|C; /* set N,V,C flags */ ! 220: exp_psw = Z | C; ! 221: exp_reslt1 = 0; ! 222: exp_reslt2 = 0; ! 223: /* mult = -4; */ ! 224: asm("movl $-4,_mult"); /* so not to use mnegl */ ! 225: muld = 5; ! 226: add = 20; ! 227: emul(exp_psw); ! 228: ! 229: asm("m14: movab m14,_stpc"); ! 230: flag_msk = exp_psw = 0; ! 231: flag_msk = Z|V|C; /* set Z,V,C flags */ ! 232: exp_psw = N | C; ! 233: asm("movl $0xffffffff,_exp_reslt1"); ! 234: asm("movl $0xffffffff,_exp_reslt2"); ! 235: /* exp_reslt1 = 0xffffffff; ! 236: exp_reslt2 = 0xffffffff; */ ! 237: ! 238: /* Expected result is a quad : 0xffffffffffffffff (-1) */ ! 239: mult = -4000; ! 240: muld = 50; ! 241: add = 199999; ! 242: emul(exp_psw); ! 243: ! 244: asm("m15: movab m15,_stpc"); ! 245: flag_msk = exp_psw = C; ! 246: flag_msk = N|Z|V|C; /* set all flags */ ! 247: exp_reslt2 = 0x60000000 ; ! 248: exp_reslt1 = 0x01000000 ; ! 249: ! 250: /* Expected result is a quad : 0x0100000060000000 */ ! 251: mult = 0xfffffff; ! 252: muld = 0xfffffff; ! 253: add = 0x7fffffff; ! 254: emul(exp_psw); ! 255: } ! 256: ! 257: /* ROUTINE TO EXECUTE MULL2 AND MULL3 */ ! 258: ! 259: static mull(type,exp_result,exp_psw) ! 260: long exp_result, exp_psw, type; ! 261: { ! 262: long op1, op2, psw, ix; ! 263: char *msg1, *msg2; ! 264: ! 265: flag_msk = flag_msk << 16; ! 266: op1 = mult; ! 267: op2 = mulp; ! 268: for(;;) ! 269: { ! 270: for (ix=0;ix<8;ix++) ! 271: { ! 272: mult = op1; ! 273: mulp = op2; ! 274: ! 275: /* set flags */ ! 276: if (type == 2) { ! 277: if (ix==0) { /* Memory to memory */ ! 278: setjmp(); ! 279: asm("movl $1,_subtst"); ! 280: asm("bicpsw $0xf"); ! 281: asm("bispsw _flag_msk"); /* set flags */ ! 282: asm("mull2 _mult,_mulp"); ! 283: asm("movpsl _psl"); /* save PSL */ ! 284: product = mulp; ! 285: } ! 286: if (ix==1) { /* Register to register */ ! 287: setjmp(); ! 288: asm("movl $2,_subtst"); ! 289: asm("movl _mult,r3"); ! 290: asm("movl _mulp,r4"); ! 291: asm("bicpsw $0xf"); ! 292: asm("bispsw _flag_msk"); /* set flags */ ! 293: asm("mull2 r3,r4"); ! 294: asm("movpsl _psl"); /* save PSL */ ! 295: asm("movl r4,_mulp"); ! 296: product = mulp; ! 297: } ! 298: if (ix==2) { /* Memory to register */ ! 299: setjmp(); ! 300: asm("movl $3,_subtst"); ! 301: asm("movl _mulp,r4"); ! 302: asm("bicpsw $0xf"); ! 303: asm("bispsw _flag_msk"); /* set flags */ ! 304: asm("mull2 _mult,r4"); ! 305: asm("movpsl _psl"); /* save PSL */ ! 306: asm("movl r4,_mulp"); ! 307: product = mulp; ! 308: } ! 309: if (ix==3) { /* Register to memory */ ! 310: setjmp(); ! 311: asm("movl $4,_subtst"); ! 312: asm("movl _mult,r3"); ! 313: asm("bicpsw $0xf"); ! 314: asm("bispsw _flag_msk"); /* set flags */ ! 315: asm("mull2 r3,_mulp"); ! 316: asm("movpsl _psl"); /* save PSL */ ! 317: product = mulp; ! 318: } ! 319: } ! 320: else { ! 321: if (ix==0) { /* Memory to memory to memory */ ! 322: setjmp(); ! 323: asm("movl $5,_subtst"); ! 324: asm("bicpsw $0xf"); ! 325: asm("bispsw _flag_msk"); /* set flags */ ! 326: asm("mull3 _mult,_mulp,_product"); ! 327: asm("movpsl _psl"); /* save PSL */ ! 328: } ! 329: if (ix==1) { /* Register to register to register */ ! 330: setjmp(); ! 331: asm("movl $6,_subtst"); ! 332: asm("movl _mult,r3"); ! 333: asm("movl _mulp,r4"); ! 334: asm("bicpsw $0xf"); ! 335: asm("bispsw _flag_msk"); /* set flags */ ! 336: asm("mull3 r3,r4,r6"); ! 337: asm("movpsl _psl"); /* save PSL */ ! 338: asm("movl r6,_product"); ! 339: } ! 340: if (ix==2) { /* Memory to register to memory */ ! 341: setjmp(); ! 342: asm("movl $7,_subtst"); ! 343: asm("movl _mulp,r4"); ! 344: asm("bicpsw $0xf"); ! 345: asm("bispsw _flag_msk"); /* set flags */ ! 346: asm("mull3 _mult,r4,_product"); ! 347: asm("movpsl _psl"); /* save PSL */ ! 348: } ! 349: if (ix==3) { /* Register to memory to register */ ! 350: setjmp(); ! 351: asm("movl $8,_subtst"); ! 352: asm("movl _mult,r3"); ! 353: asm("bicpsw $0xf"); ! 354: asm("bispsw _flag_msk"); /* set flags */ ! 355: asm("mull3 r3,_mulp,r6"); ! 356: asm("movpsl _psl"); /* save PSL */ ! 357: asm("movl r6,_product"); ! 358: } ! 359: if (ix==4) { /* Register to register to memory */ ! 360: setjmp(); ! 361: asm("movl $9,_subtst"); ! 362: asm("movl _mult,r3"); ! 363: asm("movl _mulp,r4"); ! 364: asm("bicpsw $0xf"); ! 365: asm("bispsw _flag_msk"); /* set flags */ ! 366: asm("mull3 r3,r4,_product"); ! 367: asm("movpsl _psl"); /* save PSL */ ! 368: } ! 369: if (ix==5) { /* Memory to register to register */ ! 370: setjmp(); ! 371: asm("movl $0xa,_subtst"); ! 372: asm("movl _mulp,r4"); ! 373: asm("bicpsw $0xf"); ! 374: asm("bispsw _flag_msk"); /* set flags */ ! 375: asm("mull3 _mult,r4,r6"); ! 376: asm("movpsl _psl"); /* save PSL */ ! 377: asm("movl r6,_product"); ! 378: } ! 379: if (ix==6) { /* Register to memory to memory */ ! 380: setjmp(); ! 381: asm("movl $0xb,_subtst"); ! 382: asm("movl _mult,r3"); ! 383: asm("bicpsw $0xf"); ! 384: asm("bispsw _flag_msk"); /* set flags */ ! 385: asm("mull3 r3,_mulp,_product"); ! 386: asm("movpsl _psl"); /* save PSL */ ! 387: } ! 388: if (ix==7) { /* Memory to memory to register */ ! 389: setjmp(); ! 390: asm("movl $0xc,_subtst"); ! 391: asm("bicpsw $0xf"); ! 392: asm("bispsw _flag_msk"); /* set flags */ ! 393: asm("mull3 _mult,_mulp,r6"); ! 394: asm("movpsl _psl"); /* save PSL */ ! 395: asm("movl r6,_product"); ! 396: } ! 397: } ! 398: psw = psl & 0xf; /* mask out high order word of PSL */ ! 399: ! 400: /* check flags */ ! 401: ! 402: if (exp_psw & V){ /* On expected overflows */ ! 403: if( !(psw & V) ) { /* We only look at the (V) flag */ ! 404: asm("movl $2,_ercode"); ! 405: if (scoplp) longjmp(); ! 406: error_hdl2(psw,exp_psw,op1,op2); ! 407: } ! 408: continue; /* skip other checks */ ! 409: } ! 410: else if (psw != exp_psw) ! 411: { ! 412: asm("movl $2,_ercode"); ! 413: if (scoplp) longjmp(); ! 414: error_hdl2(psw,exp_psw,op1,op2); ! 415: } ! 416: if (mult != op1) ! 417: { ! 418: asm("movl $3,_ercode"); ! 419: if (scoplp) longjmp(); ! 420: error_hdl2(mult,op1,op1,op2); ! 421: } ! 422: if (type == 3) ! 423: { ! 424: if (mulp != op2) ! 425: { ! 426: asm("movl $3,_ercode"); ! 427: if (scoplp) longjmp(); ! 428: error_hdl2(mulp,op2,op1,op2); ! 429: } ! 430: } ! 431: if (product != exp_result) ! 432: { /* error in multiply operation */ ! 433: asm("movl $1,_ercode"); ! 434: if (scoplp) longjmp(); ! 435: error_hdl2(product,exp_result,op1,op2); ! 436: } ! 437: if (force_lp) longjmp(); ! 438: } ! 439: break; ! 440: } ! 441: } ! 442: ! 443: /* ROUTINE TO EXECUTE EMUL */ ! 444: ! 445: static emul(exp_psw) ! 446: long exp_psw; ! 447: { ! 448: long op1, op2, op3, psw, type; ! 449: char *msg1, *msg2; ! 450: ! 451: flag_msk = flag_msk << 16; ! 452: op1 = mult; ! 453: op2 = muld; ! 454: op3 = add; ! 455: for(;;) ! 456: { ! 457: msg1 = "** Test EMUL **\n"; ! 458: for(type=0;type<8;type++) ! 459: { ! 460: mult = op1; ! 461: muld = op2; ! 462: add = op3; ! 463: ! 464: if (type==0) { /* Memory memory memory memory */ ! 465: asm("movl $0xd,_subtst"); ! 466: asm("bicpsw $0xf"); /* clear all flags */ ! 467: asm("bispsw _flag_msk"); /* set flags */ ! 468: asm("emul _mult,_muld,_add,_prod1"); ! 469: asm("movpsl _psl"); /* save PSL */ ! 470: psw = psl & 0xf; ! 471: } ! 472: if (type==1) { /* Register,register,register register */ ! 473: asm("movl $0xe,_subtst"); ! 474: asm("movl _mult,r3"); ! 475: asm("movl _muld,r4"); ! 476: asm("movl _add,r5"); ! 477: asm("bicpsw $0xf"); /* clear all flags */ ! 478: asm("bispsw _flag_msk"); /* set flags */ ! 479: asm("emul r3,r4,r5,r6"); ! 480: asm("movpsl _psl"); /* save PSL */ ! 481: psw = psl & 0xf; ! 482: asm("movl r6,_prod1"); ! 483: asm("movl r7,_prod2"); ! 484: } ! 485: if (type==2) { /* Register register Memory memory */ ! 486: asm("movl $0xf,_subtst"); ! 487: asm("movl _mult,r3"); ! 488: asm("movl _muld,r4"); ! 489: asm("bicpsw $0xf"); /* clear all flags */ ! 490: asm("bispsw _flag_msk"); /* set flags */ ! 491: asm("emul r3,r4,_add,_prod1"); ! 492: asm("movpsl _psl"); /* save PSL */ ! 493: psw = psl & 0xf; ! 494: } ! 495: if (type==3) { /* Register memory Memory register */ ! 496: asm("movl $0x10,_subtst"); ! 497: asm("movl _mult,r3"); ! 498: asm("bicpsw $0xf"); /* clear all flags */ ! 499: asm("bispsw _flag_msk"); /* set flags */ ! 500: asm("emul r3,_muld,_add,r6"); ! 501: asm("movpsl _psl"); /* save PSL */ ! 502: psw = psl & 0xf; ! 503: asm("movl r6,_prod1"); ! 504: asm("movl r7,_prod2"); ! 505: } ! 506: if (type==4) { /* Memory memory register memory */ ! 507: asm("movl $0x11,_subtst"); ! 508: asm("movl _add,r5"); ! 509: asm("bicpsw $0xf"); /* clear all flags */ ! 510: asm("bispsw _flag_msk"); /* set flags */ ! 511: asm("emul _mult,_muld,r5,_prod1"); ! 512: asm("movpsl _psl"); /* save PSL */ ! 513: psw = psl & 0xf; ! 514: } ! 515: if (type==5) { /* Register memory register memory */ ! 516: asm("movl $0x12,_subtst"); ! 517: asm("movl _mult,r3"); ! 518: asm("movl _add,r5"); ! 519: asm("bicpsw $0xf"); /* clear all flags */ ! 520: asm("bispsw _flag_msk"); /* set flags */ ! 521: asm("emul r3,_muld,r5,_prod1"); ! 522: asm("movpsl _psl"); /* save PSL */ ! 523: psw = psl & 0xf; ! 524: } ! 525: if (type==6) { /* Memory register register memory */ ! 526: asm("movl $0x13,_subtst"); ! 527: asm("movl _muld,r4"); ! 528: asm("movl _add,r5"); ! 529: asm("bicpsw $0xf"); /* clear all flags */ ! 530: asm("bispsw _flag_msk"); /* set flags */ ! 531: asm("emul _mult,r4,r5,_prod1"); ! 532: asm("movpsl _psl"); /* save PSL */ ! 533: psw = psl & 0xf; ! 534: } ! 535: if (type==7) { /* Memory register memory register */ ! 536: asm("movl $0x14,_subtst"); ! 537: asm("movl _muld,r4"); ! 538: asm("bicpsw $0xf"); /* clear all flags */ ! 539: asm("bispsw _flag_msk"); /* set flags */ ! 540: asm("emul _mult,r4,_add,r6"); ! 541: asm("movpsl _psl"); /* save PSL */ ! 542: psw = psl & 0xf; ! 543: asm("movl r6,_prod1"); ! 544: asm("movl r7,_prod2"); ! 545: } ! 546: ! 547: if ( prod1 != exp_reslt1) ! 548: { /* error in ext. multiply operation */ ! 549: asm("movl $1,_ercode"); ! 550: if (scoplp) longjmp(); ! 551: error(prod1,exp_reslt1,op1,op2); ! 552: } ! 553: if ( prod2 != exp_reslt2 ) ! 554: { /* error in ext. multiply operation */ ! 555: asm("movl $1,_ercode"); ! 556: if (scoplp) longjmp(); ! 557: error(prod2,exp_reslt2,op1,op2); ! 558: } ! 559: /* check flags */ ! 560: if (psw!=exp_psw) ! 561: { ! 562: asm("movl $3,_no_opr"); ! 563: asm("movl $2,_ercode"); ! 564: if (scoplp) longjmp(); ! 565: error_hdl3(psw,exp_psw,op1,op2,op3); ! 566: } ! 567: ! 568: if (mult != op1) ! 569: { ! 570: asm("movl $3,_no_opr"); ! 571: asm("movl $3,_ercode"); ! 572: if (scoplp) longjmp(); ! 573: error_hdl3(mult,op1,op1,op2,op3); ! 574: } ! 575: if (muld != op2) ! 576: { ! 577: asm("movl $3,_no_opr"); ! 578: asm("movl $3,_ercode"); ! 579: if (scoplp) longjmp(); ! 580: error_hdl3(muld,op2,op1,op2,op3); ! 581: } ! 582: if (add != op3) ! 583: { ! 584: asm("movl $3,_no_opr"); ! 585: asm("movl $3,_ercode"); ! 586: if (scoplp) longjmp(); ! 587: error_hdl3(add,op3,op1,op2,op3); ! 588: } ! 589: if (force_lp) longjmp(); ! 590: } ! 591: break; ! 592: } ! 593: } ! 594: ! 595:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.