;
; Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
; Universitaet Berlin.  See the accompanying file "COPYRIGHT" for
; details.  THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
;
;
;	Lines starting with ' (in the first col) are echoed.
;	Lines starting with " (in the first col) are echoed to stderr.
;	Lines starting with ; or empty lines are ignored.
;
;	The part after (including) a trailing '=' is what you expect;
;	there will be output if the result is different.
;
;	-  and +  by itself mean MIN_WORD and MAX_WORD, respectively;
;	-- and ++ mean MIN_LONGWORD and MAX_LONGWORD.
;

'test the basic arithmetic operations used for the rpe-ltd filtering.
'
'add ================
'  basic

	add  0  0 	=  0
	add  7  4	= 11
	add  4  6 	= 10
	add  1  1 	=  2

'  negative operands

	add  -7  4	= -3
	add   4 -6 	= -2
	add  -1 -3 	= -4
	add   7 -4	=  3
	add  -4  6 	=  2

'  positive overflow
; (max-word = 32767)
	add  + 1	= +
	add  + +	= +
	add  -1 + 	= 32766
	add  32766 2	= +
	add  1 32766  	= +

'  underflow
; (min-word = 32768)

	add  - -1	= -
	add  - -	= -
	add  1 -	= -32767  
	add  -32767 -2	= -
	add  -1 -32766 	= -32767
	add  -32767 -1	= -
	add  - +	= -1
	add  + -	= -1
	add  0 -	= -
	add  0 +	= +
'

'L_add ================
'  basic 

	L_add  0  0 	=  0
	L_add  7  4	= 11
	L_add  4  6 	= 10
	L_add  1  1 	=  2

'  negative operands

	L_add  -7  4	= -3
	L_add   4 -6 	= -2
	L_add  -1 -3 	= -4
	L_add   7 -4	=  3
	L_add  -4  6 	=  2
	L_add   0 -1 	= -1

'  positive overflow
; (max-longword = 2147483647)
	L_add  ++ 1	= ++
	L_add  ++ ++	= ++
	L_add  -1 ++ 	= 2147483646
	L_add  2147483646 2 = ++
	L_add  1 2147483645 = 2147483646

'  underflow
; (min-longword = -2147483648)

	L_add  -- -1	= --
	L_add  -- --	= --
	L_add  1 --	= -2147483647
	L_add  -2147483647 -2	= --
	L_add  -1 -2147483646 	= -2147483647
	L_add  -2147483647 -1	= --
	L_add  -- ++	= -1
	L_add  ++ --	= -1
	L_add  0 --	= --
	L_add  0 ++	= ++
'

'sub ================
'  basic 

	sub  0  0 	=  0
	sub  7  4	=  3
	sub  4  6 	= -2
	sub  1  0 	=  1

'  negative operands

	sub  -7  4	= -11
	sub   4 -6 	=  10
	sub  -1 -3 	=  2
	sub   7 -4	=  11
	sub  -4  6 	= -10

'  positive overflow
; (max-word = 32767)
	sub  1 -	= +
	sub  + +	= 0
	sub  + 0	= +
	sub  + -1 	= +
	sub  + 1 	= 32766
	sub  1 + 	= -32766 
	sub  0 +  	= -32767

'  underflow
; (min-word = 32768)

	sub  - -1	= -32767
	sub  - 1	= -
	sub  - -	= 0
	sub  - +	= -
	sub  + -	= +
	sub  1 -	= +
	sub  -1 -	= +
	sub  -32767 2	= -
	sub  0 -	= +
' 

'L_sub ================
'  basic 

	L_sub  0  0 	=  0
	L_sub  7  4	=  3
	L_sub  4  6 	= -2
	L_sub  1  0 	=  1

'  negative operands

	L_sub  -7  4	= -11
	L_sub   4 -6 	=  10
	L_sub  -1 -3 	=  2
	L_sub   7 -4	=  11
	L_sub  -4  6 	= -10

'  positive overflow
	L_sub  1 --	= ++
	L_sub  ++ ++	= 0
	L_sub  ++ 0	= ++
	L_sub  ++ -1 	= ++
	L_sub  ++ 1 	=  2147483646
	L_sub  1 ++ 	= -2147483646
	L_sub  0 ++  	= -2147483647

'  underflow

	L_sub  -- -1	= -2147483647
	L_sub  -- 1	= --
	L_sub  -- --	= 0
	L_sub  -- ++	= --
	L_sub  + --	= ++
	L_sub  1 --	= ++
	L_sub  -1 --	= ++
	L_sub  -2147483647 2 = --
	L_sub  0 --	= ++

'
'abs ================
'  basic 

	abs	   0	=   0
	abs	   2	=   2
	abs	-459	= 459

