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

📄 rint.s

📁 操作系统SunOS 4.1.3版本的源码
💻 S
字号:
	.seg	"data"	.asciz	"@(#)rint.S 1.1 92/07/30 SMI"#define LOCORE#include <machine/asm_linkage.h>! Copyright (c) 1988 by Sun Microsystems, Inc.!!double	aint(x)		truncate x to integral.!double	anint(x)	truncate sign(x)*(|x|+0.5) to integal. !double ceil(x)		round x (round-toward- +inf) to integral!double floor(x)	round x (round-toward- -inf) to integral!int	irint(x)	round x to integer according to the prevailing RD.!int	nint(x)		truncate sign(x)*(|x|+0.5) to integer. !double	rint(x)		round x to integral according to the prevailing RD.!All function except nint(x) preserve sign, including signed zero.!Code by K.C. Ng, Nov 5, 1986!Revised on May 10, 1988.	.seg	"data"	.align	8constant:two52	= 0x00	.word	0x43300000,0x0		!  2**52mtwo52	= 0x08	.word	0xc3300000,0x0		!  -2**52half	= 0x10	.word	0x3fe00000,0x0		!  0.5mhalf	= 0x18	.word	0xbfe00000,0x0		!  -0.5zero	= 0x20	.word	0x0,0x0			!  0.0mzero	= 0x28	.word	0x80000000,0x0		!  -0.0one	= 0x30	.word	0x3ff00000,0x0		!  1.0!! variable using fp x	= -0x8tmp	= -0x10! input i0=high x , i1 = low x	.seg	"text"	ENTRY(aint)	save	%sp,-128,%sp	set	constant,%l0	sethi	%hi(0x80000000),%l1	andn	%i0,%l1,%i2	sethi	%hi(0x43300000),%l4	cmp	%i2,%l4	bl,a	1f	ldd	[%l0+two52],%f2    ! return x if x>=2^52	std	%i0,[%fp+x]	ldd	[%fp+x],%f0	ldd	[%l0+zero],%f2	faddd	%f0,%f2,%f0	ba	aint_return	nop1:	st	%i2,[%fp+x]	st	%i1,[%fp+x+4]	ldd	[%fp+x],%f4		! f4 = w = |x|	faddd	%f4,%f2,%f0		! f0 = w+L, L=2^52	fsubd	%f0,%f2,%f0		! f0 = t = (w+L) - L	and	%i0,%l1,%l5		! l5 = sign bit of x	fcmpd	%f0,%f4	nop	nop	fble	2f	nop	ldd	[%l0+one],%f4	fsubd	%f0,%f4,%f0		! subtract one if t > w2:	st	%f0,[%fp+x]	ld	[%fp+x],%l4	andn	%l4,%l1,%l4	or	%l5,%l4,%l4	st	%l4,[%fp+x]	ld	[%fp+x],%f0aint_return:	ret	restore	ENTRY(anint)	save	%sp,-128,%sp	set	constant,%l0	sethi	%hi(0x80000000),%l1	andn	%i0,%l1,%i2	sethi	%hi(0x43300000),%l4	cmp	%i2,%l4	bl,a	1f	ldd	[%l0+two52],%f2    ! return x if x>=2^52	std	%i0,[%fp+x]	ldd	[%fp+x],%f0	ldd	[%l0+zero],%f2	faddd	%f0,%f2,%f0	ba	aint_return	nop1:	st	%i2,[%fp+x]	st	%i1,[%fp+x+4]	ldd	[%fp+x],%f4		! f4 = w = |x|	faddd	%f4,%f2,%f0		! f0 = w+L, L=2^52	fsubd	%f0,%f2,%f0		! f0 = t = (w+L) - L	and	%i0,%l1,%l5		! l5 = sign bit of x	fcmpd	%f0,%f4	nop	nop	fbe	2f	nop	fsubd	%f0,%f4,%f6		! f6 = z = t - w	ldd	[%l0+half],%f8	ldd	[%l0+one],%f4	fcmpd	%f6,%f8			! 	nop	nop	fbg,a	2f	fsubd	%f0,%f4,%f0		! subtract one if z > 0.5	ldd	[%l0+mhalf],%f8	fcmpd	%f6,%f8	nop	nop	fble,a	2f	faddd	%f0,%f4,%f02:	st	%f0,[%fp+x]	ld	[%fp+x],%l4	andn	%l4,%l1,%l4	or	%l5,%l4,%l4	st	%l4,[%fp+x]	ld	[%fp+x],%f0anint_return:	ret	restore	ENTRY(ceil)	save	%sp,-128,%sp	set	constant,%l0	sethi	%hi(0x80000000),%l1	andn	%i0,%l1,%i2	sethi	%hi(0x43300000),%l4	cmp	%i2,%l4	bl,a	1f	tst	%i0    ! return x if x>=2^52	std	%i0,[%fp+x]	ldd	[%fp+x],%f0	ldd	[%l0+zero],%f2	faddd	%f0,%f2,%f0	ba	aint_return	nop1:	bge,a	1f	ldd	[%l0+two52],%f2	ldd	[%l0+mtwo52],%f21:	std	%i0,[%fp+x]	ldd	[%fp+x],%f4		! f4 = w = x	faddd	%f4,%f2,%f0		! f0 = w+L, L=sign(x)*2^52	fsubd	%f0,%f2,%f0		! f0 = t = (w+L) - L	and	%i0,%l1,%l5		! l5 = sign bit of x	fcmpd	%f0,%f4	nop	nop	fbge	2f	nop	ldd	[%l0+one],%f4	faddd	%f0,%f4,%f0		! add one if t < x2:	st	%f0,[%fp+x]	ld	[%fp+x],%l4	andn	%l4,%l1,%l4	or	%l5,%l4,%l4	st	%l4,[%fp+x]	ld	[%fp+x],%f0ceil_return:	ret	restore	ENTRY(floor)	save	%sp,-128,%sp	set	constant,%l0	sethi	%hi(0x80000000),%l1	andn	%i0,%l1,%i2	sethi	%hi(0x43300000),%l4	cmp	%i2,%l4	bl,a	1f	tst	%i0    ! return x if x>=2^52	std	%i0,[%fp+x]	ldd	[%fp+x],%f0	ldd	[%l0+zero],%f2	faddd	%f0,%f2,%f0	ba	aint_return	nop1:	bge,a	1f	ldd	[%l0+two52],%f2	ldd	[%l0+mtwo52],%f21:	std	%i0,[%fp+x]	ldd	[%fp+x],%f4		! f4 = w = x	faddd	%f4,%f2,%f0		! f0 = w+L, L=sign(x)*2^52	fsubd	%f0,%f2,%f0		! f0 = t = (w+L) - L	and	%i0,%l1,%l5		! l5 = sign bit of x	fcmpd	%f0,%f4	nop	nop	fble	2f	nop	ldd	[%l0+one],%f4	fsubd	%f0,%f4,%f0		! subtract one if x < t2:	st	%f0,[%fp+x]	ld	[%fp+x],%l4	andn	%l4,%l1,%l4	or	%l5,%l4,%l4	st	%l4,[%fp+x]	ld	[%fp+x],%f0floor_return:	ret	restore	ENTRY(irint)	save	%sp,-128,%sp	mov	%i0,%o0	call	_rint	mov	%i1,%o1	fdtoi	%f0,%f0	st	%f0,[%fp+tmp]	ld	[%fp+tmp],%i0	ret	restore	ENTRY(nint)	save	%sp,-128,%sp	mov	%i0,%o0	call	_anint	mov	%i1,%o1	fdtoi	%f0,%f0	st	%f0,[%fp+tmp]	ld	[%fp+tmp],%i0	ret	restore	ENTRY(rint)	save	%sp,-128,%sp	set	constant,%l0	std	%i0,[%fp+x]	sethi	%hi(0x80000000),%l4	andn	%i0,%l4,%i2		! i2 = high|x|	ldd	[%fp+x],%f0	sethi	%hi(0x43300000),%l5	cmp	%i2,%l5	bl	1f	tst	%i0	ldd	[%l0+zero],%f2	faddd	%f0,%f2,%f0		! return x+0.0 (raise flag if x is 	ba	rint_return		! sNaN)	nop1:	bge,a	2f	ldd	[%l0+two52],%f2	ldd	[%l0+mtwo52],%f22:	faddd	%f0,%f2,%f0		! x + L rounded	fcmpd	%f0,%f2	nop	nop	fbne	3f	nop    ! return copysign(0.0,x)	tst	%i0	bge,a	rint_return	ldd	[%l0+zero],%f0	ba	rint_return	ldd	[%l0+mzero],%f03:    ! simply return (x+L)rounded - L	fsubd	%f0,%f2,%f0rint_return:	ret	restore

⌨️ 快捷键说明

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