Files
seta75D 2e8a93c394 Init
2021-10-11 18:20:23 -03:00

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