'  overflow

	abs	 +	=   +
	abs	 -	=   +
	abs 	-32767  =   +
	abs 	 32766  = 32766
	abs 	-32766  = 32766

'
'mult ================
;  actually, a * b >> 15

'  basic 
	mult	0  0		= 0
	mult	0x100 0x100	= 2
	mult	4711 0x4000	= 2355

'  negative operands
	mult	-1  0		=  0

	mult	-0x100   0x100	= -2
	mult	 0x100  -0x100	= -2
	mult	-0x100  -0x100	=  2

	mult	-4711   0x4000	= -2356
	mult	 4711  -0x4000	= -2356
	mult	-4711  -0x4000	=  2355

'  overflow
	mult	+ + 	 = 32766
	mult	+ 0x4000 = 0x3fff
	mult	0x4000 + = 0x3fff
	mult	+ 1	 = 0
	mult	+ 2	 = 1
	mult	+ 3	 = 2

'  underflow
	mult	- - 	 = +
	mult	- + 	 = -32767
	mult	+ - 	 = -32767
	mult	- 1	 = -1
	mult	- 2	 = -2
	mult	- 3	 = -3

'
'mult_r ================
;  actually, (a * b + 16384) >> 15

'  basic 
	mult_r	0  0		= 0
	mult_r	0x100 0x100	= 2
	mult_r	4711 0x4000	= 2356

'  negative operands
	mult_r	-1  0		=  0

	mult_r	-0x100   0x100	= -2
	mult_r	 0x100  -0x100	= -2
	mult_r	-0x100  -0x100	=  2

	mult_r	-4711   0x4000	= -2355
	mult_r	 4711  -0x4000	= -2355
	mult_r	-4711  -0x4000	=  2356

'  overflow
	mult_r	+ + 	 = 32766
	mult_r	+ 32766	 = 32765
	mult_r	32766 +	 = 32765
	mult_r	+ 0x4000 = 0x4000
	mult_r	0x4000 + = 0x4000
	mult_r	+ 0x4001 = 0x4000
	mult_r	0x4001 + = 0x4000
	mult_r	+ 2	 = 2
	mult_r	+ 1	 = 1
	mult_r	1 +	 = 1
	mult_r	+ 0	 = 0
	mult_r	0 +	 = 0

'  underflow
	mult_r	- - 	 = +
	mult_r	- + 	 = -32767
	mult_r	+ - 	 = -32767
	mult_r	- 1	 = -1
	mult_r	- 2	 = -2
	mult_r	- 3	 = -3

'
'L_mult ================
;  actually, (a * b) << 1
;  assert (a != MIN_WORD && b != MIN_WORD)

'  basic 
	L_mult	0  0	= 0
	L_mult	2  3	= 12
	L_mult	4711 5	= 47110

'  negative operands

	L_mult	-2  3	= -12
	L_mult	 2 -3	= -12
	L_mult	-2 -3	=  12
	L_mult -4711  5	= -47110
	L_mult	4711 -5	= -47110
	L_mult -4711 -5	=  47110

'  overflow
	L_mult	+ + 	 = 2147352578
	L_mult	+ -32767 = -2147352578
	L_mult	-32767 + = -2147352578
	L_mult	+ 2	 = 131068
	L_mult	+ 1	 = 65534
	L_mult	1 +	 = 65534
	L_mult	+ 0	 = 0
	L_mult	0 +	 = 0

'
'div ================
;  actually, (32767 * a) / b
;  assert (a > 0 && b >= a)

'  basic 
	div	1 1		= +
	div	4711 4711 	= +
	div	5 10		= 0x4000
	div	5 20		= 0x2000
	div	5 40		= 0x1000

'  overflow
	div	+ + 		= +
	div	0x4000 +	= 0x4000
	div	1 +		= 1
	div	1 2		= 0x4000
'
'norm ================

'  positive
	norm	1		= 30
	norm	2		= 29
	norm	3		= 29
	norm	4		= 28
	norm	5		= 28
; etc, etc...
	norm	0x08000000	= 3
	norm	0x10000000	= 2
	norm	0x20000000	= 1
	norm	0x20000001	= 1
	norm	0x3fffffff	= 1
	norm	0x40000000	= 0
	norm	0x40000001	= 0
	norm	0x4ffffffe	= 0
	norm	++		= 0

'  negative
	norm	-1		= 31
	norm	-2		= 30
	norm	-3		= 29
	norm	-4		= 29
	norm	-5		= 28
; etc, etc...
	norm	0x4fffffff	= 0
	norm	--		= 0
'
'>> ================

'  basic 
	>>	1 1		= 0
	>>	4 2		= 1
	>>	0x1100 5	= 0x88

'  negative operand

	>>	1 -1		= 2
	>>	1 -2		= 4
	>>	0x88 -5		= 0x1100

