⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 _swapflags.s

📁 操作系统SunOS 4.1.3版本的源码
💻 S
字号:
	.data	.asciz	"@(#)_swapFLAGS.S 1.1 92/07/30 SMI"	.even	.text|	Copyright (c) 1987 by Sun Microsystems, Inc.#include "DEFS.h"#include "Wdefs.h"/*  * _swapRD(rd) 	exchanges rd with the current rounding direction. * _swapRP(rp) 	exchanges rp with the current rounding precision. * _swapTE(ex)  exchanges ex with the current exception trap enable bits. * _swapEX(ex) 	exchanges ex with the current accrued exception.  *		Here ex is a five bit value where each bit (cf. enum  *		fp_exception_type in <sys/ieeefloatingpoint.h>) corresponds  *		to either an exception-occurred accrued status flag or an *		exception trap enable flag (0 off,1 on): * 			bit 0 :  inexact flag * 			bit 1 :  division by zero flag * 			bit 2 :  underflow flag * 			bit 3 :  overflow flag * 			bit 4 :  invalid flag */|#include <floatingpoint.h>|extern unsigned fpsr, fpcr;|enum fp_direction_type _swapRD(rd)|enum fp_direction_type rd;|{|	/* ||	   swap rd with the current rounding direction|	 */|#define MASK 3|#define SHIFT 4|register unsigned t ;|	fp_direction = rd ;|	t = fpcr ;|	fpcr = (t &~ (MASK << SHIFT)) | (((unsigned) rd) << SHIFT) ;|	return (enum fp_direction_type) ((t >> SHIFT) & MASK) ;|}||enum fp_precision_type _swapRP(rp)|enum fp_precision_type rp;|{|	/* |	   swap rp with the current rounding precision|	 */|#define MASK 3|#define SHIFT 6|register unsigned t ;|	fp_precision = rp ;|	t = fpcr ;|	fpcr = (t &~ (MASK << SHIFT)) | (((unsigned) rp) << SHIFT) ;|	return (enum fp_precision_type) ((t >> SHIFT) & MASK) ;|}||fp_exception_field_type _swapEX(ex)|fp_exception_field_type ex;|{|	/* |	   swap ex with the current accrued exception mode|	 */|#define MASK 0x1f|#define SHIFT 3|register unsigned t ;|	fp_accrued_exceptions = ex ;|	t = fpsr ;|	fpsr = (t &~ (MASK << SHIFT)) | (((unsigned) ex) << SHIFT) ;|	return (fp_exception_field_type) ((t >> SHIFT) & MASK) ;|}||fp_exception_field_type _swapTE(ex)|fp_exception_field_type ex;|{|	/* |	   swap ex with the current exception trap enable bits|	 */|#define MASK 0x1f|#define SHIFT 9|register unsigned s, t ;|	s = ((unsigned) ex) << SHIFT;|	if (s & (1 << SHIFT)) s |= (1 << (SHIFT-1)) ; |					/* if INEX2 then INEX1 */|	if (s & (0x10 << SHIFT)) s |= 0x60 << SHIFT ; |					/* if OPERR then BSUN & SNAN. */|	t = fpcr ;|	fpcr = (t &~ (MASK << SHIFT)) | s ;|	return (fp_exception_field_type) ((t >> SHIFT) & MASK) ;|}|	.textRTENTRY(__swapRD)	movl	PARAM,d1		| d1 gets unshifted new RD.	movel	d1,_fp_direction	| _fp_direction gets unshifted new RD.	lsll	#4,d1			| d1 gets new RD<<4.	fmovel	fpcr,d0			| d0 gets 68881 mode.	andl	#-49,d0			| Clear RD bits.	orl	d1,d0			| d0 gets new RD<<4.	fmovel	d0,fpcr			| Store new fpcr.	lsrl	#2,d1			| d1 gets new RD<<2.	btst	#3,d1			| May need to allow for difference					| between Motorola and Weitek.	jeq	1f			| Branch if rn or rz.	bchg	#2,d1			| Interchange rp and rm.1:	movl	d2,a0	fpmove	fpamode,d2	movl	d2,d0	andl	#3,d0			| Preserve fpamode bits 0 & 1.	orl	d1,d0	fpmove	d0,fpamode	movl	d2,d0	lsrl	#2,d0	moveq	#3,d2	andl	d2,d0	movl	a0,d2	RETRTENTRY(__swapRP)	movel	#-1,d0			| Rounding precision not supported.	RETRTENTRY(__swapEX)	movl	PARAM,d1	movel	d1,_fp_accrued_exceptions	movl	d2,a0	fmovel	fpsr,d2	movl	d2,d0	andl	#-249,d0	lsll	#3,d1	orl	d1,d0	fmovel	d0,fpsr        btst    #3,d0        bnes    1f                      | Branch if accrued inexact on.        movel   #1,FPABASEADDRESS+0xf14 | Enable FPA inexact mask.1:	movl	d2,d0	lsrl	#3,d0	moveq	#31,d2	andl	d2,d0	movl	a0,d2	RETRTENTRY(__swapTE)        movl    PARAM,d1        movel	d6,a0	movel	d7,a1        moveq   #9,d7        lsll    d7,d1        btst    d7,d1        jeq     1f        orw     #256,d11:        btst    #13,d1        jeq     1f        orw     #49152,d11:        fmovel  fpcr,d6        movl    d6,d0        andl    #-15873,d0        orl     d1,d0        fmovel  d0,fpcr        btst    #9,d0        beqs    1f                      | Branch if inexact disabled.        movel   #1,FPABASEADDRESS+0xf14 | Enable FPA inexact mask.1:        movl    d6,d0        lsrl    d7,d0        moveq   #31,d1        andl    d1,d0        movel	a0,d6	movel	a1,d7	RET

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -