📄 trig.s
字号:
.seg "data" .asciz "@(#)trig.S 1.1 92/07/30 SMI"#define LOCORE#include <machine/asm_linkage.h>! Copyright (c) 1988 by Sun Microsystems, Inc.!! double sin(x), cos(x), tan(x), sincos(x)! IEEE Double precision trig functions on Sunrise!! Algorithm: see libm/C/trig.c! .seg "text" ENTRY(sin) ba trig mov 0,%o4 ENTRY(cos) ba trig mov 1,%o4 ENTRY(tan) ba trig mov 2,%o4 ENTRY(sincos) ba trig mov 3,%o4! trig() .seg "data" .global _fp_pi .align 4_fp_pi: .word 1 ! initialize fp_pi = 1 = fp_pi_66 .align 8constant:thresh1 = 0x0 .word 0x3fe0b70c,0x6d604dd5thresh2 = 0x8 .word 0x3fd0584c,0x22231902invpio2 = 0x10 .word 0x3fe45f30,0x6dc9c883pio4 = 0x18 .word 0x3fe921fb,0x54442d18pio2 = 0x20 .word 0x3ff921fb,0x54442d18pio2_1 = 0x28 .word 0x3ff921fb,0x54400000pio2_1t = 0x30 .word 0x3dd0b461,0x1a626331pio2_1t5= 0x38 .word 0x3dd0b460,0x0pio2_2 = 0x40 .word 0x3dd0b461,0x1a600000pio2_2t = 0x48 .word 0x3ba3198a,0x2e037073pio2_3 = 0x50 .word 0x3ba3198a,0x2e000000pio2_3t = 0x58 .word 0x397b839a,0x252049c1medium = 0x60 .double 0r1647099.0tiny = 0x68 .double 0r1.0e-10big = 0x70 .double 0r1.0e10zero = 0x78 .double 0r0one = 0x80 .double 0r1.0half = 0x88 .double 0r0.5c5_8 = 0x90 .double 0r0.625c3_8 = 0x98 .double 0r0.375c13_16 = 0xa0 .double 0r0.8125c3_16 = 0xa8 .double 0r0.1875c002246 = 0xb0 .double 0r0.002246c000085 = 0xb8 .double 0r0.000085c1_3 = 0xc0 .double 0r0.33333333333333333333c1_6 = 0xc8 .double 0r0.16666666666666666666c2_15 = 0xd0 .double 0r0.13333333333333333333c1_24 = 0xd8 .double 0r0.041666666666666666666c1_120 = 0xe0 .double 0r0.0083333333333333333333ctiny1 = 0xe8 .double 0r0.00390625ctiny2 = 0xf0 .double 0r9.094947e-13C: ! C_inf .double 0r4.16666666666666019E-2, 0r-1.38888888888744744E-3 .double 0r2.48015872896717822E-5, 0r-2.75573144009911252E-7 .double 0r2.08757292566166689E-9, 0r-1.13599319556004135E-11 .double 0r0,0r0 ! C_66 = C_inf .double 0r4.16666666666666019E-2, 0r-1.38888888888744744E-3 .double 0r2.48015872896717822E-5, 0r-2.75573144009911252E-7 .double 0r2.08757292566166689E-9, 0r-1.13599319556004135E-11 .double 0r0,0r0 ! C_53 .double 0r4.1666666666666504759E-2, 0r-1.3888888888865301516E-3 .double 0r2.4801587269650015769E-5, 0r-2.7557304623183959811E-7 .double 0r2.0873958177697780076E-9, 0r-1.1250289076471311557E-11 .double 0r0,0r0S: ! S_inf .double 0r1.66666666666666796E-1, 0r-8.33333333333178931E-3 .double 0r1.98412698361250482E-4, 0r-2.75573156035895542E-6 .double 0r2.50510254394993115E-8, 0r-1.59108690260756780E-10 .double 0r0,0r0 ! S_66 = S_inf .double 0r1.66666666666666796E-1, 0r-8.33333333333178931E-3 .double 0r1.98412698361250482E-4, 0r-2.75573156035895542E-6 .double 0r2.50510254394993115E-8, 0r-1.59108690260756780E-10 .double 0r0,0r0 ! S_53 .double 0r1.6666666666666463126E-1, 0r-8.3333333332992771264E-3 .double 0r1.9841269816180999116E-4, 0r-2.7557309793219876880E-6 .double 0r2.5050225177523807003E-8, 0r-1.5868926979889205164E-10 .double 0r0,0r0! temporary variable using fp pointerx = -0x8y1 = -0x10y2 = -0x18t = -0x20z = -0x28n = -0x30! local register variable! i0 = high x, input, will be changed to high |x|! i1 = low x input! i2 = *s input from sincos! i3 = *c input from sincos! i4 = k input 0-sin,1-cos,2-tan,3-sincos! i5 = signx local! l0 = address of constant local! l1 = j indicator of whether y2=0! l2 = n!! f0 = x local! f12= x*x local! f22= y1! f24= y2 .seg "text"trig: save %sp,-0xc0,%sp set constant,%l0 ! l0 = address of constant st %i0,[%fp+x] st %i1,[%fp+4+x] sethi %hi(0x80000000),%l5 and %i0,%l5,%i5 ! i5 = signx andn %i0,%l5,%i0 ! i0 = high |x| ! if(!finite(x)) return NaN sethi %hi(0x7ff00000),%l5 and %l5,%i0,%l4 cmp %l5,%l4 bne T1 ldd [%fp+x],%f0 ! set f0 = x fsubd %f0,%f0,%f0 cmp %i4,3 bne Treturn nop st %f0,[%i2] st %f1,[%i2+4] st %f0,[%i3] ba Treturn st %f1,[%i3+4]T1: ! if(t<0.002246) then ... ld [%l0+c002246],%l5 cmp %i0,%l5 bge T2 mov 0,%l1 ! set j=0 ! if(t<tiny) then ... ld [%l0+tiny],%l5 cmp %i0,%l5 bge 1f nop ldd [%l0+big],%f2 faddd %f0,%f2,%f2 ! create inexact flag cmp %i4,3 bne 2f nop ldd [%l0+one],%f4 ! k=3 st %f0,[%i2] st %f1,[%i2+4] st %f4,[%i3] ba Treturn st %f5,[%i3+4]2: cmp %i4,1 bne Treturn ! k=0,2 sin(x)=tan(x)=x nop ba Treturn ldd [%l0+one],%f0 ! k=1 cos(x)=11: fmuld %f0,%f0,%f12 ! f12 = z = x*x; ! if(t<0.000085) then ... ld [%l0+c000085],%l5 cmp %i0,%l5 bge 1f cmp %i4,1 bg 2f nop be 3f nop fmuld %f0,%f12,%f10 ! k = 0 ldd [%l0+c1_6],%f2 fmuld %f10,%f2,%f2 ba Treturn fsubd %f0,%f2,%f03: ldd [%l0+half],%f2 ! k = 1 fmuld %f2,%f12,%f10 ldd [%l0+one],%f0 ba Treturn fsubd %f0,%f10,%f02: cmp %i4,3 be 4f fmuld %f0,%f12,%f10 ! k = 2 ldd [%l0+c1_3],%f2 fmuld %f2,%f10,%f10 ba Treturn faddd %f0,%f10,%f04: ldd [%l0+half],%f4 ! k = 3 fmuld %f12,%f4,%f4 ! z*0.5 ldd [%l0+one],%f6 fsubd %f6,%f4,%f4 ! 1-z*0.5 ldd [%l0+c1_6],%f8 fmuld %f10,%f8,%f8 ! x*z*1/6 fsubd %f0,%f8,%f8 ! x - x*z*1/6 st %f4,[%i3] st %f5,[%i3+4] st %f8,[%i2] ba Treturn st %f9,[%i2+4]1: ! now 0.002246 <= |x| < 0.00085 bg 2f nop be 3f nop fmuld %f0,%f12,%f10 ! k = 0 ldd [%l0+c1_120],%f2 fmuld %f12,%f2,%f2 ldd [%l0+c1_6],%f4 fsubd %f4,%f2,%f2 fmuld %f10,%f2,%f2 ba Treturn fsubd %f0,%f2,%f03: ldd [%l0+c1_24],%f2 ! k = 1 fmuld %f12,%f2,%f2 ldd [%l0+half],%f4 fsubd %f4,%f2,%f2 fmuld %f12,%f2,%f2 ldd [%l0+one],%f0 ba Treturn fsubd %f0,%f2,%f02: cmp %i4,3 be 4f fmuld %f12,%f0,%f10 ! k = 2, f10 = x*z ldd [%l0+c2_15],%f2 fmuld %f12,%f2,%f2 ldd [%l0+c1_3],%f4 faddd %f4,%f2,%f2 fmuld %f10,%f2,%f2 ba Treturn faddd %f0,%f2,%f04: ldd [%l0+c1_120],%f2 ! k = 3 ldd [%l0+c1_24],%f4 fmuld %f12,%f2,%f2 ! f2 = z/120 ldd [%l0+c1_6],%f6 fsubd %f6,%f2,%f2 fmuld %f10,%f2,%f2 fsubd %f0,%f2,%f2 ! f2 = sin(x) fmuld %f12,%f4,%f4 ldd [%l0+half],%f6 fsubd %f6,%f4,%f4 fmuld %f12,%f4,%f4 ldd [%l0+one],%f0 st %f2,[%i2] st %f3,[%i2+4] fsubd %f0,%f4,%f4 ! f4 = cos(x) st %f4,[%i3] ba Treturn st %f5,[%i3+4]T2: mov 0,%l2 ! set n = 0 ldd [%fp+x],%f22 ! y1 = x ! if (t>pio4) then ... ld [%l0+pio4],%l5 cmp %i0,%l5 bl T3 nop bg 1f nop ld [%l0+pio4+4],%l5 cmp %i1,%l5 bleu T3 nop1: set base,%l4 set _fp_pi,%l3 ld [%l3],%l3 sll %l3,3,%l3 ! l3 = (_fp_pi)<<3 jmp %l4+%l3 nopbase: ba pi_inf nop ba pi_66 nop ba pi_53 noppi_inf: mov 1,%l1 ! j = 1 ld [%l0+pio2],%l5 cmp %i0,%l5 bg pi_inf_1 fabss %f0,%f0 ! now f0 = |x| bl 1f nop ld [%l0+pio2+4],%l5 cmp %i1,%l5 bgu pi_inf_1 nop1: ldd [%l0+pio2_1],%f2 fsubd %f0,%f2,%f4 ! z = |x| - pio2_1 ldd [%l0+pio2_1t],%f6 ! f6 = pio2_1t mov 1,%l2 ! n = 1 ld [%l0+ctiny1],%l4 fsubd %f4,%f6,%f22 ! y1 = z - pio2_1t st %f4,[%fp+t] ld [%fp+t],%l5 sethi %hi(0x80000000),%l3 andn %l5,%l3,%l5 cmp %l5,%l4 ble 2f nop fsubd %f4,%f22,%f8 ba 4f fsubd %f8,%f6,%f24 ! y2 = (z-y1)-pio2_1t2: ldd [%l0+pio2_2],%f8 fsubd %f4,%f8,%f4 ! z -= pio2_2 ldd [%l0+pio2_2t],%f6 ! f6 = pio2_2t fsubd %f4,%f6,%f22 st %f4,[%fp+t] ld [%fp+t],%l5 ld [%l0+ctiny2],%l4 andn %l5,%l3,%l5 cmp %l5,%l4 ble 3f nop fsubd %f4,%f22,%f8 ba 4f fsubd %f8,%f6,%f24 ! y2 = (z-y1)-pio2_2t3: ldd [%l0+pio2_3],%f8 fsubd %f4,%f8,%f4 ! z -= pio2_3 ldd [%l0+pio2_3t],%f6 fsubd %f4,%f6,%f22 ! y1 = z - pio2_3t fsubd %f4,%f22,%f8 fsubd %f8,%f6,%f24 ! y2 = (z-y1) -pio2_3t4: tst %i5 be T3 nop mov -1,%l2 ! n = -1 fnegs %f22,%f22 ba T3 fnegs %f24,%f24pi_inf_1: ld [%l0+medium],%l5 cmp %i0,%l5 ble 1f nop or %i0,%i5,%o0 ! call argred for huge argument mov %i1,%o1 add %fp,y1,%o2 call argred add %fp,y2,%o3 mov %o0,%l2 ldd [%fp+y1],%f22 ba T3 ldd [%fp+y2],%f241: ! else if(t<=medium) then ... ldd [%l0+invpio2],%f2 fmuld %f0,%f2,%f2 ldd [%l0+half],%f4 faddd %f4,%f2,%f2 fdtoi %f2,%f2 fitod %f2,%f4 ! f4 = double n st %f2,[%fp+n] ld [%fp+n],%l2 ldd [%l0+pio2_1],%f6 fmuld %f4,%f6,%f6 fsubd %f0,%f6,%f6 ! f6 = z = |x|-n*pio2_1 ldd [%l0+pio2_1t],%f8 fmuld %f4,%f8,%f8 ! f8 = w = n*pio2_1t sethi %hi(0x80000000),%l3 ld [%l0+ctiny1],%l5 fsubd %f6,%f8,%f22 ! y1 = z - w st %f6,[%fp+t] ld [%fp+t],%l4 andn %l4,%l3,%l4 cmp %l4,%l5 ble 2f nop fsubd %f6,%f22,%f24 ba 4f fsubd %f24,%f8,%f242: ldd [%l0+pio2_2],%f10 fmuld %f4,%f10,%f10 fsubd %f6,%f10,%f6 ! f6 = z -= n*pio2_2 ldd [%l0+pio2_2t],%f8 fmuld %f4,%f8,%f8 ! f8 = w = n*pio2_2t ld [%l0+ctiny2],%l5 fsubd %f6,%f8,%f22 ! y1 = z - w st %f6,[%fp+t] ld [%fp+t],%l4 andn %l4,%l3,%l4 cmp %l4,%l5 ble 3f nop fsubd %f6,%f22,%f24 ba 4f fsubd %f24,%f8,%f243: ldd [%l0+pio2_3],%f10 fmuld %f4,%f10,%f10 fsubd %f6,%f10,%f6 ! f6 = z -= n*pio2_3 ldd [%l0+pio2_3t],%f8 fmuld %f4,%f8,%f8 ! f8 = w = n*pio2_3t fsubd %f6,%f8,%f22 ! y1 = z - w fsubd %f6,%f22,%f24 fsubd %f24,%f8,%f244: tst %i5 be T3 nop sub %g0,%l2,%l2 ! n = -n fnegs %f22,%f22 ba T3 fnegs %f24,%f24pi_66: mov 1,%l1 ! j = 1 ld [%l0+pio2],%l5 cmp %i0,%l5 bg pi_66_1 fabss %f0,%f0 ! now f0 = |x| bl 1f nop ld [%l0+pio2+4],%l5 cmp %i1,%l5 bgu pi_66_1 nop1: ldd [%l0+pio2_1],%f2 fsubd %f0,%f2,%f4 ! z = |x| - pio2_1 ldd [%l0+pio2_2],%f6 ! f6 = pio2_2 mov 1,%l2 ! n = 1 fsubd %f4,%f6,%f22 ! y1 = z - pio2_2 fsubd %f4,%f22,%f24 fsubd %f24,%f6,%f24 ! y2 = (z-y1)-pio2_2; tst %i5 be T3 nop fnegs %f22,%f22 mov -1,%l2 ! n = -1 ba T3 fnegs %f24,%f24pi_66_1: ld [%l0+medium],%l5 cmp %i0,%l5 ble 1f nop or %i0,%i5,%o0 ! call argred for huge argument mov %i1,%o1 add %fp,y1,%o2 call argred add %fp,y2,%o3 mov %o0,%l2 ldd [%fp+y1],%f22 ba T3 ldd [%fp+y2],%f241: ! else if(t<=medium) then ... ldd [%l0+invpio2],%f2 fmuld %f0,%f2,%f2 ldd [%l0+half],%f4 faddd %f4,%f2,%f2 fdtoi %f2,%f2 fitod %f2,%f4 ! f4 = double n st %f2,[%fp+n] ld [%fp+n],%l2 ldd [%l0+pio2_1],%f6 fmuld %f4,%f6,%f6 fsubd %f0,%f6,%f6 ! f6 = z = |x|-n*pio2_1 ldd [%l0+pio2_2],%f8 fmuld %f4,%f8,%f8 ! f8 = w = n*pio2_2 fsubd %f6,%f8,%f22 ! y1 = z - w fsubd %f6,%f22,%f24 fsubd %f24,%f8,%f24 tst %i5 be T3 nop fnegs %f22,%f22 sub %g0,%l2,%l2 ! n = -n ba T3 fnegs %f24,%f24pi_53: ld [%l0+pio2],%l5 cmp %i0,%l5 bg pi_53_1 fabss %f0,%f0 ! now f0 = |x| bl 1f nop ld [%l0+pio2+4],%l5 cmp %i1,%l5 bgu pi_53_1 nop1: ldd [%l0+pio2],%f2 fsubd %f0,%f2,%f22 ! y1 = |x| - pio2 tst %i5 be T3 mov 1,%l2 mov -1,%l2 ba T3 fnegs %f22,%f22pi_53_1: ld [%l0+medium],%l5 cmp %i0,%l5 ble 1f nop or %i0,%i5,%o0 ! call argred for huge argument mov %i1,%o1 mov 1,%l1 ! set j=1 add %fp,y1,%o2 call argred add %fp,y2,%o3 mov %o0,%l2 ldd [%fp+y1],%f22 ba T3 ldd [%fp+y2],%f241: ! else if(t<=medium) then ... ldd [%l0+invpio2],%f2 fmuld %f0,%f2,%f2 ldd [%l0+half],%f4 faddd %f4,%f2,%f2 fdtoi %f2,%f2 fitod %f2,%f4 ! f4 = double n st %f2,[%fp+n] ld [%fp+n],%l2 ldd [%l0+pio2_1],%f6 fmuld %f4,%f6,%f6 fsubd %f0,%f6,%f6 ! f6 = z = |x|-n*pio2_1 ldd [%l0+pio2_1t5],%f8 fmuld %f4,%f8,%f8 ! f8 = w = n*pio2_1t5 fsubd %f6,%f8,%f22 ! y1 = z - w tst %i5 be T3 nop fnegs %f22,%f22 sub %g0,%l2,%l2 ! n = -n fnegs %f24,%f24T3: ! redefine local variable: ! f12 = z = y1*y1 ! l5 = _fp_pi<<6 fmuld %f22,%f22,%f12 set _fp_pi,%l5 ld [%l5],%l5 sll %l5,6,%l5 ! l5 = (_fp_pi)<<6 ! if(k<2) then ... (sin,cos) cmp %i4,2 bge T4 nop add %l2,%i4,%l2 ! n += k; ! if ((n&1)==0) then ... (sin) andcc %l2,1,%g0 bne T3_cos nop fmuld %f22,%f12,%f8 ! f8 = t = y1*z; set S,%l4 ! l4 = S add %l4,%l5,%l4 ! l4 = &S[m] ldd [%l4+40],%f4 ! f4 = S[m+5] fmuld %f12,%f4,%f4 ! f4 = z*S[m+5] ldd [%l4+32],%f6 ! f6 = S[m+4] faddd %f6,%f4,%f4 ! f4 = S[m+4]+z*S[m+5] fmuld %f12,%f4,%f4 ldd [%l4+24],%f2 ! f2 = S[m+3] faddd %f2,%f4,%f4 fmuld %f12,%f4,%f4 ldd [%l4+16],%f6 faddd %f6,%f4,%f4 fmuld %f12,%f4,%f4 ldd [%l4+8],%f2 faddd %f2,%f4,%f4 fmuld %f12,%f4,%f4 ldd [%l4],%f6 faddd %f6,%f4,%f4 ! f4 = ss = S[m]+ ... tst %l1 bne 1f nop ! j==0 fmuld %f8,%f4,%f4 ba 2f fsubd %f22,%f4,%f01: ! j!=0 fmuld %f24,%f12,%f0 ldd [%l0+half],%f2 fmuld %f2,%f0,%f0 fsubd %f24,%f0,%f0 fmuld %f8,%f4,%f4 fsubd %f4,%f0,%f0 fsubd %f22,%f0,%f02: andcc %l2,2,%g0 be Treturn nop ba Treturn fnegs %f0,%f0T3_cos: fmuld %f12,%f12,%f8 ! f8 = z*z set C,%l4 add %l5,%l4,%l4 ! l4 = &C[m] ldd [%l4+40],%f4 ! f4 = C[m+5] fmuld %f12,%f4,%f4 ! f4 = z*C[m+5] ldd [%l4+32],%f6 ! f6 = C[m+4] faddd %f6,%f4,%f4 ! f4 = C[m+4]+z*C[m+5] fmuld %f12,%f4,%f4 ldd [%l4+24],%f2 ! f2 = C[m+3] faddd %f2,%f4,%f4 fmuld %f12,%f4,%f4 ldd [%l4+16],%f6 faddd %f6,%f4,%f4 fmuld %f12,%f4,%f4 ldd [%l4+8],%f2 faddd %f2,%f4,%f4 fmuld %f12,%f4,%f4 ldd [%l4],%f6 faddd %f6,%f4,%f4 ! f4 = C[m] + ... fmuld %f8,%f4,%f4 ! f4 = cc = (z*z)*(C[m]+...) ldd [%l0+half],%f2 fmuld %f12,%f2,%f2 ! f2 = half*z tst %l1 be 1f nop fmuld %f22,%f24,%f26 fsubd %f4,%f26,%f4 ! f4 = cc -= y1*y21: std %f12,[%fp+z] ld [%l0+thresh1],%l3 ld [%fp+z],%l4 ! if(z>=thresh1) then ... cmp %l4,%l3 bl 3f nop bg 2f ld [%l0+thresh1+4],%l3 ld [%fp+z+4],%l4 cmp %l4,%l3 blu 3f nop2: ldd [%l0+c3_8],%f6 fsubd %f2,%f6,%f6 fsubd %f6,%f4,%f4
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -