12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061 |
- #
- ;
- ; (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: $Id$
- ;
- 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
|