|
|
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.