\ hs 21.07.97 code squeezer
\ cpu specific parts

needs >group-index lib.optimized

only forth also definitions
optimizer also definitions

code (lit)+
	r0	ip )+		ldr
	top	top	r0	add c;	def_squeeze (lit) +
code (lit)-
	r0	ip )+		ldr
	top	top	r0	sub c;	def_squeeze (lit) -
code (lit)and
	r0	ip )+		ldr
	top	top	r0	and c;	def_squeeze (lit) and
code (lit)or
	r0	ip )+		ldr
	top	top	r0	orr c;	def_squeeze (lit) or
code (lit)xor
	r0	ip )+		ldr
	top	top	r0	eor c;	def_squeeze (lit) xor
code (lit)*
	r0	ip )+		ldr
	top	top	r0	mul c;	def_squeeze (lit) *
					def_squeeze (lit) u*
code (lit)!
	r0	ip )+		ldr
	top	r0 )		str
	top	sp		pop c;	def_squeeze (lit) !
code (lit)c!
	r0	ip )+		ldr
	top	r0 byte )	str
	top	sp		pop c;	def_squeeze (lit) c!
code (lit)@
	top	sp		push
	top	ip )+		ldr
	top	top )		ldr c;	def_squeeze (lit) @	
                                        def_squeeze (lit) a@
                                        def_squeeze (lit) token@
code (lit)c@
	top	sp		push
	top	ip )+		ldr
	top	top byte )	ldr c;	def_squeeze (lit) c@	
code (lit)>r
	r0	ip )+		ldr
	r0	rp		push c;	def_squeeze (lit) >r
	

code i_+
	r0 r1 2 	rp ia	ldm
	r1	r1	r0	add
	top	top	r1	add c;	def_squeeze i +
code i_-
	r0 r1 2 	rp ia	ldm
	r1	r1	r0	add
	top	top	r1	sub c;	def_squeeze i -
code i_and
	r0 r1 2 	rp ia	ldm
	r1	r1	r0	add
	top	top	r1	and c;	def_squeeze i and
code i_or
	r0 r1 2 	rp ia	ldm
	r1	r1	r0	add
	top	top	r1	orr c;	def_squeeze i or
code i_xor
	r0 r1 2 	rp ia	ldm
	r1	r1	r0	add
	top	top	r1	eor c;	def_squeeze i xor
code i_*
	r0 r1 2 	rp ia	ldm
	r1	r1	r0	add
	top	top	r1	mul c;	def_squeeze i *
					def_squeeze i u*
code i_!	( n i -- )
	r0 r1 2 	rp ia	ldm
	r1	r1	r0	add
	top	r1 )		str
	top	sp		pop c;	def_squeeze i !	
code i_c!
	r0 r1 2 	rp ia	ldm
	r1	r1	r0	add
	top	r1 byte )	str
	top	sp		pop c;	def_squeeze i c!	
code i_@
	top	sp		push
	r0 r1 2 	rp ia	ldm
	r1	r1	r0	add
	top	r1 )		ldr c;	def_squeeze i @
                                        def_squeeze i a@
                                        def_squeeze i token@
code i_c@
	top	sp		push
	r0 r1 2 	rp ia	ldm
	r1	r1	r0	add
	top	r1 byte )	ldr c;	def_squeeze i c@


code swap-
	r0	sp		pop
	top	top	r0	sub c;	def_squeeze swap -
					' + (def_squeeze swap +
					' * (def_squeeze swap *
					' u* (def_squeeze swap u*
					' and (def_squeeze swap and
					' or (def_squeeze swap or
					' xor (def_squeeze swap xor
code swap!	( addr n )
	r0	sp		pop
	top	r0 )		str
	top	sp		pop c;	def_squeeze swap !	
code swapc!
	r0	sp		pop
	top	r0 byte )	str
	top	sp		pop c;	def_squeeze swap c!	
code swap@	( addr x -- x data )
	r0	sp )		ldr
	top	sp )		str
	top	r0 )		ldr c;	def_squeeze swap @
                                        def_squeeze swap a@
                                        def_squeeze swap token@
code swapc@
	r0	sp )		ldr
	top	sp )		str
	top	r0 byte )	ldr c;	def_squeeze swap c@
					' nip (def_squeeze swap drop

code over+	( n1 n2 -- n1 n1+n2 )
	r0	sp )		ldr
	top	top	r0	add c;	def_squeeze over +
code over-
	r0	sp )		ldr
	top	top	r0	sub c;	def_squeeze over -
code overand
	r0	sp )		ldr
	top	top	r0	and c;	def_squeeze over and
code overor
	r0	sp )		ldr
	top	top	r0	orr c;	def_squeeze over or
code overxor
	r0	sp )		ldr
	top	top	r0	eor c;	def_squeeze over xor
code over*
	r0	sp )		ldr
	top	top	r0	mul c;	def_squeeze over *
					def_squeeze over u*
code over!	( n1 n2 -- n1 )
	r0	sp		pop
	top	r0 )		str
	top	r0		mov c;	def_squeeze over !
code overc!	( n1 n2 -- n1 )
	r0	sp		pop
	top	r0 byte )	str
	top	r0		mov c;	def_squeeze over c!
code over@	( n1 n2 -- n1 n2 (n1)
	top	sp		push
	top	sp 1 cells d)	ldr
	top	top )		ldr c;	def_squeeze over @
	                                def_squeeze over a@
	                                def_squeeze over token@
code overc@	( n1 n2 -- n1 n2 (n1)
	top	sp		push
	top	sp 1 cells d)	ldr
	top	top byte )	ldr c;	def_squeeze over c@

code 2dup+
	top	sp		push
	r0	sp /cell d)	ldr
	top	top	r0	add c;	def_squeeze 2dup +
code 2dup-
	top	sp		push
	r0	sp /cell d)	ldr
	top	r0	top	sub c;	def_squeeze 2dup -
code 2dup*
	top	sp		push
	r0	sp /cell d)	ldr
	top	top	r0	mul c;	def_squeeze 2dup *
                                        def_squeeze 2dup u*

code 2over+
	top	sp	push
	top	sp 2 cells d)	ldr
	r0	sp 3 cells d)	ldr
	top	top	r0	add c;	def_squeeze 2over +
code 2over-
	top	sp	push
	top	sp 2 cells d)	ldr
	r0	sp 3 cells d)	ldr
	top	r0	top	sub c;	def_squeeze 2over -
code 2over*
	top	sp	push
	top	sp 2 cells d)	ldr
	r0	sp 3 cells d)	ldr
	top	top	r0	mul c;	def_squeeze 2over *
                                        def_squeeze 2over u*
code r>+
	r0	rp		pop
	top	top	r0	add c;	def_squeeze r> +
code r>-
	r0	rp		pop
	top	top	r0	sub c;	def_squeeze r> -
code r>*
	r0	rp		pop
	top	top	r0	mul c;	def_squeeze r> *
					def_squeeze r> u*
code r>and
	r0	rp		pop
	top	top	r0	and c;	def_squeeze r> and
code r>or
	r0	rp		pop
	top	top	r0	orr c;	def_squeeze r> or
code r>xor
	r0	rp		pop
	top	top	r0	eor c;	def_squeeze r> xor
code r>!
	r0	rp		pop
	top	r0 )		str
	top	sp		pop c;	def_squeeze r> !
code r>c!
	r0	rp		pop
	top	r0 byte )	str
	top	sp		pop c;	def_squeeze r> c!
code r>@
	top	sp		push
	top	rp		pop
	top	top )		ldr c;	def_squeeze r> @
		                        def_squeeze r> a@
		                        def_squeeze r> token@
code r>c@
	top	sp		push
	top	rp		pop
	top	top byte )	ldr c;	def_squeeze r> c@
code r>drop
	rp	/cell		incr c;	def_squeeze r> drop	
code r>swap
	r0	rp )+		ldr
	r0	sp		push c;	def_squeeze r> swap
code r>over	( n -- n r n )
	r0	rp )+		ldr
	r0 top 2	sp db!	stm c;	def_squeeze r> over
	
code r@+
	r0	rp )		ldr
	top	top	r0	add c;	def_squeeze r@ +
code r@-
	r0	rp )		ldr
	top	top	r0	sub c;	def_squeeze r@ -
code r@*
	r0	rp )		ldr
	top	top	r0	mul c;	def_squeeze r@ *
					def_squeeze r@ u*
code r@and
	r0	rp )		ldr
	top	top	r0	and c;	def_squeeze r@ and
code r@or
	r0	rp )		ldr
	top	top	r0	orr c;	def_squeeze r@ or
code r@xor
	r0	rp )		ldr
	top	top	r0	eor c;	def_squeeze r@ xor
code r@!
	r0	rp )		ldr
	top	r0 )		str
	top	sp		pop c;	def_squeeze r@ !
code r@c!
	r0	rp )		ldr
	top	r0 byte )	str
	top	sp		pop c;	def_squeeze r@ c!
code r@@
	top	sp		push
	top	rp )		ldr
	top	top )		ldr c;	def_squeeze r@ @
		                        def_squeeze r@ a@
		                        def_squeeze r@ token@
code r@c@
	top	sp		push
	top	rp )		ldr
	top	top byte )	ldr c;	def_squeeze r@ c@

code dup@
	top	sp		push
	top	top )		ldr c;	def_squeeze dup @
	                                def_squeeze dup a@
	                                def_squeeze dup token@
code dupc@
	top	sp		push
	top	top byte )	ldr c;	def_squeeze dup c@
code dup>r
	top	rp		push c;	def_squeeze dup >r


code drop(lit)
	top	ip )+		ldr c;	def_squeeze drop (lit)
code dropr>
	top	rp		pop c;	def_squeeze drop r>
	
code (lit)(lit)
	r1	top		mov
	r0 top 2	ip ia!	ldm
	r0 r1 2		sp db!	stm c;	def_squeeze (lit) (lit)	

code @+
	r0	top )		ldr
	top	sp		pop
	top	top	r0	add c;	def_squeeze @ +
code c@+
	r0	top byte )	ldr
	top	sp		pop
	top	top	r0	add c;	def_squeeze c@ +
code @-
	r0	top )		ldr
	top	sp		pop
	top	top	r0	sub c;	def_squeeze @ -
code @and
	r0	top )		ldr
	top	sp		pop
	top	top	r0	and c;	def_squeeze @ and
code @or
	r0	top )		ldr
	top	sp		pop
	top	top	r0	orr c;	def_squeeze @ or
code @>r
	top	top )		ldr
	top	rp		push
	top	sp		pop c;	def_squeeze @ >r
code @swap
	r0	sp )		ldr
	top	top )		ldr
	top	sp )		str
	top	r0		mov c;	def_squeeze @ swap

code (lit)cells
	top	sp		push
	top	ip )+		ldr
	top	top 2 #asl	mov c;	def_squeeze (lit) cells
code (lit)cells+
	r0	ip )+		ldr
	top	top r0 2 #asl	add c;	def_squeeze (lit) cells+	
code i_cells
	top	sp		push
	r0 r1 2 	rp ia	ldm
	r1	r1	r0	add
	top	r1 2 #asl	mov c;	def_squeeze i cells
code i_cells+
	r0 r1 2 	rp ia	ldm
	r1	r1	r0	add
	top	top  r1 2 #asl	add c;	def_squeeze i cells+

only forth also definitions
