#
; $Header: /cvsup/minix/src/lib/ack/libp/gto.e,v 1.1 2005/10/10 15:27:46 beng Exp $
;  (c) copyright 1983 by the Vrije Universiteit, Amsterdam, The Netherlands.
; 
;           This product is part of the Amsterdam Compiler Kit.
; 
;  Permission to use, sell, duplicate or disclose this software must be
;  obtained in writing. Requests for such permissions may be sent to
; 
;       Dr. Andrew S. Tanenbaum
;       Wiskundig Seminarium
;       Vrije Universiteit
;       Postbox 7161
;       1007 MC Amsterdam
;       The Netherlands
; 

/* Author: J.W. Stevenson */


 mes 2,_EM_WSIZE,_EM_PSIZE

#define TARLB   0
#define DESCR   _EM_PSIZE

#define NEWPC   0
#define SAVSP   _EM_PSIZE

#define D_PC    0
#define D_SP    _EM_PSIZE
#define D_LB    _EM_PSIZE+_EM_PSIZE

#define LOCLB   0-_EM_PSIZE

; _gto is called with two arguments:
;       - pointer to the label descriptor (DESCR)
;       - local base (LB) of target procedure (TARLB)
; the label descriptor contains two items:
;       - label address i.e. new PC (NEWPC)
;       - offset in target procedure frame (SAVSP)
; using this offset and the LB of the target procedure, the address of
; of local variable of the target procedure is constructed.
; the target procedure must have stored the correct target SP there.

descr
 bss 3*_EM_PSIZE,0,0

 exp $_gto
 pro $_gto,_EM_PSIZE
 lal DESCR
 loi _EM_PSIZE
 adp NEWPC
 loi _EM_PSIZE
 lae descr+D_PC
 sti _EM_PSIZE
 lal TARLB
 loi _EM_PSIZE
 zer _EM_PSIZE
 cmp
 zeq *1
 lal TARLB
 loi _EM_PSIZE
 bra *2
1
 lae _m_lb
 loi _EM_PSIZE
2
 lal LOCLB
 sti _EM_PSIZE
 lal LOCLB
 loi _EM_PSIZE
 lal DESCR
 loi _EM_PSIZE
 adp SAVSP
 loi _EM_WSIZE           ; or _EM_PSIZE ?
 ads _EM_WSIZE           ; or _EM_PSIZE ?
 loi _EM_PSIZE
 lae descr+D_SP
 sti _EM_PSIZE
 lal LOCLB
 loi _EM_PSIZE
 lae descr+D_LB
 sti _EM_PSIZE
 gto descr
 end ?
