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

📄 fpowid.s

📁 操作系统SunOS 4.1.3版本的源码
💻 S
字号:
	.data|	.asciz	"@(#)Fpowid.s 1.1 92/07/30 SMI"	.even	.text|	Copyright (c) 1987 by Sun Microsystems, Inc.#include "fpcrtdefs.h"#include "PIC.h"RTENTRY(Fpowid)        tstl    a0@        bnes    1f              | Branch if i <> 0.        movel   #0x3ff00000,d0  | Return 1.0 = x**0.        clrl   	d1  		| Return 1.0 = x**0.        jra     3f1:        link	a6,#-8temp	=	-8		| Double temporary.	moveml	d2-d5/a2,sp@-	| Save d2-d5.				| d0/d1 will be the result.				| ARG2PTR@ will be i.				| d2 will be |i|.	movel	a0@,d5		| d5 gets i.        movel	d5,d2	bpls    4f        moveml	d0/d1,sp@-	| Save argument x.	negl    d2              | d2 gets abs(i).        bras    4f dpowerloop:       				| If there are n trailing 0's,                                | this loop computes d0/d1 = x**2**n.	JBSR(Fsqrd,a2)        lsrl    #1,d2		| While U Wait.4:        btst    #0,d2        beqs    dpowerloop                 moveml	d0/d1,a6@(temp)	| temp gets x**2**n.        bras    6f         dmultloop:	JBSR(Fsqrd,a2)        btst    #0,d2        beqs    6f	movel	d0,d3	movel	d1,d4		| d3/d4 saves x**2**n.	lea	a6@(temp),a0	JBSR(Fmuld,a2)		| d0/d1 gets answer so far.	moveml	d0/d1,a6@(temp) | a6@(temp) gets answer so far.	movel	d3,d0	movel	d4,d16:               lsrl    #1,d2        bnes    dmultloop        | Branch if there are more 1 bits.5:               tstl    d5        bpls    2f	movel	#0x3ff00000,d0 	 | d0/d1 gets 1.0.	clrl	d1	lea	a6@(temp),a0	JBSR(Fdivd,a2)	cmpl	#-1,d5	beqs	8f		| Branch if x**-1; can't improve.	movel	d0,d2	andl	#0x7fffffff,d2	orl	d1,d2	bnes	8f		| Branch if x**-i was not infinity.	negl	d5		| d5 gets abs(i).	moveml	sp@,d0/d1	| Restore original argument.	movel	d5,d2	lsrl	#1,d2		| d2 gets -i/2.	movel	d2,sp@-		| Stack |i|/2.	lea	sp@,a0	bsr	Fpowid		| Compute x**|i|/2.	addql	#4,sp		| Bypass |i|/2.	moveml	d0/d1,a6@(temp)	| Temp gets x**-i/2.	lea	a6@(temp),a0	movel	#0x3ff00000,d0 	 | d0/d1 gets 1.0.	clrl	d1	JBSR(Fdivd,a2)		| d0/d1 gets x**i/2.	JBSR(Fsqrd,a2)		| d0/d1 gets x**i-{0 or 1}.	lsll	#1,d2	cmpl	d2,d5	beqs	8f		| Branch if d2 = i/2 exactly.	lea	sp@,a0	JBSR(Fdivd,a2)		| Otherwise divide by x again.8:	addql	#8,sp		| Bypass original argument x.	bras	7f2:       	moveml	a6@(temp),d0/d1	|Final result.7:	moveml	sp@+,d2-d5/a2	unlk	a63:	RET

⌨️ 快捷键说明

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