xref: /csrg-svn/usr.bin/f77/libF77/traper_.c (revision 47940)
1*47940Sbostic /*-
2*47940Sbostic  * Copyright (c) 1980 The Regents of the University of California.
3*47940Sbostic  * All rights reserved.
4*47940Sbostic  *
5*47940Sbostic  * %sccs.include.proprietary.c%
6*47940Sbostic  */
7*47940Sbostic 
8*47940Sbostic #ifndef lint
9*47940Sbostic static char sccsid[] = "@(#)traper_.c	5.4 (Berkeley) 04/12/91";
10*47940Sbostic #endif /* not lint */
11*47940Sbostic 
124154Sdlw /*
134154Sdlw  * Full of Magic! DON'T CHANGE ANYTHING !!
144154Sdlw  *
154154Sdlw  * To use from f77:
164154Sdlw  *	integer oldmsk, traper
174154Sdlw  *	oldmsk = traper (mask)
1829959Smckusick  * where for vax:
194154Sdlw  *	mask = 1 to trap integer overflow
204154Sdlw  *	mask = 2 to trap floating underflow
214154Sdlw  *	mask = 3 to trap both
224154Sdlw  *	These 2 bits will be set into the PSW.
234154Sdlw  *	The old state will be returned.
2429959Smckusick  *
2529959Smckusick  * where for CCI:
2629959Smckusick  *	mask = 0 to trap neither
2729959Smckusick  *	mask = 1 to trap integer overflow
2829959Smckusick  *	mask = 2 to trap floating underflow
2929959Smckusick  *	mask = 3 to trap both
3029959Smckusick  *	These 2 bits will be set into the PSL.
3129959Smckusick  *	The old state will be returned.
324154Sdlw  */
334154Sdlw 
3429959Smckusick #ifdef vax
traper_(msk)354154Sdlw long traper_(msk)
364154Sdlw long	*msk;
374154Sdlw {
384154Sdlw 	int	old = 0;
394154Sdlw #define IOV_MASK	0140
404154Sdlw 	int	**s = &msk;
414154Sdlw 	int	psw;
424154Sdlw 
434154Sdlw 	s -= 5;
444154Sdlw 	psw = (int)*s;
454154Sdlw 	old = (psw & IOV_MASK) >> 5;
464154Sdlw 	psw = (psw & ~IOV_MASK) | ((*msk << 5) & IOV_MASK);
474154Sdlw 	*s = (int *)psw;
484154Sdlw 	return((long)old);
494154Sdlw }
5029959Smckusick #endif	vax
5129959Smckusick 
5229959Smckusick /*
5329959Smckusick  * Assumptions for CCI:
5429959Smckusick  *	- the two bits are contiguous in PSL;
5529959Smckusick  *	- integer overflow trap enable bit < floating underflow trap enable bit;
5629959Smckusick  */
5729959Smckusick #ifdef tahoe
5829959Smckusick # include <machine/psl.h>
5929959Smckusick 
6029959Smckusick unsigned long old_msk;
6129959Smckusick unsigned short new_msk;
6229959Smckusick unsigned long tst_msk;
6329959Smckusick 
traper_(msk)6429959Smckusick long traper_(msk)
6529959Smckusick long	*msk;
6629959Smckusick {
6729959Smckusick #define IOV_MASK (PSL_IV | PSL_FU)
6829959Smckusick #define IOV_DISP 5
6929959Smckusick 
7029959Smckusick 	asm("	movpsl _old_msk");
7129959Smckusick 
7229959Smckusick 	old_msk = (old_msk & IOV_MASK) >> IOV_DISP;
7329959Smckusick 
7429959Smckusick 	new_msk = (*msk << IOV_DISP) & IOV_MASK;
7529959Smckusick 	asm("	bispsw _new_msk");
7629959Smckusick 
7729959Smckusick 	new_msk = ~(*msk << IOV_DISP) & IOV_MASK;
7829959Smckusick 	asm("	bicpsw _new_msk");
7929959Smckusick 
8029959Smckusick 	return(old_msk);
8129959Smckusick }
8229959Smckusick #endif tahoe
83