80386 alternative math library part04/04
Glenn Geers
glenn at extro.ucc.su.OZ.AU
Sat Dec 8 09:03:28 AEST 1990
Submitted-by: glenn at trantor
Archive-name: libfpu/part04
#!/bin/sh
# This is part 04 of libfpu
# ============= pow.s ==============
if test -f 'pow.s' -a X"$1" != X"-c"; then
echo 'x - skipping pow.s (File already exists)'
else
echo 'x - extracting pow.s (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'pow.s' &&
/*
** This file is part of the alternative 80386 math library and is
** covered by the GNU General Public license with my modification
** as noted in the README file that accompanied this file.
**
** This file started life as a C implemenation of pow, it then evolved
** into an embeded asm version (with some C) and finally, all assembler.
** It's actually hacked assembler produced by gcc.
**
** Copyright 1990 G. Geers
**
*/
X
.text
.LC0:
X .ascii "pow: DOMAIN error\12\0"
X .align 4
.LC1:
X .double 0d0.00000000000000000000e+00
X .align 4
.LC2:
X .double 0d1.00000000000000000000e+00
X .align 4
.globl pow
pow:
X pushl %ebp
X movl %esp,%ebp
X subl $28,%esp
X pushl %edi
X pushl %esi
X pushl %ebx
X movl 16(%ebp),%esi
X movl 20(%ebp),%edi
X movl $0,-4(%ebp)
X movl $1,%ebx
X fldl 8(%ebp)
X ftst
X fstp %st(0)
X fnstsw %ax
X sahf
X jae .L2
X movl %ebx,-4(%ebp)
X pushl %edi
X pushl %esi
/**/
X fldl 16(%ebp)
X
X fstcw -8(%ebp)
X fstcw -12(%ebp)
X orw $0x0400, -12(%ebp)
X fldcw -12(%ebp)
X
X frndint
X fldcw -8(%ebp)
/**/
X fstpl -16(%ebp)
X pushl %edi
X pushl %esi
X fldl (%esp)
X addl $8,%esp
X fsubl -16(%ebp)
X fstpl -16(%ebp)
X addl $8,%esp
X fldl -16(%ebp)
X ftst
X fstp %st(0)
X fnstsw %ax
X sahf
X je .L3
X movl $33,errno
X pushl $.LC0
X pushl $_iob+32
X call fprintf
X fldl .LC1
X jmp .L1
X .align 4
.L3:
X pushl %edi
X pushl %esi
/**/
X fldl 16(%ebp)
X fistpl -8(%ebp)
X movl -8(%ebp),%eax
/**/
X testl %eax,%eax
X jge .L5
X incl %eax
.L5:
X andl $-2,%eax
X movl -8(%ebp),%ecx
X subl %eax,%ecx
X movl %ecx,%eax
X testl %eax,%eax
X je .L2
X xorl %ebx,%ebx
.L2:
X fldl 8(%ebp)
X ftst
X fstp %st(0)
X fnstsw %ax
X sahf
X jne .L6
X pushl %edi
X pushl %esi
X fldl (%esp)
X addl $8,%esp
X ftst
X fstp %st(0)
X fnstsw %ax
X sahf
X je .L6
X fldl .LC1
X jmp .L1
X .align 4
.L6:
X pushl %edi
X pushl %esi
X fldl (%esp)
X addl $8,%esp
X ftst
X fstp %st(0)
X fnstsw %ax
X sahf
X jne .L8
X fldl .LC2
X jmp .L1
X .align 4
.L8:
/APP
X fldl 16(%ebp)
X fldl 8(%ebp)
/NO_APP
X cmpl $0,-4(%ebp)
X je .L10
/APP
X fchs
/NO_APP
.L10:
/APP
X fyl2x
X fstl %st(1)
X frndint
X fstl %st(2)
X fsubrp
X f2xm1
X fld1
X faddp
X fscale
/NO_APP
X testl %ebx,%ebx
X jne .L1
/APP
X fchs
/NO_APP
.L1:
X leal -28(%ebp),%esp
X popl %ebx
X popl %esi
X popl %edi
X leave
X ret
SHAR_EOF
chmod 0644 pow.s ||
echo 'restore of pow.s failed'
Wc_c="`wc -c < 'pow.s'`"
test 2128 -eq "$Wc_c" ||
echo 'pow.s: original size 2128, current size' "$Wc_c"
fi
# ============= rint.s ==============
if test -f 'rint.s' -a X"$1" != X"-c"; then
echo 'x - skipping rint.s (File already exists)'
else
echo 'x - extracting rint.s (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'rint.s' &&
/*
** This file is part of the alternative 80386 math library and is
** covered by the GNU General Public license with my modification
** as noted in the README file that accompanied this file.
**
** Copyright 1990 G. Geers
**
*/
X
X .align 4
X .globl rint
rint:
X pushl %ebp
X movl %esp,%ebp
X
X fldl 8(%ebp)
X frndint
X
X leave
X ret
SHAR_EOF
chmod 0644 rint.s ||
echo 'restore of rint.s failed'
Wc_c="`wc -c < 'rint.s'`"
test 326 -eq "$Wc_c" ||
echo 'rint.s: original size 326, current size' "$Wc_c"
fi
# ============= scalb.s ==============
if test -f 'scalb.s' -a X"$1" != X"-c"; then
echo 'x - skipping scalb.s (File already exists)'
else
echo 'x - extracting scalb.s (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'scalb.s' &&
/*
** This file is part of the alternative 80386 math library and is
** covered by the GNU General Public license with my modification
** as noted in the README file that accompanied this file.
**
** Copyright 1990 G. Geers
**
*/
X
X .align 4
X .globl scalb
scalb:
X pushl %ebp
X movl %esp,%ebp
X
X fildl 16(%ebp)
X fldl 8(%ebp)
X fscale
X
X leave
X ret
SHAR_EOF
chmod 0644 scalb.s ||
echo 'restore of scalb.s failed'
Wc_c="`wc -c < 'scalb.s'`"
test 343 -eq "$Wc_c" ||
echo 'scalb.s: original size 343, current size' "$Wc_c"
fi
# ============= setcont.s ==============
if test -f 'setcont.s' -a X"$1" != X"-c"; then
echo 'x - skipping setcont.s (File already exists)'
else
echo 'x - extracting setcont.s (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'setcont.s' &&
/*
** This file is part of the alternative 80386 math library and is
** covered by the GNU General Public license with my modification
** as noted in the README file that accompanied this file.
**
** Copyright 1990 G. Geers
**
*/
X
X .align 4
X .globl setcont
X
setcont:
X pushl %ebp
X movl %esp, %ebp
X subl $4, %esp
X
X fnstcw -8(%ebp)
X movw -8(%ebp), %ax
X fldcw 8(%ebp)
X
X leave
X ret
SHAR_EOF
chmod 0644 setcont.s ||
echo 'restore of setcont.s failed'
Wc_c="`wc -c < 'setcont.s'`"
test 377 -eq "$Wc_c" ||
echo 'setcont.s: original size 377, current size' "$Wc_c"
fi
# ============= setinternal.s ==============
if test -f 'setinternal.s' -a X"$1" != X"-c"; then
echo 'x - skipping setinternal.s (File already exists)'
else
echo 'x - extracting setinternal.s (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'setinternal.s' &&
/*
** This file is part of the alternative 80386 math library and is
** covered by the GNU General Public license with my modification
** as noted in the README file that accompanied this file.
**
** Copyright 1990 G. Geers
**
*/
X
X .align 4
X .globl setinternal
X
setinternal:
X pushl %ebp
X movl %esp, %ebp
X subl $4, %esp
X
X fnstcw -8(%ebp)
X movw -8(%ebp), %ax
X orw $0x007e, -8(%ebp) /* All exceptions except IOP masked */
X fldcw -8(%ebp)
X
X leave
X ret
SHAR_EOF
chmod 0644 setinternal.s ||
echo 'restore of setinternal.s failed'
Wc_c="`wc -c < 'setinternal.s'`"
test 449 -eq "$Wc_c" ||
echo 'setinternal.s: original size 449, current size' "$Wc_c"
fi
# ============= sin.s ==============
if test -f 'sin.s' -a X"$1" != X"-c"; then
echo 'x - skipping sin.s (File already exists)'
else
echo 'x - extracting sin.s (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'sin.s' &&
/*
** This file is part of the alternative 80386 math library and is
** covered by the GNU General Public license with my modification
** as noted in the README file that accompanied this file.
**
** Copyright 1990 G. Geers
**
*/
X
X .align 4
X .globl sin
sin:
X pushl %ebp
X movl %esp,%ebp
X
X fldl 8(%ebp)
X fsin
X
X leave
X ret
SHAR_EOF
chmod 0644 sin.s ||
echo 'restore of sin.s failed'
Wc_c="`wc -c < 'sin.s'`"
test 320 -eq "$Wc_c" ||
echo 'sin.s: original size 320, current size' "$Wc_c"
fi
# ============= sinh.s ==============
if test -f 'sinh.s' -a X"$1" != X"-c"; then
echo 'x - skipping sinh.s (File already exists)'
else
echo 'x - extracting sinh.s (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'sinh.s' &&
/*
** This file is part of the alternative 80386 math library and is
** covered by the GNU General Public license with my modification
** as noted in the README file that accompanied this file.
**
** Copyright 1990 G. Geers
**
*/
X
X .align 4
.LC2:
X .double 0.500
X
X .align 4
X .globl sinh
sinh:
X pushl %ebp
X movl %esp,%ebp
X
X fldl 8(%ebp)
X fldl2e
X fmulp
X fstl %st(1)
X frndint
X fstl %st(2)
X fsubrp
X f2xm1
X fld1
X faddp
X fscale
X fst %st(1)
X
X fld1
X fdivp
X fsubrp
X
X fldl .LC2
X fmulp
X
X leave
X ret
SHAR_EOF
chmod 0644 sinh.s ||
echo 'restore of sinh.s failed'
Wc_c="`wc -c < 'sinh.s'`"
test 487 -eq "$Wc_c" ||
echo 'sinh.s: original size 487, current size' "$Wc_c"
fi
# ============= sqrt.s ==============
if test -f 'sqrt.s' -a X"$1" != X"-c"; then
echo 'x - skipping sqrt.s (File already exists)'
else
echo 'x - extracting sqrt.s (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'sqrt.s' &&
/*
** This file is part of the alternative 80386 math library and is
** covered by the GNU General Public license with my modification
** as noted in the README file that accompanied this file.
**
** Copyright 1990 G. Geers
**
** sqrt in the prevailing precision
*/
X
X .align 4
X .globl sqrt
sqrt:
X pushl %ebp
X movl %esp,%ebp
X
X fldl 8(%ebp)
X fsqrt
X
X leave
X ret
SHAR_EOF
chmod 0644 sqrt.s ||
echo 'restore of sqrt.s failed'
Wc_c="`wc -c < 'sqrt.s'`"
test 359 -eq "$Wc_c" ||
echo 'sqrt.s: original size 359, current size' "$Wc_c"
fi
# ============= sqrtp.s ==============
if test -f 'sqrtp.s' -a X"$1" != X"-c"; then
echo 'x - skipping sqrtp.s (File already exists)'
else
echo 'x - extracting sqrtp.s (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'sqrtp.s' &&
/*
** This file is part of the alternative 80386 math library and is
** covered by the GNU General Public license with my modification
** as noted in the README file that accompanied this file.
**
** Copyright 1990 G. Geers
**
** sqrt in 64 bit precision always
*/
X
X .align 4
X .globl sqrtp
sqrtp:
X pushl %ebp
X movl %esp,%ebp
X subl $8, %esp
X
X fnstcw -12(%ebp) /* store current control word */
X fnstcw -16(%ebp) /* store again */
X andw $0xf2ff, -12(%ebp) /* enable 64 bit precision */
X fldcw -12(%ebp)
X
X fldl 8(%ebp)
X fsqrt
X
X fldcw -16(%ebp) /* restore original control word */
X
X leave
X ret
SHAR_EOF
chmod 0644 sqrtp.s ||
echo 'restore of sqrtp.s failed'
Wc_c="`wc -c < 'sqrtp.s'`"
test 605 -eq "$Wc_c" ||
echo 'sqrtp.s: original size 605, current size' "$Wc_c"
fi
# ============= tan.s ==============
if test -f 'tan.s' -a X"$1" != X"-c"; then
echo 'x - skipping tan.s (File already exists)'
else
echo 'x - extracting tan.s (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'tan.s' &&
/*
** This file is part of the alternative 80386 math library and is
** covered by the GNU General Public license with my modification
** as noted in the README file that accompanied this file.
**
** Copyright 1990 G. Geers
**
*/
X
X .align 4
X .globl tan
tan:
X pushl %ebp
X movl %esp,%ebp
X
X fldl 8(%ebp)
X fptan
X fstp %st(0)
X
X leave
X ret
SHAR_EOF
chmod 0644 tan.s ||
echo 'restore of tan.s failed'
Wc_c="`wc -c < 'tan.s'`"
test 334 -eq "$Wc_c" ||
echo 'tan.s: original size 334, current size' "$Wc_c"
fi
# ============= tanh.s ==============
if test -f 'tanh.s' -a X"$1" != X"-c"; then
echo 'x - skipping tanh.s (File already exists)'
else
echo 'x - extracting tanh.s (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'tanh.s' &&
/*
** This file is part of the alternative 80386 math library and is
** covered by the GNU General Public license with my modification
** as noted in the README file that accompanied this file.
**
** Copyright 1990 G. Geers
**
*/
X
X .align 4
X .globl tanh
tanh:
X pushl %ebp
X movl %esp,%ebp
X subl $8, %esp
X
X fldl 8(%ebp)
X fldl2e
X fmulp
X fstl %st(1)
X frndint
X fstl %st(2)
X fsubrp
X f2xm1
X fld1
X faddp
X fscale
X fstl %st(1)
X fstl -16(%ebp)
X
X fld1
X fdivp
X
X fsubr
X faddl -16(%ebp)
X fdivrp
X
X leave
X ret
SHAR_EOF
chmod 0644 tanh.s ||
echo 'restore of tanh.s failed'
Wc_c="`wc -c < 'tanh.s'`"
test 493 -eq "$Wc_c" ||
echo 'tanh.s: original size 493, current size' "$Wc_c"
fi
exit 0
--
Glenn Geers | "So when it's over, we're back to people.
Department of Theoretical Physics | Just to prove that human touch can have
The University of Sydney | no equal."
Sydney NSW 2006 Australia | - Basia Trzetrzelewska, 'Prime Time TV'
More information about the Alt.sources
mailing list