diff options
| -rw-r--r-- | src/math/i386/scalbn.s | 19 | ||||
| -rw-r--r-- | src/math/i386/scalbnf.s | 18 | ||||
| -rw-r--r-- | src/math/i386/scalbnl.s | 16 | 
3 files changed, 46 insertions, 7 deletions
diff --git a/src/math/i386/scalbn.s b/src/math/i386/scalbn.s index e275d14f..8bf302f2 100644 --- a/src/math/i386/scalbn.s +++ b/src/math/i386/scalbn.s @@ -11,10 +11,23 @@ scalbln:  .global scalbn  .type scalbn,@function  scalbn: -	fildl 12(%esp) +	mov 12(%esp),%eax +	add $0x3ffe,%eax +	cmp $0x7ffd,%eax +	jb 1f +	sub $0x3ffe,%eax +	sar $31,%eax +	xor $0xfff,%eax +	add $0x3ffe,%eax +1:	inc %eax  	fldl 4(%esp) -	fscale -	fstp %st(1) +	mov %eax,12(%esp) +	mov $0x80000000,%eax +	mov %eax,8(%esp) +	xor %eax,%eax +	mov %eax,4(%esp) +	fldt 4(%esp) +	fmulp  	fstpl 4(%esp)  	fldl 4(%esp)  	ret diff --git a/src/math/i386/scalbnf.s b/src/math/i386/scalbnf.s index 40232b6a..9cb9ef5f 100644 --- a/src/math/i386/scalbnf.s +++ b/src/math/i386/scalbnf.s @@ -11,10 +11,22 @@ scalblnf:  .global scalbnf  .type scalbnf,@function  scalbnf: -	fildl 8(%esp) +	mov 8(%esp),%eax +	add $0x3fe,%eax +	cmp $0x7fd,%eax +	jb 1f +	sub $0x3fe,%eax +	sar $31,%eax +	xor $0x1ff,%eax +	add $0x3fe,%eax +1:	inc %eax +	shl $20,%eax  	flds 4(%esp) -	fscale -	fstp %st(1) +	mov %eax,8(%esp) +	xor %eax,%eax +	mov %eax,4(%esp) +	fldl 4(%esp) +	fmulp  	fstps 4(%esp)  	flds 4(%esp)  	ret diff --git a/src/math/i386/scalbnl.s b/src/math/i386/scalbnl.s index 224b1bef..54414c2e 100644 --- a/src/math/i386/scalbnl.s +++ b/src/math/i386/scalbnl.s @@ -11,7 +11,21 @@ scalblnl:  .global scalbnl  .type scalbnl,@function  scalbnl: -	fildl 16(%esp) +	mov 16(%esp),%eax +	add $0x3ffe,%eax +	cmp $0x7ffd,%eax +	jae 1f +	inc %eax +	fldt 4(%esp) +	mov %eax,12(%esp) +	mov $0x80000000,%eax +	mov %eax,8(%esp) +	xor %eax,%eax +	mov %eax,4(%esp) +	fldt 4(%esp) +	fmulp +	ret +1:	fildl 16(%esp)  	fldt 4(%esp)  	fscale  	fstp %st(1)  | 
