📄 exp.s
字号:
.seg "data" .asciz "@(#)exp.S 1.1 92/07/30 SMI"#define LOCORE#include <machine/asm_linkage.h>! Copyright (c) 1989 by Sun Microsystems, Inc.!! double exp(x) ! Algorithm see libm/C/exp.c.! -- K.C. NG (kcng@kcng)!! local variable using fp indexx = -0x8tmp = -0x10k = -0x18 ! local usage of register! i0 input high x! i1 input low x! i2 high |x|! i3 k! i4 j! i5 m! f8 hi! f10 lo .seg "text" .global _SVID_libm_err ENTRY(exp) save %sp,-0xb0,%sp std %i0,[%fp+x] set constant,%l0 ldd [%fp+x],%f0 sethi %hi(0x80000000),%i2 andn %i0,%i2,%i2 ! i2 = high |x| sethi %hi(0x7ff00000),%o0 cmp %i2,%o0 bl finite ld [%l0+ln2_64],%l4 ! x is not finite andn %i2,%o0,%o1 orcc %o1,%i1,%g0 bne TNaN nop! faddd %f0,%f0,%f0 ! NaN+NaN tst %i0 bge exit ! return x when x = inf nop ba exit ldd [%l0+zero],%f0 ! return 0.0 when x = -inffinite: cmp %i2,%l4 ble T1 ! sethi %hi(0x3ed00000),%l4 ! 2**-18 ! if |x| >= ln2/64 ld [%l0+ln2_onehalf],%l4 mov 0,%i3 ! set k = 0 cmp %i2,%l4 bl,a 8f ld [%l0+ln2_2],%l4 bg,a 2f tst %i0 ld [%l0+ln2_onehalf+4],%l4 cmp %i1,%l4 bgu,a 2f tst %i0 ld [%l0+ln2_2],%l48: cmp %i2,%l4 bg,a 9f tst %i0 bl 7f nop ld [%l0+ln2_2+4],%l4 cmp %i2,%l4 bleu 7f nop9: ! now ln2/2 <= |x| < 1.5*ln2 bl 1f ldd [%l0+ln2hi],%f2 fsubd %f0,%f2,%f8 ldd [%l0+ln2lo],%f10 fsubd %f8,%f10,%f0 ! x>0: f0 = x - ln2 ba 7f mov 1,%i3 ! k = 11: ldd [%l0+ln2hi],%f2 faddd %f0,%f2,%f8 ldd [%l0+ln2lo],%f10 faddd %f8,%f10,%f0 ! x<0: f0 = x + ln2 mov -1,%i3 ! k = -1 fnegs %f10,%f107: fmuld %f0,%f0,%f2 ! f2 = t = z*z ldd [%l0+p5],%f4 fmuld %f2,%f4,%f4 ! f4 = t*p5 ldd [%l0+p4],%f6 faddd %f6,%f4,%f4 ! f4 = p4+t*p5 fmuld %f2,%f4,%f4 ldd [%l0+p3],%f6 faddd %f6,%f4,%f4 fmuld %f2,%f4,%f4 ldd [%l0+p2],%f6 faddd %f6,%f4,%f4 ldd [%l0+two],%f14 ! f14 = 2.0 fmuld %f2,%f4,%f4 ldd [%l0+p1],%f6 faddd %f6,%f4,%f4 fmuld %f2,%f4,%f4 fsubd %f0,%f4,%f4 ! f4 = c = z - t*(p1+...) cmp %i3,0 bne 1f nop ! k = 0 fmuld %f0,%f4,%f2 ! f2 = z*c fsubd %f4,%f14,%f14 ! f14 = c-2 fdivd %f2,%f14,%f14 ! f14 = (z*c)/(c-2) fsubd %f14,%f0,%f0 ldd [%l0+one],%f2 ba exit fsubd %f2,%f0,%f01: ! f8=ho, f10=lo fmuld %f0,%f4,%f2 ! f2 = z*c fsubd %f14,%f4,%f14 ! f14 = 2-c fdivd %f2,%f14,%f14 ! f14 = (z*c)/(2-c) fsubd %f10,%f14,%f14 ldd [%l0+one],%f2 fsubd %f14,%f8,%f14 fsubd %f2,%f14,%f0 cmp %i3,1 be,a exit faddd %f0,%f0,%f0 ld [%l0+half],%f2 ba exit fmuld %f2,%f0,%f02: bg,a 1f ld [%l0+threshold1],%l4 ld [%l0+threshold2],%l41: cmp %i2,%l4 bl,a 2f ldd [%l0+invln2_32],%f2 bg 3f tst %i0 bg,a 1f ld [%l0+threshold1+4],%l4 ld [%l0+threshold2+4],%l4 ! check lower half of x1: cmp %i1,%l4 bleu,a 2f ldd [%l0+invln2_32],%f2 tst %i03: ! |x| > threshold bg xflow ! overflow mov 6,%o4 bl xflow ! underflow mov 7,%o42: ! ln2_onehalf <= |x| <= threshold fmuld %f0,%f2,%f4 ! invln2_32*x ldd [%l0+half],%f6 tst %i0 bg,a 1f faddd %f4,%f6,%f4 fsubd %f4,%f6,%f41: fdtoi %f4,%f4 fitod %f4,%f6 ! f6 = t = (double) k st %f4,[%fp+k] ldd [%l0+ln2_32hi],%f8 fmuld %f6,%f8,%f8 ld [%fp+k],%i3 and %i3,0x1f,%i4 ! i4 = j = k&0x1f fsubd %f0,%f8,%f8 ! f8 = hi = x-t*ln2_32hi ldd [%l0+ln2_32lo],%f10 fmuld %f6,%f10,%f10 ! f10 = lo = t*ln2_32lo sra %i3,5,%i5 ! i5 = m = k>>5 ba primary fsubd %f8,%f10,%f0 ! f0 = hi - loT1: cmp %i2,%l4 ! l4 = 2**-18 bge 2f sethi %hi(0x3e300000),%l4 ! 2**-28 ldd [%l0+huge],%f2 faddd %f0,%f2,%f2 ! raise inexact flag if x != 0 cmp %i2,%l4 bge 1f ldd [%l0+one],%f4 ! |x| < 2**-28 return 1+x ba exit faddd %f0,%f4,%f01: ! 2**-28 <= |x| < 2**-18, return 1+x*(1+0.5*x) ldd [%l0+half],%f6 fmuld %f0,%f6,%f6 faddd %f4,%f6,%f6 fmuld %f0,%f6,%f6 ba exit faddd %f4,%f6,%f02: mov 0,%i4 mov 0,%i5primary: fmuld %f0,%f0,%f2 ! f2 = t = z*z sll %i4,3,%i4 ! j = j<<3 ldd [%l0+t2],%f4 fmuld %f2,%f4,%f4 ! f4 = t*t2 ldd [%l0+t1],%f6 faddd %f6,%f4,%f4 ! f4 = t1+t*t2 set S,%l1 fmuld %f2,%f4,%f4 ! f4 = t*(t1+t*t2) set S2,%l2 fsubd %f0,%f4,%f4 ! f4 = z - t*(t1+t*t2) ldd [%l0+two],%f6 fsubd %f4,%f6,%f4 ! f4 = (z - t*(t1+t*t2)) - 2.0 ldd [%l2+%i4],%f8 fmuld %f0,%f8,%f8 ! f8 = S2[j]*z set S_trail,%l3 fdivd %f8,%f4,%f4 ! f4 = f8/f4 ldd [%l3+%i4],%f6 ! f6 = S_trail[j] fsubd %f4,%f6,%f4 ! f4 = f4 - f6 ldd [%l1+%i4],%f8 fsubd %f8,%f4,%f0 ! f0 = S[j]-f4 tst %i5 be exit cmp %i5,-1021 bl,a subnormal add %i5,54,%i5 ! normal output sll %i5,20,%i5 st %f0,[%fp+tmp] ld [%fp+tmp],%l4 add %i5,%l4,%l4 st %l4,[%fp+tmp] ba exit ld [%fp+tmp],%f0subnormal: sll %i5,20,%i5 st %f0,[%fp+tmp] ld [%fp+tmp],%l4 add %i5,%l4,%l4 st %l4,[%fp+tmp] ld [%fp+tmp],%f0 ldd [%l0+twom54],%f2 fmuld %f2,%f0,%f0exit: ret restorexflow: mov %i0,%o0 mov %i0,%o2 mov %i1,%o1 call _SVID_libm_err mov %i1,%o3 ba exit nopTNaN: ! ba exit ! faddd %f0,%f0,%f0 ! trigger invalid if x is sNaN ! rewrite to avoid kernel trap when TEM=RD=0 set 0x00080000,%l5 andcc %l5,%i0,%g0 bne exit ! quiet NaN nop or %l5,%i0,%i0 ! change to quiet NaN st %fsr,[%fp+tmp] ld [%fp+tmp],%l4 set 0xcf800000,%l5 andcc %l4,%l5,%g0 bne 1f nop ! signaling NaN set 0x210,%l5 or %l5,%l4,%l4 st %l4,[%fp+tmp] ld [%fp+tmp],%fsr st %i0,[%fp+x] ba exit ldd [%fp+x],%f01: ! standard way to treat NaN ba exit faddd %f0,%f0,%f0 .seg "data" .align 8constant:threshold1 = 0x00 .word 0x40862E42,0xFEFA39EF ! exp(x>threshold1)overflowthreshold2 = 0x08 .word 0x40874910,0xD52D3051 ! exp(x<-threshold1)underflowln2_onehalf = 0x10 .word 0x3FF0A2B2,0x3F3BAB73 ! 1.5*ln2 choppedln2 = 0x18 .word 0x3fe62e42,0xfefa39ef ! ln2 choppedln2_2 = 0x20 .word 0x3fd62e42,0xfefa39ef ! ln2/2 choppedln2hi = 0x28 .word 0x3fe62e42,0xfee00000 ! ln2hiln2lo = 0x30 .word 0x3dea39ef,0x35793c76 ! ln2lotwo = 0x38 .double 0r2.0one = 0x40 .double 0r1.0half = 0x48 .double 0r0.5p1 = 0x50 .word 0x3fc55555,0x5555553ep2 = 0x58 .word 0xbf66c16c,0x16bebd93p3 = 0x60 .word 0x3f11566a,0xaf25de2cp4 = 0x68 .word 0xbebbbd41,0xc5d26bf1p5 = 0x70 .word 0x3e663769,0x72bea4d0invln2 = 0x78 .word 0x3ff71547,0x652b82fetwom54 = 0x80 .word 0x3c900000,0x00000000zero = 0x88 .word 0x0,0x0huge = 0x90 .double 0r1.0e30ln2_64 = 0x98 .word 0x3f862e42,0xfefa39efln2_32hi= 0xa0 .word 0x3f962e42,0xfee00000ln2_32lo= 0xa8 .word 0x3d9a39ef,0x35793c76invln2_32 = 0xb0 .word 0x40471547,0x652b82fetwom18 = 0xb8 .word 0x3ed00000,0x0twom28 = 0xc0 .word 0x3e300000,0x0t1 = 0xc8 .word 0x3fc55555,0x55551e29t2 = 0xd0 .word 0xbf66c166,0x4a3720a8S: .word 0x3ff00000,0x0 .word 0x3ff059b0,0xd3158574 .word 0x3ff0b558,0x6cf9890f .word 0x3ff11301,0xd0125b51 .word 0x3ff172b8,0x3c7d517b .word 0x3ff1d487,0x3168b9aa .word 0x3ff2387a,0x6e756238 .word 0x3ff29e9d,0xf51fdee1 .word 0x3ff306fe,0xa31b715 .word 0x3ff371a7,0x373aa9cb .word 0x3ff3dea6,0x4c123422 .word 0x3ff44e08,0x6061892d .word 0x3ff4bfda,0xd5362a27 .word 0x3ff5342b,0x569d4f82 .word 0x3ff5ab07,0xdd485429 .word 0x3ff6247e,0xb03a5585 .word 0x3ff6a09e,0x667f3bcd .word 0x3ff71f75,0xe8ec5f74 .word 0x3ff7a114,0x73eb0187 .word 0x3ff82589,0x994cce13 .word 0x3ff8ace5,0x422aa0db .word 0x3ff93737,0xb0cdc5e5 .word 0x3ff9c491,0x82a3f090 .word 0x3ffa5503,0xb23e255d .word 0x3ffae89f,0x995ad3ad .word 0x3ffb7f76,0xf2fb5e47 .word 0x3ffc199b,0xdd85529c .word 0x3ffcb720,0xdcef9069 .word 0x3ffd5818,0xdcfba487 .word 0x3ffdfc97,0x337b9b5f .word 0x3ffea4af,0xa2a490da .word 0x3fff5076,0x5b6e4540S_trail: .word 0x0,0x0 .word 0x3c8d73e2,0xa475b465 .word 0x3c98a62e,0x4adc610a .word 0xbc96c510,0x39449b3a .word 0xbc819041,0xb9d78a76 .word 0x3c9e016e,0xa2643c .word 0x3c99b07e,0xb6c70573 .word 0x3c8612e8,0xafad1255 .word 0x3c86f46a,0xd23182e4 .word 0xbc963aea,0xbf42eae2 .word 0x3c8ada09,0x11f09ebc .word 0x3c489b7a,0x4ef80d0 .word 0x3c7d4397,0xafec42e2 .word 0xbc807abe,0x1db13cac .word 0x3c96324c,0x54647ad .word 0xbc9383c1,0x7e40b497 .word 0xbc9bdd34,0x13b26456 .word 0xbc816e47,0x86887a99 .word 0xbc841577,0xee04992f .word 0xbc9d4c1d,0xd41532d8 .word 0x3c96e9f1,0x56864b27 .word 0xbc675fc7,0x81b57ebc .word 0x3c7c7c46,0xb071f2be .word 0xbc9d2f6e,0xdb8d41e1 .word 0x3c97a1cd,0x345dcc81 .word 0xbc75584f,0x7e54ac3b .word 0x3c811065,0x895048dd .word 0x3c7503cb,0xd1e949db .word 0x3c82ed02,0xd75b3706 .word 0xbc91a5cd,0x4f184b5c .word 0xbc9e9c23,0x179c2893 .word 0x3c99d3e1,0x2dd8a18b .align 8S2: .word 0x40000000,0x0 .word 0x400059b0,0xd3158574 .word 0x4000b558,0x6cf9890f .word 0x40011301,0xd0125b51 .word 0x400172b8,0x3c7d517b .word 0x4001d487,0x3168b9aa .word 0x4002387a,0x6e756238 .word 0x40029e9d,0xf51fdee1 .word 0x400306fe,0xa31b715 .word 0x400371a7,0x373aa9cb .word 0x4003dea6,0x4c123422 .word 0x40044e08,0x6061892d .word 0x4004bfda,0xd5362a27 .word 0x4005342b,0x569d4f82 .word 0x4005ab07,0xdd485429 .word 0x4006247e,0xb03a5585 .word 0x4006a09e,0x667f3bcd .word 0x40071f75,0xe8ec5f74 .word 0x4007a114,0x73eb0187 .word 0x40082589,0x994cce13 .word 0x4008ace5,0x422aa0db .word 0x40093737,0xb0cdc5e5 .word 0x4009c491,0x82a3f090 .word 0x400a5503,0xb23e255d .word 0x400ae89f,0x995ad3ad .word 0x400b7f76,0xf2fb5e47 .word 0x400c199b,0xdd85529c .word 0x400cb720,0xdcef9069 .word 0x400d5818,0xdcfba487 .word 0x400dfc97,0x337b9b5f .word 0x400ea4af,0xa2a490da .word 0x400f5076,0x5b6e4540 .seg "text"
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -