#
;
; (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands.
; See the copyright notice in the ACK home directory, in the file "Copyright".
;
;
; Module:	Compute non-constant set displays
; Author:	Ceriel J.H. Jacobs
; Version:	$Header$
;
 mes 2,EM_WSIZE,EM_PSIZE

 ; LtoUset is called for set displays containing { expr1 .. expr2 }.
 ; It has six parameters, of which the caller must pop five:
 ; - The set in which bits must be set.
 ; - the lower bound of the set type.
 ; - The set size in bytes.
 ; - The upper bound of set elements, specified by the set-type.
 ; - "expr2", the upper bound
 ; - "expr1", the lower bound

#define SETBASE	5*EM_WSIZE
#define SETLOW	4*EM_WSIZE
#define SETSIZE 3*EM_WSIZE
#define USETSIZ 2*EM_WSIZE
#define LWB	EM_WSIZE
#define UPB	0
 exp $LtoUset
 pro $LtoUset,0
 lal SETBASE	; address of initial set
 lol SETSIZE
 los EM_WSIZE	; load initial set
 lol LWB	; low bound
 lol SETLOW
 sbu EM_WSIZE
 stl LWB
 lol UPB	; high bound
 lol SETLOW
 sbu EM_WSIZE
 stl UPB
1
 lol LWB
 lol UPB
 cmu EM_WSIZE
 zgt *2		; while low <= high
 lol LWB
 lol SETSIZE
 set ?		; create [low]
 lol SETSIZE
 ior ?		; merge with initial set
 lol LWB
 loc 1
 adu EM_WSIZE
 stl LWB
 bra *1		; loop back
2
 lal SETBASE
 lol SETSIZE
 sts EM_WSIZE	; store result over initial set
 ret 0
 end 0