'  overflow
	>>	-1 4711		= -1
	>>	1  4711		= 0
	>>	-4711 4711 	= -1
	>>	4711 4711 	= 0
	>>	+ 1		=  16383
	>>	- 1		= -16384
'
'L_>> ================

'  basic 
	L_>>	1 1		= 0
	L_>>	4 2		= 1
	L_>>	0x1100 5	= 0x88

'  negative operand

	L_>>	1 -1		= 2
	L_>>	1 -2		= 4
	L_>>	0x88 -5		= 0x1100

'  overflow
	L_>>	-1 4711		= -1
	L_>>	1  4711		= 0
	L_>>	-4711 4711 	= -1
	L_>>	4711 4711 	= 0
	L_>>	++ 1		=  1073741823
	L_>>	-- 1		= -1073741824

'
'<< ================

'  basic 
	<<	1 1		= 2
	<<	4 2		= 16
	<<	0x0088 5	= 0x1100

'  negative operand

	<<	1 -1		= 0
	<<	4 -2		= 1
	<<	0x1100 -5	= 0x0088

'  overflow
	<<	-1 4711		= 0
	<<	1  4711		= 0
	<<	-4711 4711 	= 0
	<<	4711 4711 	= 0
	<<	4711 -4711 	= 0
	<<	-4711 -4711 	= -1
	<<	+ 1		= 0xfffe
	<<	-1 1		= 0xfffe
	<<	- 1		= 0
'
'L_<< ================

'  basic 
	L_<<	1 1		= 2
	L_<<	4 2		= 16
	L_<<	0x0088 5	= 0x1100

'  negative operand

	L_<<	1 -1		= 0
	L_<<	4 -2		= 1
	L_<<	0x1100 -5	= 0x0088

'  overflow
	L_<<	-1 4711		= 0
	L_<<	1  4711		= 0
	L_<<	-4711 4711 	= 0
	L_<<	4711 4711 	= 0
	L_<<	4711 -4711 	= 0
	L_<<	-4711 -4711 	= -1
	L_<<	++ 1		= -2
	L_<<	-1 1		= -2
	L_<<	-- 1		= 0

'macros
'
'add ================
'  basic

	M_add  0  0 	=  0
	M_add  7  4	= 11
	M_add  4  6 	= 10
	M_add  1  1 	=  2

'  negative operands

	M_add  -7  4	= -3
	M_add   4 -6 	= -2
	M_add  -1 -3 	= -4
	M_add   7 -4	=  3
	M_add  -4  6 	=  2

'  positive overflow
; (max-word = 32767)
	M_add  + 1	= +
	M_add  + +	= +
	M_add  -1 + 	= 32766
	M_add  32766 2	= +
	M_add  1 32766  	= +

'  underflow
; (min-word = 32768)

	M_add  - -1	= -
	M_add  - -	= -
	M_add  1 -	= -32767  
	M_add  -32767 -2 = -
	M_add  -1 -32766 = -32767
	M_add  -32767 -1 = -
	M_add  - +	= -1
	M_add  + -	= -1
	M_add  0 -	= -
	M_add  0 +	= +
'

'L_add ================
'  basic 

	M_L_add  0  0 	=  0
	M_L_add  7  4	= 11
	M_L_add  4  6 	= 10
	M_L_add  1  1 	=  2

'  negative operands

	M_L_add  -7  4	= -3
	M_L_add   4 -6 	= -2
	M_L_add  -1 -3 	= -4
	M_L_add   7 -4	=  3
	M_L_add  -4  6 	=  2
	M_L_add   0 -1 	= -1

'  positive overflow
; (max-longword = 2147483647)
	M_L_add  ++ 1	= ++
	M_L_add  ++ ++	= ++
	M_L_add  -1 ++ 	= 2147483646
	M_L_add  2147483646 2 = ++
	M_L_add  1 2147483645 = 2147483646

'  underflow
; (min-longword = -2147483648)

	M_L_add  -- -1	= --
	M_L_add  -- --	= --
	M_L_add  1 --	= -2147483647
	M_L_add  -2147483647 -2	= --
	M_L_add  -1 -2147483646 	= -2147483647
	M_L_add  -2147483647 -1	= --
	M_L_add  -- ++	= -1
	M_L_add  ++ --	= -1
	M_L_add  0 --	= --
	M_L_add  0 ++	= ++
'

'sub ================
'  basic 

	M_sub  0  0 	=  0
	M_sub  7  4	=  3
	M_sub  4  6 	= -2
	M_sub  1  0 	=  1

'  negative operands

	M_sub  -7  4	= -11
	M_sub   4 -6 	=  10
	M_sub  -1 -3 	=  2
	M_sub   7 -4	=  11
	M_sub  -4  6 	= -10

