#include <m2_traps.h>
;
; (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands.
; See the copyright notice in the ACK home directory, in the file "Copyright".
;
;
; Module:	CARDINAL operations with overflow checking
; Author:	Ceriel J.H. Jacobs
; Version:	$Header$
;

 mes 2,EM_WSIZE,EM_PSIZE

 exp $addu
 exp $subu
 exp $mulu
#if EM_WSIZE < EM_LSIZE
 exp $addul
 exp $subul
 exp $mulul
#endif

 pro $addu,0
 loc -1
 lol 0
 sbu EM_WSIZE
 lol EM_WSIZE
 cmu EM_WSIZE
 zge *1
 loc M2_UOVFL
 trp
1
 lol 0
 lol EM_WSIZE
 adu EM_WSIZE
 stl EM_WSIZE
 ret 0
 end 0

#if EM_WSIZE < EM_LSIZE
 pro $addul,0
 ldc -1
 ldl 0
 sbu EM_LSIZE
 ldl EM_LSIZE
 cmu EM_LSIZE
 zge *1
 loc M2_UOVFL
 trp
1
 ldl 0
 ldl EM_LSIZE
 adu EM_LSIZE
 sdl EM_LSIZE
 ret 0
 end 0
#endif

 pro $mulu,0
 lol 0
 zeq *1
 loc -1
 lol 0
 dvu EM_WSIZE
 lol EM_WSIZE
 cmu EM_WSIZE
 zge *1
 loc M2_UOVFL
 trp
1
 lol 0
 lol EM_WSIZE
 mlu EM_WSIZE
 stl EM_WSIZE
 ret 0
 end 0

#if EM_WSIZE < EM_LSIZE
 pro $mulul,0
 ldl 0
 ldc 0
 cmu EM_LSIZE
 zeq *1
 ldc -1
 ldl 0
 dvu EM_LSIZE
 ldl EM_LSIZE
 cmu EM_LSIZE
 zge *1
 loc M2_UOVFL
 trp
1
 ldl 0
 ldl EM_LSIZE
 mlu EM_LSIZE
 sdl EM_LSIZE
 ret 0
 end 0
#endif

 pro $subu,0
 lol EM_WSIZE
 lol 0
 cmu EM_WSIZE
 zge *1
 loc M2_UOVFL
 trp
1
 lol EM_WSIZE
 lol 0
 sbu EM_WSIZE
 stl EM_WSIZE
 ret 0
 end 0

#if EM_WSIZE < EM_LSIZE
 pro $subul,0
 ldl EM_LSIZE
 ldl 0
 cmu EM_LSIZE
 zge *1
 loc M2_UOVFL
 trp
1
 ldl EM_LSIZE
 ldl 0
 sbu EM_LSIZE
 sdl EM_LSIZE
 ret 0
 end 0
#endif
