1;
2; Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
3; Universitaet Berlin.  See the accompanying file "COPYRIGHT" for
4; details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
5;
6;
7;	Lines starting with ' (in the first col) are echoed.
8;	Lines starting with " (in the first col) are echoed to stderr.
9;	Lines starting with ; or empty lines are ignored.
10;
11;	The part after (including) a trailing '=' is what you expect;
12;	there will be output if the result is different.
13;
14;	-  and +  by itself mean MIN_WORD and MAX_WORD, respectively;
15;	-- and ++ mean MIN_LONGWORD and MAX_LONGWORD.
16;
17
18'test the basic arithmetic operations used for the rpe-ltd filtering.
19'
20'add ================
21'  basic
22
23	add  0  0 	=  0
24	add  7  4	= 11
25	add  4  6 	= 10
26	add  1  1 	=  2
27
28'  negative operands
29
30	add  -7  4	= -3
31	add   4 -6 	= -2
32	add  -1 -3 	= -4
33	add   7 -4	=  3
34	add  -4  6 	=  2
35
36'  positive overflow
37; (max-word = 32767)
38	add  + 1	= +
39	add  + +	= +
40	add  -1 + 	= 32766
41	add  32766 2	= +
42	add  1 32766  	= +
43
44'  underflow
45; (min-word = 32768)
46
47	add  - -1	= -
48	add  - -	= -
49	add  1 -	= -32767
50	add  -32767 -2	= -
51	add  -1 -32766 	= -32767
52	add  -32767 -1	= -
53	add  - +	= -1
54	add  + -	= -1
55	add  0 -	= -
56	add  0 +	= +
57'
58
59'L_add ================
60'  basic
61
62	L_add  0  0 	=  0
63	L_add  7  4	= 11
64	L_add  4  6 	= 10
65	L_add  1  1 	=  2
66
67'  negative operands
68
69	L_add  -7  4	= -3
70	L_add   4 -6 	= -2
71	L_add  -1 -3 	= -4
72	L_add   7 -4	=  3
73	L_add  -4  6 	=  2
74	L_add   0 -1 	= -1
75
76'  positive overflow
77; (max-longword = 2147483647)
78	L_add  ++ 1	= ++
79	L_add  ++ ++	= ++
80	L_add  -1 ++ 	= 2147483646
81	L_add  2147483646 2 = ++
82	L_add  1 2147483645 = 2147483646
83
84'  underflow
85; (min-longword = -2147483648)
86
87	L_add  -- -1	= --
88	L_add  -- --	= --
89	L_add  1 --	= -2147483647
90	L_add  -2147483647 -2	= --
91	L_add  -1 -2147483646 	= -2147483647
92	L_add  -2147483647 -1	= --
93	L_add  -- ++	= -1
94	L_add  ++ --	= -1
95	L_add  0 --	= --
96	L_add  0 ++	= ++
97'
98
99'sub ================
100'  basic
101
102	sub  0  0 	=  0
103	sub  7  4	=  3
104	sub  4  6 	= -2
105	sub  1  0 	=  1
106
107'  negative operands
108
109	sub  -7  4	= -11
110	sub   4 -6 	=  10
111	sub  -1 -3 	=  2
112	sub   7 -4	=  11
113	sub  -4  6 	= -10
114
115'  positive overflow
116; (max-word = 32767)
117	sub  1 -	= +
118	sub  + +	= 0
119	sub  + 0	= +
120	sub  + -1 	= +
121	sub  + 1 	= 32766
122	sub  1 + 	= -32766
123	sub  0 +  	= -32767
124
125'  underflow
126; (min-word = 32768)
127
128	sub  - -1	= -32767
129	sub  - 1	= -
130	sub  - -	= 0
131	sub  - +	= -
132	sub  + -	= +
133	sub  1 -	= +
134	sub  -1 -	= +
135	sub  -32767 2	= -
136	sub  0 -	= +
137'
138
139'L_sub ================
140'  basic
141
142	L_sub  0  0 	=  0
143	L_sub  7  4	=  3
144	L_sub  4  6 	= -2
145	L_sub  1  0 	=  1
146
147'  negative operands
148
149	L_sub  -7  4	= -11
150	L_sub   4 -6 	=  10
151	L_sub  -1 -3 	=  2
152	L_sub   7 -4	=  11
153	L_sub  -4  6 	= -10
154
155'  positive overflow
156	L_sub  1 --	= ++
157	L_sub  ++ ++	= 0
158	L_sub  ++ 0	= ++
159	L_sub  ++ -1 	= ++
160	L_sub  ++ 1 	=  2147483646
161	L_sub  1 ++ 	= -2147483646
162	L_sub  0 ++  	= -2147483647
163
164'  underflow
165
166	L_sub  -- -1	= -2147483647
167	L_sub  -- 1	= --
168	L_sub  -- --	= 0
169	L_sub  -- ++	= --
170	L_sub  + --	= ++
171	L_sub  1 --	= ++
172	L_sub  -1 --	= ++
173	L_sub  -2147483647 2 = --
174	L_sub  0 --	= ++
175
176'
177'abs ================
178'  basic
179
180	abs	   0	=   0
181	abs	   2	=   2
182	abs	-459	= 459
183
184'  overflow
185
186	abs	 +	=   +
187	abs	 -	=   +
188	abs 	-32767  =   +
189	abs 	 32766  = 32766
190	abs 	-32766  = 32766
191
192'
193'mult ================
194;  actually, a * b >> 15
195
196'  basic
197	mult	0  0		= 0
198	mult	0x100 0x100	= 2
199	mult	4711 0x4000	= 2355
200
201'  negative operands
202	mult	-1  0		=  0
203
204	mult	-0x100   0x100	= -2
205	mult	 0x100  -0x100	= -2
206	mult	-0x100  -0x100	=  2
207
208	mult	-4711   0x4000	= -2356
209	mult	 4711  -0x4000	= -2356
210	mult	-4711  -0x4000	=  2355
211
212'  overflow
213	mult	+ + 	 = 32766
214	mult	+ 0x4000 = 0x3fff
215	mult	0x4000 + = 0x3fff
216	mult	+ 1	 = 0
217	mult	+ 2	 = 1
218	mult	+ 3	 = 2
219
220'  underflow
221	mult	- - 	 = +
222	mult	- + 	 = -32767
223	mult	+ - 	 = -32767
224	mult	- 1	 = -1
225	mult	- 2	 = -2
226	mult	- 3	 = -3
227
228'
229'mult_r ================
230;  actually, (a * b + 16384) >> 15
231
232'  basic
233	mult_r	0  0		= 0
234	mult_r	0x100 0x100	= 2
235	mult_r	4711 0x4000	= 2356
236
237'  negative operands
238	mult_r	-1  0		=  0
239
240	mult_r	-0x100   0x100	= -2
241	mult_r	 0x100  -0x100	= -2
242	mult_r	-0x100  -0x100	=  2
243
244	mult_r	-4711   0x4000	= -2355
245	mult_r	 4711  -0x4000	= -2355
246	mult_r	-4711  -0x4000	=  2356
247
248'  overflow
249	mult_r	+ + 	 = 32766
250	mult_r	+ 32766	 = 32765
251	mult_r	32766 +	 = 32765
252	mult_r	+ 0x4000 = 0x4000
253	mult_r	0x4000 + = 0x4000
254	mult_r	+ 0x4001 = 0x4000
255	mult_r	0x4001 + = 0x4000
256	mult_r	+ 2	 = 2
257	mult_r	+ 1	 = 1
258	mult_r	1 +	 = 1
259	mult_r	+ 0	 = 0
260	mult_r	0 +	 = 0
261
262'  underflow
263	mult_r	- - 	 = +
264	mult_r	- + 	 = -32767
265	mult_r	+ - 	 = -32767
266	mult_r	- 1	 = -1
267	mult_r	- 2	 = -2
268	mult_r	- 3	 = -3
269
270'
271'L_mult ================
272;  actually, (a * b) << 1
273;  assert (a != MIN_WORD && b != MIN_WORD)
274
275'  basic
276	L_mult	0  0	= 0
277	L_mult	2  3	= 12
278	L_mult	4711 5	= 47110
279
280'  negative operands
281
282	L_mult	-2  3	= -12
283	L_mult	 2 -3	= -12
284	L_mult	-2 -3	=  12
285	L_mult -4711  5	= -47110
286	L_mult	4711 -5	= -47110
287	L_mult -4711 -5	=  47110
288
289'  overflow
290	L_mult	+ + 	 = 2147352578
291	L_mult	+ -32767 = -2147352578
292	L_mult	-32767 + = -2147352578
293	L_mult	+ 2	 = 131068
294	L_mult	+ 1	 = 65534
295	L_mult	1 +	 = 65534
296	L_mult	+ 0	 = 0
297	L_mult	0 +	 = 0
298
299'
300'div ================
301;  actually, (32767 * a) / b
302;  assert (a > 0 && b >= a)
303
304'  basic
305	div	1 1		= +
306	div	4711 4711 	= +
307	div	5 10		= 0x4000
308	div	5 20		= 0x2000
309	div	5 40		= 0x1000
310
311'  overflow
312	div	+ + 		= +
313	div	0x4000 +	= 0x4000
314	div	1 +		= 1
315	div	1 2		= 0x4000
316'
317'norm ================
318
319'  positive
320	norm	1		= 30
321	norm	2		= 29
322	norm	3		= 29
323	norm	4		= 28
324	norm	5		= 28
325; etc, etc...
326	norm	0x08000000	= 3
327	norm	0x10000000	= 2
328	norm	0x20000000	= 1
329	norm	0x20000001	= 1
330	norm	0x3fffffff	= 1
331	norm	0x40000000	= 0
332	norm	0x40000001	= 0
333	norm	0x4ffffffe	= 0
334	norm	++		= 0
335
336'  negative
337	norm	-1		= 31
338	norm	-2		= 30
339	norm	-3		= 29
340	norm	-4		= 29
341	norm	-5		= 28
342; etc, etc...
343	norm	0x4fffffff	= 0
344	norm	--		= 0
345'
346'>> ================
347
348'  basic
349	>>	1 1		= 0
350	>>	4 2		= 1
351	>>	0x1100 5	= 0x88
352
353'  negative operand
354
355	>>	1 -1		= 2
356	>>	1 -2		= 4
357	>>	0x88 -5		= 0x1100
358
359'  overflow
360	>>	-1 4711		= -1
361	>>	1  4711		= 0
362	>>	-4711 4711 	= -1
363	>>	4711 4711 	= 0
364	>>	+ 1		=  16383
365	>>	- 1		= -16384
366'
367'L_>> ================
368
369'  basic
370	L_>>	1 1		= 0
371	L_>>	4 2		= 1
372	L_>>	0x1100 5	= 0x88
373
374'  negative operand
375
376	L_>>	1 -1		= 2
377	L_>>	1 -2		= 4
378	L_>>	0x88 -5		= 0x1100
379
380'  overflow
381	L_>>	-1 4711		= -1
382	L_>>	1  4711		= 0
383	L_>>	-4711 4711 	= -1
384	L_>>	4711 4711 	= 0
385	L_>>	++ 1		=  1073741823
386	L_>>	-- 1		= -1073741824
387
388'
389'<< ================
390
391'  basic
392	<<	1 1		= 2
393	<<	4 2		= 16
394	<<	0x0088 5	= 0x1100
395
396'  negative operand
397
398	<<	1 -1		= 0
399	<<	4 -2		= 1
400	<<	0x1100 -5	= 0x0088
401
402'  overflow
403	<<	-1 4711		= 0
404	<<	1  4711		= 0
405	<<	-4711 4711 	= 0
406	<<	4711 4711 	= 0
407	<<	4711 -4711 	= 0
408	<<	-4711 -4711 	= -1
409	<<	+ 1		= 0xfffe
410	<<	-1 1		= 0xfffe
411	<<	- 1		= 0
412'
413'L_<< ================
414
415'  basic
416	L_<<	1 1		= 2
417	L_<<	4 2		= 16
418	L_<<	0x0088 5	= 0x1100
419
420'  negative operand
421
422	L_<<	1 -1		= 0
423	L_<<	4 -2		= 1
424	L_<<	0x1100 -5	= 0x0088
425
426'  overflow
427	L_<<	-1 4711		= 0
428	L_<<	1  4711		= 0
429	L_<<	-4711 4711 	= 0
430	L_<<	4711 4711 	= 0
431	L_<<	4711 -4711 	= 0
432	L_<<	-4711 -4711 	= -1
433	L_<<	++ 1		= -2
434	L_<<	-1 1		= -2
435	L_<<	-- 1		= 0
436
437'macros
438'
439'add ================
440'  basic
441
442	M_add  0  0 	=  0
443	M_add  7  4	= 11
444	M_add  4  6 	= 10
445	M_add  1  1 	=  2
446
447'  negative operands
448
449	M_add  -7  4	= -3
450	M_add   4 -6 	= -2
451	M_add  -1 -3 	= -4
452	M_add   7 -4	=  3
453	M_add  -4  6 	=  2
454
455'  positive overflow
456; (max-word = 32767)
457	M_add  + 1	= +
458	M_add  + +	= +
459	M_add  -1 + 	= 32766
460	M_add  32766 2	= +
461	M_add  1 32766  	= +
462
463'  underflow
464; (min-word = 32768)
465
466	M_add  - -1	= -
467	M_add  - -	= -
468	M_add  1 -	= -32767
469	M_add  -32767 -2 = -
470	M_add  -1 -32766 = -32767
471	M_add  -32767 -1 = -
472	M_add  - +	= -1
473	M_add  + -	= -1
474	M_add  0 -	= -
475	M_add  0 +	= +
476'
477
478'L_add ================
479'  basic
480
481	M_L_add  0  0 	=  0
482	M_L_add  7  4	= 11
483	M_L_add  4  6 	= 10
484	M_L_add  1  1 	=  2
485
486'  negative operands
487
488	M_L_add  -7  4	= -3
489	M_L_add   4 -6 	= -2
490	M_L_add  -1 -3 	= -4
491	M_L_add   7 -4	=  3
492	M_L_add  -4  6 	=  2
493	M_L_add   0 -1 	= -1
494
495'  positive overflow
496; (max-longword = 2147483647)
497	M_L_add  ++ 1	= ++
498	M_L_add  ++ ++	= ++
499	M_L_add  -1 ++ 	= 2147483646
500	M_L_add  2147483646 2 = ++
501	M_L_add  1 2147483645 = 2147483646
502
503'  underflow
504; (min-longword = -2147483648)
505
506	M_L_add  -- -1	= --
507	M_L_add  -- --	= --
508	M_L_add  1 --	= -2147483647
509	M_L_add  -2147483647 -2	= --
510	M_L_add  -1 -2147483646 	= -2147483647
511	M_L_add  -2147483647 -1	= --
512	M_L_add  -- ++	= -1
513	M_L_add  ++ --	= -1
514	M_L_add  0 --	= --
515	M_L_add  0 ++	= ++
516'
517
518'sub ================
519'  basic
520
521	M_sub  0  0 	=  0
522	M_sub  7  4	=  3
523	M_sub  4  6 	= -2
524	M_sub  1  0 	=  1
525
526'  negative operands
527
528	M_sub  -7  4	= -11
529	M_sub   4 -6 	=  10
530	M_sub  -1 -3 	=  2
531	M_sub   7 -4	=  11
532	M_sub  -4  6 	= -10
533
534'  positive overflow
535; (max-word = 32767)
536	M_sub  1 -	= +
537	M_sub  + +	= 0
538	M_sub  + 0	= +
539	M_sub  + -1 	= +
540	M_sub  + 1 	= 32766
541	M_sub  1 + 	= -32766
542	M_sub  0 +  	= -32767
543
544'  underflow
545; (min-word = 32768)
546
547	M_sub  - -1	= -32767
548	M_sub  - 1	= -
549	M_sub  - -	= 0
550	M_sub  - +	= -
551	M_sub  + -	= +
552	M_sub  1 -	= +
553	M_sub  -1 -	= +
554	M_sub  -32767 2	= -
555	M_sub  0 -	= +
556'
557'
558'abs ================
559'  basic
560
561	M_abs	   0	=   0
562	M_abs	   2	=   2
563	M_abs	-459	= 459
564
565'  overflow
566
567	M_abs	 +	=   +
568	M_abs	 -	=   +
569	M_abs 	-32767  =   +
570	M_abs 	 32766  = 32766
571	M_abs 	-32766  = 32766
572
573'
574'mult ================
575;  actually, a * b >> 15
576
577'  basic
578	M_mult	0  0		= 0
579	M_mult	0x100 0x100	= 2
580	M_mult	4711 0x4000	= 2355
581
582'  negative operands
583	M_mult	-1  0		=  0
584
585	M_mult	-0x100   0x100	= -2
586	M_mult	 0x100  -0x100	= -2
587	M_mult	-0x100  -0x100	=  2
588
589	M_mult	-4711   0x4000	= -2356
590	M_mult	 4711  -0x4000	= -2356
591	M_mult	-4711  -0x4000	=  2355
592
593'  overflow
594	M_mult	+ + 	 = 32766
595	M_mult	+ 0x4000 = 0x3fff
596	M_mult	0x4000 + = 0x3fff
597	M_mult	+ 1	 = 0
598	M_mult	+ 2	 = 1
599	M_mult	+ 3	 = 2
600
601'  underflow
602;	M_mult - - 	= +			assert !(a == b && b == MIN_WORD)
603 	M_mult - -32767	= +
604 	M_mult -32767 -	= +
605	M_mult	- + 	= -32767
606	M_mult	+ - 	= -32767
607	M_mult	- 1	= -1
608	M_mult	- 2	= -2
609	M_mult	- 3	= -3
610
611'
612'mult_r ================
613;  actually, (a * b + 16384) >> 15
614
615'  basic
616	M_mult_r 0  0		= 0
617	M_mult_r 0x100 0x100	= 2
618	M_mult_r 4711 0x4000	= 2356
619
620'  negative operands
621	M_mult_r -1  0		=  0
622
623	M_mult_r -0x100   0x100	= -2
624	M_mult_r  0x100  -0x100	= -2
625	M_mult_r -0x100  -0x100	=  2
626
627	M_mult_r -4711   0x4000	= -2355
628	M_mult_r  4711  -0x4000	= -2355
629	M_mult_r -4711  -0x4000	=  2356
630
631'  overflow
632	M_mult_r + + 	 = 32766
633	M_mult_r + 32766  = 32765
634	M_mult_r 32766 +  = 32765
635	M_mult_r + 0x4000 = 0x4000
636	M_mult_r 0x4000 + = 0x4000
637	M_mult_r + 0x4001 = 0x4000
638	M_mult_r 0x4001 + = 0x4000
639	M_mult_r + 2	 = 2
640	M_mult_r + 1	 = 1
641	M_mult_r 1 +	 = 1
642	M_mult_r + 0	 = 0
643	M_mult_r 0 +	 = 0
644
645'  underflow
646;	M_mult_r - - 	 = +			assert !(a == b && b == MIN_WORD)
647 	M_mult_r - -32767 = +
648 	M_mult_r -32767 - = +
649	M_mult_r - + 	 = -32767
650	M_mult_r + - 	 = -32767
651	M_mult_r - 1	 = -1
652	M_mult_r - 2	 = -2
653	M_mult_r - 3	 = -3
654
655'
656'L_mult ================
657;  actually, (a * b) << 1
658;  assert (a != MIN_WORD && b != MIN_WORD)
659
660'  basic
661	M_L_mult	0  0	= 0
662	M_L_mult	2  3	= 12
663	M_L_mult	4711 5	= 47110
664
665'  negative operands
666
667	M_L_mult	-2  3	= -12
668	M_L_mult	 2 -3	= -12
669	M_L_mult	-2 -3	=  12
670	M_L_mult -4711  5	= -47110
671	M_L_mult	4711 -5	= -47110
672	M_L_mult -4711 -5	=  47110
673
674'  overflow
675 	M_L_mult	+ + 	 = 2147352578
676	M_L_mult	+ -32767 = -2147352578
677	M_L_mult	-32767 + = -2147352578
678	M_L_mult	+ 2	 = 131068
679	M_L_mult	+ 1	 = 65534
680	M_L_mult	1 +	 = 65534
681	M_L_mult	+ 0	 = 0
682	M_L_mult	0 +	 = 0
683
684