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

📄 fsqrts.s

📁 操作系统SunOS 4.1.3版本的源码
💻 S
字号:
        .data |        .asciz  "@(#)Fsqrts.s 1.1 92/07/30 SMI"        .even        .text|	Copyright (c) 1987 by Sun Microsystems, Inc.#include "fpcrtdefs.h"#include "PIC.h"RTENTRY(Fsqrts)	moveml	d2-d5/a2,sp@-	movl	d0,d1	movl	d1,d5				| save 	JBSR(f_tst,a2)					| test the argument	addw	d0,d0			 	| switch on the type field 	movw	pc@(6,d0:w),d1	jmp	pc@(2,d1:w)Ltable:	.word	Lerr-Ltable			| unknown type	.word	Lzero-Ltable			| zero	.word	Lgu-Ltable			| gradual undeflow	.word	Lplain-Ltable			| ordinary number	.word	Linf-Ltable			| infinity	.word	Lnan-Ltable			| NanLgu:	movl	d5,d1		| d1 gets argument x.	roxll	#1,d1		| X gets sign bit.	jcs 	Lerrarg		| Error if negative.	clrw	d4		| Exponent for max subnormal.	bclr	#0,d1		| Remove sign bit - X junk.	roll	#8,d1		| Move exponent to ls byte.	bmis	main		| Branch if normalized now.1$:	subqw	#1,d4		| Decrement exponent.	lsll	#1,d1		| Normalize.	bpls	1$		| Branch if still not normalized.	bras	mainLplain:	movl	d5,d1		| d1 gets argument x.	roll	#1,d1		| X gets sign bit; bit 0 gets junk.	bcss	Lerrarg		| Branch if negative argument.	bclr	#0,d1		| Clear bit 0.	roll	#8,d1		| Move exponent to least sig byte.	clrw	d4	movb	d1,d4		| d4 gets (biased) exponent.	movb	#1,d1		| Clear exponent and set i bit.	rorl	#1,d1		| Position leading bit.main:				| d1 has normalized significand;				| d4 has biased exponent.				| Since bias is odd, odd biased exponent =				| even true exponent.	btst	#0,d4			bnes	3$		| Branch if odd biased exponent.	subqw	#1,d4		| Decrement exponent if even.	bras	4$3$:	lsrl	#1,d1		| Extra alignment for odd exponent.4$:			| In the loop below, 			| d0 contains the result z			| d1 contains the remainder r			| d2 contains the traveling bit b			| d3 contains the loop count			| For historical reasons, the interpretation of the			| bits of d0 and d1 is:			| bit 31 is called the S bit			| bit 30 is called the 0 bit			| bit 30-i is called the i bit.			| In the loop below, counting the first iteration as			| 1 and the last n, the traveling bit is bit i at			| the beginning of each loop step and bit i+1 at the			| end.			| This loop performs a non-restoring square root.	clrl	d0		| Result z gets 0 to start.	movl	#0x20000000,d2	| Traveling bit starts as bit 1.	movw	#24,d3		| 25 steps through loop.	lsrl	#1,d1		| Position remainder so S bit is clear.	subl	d2,d1		| Initial subtract of 0.25.toploop:	bpls	plloop		| Branch if remainder was positive.miloop:	asll	#1,d1		| Double remainder for next step.	addl	d2,d1	lsrl	#1,d2		| Travel bit.	addl	d2,d1	addl	d0,d1		| r := r + z + 3.	bras	botloopplloop:	asll	#1,d1		| Double remainder for next step.	addl	d2,d0	addl	d2,d0		| Turn on bit i-1 in result.		lsrl	#1,d2		| Travel bit.	subl	d2,d1	subl	d0,d1		| r := r - z - 1.botloop:	dbf	d3,toploop	| Branch if less than 25 steps.	addl	#0x40,d0	| Add round bit.				| On sqrt, no danger of ambiguous case or				| of rounding carry overflow.	lsll	#2,d0		| Clear S, and I bits.	asrw	#1,d4		| Cut exponent in half.	addw	#64,d4		| Cut bias in half.	movb	d4,d0		| Insert exponent..	rorl	#8,d0		| Reposition exponent.	lsrl	#1,d0		| Reposition positive sign.	Ldone:	moveml sp@+,d2-d5/a2	RETLzero:					| sqrt(+-0) = +-0.Lnan:					| sqrt(nan) = nan.	movl	d5,d0	bras	LdoneLinf:	movl	d5,d0	bpls	Ldone			| sqrt(+inf) = +inf.Lerr:Lerrarg:	JBSR(f_snan,a2)	bras	Ldone

⌨️ 快捷键说明

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