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

📄 fpowis.s

📁 操作系统SunOS 4.1.3版本的源码
💻 S
字号:
	.data|	.asciz	"@(#)Fpowis.s 1.1 92/07/30 SMI"	.even	.text|	Copyright (c) 1987 by Sun Microsystems, Inc.#include "fpcrtdefs.h"#include "PIC.h"RTENTRY(Fpowis)        tstl   	d1        bnes    1f              | Branch if i <> 0.        movel   #0x3f800000,d0  | Return 1.0 = x**0.        jra     3f1:	moveml	d2-d5/a2,sp@-	| Save d2-d5.				| d0 will be the result.				| d2 will be |i|.	movel	d1,d5		| d5 gets i.        movel	d5,d2	bpls    4f        movel	d0,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(Fsqrs,a2)        lsrl    #1,d2		| While U Wait.4:        btst    #0,d2        beqs    dpowerloop                 movel	d0,d4		| d4 gets x**2**n.        bras    6f         dmultloop:	JBSR(Fsqrs,a2)        btst    #0,d2        beqs    6f	movel	d0,d3 		| d3 saves x**2**n.	movel	d4,d1	JBSR(Fmuls,a2)		| d0/d1 gets answer so far.	movel	d0,d4 		| d4 gets answer so far.	movel	d3,d0		| d0 gets x**2**n.6:               lsrl    #1,d2        bnes    dmultloop       | Branch if there are more 1 bits.5:               tstl    d5        bpls    2f		| Branch if non-negative power.	movel	#0x3f800000,d0 	| d0/d1 gets 1.0.	movel	d4,d1	JBSR(Fdivs,a2)		| d0 gets 1.0/f.        cmpl 	#-1,d5        beqs    8f              | Branch if x**-1; can't improve.	movel	d0,d2	andl	#0x7fffffff,d2	bnes	8f		| Branch if x**-i was not infinity.        negl    d5              | d5 gets abs(i).        movel   sp@,d0          | Restore original argument.        movel   d5,d2        lsrl    #1,d2           | d2 gets -i/2.        movel   d2,d1         	| d1 gets |i|/2.        bsr     Fpowis          | Compute x**|i|/2.        movel   d0,d1 		| d1 gets x**-i/2.        movel   #0x3f800000,d0  | d0 gets 1.0.        JBSR(Fdivs,a2)           | d0 gets x**i/2.        JBSR(Fsqrs,a2)           | d0 gets x**i-{0 or 1}.        lsll    #1,d2        cmpl    d2,d5        beqs    8f              | Branch if d2 = i/2 exactly.        movel   sp@,d1        JBSR(Fdivs,a2)	 	| Otherwise,a0 divide by x again.8:        addql   #4,sp           | Bypass original argument x.        bras    7f2:       	movel	d4,d0		|Final result.7:	moveml	sp@+,d2-d5/a23:	RET

⌨️ 快捷键说明

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