'  positive overflow
; (max-word = 32767)
	M_sub  1 -	= +
	M_sub  + +	= 0
	M_sub  + 0	= +
	M_sub  + -1 	= +
	M_sub  + 1 	= 32766
	M_sub  1 + 	= -32766 
	M_sub  0 +  	= -32767

'  underflow
; (min-word = 32768)

	M_sub  - -1	= -32767
	M_sub  - 1	= -
	M_sub  - -	= 0
	M_sub  - +	= -
	M_sub  + -	= +
	M_sub  1 -	= +
	M_sub  -1 -	= +
	M_sub  -32767 2	= -
	M_sub  0 -	= +
' 
'
'abs ================
'  basic 

	M_abs	   0	=   0
	M_abs	   2	=   2
	M_abs	-459	= 459

'  overflow

	M_abs	 +	=   +
	M_abs	 -	=   +
	M_abs 	-32767  =   +
	M_abs 	 32766  = 32766
	M_abs 	-32766  = 32766

'
'mult ================
;  actually, a * b >> 15

'  basic 
	M_mult	0  0		= 0
	M_mult	0x100 0x100	= 2
	M_mult	4711 0x4000	= 2355

'  negative operands
	M_mult	-1  0		=  0

	M_mult	-0x100   0x100	= -2
	M_mult	 0x100  -0x100	= -2
	M_mult	-0x100  -0x100	=  2

	M_mult	-4711   0x4000	= -2356
	M_mult	 4711  -0x4000	= -2356
	M_mult	-4711  -0x4000	=  2355

'  overflow
	M_mult	+ + 	 = 32766
	M_mult	+ 0x4000 = 0x3fff
	M_mult	0x4000 + = 0x3fff
	M_mult	+ 1	 = 0
	M_mult	+ 2	 = 1
	M_mult	+ 3	 = 2

'  underflow
;	M_mult - - 	= +			assert !(a == b && b == MIN_WORD)
 	M_mult - -32767	= +
 	M_mult -32767 -	= +
	M_mult	- + 	= -32767
	M_mult	+ - 	= -32767
	M_mult	- 1	= -1
	M_mult	- 2	= -2
	M_mult	- 3	= -3

'
'mult_r ================
;  actually, (a * b + 16384) >> 15

'  basic 
	M_mult_r 0  0		= 0
	M_mult_r 0x100 0x100	= 2
	M_mult_r 4711 0x4000	= 2356

'  negative operands
	M_mult_r -1  0		=  0

	M_mult_r -0x100   0x100	= -2
	M_mult_r  0x100  -0x100	= -2
	M_mult_r -0x100  -0x100	=  2

	M_mult_r -4711   0x4000	= -2355
	M_mult_r  4711  -0x4000	= -2355
	M_mult_r -4711  -0x4000	=  2356

'  overflow
	M_mult_r + + 	 = 32766
	M_mult_r + 32766  = 32765
	M_mult_r 32766 +  = 32765
	M_mult_r + 0x4000 = 0x4000
	M_mult_r 0x4000 + = 0x4000
	M_mult_r + 0x4001 = 0x4000
	M_mult_r 0x4001 + = 0x4000
	M_mult_r + 2	 = 2
	M_mult_r + 1	 = 1
	M_mult_r 1 +	 = 1
	M_mult_r + 0	 = 0
	M_mult_r 0 +	 = 0

'  underflow
;	M_mult_r - - 	 = +			assert !(a == b && b == MIN_WORD)
 	M_mult_r - -32767 = +
 	M_mult_r -32767 - = +
	M_mult_r - + 	 = -32767
	M_mult_r + - 	 = -32767
	M_mult_r - 1	 = -1
	M_mult_r - 2	 = -2
	M_mult_r - 3	 = -3

'
'L_mult ================
;  actually, (a * b) << 1
;  assert (a != MIN_WORD && b != MIN_WORD)

'  basic 
	M_L_mult	0  0	= 0
	M_L_mult	2  3	= 12
	M_L_mult	4711 5	= 47110

'  negative operands

	M_L_mult	-2  3	= -12
	M_L_mult	 2 -3	= -12
	M_L_mult	-2 -3	=  12
	M_L_mult -4711  5	= -47110
	M_L_mult	4711 -5	= -47110
	M_L_mult -4711 -5	=  47110

'  overflow
 	M_L_mult	+ + 	 = 2147352578
	M_L_mult	+ -32767 = -2147352578
	M_L_mult	-32767 + = -2147352578
	M_L_mult	+ 2	 = 131068
	M_L_mult	+ 1	 = 65534
	M_L_mult	1 +	 = 65534
	M_L_mult	+ 0	 = 0
	M_L_mult	0 +	 = 0