1206 lines
21 KiB
Plaintext
1206 lines
21 KiB
Plaintext
|
|
! .asciz "@(#)libm.il 1.1 92/07/30 SMI"
|
|
|
|
! Copyright (c) 1989 by Sun Microsystems, Inc.
|
|
! @(#)RELEASE libm.il, 4.1 alpha 9
|
|
|
|
! x0 = 0x44 ! shadow area of %o0
|
|
! x1 = 0x48 ! shadow area of %o1
|
|
! x2 = 0x4c ! shadow area of %o2
|
|
! x3 = 0x50 ! shadow area of %o3
|
|
! x4 = 0x54 ! shadow area of %o4
|
|
! x5 = 0x58 ! shadow area of %o5
|
|
!
|
|
! List of inline expansion libm functions
|
|
! __swapEX, __swapRD, __swapRP, __swapTE
|
|
! _fp_class, _ir_fp_class, _copysign, _r_copysign_
|
|
! _finite, _ir_finite_
|
|
! _signbit, _ir_signbit
|
|
! _isinf, _isnan, _isnormal, _issubnormal, _iszero
|
|
! _abs, _fabs, _r_fabs_
|
|
!! _irint, _ir_irint_
|
|
!
|
|
! _Facos, _Faint, _Fanint, _Fasin, _Fatan, _Fcos, _Fcosh, _Fexp, _Fexp10
|
|
! _Fexp2, _Flog, _Flog10, _Fnint, _Fsin, _Fsinh, _Ftan, _Ftanh
|
|
!
|
|
! ___infinity (request by POSIX)
|
|
!
|
|
! List of inline expansion libF77 functions
|
|
! _i_nint, _i_dnnt
|
|
!
|
|
! __Fc_minus, __Fc_add, __Fc_neg,
|
|
! __Ff_conv_c, __Fc_conv_f, __Fc_conv_i, __Fi_conv_c
|
|
! __Fc_conv_d, __Fd_conv_c
|
|
!
|
|
! __Fc_conv_z
|
|
! __Fz_minus, __Fz_add, __Fz_neg
|
|
! __Ff_conv_z, __Fz_conv_f, __Fz_conv_i, __Fi_conv_z
|
|
! __Fz_conv_d, __Fd_conv_z, __Fz_conv_c
|
|
|
|
! _c_abs, z_abs, _c_cmplx, _d_cmplx, _r_cnjg, _d_cnjg
|
|
! _r_dim, _d_dim, _r_imag, _d_imag, _r_sign, _d_sign
|
|
|
|
! __Fc_mult, __Fz_mult
|
|
!
|
|
|
|
! begin fsqrt[sd] inline expansion templates
|
|
! remove if fsqrt[sd] instructions aren't in hardware
|
|
|
|
.inline _Fsqrt,1
|
|
st %o0,[%sp+0x44]
|
|
ld [%sp+0x44],%f0
|
|
fsqrts %f0,%f0
|
|
.end
|
|
|
|
.inline _sqrt,2
|
|
std %o0,[%sp+0x48] ! store to 8-aligned address
|
|
ldd [%sp+0x48],%f0
|
|
fsqrtd %f0,%f0
|
|
.end
|
|
|
|
.inline _r_sqrt_,1
|
|
ld [%o0],%f0
|
|
fsqrts %f0,%f0
|
|
.end
|
|
|
|
.inline _d_sqrt_,1
|
|
ld [%o0],%f0
|
|
ld [%o0+4],%f1
|
|
fsqrtd %f0,%f0
|
|
.end
|
|
|
|
.inline _r_hypot_,2
|
|
ld [%o0],%o4
|
|
sethi 0x1fffff,%o5
|
|
or %o5,1023,%o5
|
|
and %o4,%o5,%o4
|
|
sethi 0x1fe000,%o3
|
|
cmp %o4,%o3
|
|
bne 2f
|
|
ld [%o0],%f0 ! load result with first argument
|
|
ba 5f ! first argument is inf
|
|
fabss %f0,%f0
|
|
2:
|
|
ld [%o1],%o4
|
|
sethi 0x1fffff,%o5
|
|
or %o5,1023,%o5
|
|
and %o4,%o5,%o4
|
|
sethi 0x1fe000,%o3
|
|
cmp %o4,%o3
|
|
bne 4f
|
|
nop
|
|
ld [%o1],%f0 ! second argument inf
|
|
ba 5f
|
|
fabss %f0,%f0
|
|
4:
|
|
fstod %f0,%f0
|
|
ld [%o1],%f3
|
|
fmuld %f0,%f0,%f0
|
|
fstod %f3,%f2
|
|
fmuld %f2,%f2,%f2
|
|
faddd %f2,%f0,%f0
|
|
fsqrtd %f0,%f0
|
|
fdtos %f0,%f0
|
|
5:
|
|
.end
|
|
|
|
.inline _c_abs,1
|
|
ld [%o0],%o4
|
|
sethi 0x1fffff,%o5
|
|
or %o5,1023,%o5
|
|
and %o4,%o5,%o4
|
|
sethi 0x1fe000,%o3
|
|
cmp %o4,%o3
|
|
bne 2f
|
|
ld [%o0],%f0
|
|
ba 5f
|
|
fabss %f0,%f0
|
|
2:
|
|
ld [%o0+4],%o4
|
|
sethi 0x1fffff,%o5
|
|
or %o5,1023,%o5
|
|
and %o4,%o5,%o4
|
|
sethi 0x1fe000,%o3
|
|
cmp %o4,%o3
|
|
bne 4f
|
|
nop
|
|
ld [%o0+4],%f0
|
|
ba 5f
|
|
fabss %f0,%f0
|
|
! store to 8-aligned address
|
|
4:
|
|
fstod %f0,%f0
|
|
ld [%o0+4],%f3
|
|
fmuld %f0,%f0,%f0
|
|
fstod %f3,%f2
|
|
fmuld %f2,%f2,%f2
|
|
faddd %f2,%f0,%f0
|
|
fsqrtd %f0,%f0
|
|
fdtos %f0,%f0
|
|
5:
|
|
.end
|
|
|
|
! remove if fsqrt[sd] instructions aren't in hardware
|
|
! end fsqrt[sd] inline expansion templates
|
|
|
|
! alternate definition for those who don't want fsqrt instructions
|
|
.inline _c_abs,1
|
|
add %o0,4,%o1
|
|
call _r_hypot_,2
|
|
nop
|
|
.end
|
|
|
|
.inline _min_subnormal,0
|
|
set 0x0,%o0
|
|
st %o0,[%sp+0x44]
|
|
ld [%sp+0x44],%f0
|
|
set 0x1,%o0
|
|
st %o0,[%sp+0x44]
|
|
ld [%sp+0x44],%f1
|
|
.end
|
|
|
|
.inline _d_min_subnormal_,0
|
|
set 0x0,%o0
|
|
st %o0,[%sp+0x44]
|
|
ld [%sp+0x44],%f0
|
|
set 0x1,%o0
|
|
st %o0,[%sp+0x44]
|
|
ld [%sp+0x44],%f1
|
|
.end
|
|
|
|
.inline _r_min_subnormal_,0
|
|
set 0x1,%o0
|
|
st %o0,[%sp+0x44]
|
|
ld [%sp+0x44],%f0
|
|
.end
|
|
|
|
.inline _max_subnormal,0
|
|
set 0x000fffff,%o0
|
|
st %o0,[%sp+0x44]
|
|
ld [%sp+0x44],%f0
|
|
set 0xffffffff,%o0
|
|
st %o0,[%sp+0x44]
|
|
ld [%sp+0x44],%f1
|
|
.end
|
|
|
|
.inline _d_max_subnormal_,0
|
|
set 0x000fffff,%o0
|
|
st %o0,[%sp+0x44]
|
|
ld [%sp+0x44],%f0
|
|
set 0xffffffff,%o0
|
|
st %o0,[%sp+0x44]
|
|
ld [%sp+0x44],%f1
|
|
.end
|
|
|
|
.inline _r_max_subnormal_,0
|
|
set 0x007fffff,%o0
|
|
st %o0,[%sp+0x44]
|
|
ld [%sp+0x44],%f0
|
|
.end
|
|
|
|
.inline _min_normal,0
|
|
set 0x00100000,%o0
|
|
st %o0,[%sp+0x44]
|
|
ld [%sp+0x44],%f0
|
|
set 0x0,%o0
|
|
st %o0,[%sp+0x44]
|
|
ld [%sp+0x44],%f1
|
|
.end
|
|
|
|
.inline _d_min_normal_,0
|
|
set 0x00100000,%o0
|
|
st %o0,[%sp+0x44]
|
|
ld [%sp+0x44],%f0
|
|
set 0x0,%o0
|
|
st %o0,[%sp+0x44]
|
|
ld [%sp+0x44],%f1
|
|
.end
|
|
|
|
.inline _r_min_normal_,0
|
|
set 0x00800000,%o0
|
|
st %o0,[%sp+0x44]
|
|
ld [%sp+0x44],%f0
|
|
.end
|
|
|
|
.inline _max_normal,0
|
|
set 0x7fefffff,%o0
|
|
st %o0,[%sp+0x44]
|
|
ld [%sp+0x44],%f0
|
|
set 0xffffffff,%o0
|
|
st %o0,[%sp+0x44]
|
|
ld [%sp+0x44],%f1
|
|
.end
|
|
|
|
.inline _d_max_normal_,0
|
|
set 0x7fefffff,%o0
|
|
st %o0,[%sp+0x44]
|
|
ld [%sp+0x44],%f0
|
|
set 0xffffffff,%o0
|
|
st %o0,[%sp+0x44]
|
|
ld [%sp+0x44],%f1
|
|
.end
|
|
|
|
.inline _r_max_normal_,0
|
|
set 0x7f7fffff,%o0
|
|
st %o0,[%sp+0x44]
|
|
ld [%sp+0x44],%f0
|
|
.end
|
|
|
|
.inline ___infinity,0
|
|
set 0x7ff00000,%o0
|
|
set 0x0,%o1
|
|
std %o0,[%sp+0x48]
|
|
ldd [%sp+0x48],%f0
|
|
.end
|
|
|
|
.inline _infinity,0
|
|
set 0x7ff00000,%o0
|
|
set 0x0,%o1
|
|
std %o0,[%sp+0x48]
|
|
ldd [%sp+0x48],%f0
|
|
.end
|
|
|
|
.inline _d_infinity_,0
|
|
set 0x7ff00000,%o0
|
|
st %o0,[%sp+0x44]
|
|
ld [%sp+0x44],%f0
|
|
set 0x0,%o0
|
|
st %o0,[%sp+0x44]
|
|
ld [%sp+0x44],%f1
|
|
.end
|
|
|
|
.inline _r_infinity_,0
|
|
set 0x7f800000,%o0
|
|
st %o0,[%sp+0x44]
|
|
ld [%sp+0x44],%f0
|
|
.end
|
|
|
|
.inline _signaling_nan,0
|
|
set 0x7ff00000,%o0
|
|
st %o0,[%sp+0x44]
|
|
ld [%sp+0x44],%f0
|
|
set 0x1,%o0
|
|
st %o0,[%sp+0x44]
|
|
ld [%sp+0x44],%f1
|
|
.end
|
|
|
|
.inline _d_signaling_nan_,0
|
|
set 0x7ff00000,%o0
|
|
st %o0,[%sp+0x44]
|
|
ld [%sp+0x44],%f0
|
|
set 0x1,%o0
|
|
st %o0,[%sp+0x44]
|
|
ld [%sp+0x44],%f1
|
|
.end
|
|
|
|
.inline _r_signaling_nan_,0
|
|
set 0x7f800001,%o0
|
|
st %o0,[%sp+0x44]
|
|
ld [%sp+0x44],%f0
|
|
.end
|
|
|
|
.inline _quiet_nan,0
|
|
set 0x7fffffff,%o0
|
|
st %o0,[%sp+0x44]
|
|
ld [%sp+0x44],%f0
|
|
set 0xffffffff,%o0
|
|
st %o0,[%sp+0x44]
|
|
ld [%sp+0x44],%f1
|
|
.end
|
|
|
|
.inline _d_quiet_nan_,0
|
|
set 0x7fffffff,%o0
|
|
st %o0,[%sp+0x44]
|
|
ld [%sp+0x44],%f0
|
|
set 0xffffffff,%o0
|
|
st %o0,[%sp+0x44]
|
|
ld [%sp+0x44],%f1
|
|
.end
|
|
|
|
.inline _r_quiet_nan_,0
|
|
set 0x7fffffff,%o0
|
|
st %o0,[%sp+0x44]
|
|
ld [%sp+0x44],%f0
|
|
.end
|
|
|
|
.inline __swapEX,1
|
|
set _fp_accrued_exceptions,%o3
|
|
st %o0,[%o3]
|
|
and %o0,0x1f,%o1
|
|
sll %o1,5,%o1 ! shift input to aexc bit location
|
|
st %fsr,[%sp+0x44]
|
|
ld [%sp+0x44],%o0 ! o0 = fsr
|
|
andn %o0,0x3e0,%o2
|
|
or %o1,%o2,%o1 ! o1 = new fsr
|
|
st %o1,[%sp+0x44]
|
|
ld [%sp+0x44],%fsr
|
|
srl %o0,5,%o0
|
|
and %o0,0x1f,%o0
|
|
.end
|
|
|
|
.inline __swapRD,1
|
|
set _fp_direction,%o3
|
|
and %o0,0x3,%o0
|
|
st %o0,[%o3]
|
|
sll %o0,30,%o1 ! shift input to RD bit location
|
|
st %fsr,[%sp+0x44]
|
|
ld [%sp+0x44],%o0 ! o0 = fsr
|
|
set 0xc0000000,%o4 ! mask of rounding direction bits
|
|
andn %o0,%o4,%o2
|
|
or %o1,%o2,%o1 ! o1 = new fsr
|
|
st %o1,[%sp+0x44]
|
|
ld [%sp+0x44],%fsr
|
|
srl %o0,30,%o0
|
|
and %o0,0x3,%o0
|
|
.end
|
|
|
|
.inline __swapRP,1
|
|
set _fp_precision,%o3
|
|
and %o0,0x3,%o0
|
|
st %o0,[%o3]
|
|
sll %o0,28,%o1 ! shift input to RP bit location
|
|
st %fsr,[%sp+0x44]
|
|
ld [%sp+0x44],%o0 ! o0 = fsr
|
|
set 0x30000000,%o4 ! mask of rounding precision bits
|
|
andn %o0,%o4,%o2
|
|
or %o1,%o2,%o1 ! o1 = new fsr
|
|
st %o1,[%sp+0x44]
|
|
ld [%sp+0x44],%fsr
|
|
srl %o0,28,%o0
|
|
and %o0,0x3,%o0
|
|
.end
|
|
|
|
.inline __swapTE,1
|
|
and %o0,0x1f,%o0
|
|
sll %o0,23,%o1 ! shift input to TEM bit location
|
|
st %fsr,[%sp+0x44]
|
|
ld [%sp+0x44],%o0 ! o0 = fsr
|
|
set 0x0f800000,%o4 ! mask of TEM (Trap Enable Mode bits)
|
|
andn %o0,%o4,%o2
|
|
or %o1,%o2,%o1 ! o1 = new fsr
|
|
st %o1,[%sp+0x48]
|
|
ld [%sp+0x48],%fsr
|
|
srl %o0,23,%o0
|
|
and %o0,0x1f,%o0
|
|
.end
|
|
|
|
.inline _fp_class,2
|
|
sethi %hi(0x80000000),%o2
|
|
andn %o0,%o2,%o0
|
|
orcc %o0,%o1,%g0
|
|
bne 1f
|
|
sethi %hi(0x7ff00000),%o2
|
|
ba 2f ! x is 0
|
|
mov 0,%o0
|
|
1: andcc %o0,%o2,%g0
|
|
bne 1f
|
|
cmp %o0,%o2
|
|
ba 2f ! x is subnormal
|
|
mov 1,%o0
|
|
1: bge 1f
|
|
andn %o0,%o2,%o0
|
|
ba 2f ! x is normal
|
|
mov 2,%o0
|
|
1: orcc %o0,%o1,%g0
|
|
bne 1f
|
|
sethi %hi(0x00080000),%o2
|
|
ba 2f ! x is infinity
|
|
mov 3,%o0
|
|
1: andcc %o0,%o2,%g0
|
|
bne 2f
|
|
mov 4,%o0 ! x is quiet NaN
|
|
mov 5,%o0 ! x is signaling NaN
|
|
2:
|
|
.end
|
|
|
|
.inline _ir_fp_class,1
|
|
ld [%o0],%o0
|
|
sethi %hi(0x80000000),%o2
|
|
andncc %o0,%o2,%o0
|
|
bne 1f
|
|
sethi %hi(0x7f800000),%o2
|
|
ba 2f ! x is 0
|
|
mov 0,%o0
|
|
1: andcc %o0,%o2,%g0
|
|
bne 1f
|
|
cmp %o0,%o2
|
|
ba 2f ! x is subnormal
|
|
mov 1,%o0
|
|
1: bge 1f
|
|
andn %o0,%o2,%o0
|
|
ba 2f ! x is normal
|
|
mov 2,%o0
|
|
1: bg 1f
|
|
sethi %hi(0x00400000),%o2
|
|
ba 2f ! x is infinity
|
|
mov 3,%o0
|
|
1: andcc %o0,%o2,%g0
|
|
bne 2f
|
|
mov 4,%o0 ! x is quiet NaN
|
|
mov 5,%o0 ! x is signaling NaN
|
|
2:
|
|
.end
|
|
|
|
.inline _copysign,4
|
|
set 0x80000000,%o3
|
|
and %o2,%o3,%o2
|
|
andn %o0,%o3,%o0
|
|
or %o0,%o2,%o0
|
|
std %o0,[%sp+0x48]
|
|
ldd [%sp+0x48],%f0
|
|
.end
|
|
|
|
.inline _r_copysign_,2
|
|
ld [%o0],%o0
|
|
ld [%o1],%o1
|
|
set 0x80000000,%o2
|
|
andn %o0,%o2,%o0
|
|
and %o1,%o2,%o1
|
|
or %o0,%o1,%o0
|
|
st %o0,[%sp+0x44]
|
|
ld [%sp+0x44],%f0
|
|
.end
|
|
|
|
.inline _finite,2
|
|
set 0x7ff00000,%o1
|
|
and %o0,%o1,%o0
|
|
cmp %o0,%o1
|
|
bne 1f
|
|
mov 1,%o0
|
|
mov 0,%o0
|
|
1:
|
|
.end
|
|
|
|
.inline _ir_finite_,1
|
|
ld [%o0],%o0
|
|
set 0x7f800000,%o1
|
|
and %o0,%o1,%o0
|
|
cmp %o0,%o1
|
|
bne 1f
|
|
mov 1,%o0
|
|
mov 0,%o0
|
|
1:
|
|
.end
|
|
|
|
.inline _signbit,1
|
|
srl %o0,31,%o0
|
|
.end
|
|
|
|
.inline _ir_signbit_,1
|
|
ld [%o0],%o0
|
|
srl %o0,31,%o0
|
|
.end
|
|
|
|
.inline _ir_isinf_,1 ! used in r_hypot_
|
|
ld [%o0],%o0
|
|
sethi %hi(0x7fffffff),%o1
|
|
or %o1,%lo(0x7fffffff),%o1 ! [internal]
|
|
and %o0,%o1,%o0
|
|
sethi %hi(0x7f800000),%o3
|
|
cmp %o0,%o3
|
|
bne,a 1f
|
|
mov 0,%o0
|
|
mov 1,%o0
|
|
1:
|
|
.end
|
|
|
|
.inline _isinf,2
|
|
tst %o1
|
|
bne 1f
|
|
sethi %hi(0x80000000),%o2
|
|
andn %o0,%o2,%o0
|
|
sethi %hi(0x7ff00000),%o2
|
|
cmp %o0,%o2
|
|
be 2f
|
|
mov 1,%o0
|
|
1:
|
|
mov 0,%o0
|
|
2:
|
|
.end
|
|
|
|
.inline _isnan,2
|
|
sethi %hi(0x7ff00000),%o2
|
|
and %o0,%o2,%o3
|
|
cmp %o3,%o2
|
|
bne 1f
|
|
sethi %hi(0xfff00000),%o2
|
|
andn %o0,%o2,%o0
|
|
orcc %o0,%o1,%g0
|
|
bne 2f
|
|
mov 1,%o0
|
|
1:
|
|
mov 0,%o0
|
|
2:
|
|
.end
|
|
|
|
.inline _isnormal,2
|
|
sethi %hi(0x80000000),%o2
|
|
andn %o0,%o2,%o0
|
|
sethi %hi(0x7ff00000),%o2
|
|
cmp %o0,%o2
|
|
bge 1f
|
|
sethi %hi(0x00100000),%o2
|
|
cmp %o0,%o2
|
|
bge 2f
|
|
mov 1,%o0
|
|
1:
|
|
mov 0,%o0
|
|
2:
|
|
.end
|
|
|
|
.inline _issubnormal,2
|
|
sethi %hi(0x80000000),%o2
|
|
andn %o0,%o2,%o0
|
|
sethi %hi(0x00100000),%o2
|
|
cmp %o0,%o2
|
|
bge 1f
|
|
orcc %o0,%o1,%g0
|
|
bne 2f
|
|
mov 1,%o0
|
|
1:
|
|
mov 0,%o0
|
|
2:
|
|
.end
|
|
|
|
.inline _iszero,2
|
|
sethi %hi(0x80000000),%o2
|
|
andn %o0,%o2,%o0
|
|
orcc %o0,%o1,%g0
|
|
be 1f
|
|
mov 1,%o0
|
|
mov 0,%o0
|
|
1:
|
|
.end
|
|
|
|
.inline _abs,1 /* integer abs */
|
|
subcc %g0,%o0,%g0 /* compute 0-o0 */
|
|
ble 1f /* nop if 0 <= o0 */
|
|
nop
|
|
sub %g0,%o0,%o0 /* o0 := -o0 */
|
|
1:
|
|
.end
|
|
|
|
.inline _fabs,2
|
|
sll %o0,1,%o0
|
|
srl %o0,1,%o0
|
|
std %o0,[%sp+0x48]
|
|
ldd [%sp+0x48],%f0
|
|
.end
|
|
|
|
.inline _r_fabs_,1
|
|
ld [%o0],%f0
|
|
fabss %f0,%f0
|
|
.end
|
|
|
|
!
|
|
! _Facos, _Faint, _Fanint, _Fasin, _Fatan, _Fcos, _Fcosh, _Fexp, _Fexp10
|
|
! _Fexp2, _Flog, _Flog10, _Fnint, _Fsin, _Fsinh, _Ftan, _Ftanh
|
|
!
|
|
.inline _Facos,1
|
|
st %o0,[%sp+0x44]
|
|
add %sp,0x44,%o0
|
|
call _r_acos_,1
|
|
nop
|
|
.end
|
|
|
|
.inline _Faint,1
|
|
st %o0,[%sp+0x44]
|
|
add %sp,0x44,%o0
|
|
call _r_aint_,1
|
|
nop
|
|
.end
|
|
|
|
.inline _Fanint,1
|
|
st %o0,[%sp+0x44]
|
|
add %sp,0x44,%o0
|
|
call _r_anint_,1
|
|
nop
|
|
.end
|
|
|
|
.inline _Fasin,1
|
|
st %o0,[%sp+0x44]
|
|
add %sp,0x44,%o0
|
|
call _r_asin_,1
|
|
nop
|
|
.end
|
|
|
|
.inline _Fatan,1
|
|
st %o0,[%sp+0x44]
|
|
add %sp,0x44,%o0
|
|
call _r_atan_,1
|
|
nop
|
|
.end
|
|
|
|
.inline _Fcos,1
|
|
st %o0,[%sp+0x44]
|
|
add %sp,0x44,%o0
|
|
call _r_cos_,1
|
|
nop
|
|
.end
|
|
|
|
.inline _Fcosh,1
|
|
st %o0,[%sp+0x44]
|
|
add %sp,0x44,%o0
|
|
call _r_cosh_,1
|
|
nop
|
|
.end
|
|
|
|
.inline _Fexp,1
|
|
st %o0,[%sp+0x44]
|
|
add %sp,0x44,%o0
|
|
call _r_exp_,1
|
|
nop
|
|
.end
|
|
|
|
.inline _Fexp10,1
|
|
st %o0,[%sp+0x44]
|
|
add %sp,0x44,%o0
|
|
call _r_exp10_,1
|
|
nop
|
|
.end
|
|
|
|
.inline _Fexp2,1
|
|
st %o0,[%sp+0x44]
|
|
add %sp,0x44,%o0
|
|
call _r_exp2_,1
|
|
nop
|
|
.end
|
|
|
|
.inline _Flog,1
|
|
st %o0,[%sp+0x44]
|
|
add %sp,0x44,%o0
|
|
call _r_log_,1
|
|
nop
|
|
.end
|
|
|
|
.inline _Flog10,1
|
|
st %o0,[%sp+0x44]
|
|
add %sp,0x44,%o0
|
|
call _r_log10_,1
|
|
nop
|
|
.end
|
|
|
|
.inline _Fnint,1
|
|
st %o0,[%sp+0x44]
|
|
add %sp,0x44,%o0
|
|
call _ir_nint_,1
|
|
nop
|
|
.end
|
|
|
|
.inline _Fsin,1
|
|
st %o0,[%sp+0x44]
|
|
add %sp,0x44,%o0
|
|
call _r_sin_,1
|
|
nop
|
|
.end
|
|
|
|
.inline _Fsinh,1
|
|
st %o0,[%sp+0x44]
|
|
add %sp,0x44,%o0
|
|
call _r_sinh_,1
|
|
nop
|
|
.end
|
|
|
|
.inline _Ftan,1
|
|
st %o0,[%sp+0x44]
|
|
add %sp,0x44,%o0
|
|
call _r_tan_,1
|
|
nop
|
|
.end
|
|
|
|
.inline _Ftanh,1
|
|
st %o0,[%sp+0x44]
|
|
add %sp,0x44,%o0
|
|
call _r_tanh_,1
|
|
nop
|
|
.end
|
|
|
|
|
|
!
|
|
! libF77 _i_nint and _i_dnnt
|
|
!
|
|
.inline _i_nint,1
|
|
call _ir_nint_,1
|
|
nop
|
|
.end
|
|
|
|
.inline _i_dnnt,1
|
|
ld [%o0+4],%o1
|
|
ld [%o0],%o0
|
|
call _nint,2
|
|
nop
|
|
.end
|
|
|
|
.inline __Fz_minus,3
|
|
ld [%o1],%f0
|
|
ld [%o1+0x4],%f1
|
|
ld [%o2],%f4
|
|
ld [%o2+0x4],%f5
|
|
fsubd %f0,%f4,%f0
|
|
ld [%o1+8],%f2
|
|
ld [%o1+0xc],%f3
|
|
ld [%o2+8],%f6
|
|
ld [%o2+0xc],%f7
|
|
fsubd %f2,%f6,%f2
|
|
st %f0,[%o0+0x0]
|
|
st %f1,[%o0+0x4]
|
|
st %f2,[%o0+0x8]
|
|
st %f3,[%o0+0xc]
|
|
.end
|
|
|
|
.inline __Fz_add,3
|
|
ld [%o1],%f0
|
|
ld [%o1+0x4],%f1
|
|
ld [%o2],%f4
|
|
ld [%o2+0x4],%f5
|
|
faddd %f0,%f4,%f0
|
|
ld [%o1+8],%f2
|
|
ld [%o1+0xc],%f3
|
|
ld [%o2+8],%f6
|
|
ld [%o2+0xc],%f7
|
|
faddd %f2,%f6,%f2
|
|
st %f0,[%o0+0x0]
|
|
st %f1,[%o0+0x4]
|
|
st %f2,[%o0+0x8]
|
|
st %f3,[%o0+0xc]
|
|
.end
|
|
|
|
.inline __Fz_neg,2
|
|
ld [%o1],%f0
|
|
fnegs %f0,%f0
|
|
ld [%o1+0x4],%f1
|
|
st %f1,[%o0+0x4]
|
|
ld [%o1+8],%f2
|
|
fnegs %f2,%f2
|
|
ld [%o1+0xc],%f3
|
|
st %f3,[%o0+0xc]
|
|
st %f0,[%o0]
|
|
st %f2,[%o0+0x8]
|
|
.end
|
|
|
|
.inline __Ff_conv_z,2
|
|
st %o1,[%sp+0x44]
|
|
ld [%sp+0x44],%f0
|
|
fstod %f0,%f0
|
|
st %g0,[%o0+0x8]
|
|
st %g0,[%o0+0xc]
|
|
st %f1,[%o0+0x4]
|
|
st %f0,[%o0]
|
|
.end
|
|
|
|
.inline __Fz_conv_f,1
|
|
ld [%o0],%f0
|
|
ld [%o0+4],%f1
|
|
fdtos %f0,%f0
|
|
.end
|
|
|
|
.inline __Fz_conv_i,1
|
|
ld [%o0],%f0
|
|
ld [%o0+4],%f1
|
|
fdtoi %f0,%f0
|
|
st %f0,[%sp+0x44]
|
|
ld [%sp+0x44],%o0
|
|
.end
|
|
|
|
.inline __Fi_conv_z,2
|
|
st %o1,[%sp+0x44]
|
|
ld [%sp+0x44],%f0
|
|
fitod %f0,%f0
|
|
st %g0,[%o0+0x8]
|
|
st %g0,[%o0+0xc]
|
|
st %f1,[%o0+0x4]
|
|
st %f0,[%o0]
|
|
.end
|
|
|
|
.inline __Fz_conv_d,1
|
|
ld [%o0],%f0
|
|
ld [%o0+4],%f1
|
|
.end
|
|
|
|
.inline __Fd_conv_z,3
|
|
st %o1,[%o0]
|
|
st %o2,[%o0+0x4]
|
|
st %g0,[%o0+0x8]
|
|
st %g0,[%o0+0xc]
|
|
.end
|
|
|
|
.inline __Fz_conv_c,1
|
|
ld [%o0],%f0
|
|
ld [%o0+4],%f1
|
|
fdtos %f0,%f0
|
|
ld [%o0+0x8],%f2
|
|
ld [%o0+0xc],%f3
|
|
fdtos %f2,%f1
|
|
.end
|
|
|
|
.inline _z_abs,1
|
|
ld [%o0+0xc],%o3
|
|
ld [%o0+0x8],%o2
|
|
ld [%o0+0x4],%o1
|
|
ld [%o0],%o0
|
|
call _hypot,4
|
|
nop
|
|
.end
|
|
|
|
.inline _c_cmplx,3
|
|
ld [%o1],%o1
|
|
st %o1,[%o0]
|
|
ld [%o2],%o2
|
|
st %o2,[%o0+4]
|
|
.end
|
|
|
|
.inline _d_cmplx,3
|
|
ld [%o1],%f0
|
|
st %f0,[%o0]
|
|
ld [%o1+4],%f1
|
|
st %f1,[%o0+4]
|
|
ld [%o2],%f0
|
|
st %f0,[%o0+0x8]
|
|
ld [%o2+4],%f1
|
|
st %f1,[%o0+0xc]
|
|
.end
|
|
|
|
.inline _r_cnjg,2
|
|
ld [%o1+0x4],%f1
|
|
fnegs %f1,%f1
|
|
ld [%o1],%f0
|
|
st %f0,[%o0]
|
|
st %f1,[%o0+4]
|
|
.end
|
|
|
|
.inline _d_cnjg,2
|
|
ld [%o1+0x8],%f0
|
|
fnegs %f0,%f0
|
|
ld [%o1+0xc],%f1
|
|
st %f1,[%o0+0xc]
|
|
ld [%o1+0x0],%f1
|
|
st %f1,[%o0+0x0]
|
|
ld [%o1+0x4],%f1
|
|
st %f1,[%o0+0x4]
|
|
st %f0,[%o0+0x8]
|
|
.end
|
|
|
|
.inline _r_dim,2
|
|
ld [%o0],%f2
|
|
ld [%o1],%f4
|
|
fcmps %f2,%f4
|
|
st %g0,[%sp+0x48]
|
|
ld [%sp+0x48],%f0
|
|
fbule 1f
|
|
nop
|
|
fsubs %f2,%f4,%f0
|
|
1:
|
|
.end
|
|
|
|
.inline _d_dim,2
|
|
ld [%o0],%f2
|
|
ld [%o0+4],%f3
|
|
ld [%o1],%f4
|
|
ld [%o1+4],%f5
|
|
fcmpd %f2,%f4
|
|
st %g0,[%sp+0x48]
|
|
ld [%sp+0x48],%f0
|
|
ld [%sp+0x48],%f1
|
|
fbule 1f
|
|
nop
|
|
fsubd %f2,%f4,%f0
|
|
1:
|
|
.end
|
|
|
|
.inline _r_imag,1
|
|
ld [%o0+4],%f0
|
|
.end
|
|
|
|
.inline _d_imag,1
|
|
ld [%o0+8],%f0
|
|
ld [%o0+0xc],%f1
|
|
.end
|
|
|
|
.inline _r_sign,2
|
|
ld [%o0],%f0
|
|
fabss %f0,%f0
|
|
ld [%o1],%o2
|
|
sethi %hi(0x80000000),%o3
|
|
cmp %o2,%o3
|
|
beq 1f
|
|
tst %o2
|
|
bge 1f
|
|
nop
|
|
fnegs %f0,%f0
|
|
1:
|
|
.end
|
|
|
|
.inline _d_sign,2
|
|
ld [%o0],%f0
|
|
fabss %f0,%f0
|
|
ld [%o0+4],%f1
|
|
ld [%o1],%o2
|
|
ld [%o1+4],%o3
|
|
sethi %hi(0x80000000),%o4
|
|
andn %o2,%o4,%o4
|
|
orcc %o3,%o4,%g0
|
|
beq 1f
|
|
tst %o2
|
|
bge 1f
|
|
nop
|
|
fnegs %f0,%f0
|
|
1:
|
|
.end
|
|
|
|
.inline __Fz_mult,3
|
|
ld [%o1],%f0
|
|
ld [%o1+0x4],%f1
|
|
ld [%o2],%f4
|
|
ld [%o2+0x4],%f5
|
|
fmuld %f0,%f4,%f8 ! f8 = r1*r2
|
|
ld [%o1+0x8],%f2
|
|
ld [%o1+0xc],%f3
|
|
ld [%o2+0x8],%f6
|
|
ld [%o2+0xc],%f7
|
|
fmuld %f2,%f6,%f10 ! f10= i1*i2
|
|
fsubd %f8,%f10,%f12 ! f12= r1*r2-i1*i2
|
|
st %f12,[%o0]
|
|
st %f13,[%o0+4]
|
|
fmuld %f0,%f6,%f14 ! f14= r1*i2
|
|
fmuld %f2,%f4,%f16 ! f16= r2*i1
|
|
faddd %f14,%f16,%f2 ! f2 = r1*i2+r2*i1
|
|
st %f2,[%o0+8]
|
|
st %f3,[%o0+12]
|
|
.end
|
|
|
|
!- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
! void
|
|
! __Fc_mult(c, a, b)
|
|
! complex *c, *a, *b; /* c = a * b */
|
|
! {
|
|
.inline __Fc_mult,3
|
|
! 21 c->real = (a->real * b->real) - (a->imag * b->imag);
|
|
ld [%o1+4],%f0
|
|
ld [%o2+4],%f1
|
|
fstod %f0,%f2 ! f2 = a->imag
|
|
fstod %f1,%f4 ! f4 = b->imag
|
|
fmuld %f2,%f4,%f6 ! f6 = (a->imag * b->imag)
|
|
ld [%o1],%f0
|
|
ld [%o2],%f1
|
|
fstod %f0,%f8 ! f8 = a->real
|
|
fstod %f1,%f10 ! f10 = b->real
|
|
fmuld %f8,%f10,%f0
|
|
fsubd %f0,%f6,%f6
|
|
! 22 c->imag = (a->real * b->imag) + (a->imag * b->real);
|
|
fmuld %f2,%f10,%f2 ! f2 = a->imag * b->real
|
|
fmuld %f8,%f4,%f4 ! f4 = a->real * b->imag
|
|
faddd %f2,%f4,%f4
|
|
fdtos %f6,%f0
|
|
fdtos %f4,%f1
|
|
st %f0,[%o0]
|
|
st %f1,[%o0+4]
|
|
.end
|
|
|
|
|
|
!- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
! void
|
|
! __Fc_minus(c, a, b)
|
|
! complex *c, *a, *b; /* c = a - b */
|
|
! {
|
|
.inline __Fc_minus,3
|
|
! 30 c->real = a->real - b->real;
|
|
ld [%o1],%f0
|
|
ld [%o2],%f1
|
|
fsubs %f0,%f1,%f2
|
|
! 31 c->imag = a->imag - b->imag;
|
|
ld [%o1+4],%f3
|
|
ld [%o2+4],%f4
|
|
fsubs %f3,%f4,%f5
|
|
st %f2,[%o0]
|
|
st %f5,[%o0+4]
|
|
.end
|
|
|
|
|
|
!- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
! void
|
|
! _Fc_add(c, a, b)
|
|
! complex *c, *a, *b; /* c = a + b */
|
|
! {
|
|
.inline __Fc_add,3
|
|
! 39 c->real = a->real + b->real;
|
|
ld [%o1],%f0
|
|
ld [%o2],%f1
|
|
fadds %f0,%f1,%f2
|
|
! 40 c->imag = a->imag + b->imag;
|
|
ld [%o1+4],%f3
|
|
ld [%o2+4],%f4
|
|
fadds %f3,%f4,%f5
|
|
st %f2,[%o0]
|
|
st %f5,[%o0+4]
|
|
.end
|
|
|
|
|
|
!- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
! void
|
|
! _Fc_neg(c, a)
|
|
! complex *c, *a; /* c = -a */
|
|
! {
|
|
.inline __Fc_neg,2
|
|
! 48 c->real = - a->real;
|
|
ld [%o1],%f0
|
|
fnegs %f0,%f1
|
|
! 49 c->imag = - a->imag;
|
|
ld [%o1+4],%f2
|
|
fnegs %f2,%f3
|
|
st %f1,[%o0]
|
|
st %f3,[%o0+4]
|
|
.end
|
|
|
|
|
|
!- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
! void
|
|
! _Ff_conv_c(c, x) /* convert float to complex */
|
|
! complex *c;
|
|
! FLOATPARAMETER x;
|
|
! {
|
|
.inline __Ff_conv_c,2
|
|
! 59 c->real = x;
|
|
st %o1,[%o0]
|
|
! 60 c->imag = 0.0;
|
|
st %g0,[%o0+4]
|
|
.end
|
|
|
|
|
|
|
|
!- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
! FLOATFUNCTIONTYPE
|
|
! _Fc_conv_f( c ) /* Convert complex to float */
|
|
! complex *c;
|
|
! {
|
|
.inline __Fc_conv_f,1
|
|
! 69 RETURNFLOAT(c->real);
|
|
ld [%o0],%f0
|
|
.end
|
|
|
|
|
|
!- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
! int
|
|
! _Fc_conv_i (c) /* Convert complex to int */
|
|
! complex *c;
|
|
! {
|
|
.inline __Fc_conv_i,1
|
|
! 78 return (int)c->real;
|
|
ld [%o0],%f0
|
|
fstoi %f0,%f1
|
|
st %f1,[%sp+68]
|
|
ld [%sp+68],%o0
|
|
.end
|
|
|
|
|
|
!- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
! void
|
|
! _Fi_conv_c (c,i) /* Convert int to complex */
|
|
! complex *c;
|
|
! int i;
|
|
! {
|
|
.inline __Fi_conv_c,2
|
|
! 88 c->real = (float)i;
|
|
st %o1,[%sp+68]
|
|
ld [%sp+68],%f0
|
|
fitos %f0,%f1
|
|
st %f1,[%o0]
|
|
! 89 c->imag = 0.0;
|
|
st %g0,[%o0+4]
|
|
.end
|
|
|
|
|
|
!- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
! double
|
|
! _Fc_conv_d ( c ) /* Convert complex to double */
|
|
! complex *c;
|
|
! {
|
|
.inline __Fc_conv_d,1
|
|
! 98 return (double)c->real;
|
|
ld [%o0],%f2
|
|
fstod %f2,%f0
|
|
.end
|
|
|
|
|
|
!- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
! void
|
|
! _Fd_conv_c (c, x) /* Convert double to complex */
|
|
! complex *c;
|
|
! double x;
|
|
.inline __Fd_conv_c,2
|
|
st %o1,[%sp+72]
|
|
st %o2,[%sp+76]
|
|
! 109 c->real = (float)(x);
|
|
ldd [%sp+72],%f0
|
|
fdtos %f0,%f1
|
|
st %f1,[%o0]
|
|
! 110 c->imag = 0.0;
|
|
st %g0,[%o0+4]
|
|
.end
|
|
|
|
|
|
!- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
! void
|
|
! _Fc_conv_z( result, c ) /* Convert complex to double complex */
|
|
! dcomplex *result;
|
|
! complex *c;
|
|
! {
|
|
.inline __Fc_conv_z,2
|
|
! 120 result->dreal = (double)c->real;
|
|
ld [%o1],%f0
|
|
fstod %f0,%f2
|
|
st %f2,[%o0]
|
|
st %f3,[%o0+4]
|
|
! 121 result->dimag = (double)c->imag;
|
|
ld [%o1+4],%f3
|
|
fstod %f3,%f4
|
|
st %f4,[%o0+8]
|
|
st %f5,[%o0+12]
|
|
.end
|
|
|
|
!- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
! void
|
|
! _Fc_div(c, a, b)
|
|
! complex *c, *a, *b; /* c = a * b */
|
|
! {
|
|
.inline __Fc_div,3
|
|
ld [%o2+4],%o3
|
|
sethi %hi(0x7fffffff),%o4
|
|
or %o4,%lo(0x7fffffff),%o4 ! [internal]
|
|
andcc %o3,%o4,%g0
|
|
bne,a 1f
|
|
ld [%o2],%f6 ! f6 gets reb
|
|
ld [%o1],%f0
|
|
ld [%o2],%f1
|
|
fdivs %f0,%f1,%f0
|
|
st %f0,[%o0]
|
|
ld [%o2],%f4
|
|
ld [%o1+4],%f3
|
|
fdivs %f3,%f4,%f3
|
|
b 2f
|
|
st %f3,[%o0+4]
|
|
1: ! [internal]
|
|
fstod %f6,%f8 ! f8/9 gets reb
|
|
ld [%o2+4],%f19 ! f19 gets imb
|
|
ld [%o1+4],%f13 ! f13 gets ima
|
|
fstod %f13,%f24 ! f24/5 gets ima
|
|
fstod %f19,%f10 ! f10/11 gets imb
|
|
fmuld %f8,%f8,%f16 ! f16/17 gets reb**2
|
|
ld [%o1],%f19 ! f19 gets rea
|
|
fmuld %f24,%f10,%f0 ! f0/f1 gets ima*imb
|
|
fstod %f19,%f26 ! f26/7 gets rea
|
|
fmuld %f10,%f10,%f12 ! f12/13 gets imb**2
|
|
faddd %f12,%f16,%f12 ! f12/13 gets reb**2+imb**2
|
|
fmuld %f26,%f8,%f2 ! f2/3 gets rea*reb
|
|
faddd %f2,%f0,%f2 ! f2/3 gets rea*reb+ima*imb
|
|
fdivd %f2,%f12,%f2 ! f2/3 gets imc
|
|
fmuld %f24,%f8,%f24 ! f24/5 gets ima*reb
|
|
fmuld %f26,%f10,%f10 ! f10/11 gets rea*imb
|
|
fsubd %f24,%f10,%f10 ! f10/11 gets ima*reb-rea*imb
|
|
fdtos %f2,%f7 ! f7 gets imc
|
|
fdivd %f10,%f12,%f12 ! f12 gets rec
|
|
fdtos %f12,%f15 ! f15 gets rec
|
|
st %f7,[%o0]
|
|
st %f15,[%o0+4]
|
|
2:
|
|
.end
|