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