📄 r_exp_.s
字号:
.seg "data" .asciz "@(#)r_exp_.S 1.1 92/07/30 SMI"#define LOCORE#include <machine/asm_linkage.h>! Copyright (c) 1989 by Sun Microsystems, Inc.!! single exp(x) float *x;! Code by K.C. Ng (based on libm/R/r_exp_.c), April 7, 1987! revised on Feb 22, 1989 (using table look-up scheme).!! variables in fpofsr = -8tmp = -16 .global _scalbn .seg "text" ENTRY(r_exp_) save %sp,-120,%sp set constant,%l0 ld [%i0],%f0 ! f0 = x ld [%i0],%o0 ! o0 = x sethi %hi(0x80000000),%o1 ! o1 = 0x80000000 andn %o0,%o1,%o1 ! o1 = |x| set 0x3EB17218,%o2 ! o2 = 0.5*ln2 cmp %o1,%o2 ! |x| < 0.5*ln2 ? bl small sethi %hi(0x3b000000),%o3 ! o3 = 2**-9 ! |x| >= 0.5*ln2 set %hi(0x42b00000),%o3 ! o3 = 88.0 cmp %o1,%o3 bl,a finite ld [%l0+invln2_32],%f2 set 0x42cff1b4,%o3 cmp %o1,%o3 bg exception nop set 0x42b17218,%o3 cmp %o0,%o3 bl,a finite ld [%l0+invln2_32],%f2exception: sethi %hi(0x7f800000),%o3 cmp %o0,%o3 be exit ! exp(inf)=inf, no exception cmp %o1,%o3 be,a exit ! exp(-inf) = 0, no exception ld [%l0+fzero],%f0 st %fsr,[%fp+ofsr] ld [%fp+ofsr],%i1 andn %i1,0x1f,%i1 ! clear cexc sethi %hi(0xce800000),%i2 andcc %i1,%i2,%g0 ! see if RD=0 and no trap on ! on invalid, over, underflow, inexact be fastexception cmp %o1,%o3 bg,a exit ! return NaN+NaN fadds %f0,%f0,%f0 ldd [%l0+huge],%f2 ldd [%l0+tiny],%f4 tst %o0 bg,a exit fdtos %f2,%f0 ! overflow ba exit fdtos %f4,%f0 ! underflowfastexception: sethi %hi(0x7fc00000),%o4 ! qNaN cmp %o1,%o4 bge exit ! return qNaN with no exception cmp %o1,%o3 bl xflow tst %o0 ! sNaN, set aexc and cexc and return quiet(sNaN) or %i1,0x210,%i1 st %i1,[%fp+ofsr] ld [%fp+ofsr],%fsr set 0x00400000,%o5 or %o5,%o0,%o0 st %o0,[%fp+tmp] ba exit ld [%fp+tmp],%f0xflow: bl uflow nop ! overflow or %i1,0x129,%i1 st %i1,[%fp+ofsr] ld [%fp+ofsr],%fsr st %o3,[%fp+tmp] ba exit ld [%fp+tmp],%f0uflow: or %i1,0xa5,%i1 st %i1,[%fp+ofsr] ld [%fp+ofsr],%fsr st %o3,[%fp+tmp] ba exit ld [%l0+fzero],%f0finite: ! result is finite ! f0 = x, f2 = invln2_32 fmuls %f0,%f2,%f2 ! tst %o0 bg,a 1f ld [%l0+fhalf],%f4 ld [%l0+mfhalf],%f41: fadds %f2,%f4,%f2 fstoi %f2,%f6 fitod %f6,%f8 st %f6,[%fp+tmp] ldd [%l0+ln2_32],%f10 fmuld %f10,%f8,%f10 ! f10 = k*ln2_32 ld [%fp+tmp],%i3 ! i3 = k fstod %f0,%f0 and %i3,0x1f,%i4 ! i4 = j = k&0x1f sra %i3,5,%i5 ! i5 = m = k>>5 fsubd %f0,%f10,%f0 ! f0 = r ldd [%l0+a2],%f8 fmuld %f8,%f0,%f10 ldd [%l0+a1],%f6 faddd %f6,%f10,%f10 sll %i4,3,%i4 ! j <<3 set Sexp,%o3 fmuld %f0,%f10,%f10 ldd [%l0+one],%f4 faddd %f4,%f10,%f10 ldd [%o3+%i4],%f12 ! f12 = Sexp[j] fmuld %f0,%f10,%f10 ld [%o3+%i4],%o3 sll %i5,20,%i5 ! i5 = m<<20 faddd %f4,%f10,%f10 add %i5,%o3,%o3 ! o3 = 2^m * Sexp[j] st %o3,[%fp+tmp] ld [%fp+tmp],%f12 fmuld %f12,%f10,%f10 fdtos %f10,%f0exit: ret restoresmall: cmp %o1,%o3 ble two_m9 sethi %hi(0x38800000),%o3 ! 2**-14 sethi %hi(0x3c800000),%o3 ! 2**-6 cmp %o1,%o3 bl,a two_m6 ld [%l0+p2],%f2 ! 2**-6 <= |x| < 0.5*ln2, use long poly fmuls %f0,%f0,%f8 ld [%l0+p5],%f2 fmuls %f0,%f2,%f4 ld [%l0+p4],%f6 fadds %f6,%f4,%f4 fmuls %f0,%f4,%f4 ld [%l0+p3],%f2 fadds %f2,%f4,%f4 fmuls %f0,%f4,%f4 ld [%l0+p2],%f6 fadds %f6,%f4,%f4 fmuls %f0,%f4,%f4 ld [%l0+p1],%f2 fadds %f2,%f4,%f4 fmuls %f8,%f4,%f4 fadds %f0,%f4,%f4 ld [%l0+fone],%f6 ba exit fadds %f6,%f4,%f0two_m6: fmuls %f0,%f2,%f4 ld [%l0+p1],%f6 fadds %f6,%f4,%f4 ld [%l0+fone],%f2 fmuls %f0,%f4,%f4 fadds %f2,%f4,%f4 fmuls %f0,%f4,%f4 ba exit fadds %f2,%f4,%f0two_m9: cmp %o1,%o3 ble two_m14 nop ld [%l0+fhalf],%f2 fmuls %f0,%f2,%f2 ld [%l0+fone],%f4 fadds %f4,%f2,%f2 fmuls %f0,%f2,%f2 ba exit fadds %f4,%f2,%f0two_m14: ld [%l0+fone],%f4 ba exit fadds %f4,%f0,%f0 .seg "data" .align 8constant:invln2 = 0x00 .double 0r1.44269504088896338700ln2 = 0x08 .double 0r6.93147180559945286227e-01half = 0x10 .double 0r0.5a1 = 0x18 .word 0x3fe00008,0x80000000a2 = 0x20 .word 0x3fc5555d,0x80000000ln2_32 = 0x28 .word 0x3f962e42,0xfefa39eftiny = 0x30 .word 0x2b2bff2e,0xe48e0530huge = 0x38 .word 0x54b249ad,0x2594c37dfzero = 0x40 .single 0r0.0fone = 0x44 .single 0r1.0fhalf = 0x48 .word 0x3f000000mfhalf = 0x4c .word 0xbf000000invln2_32 = 0x50 .word 0x4238aa3bp1 = 0x54 .single 0r5.00000009512921380000e-01p2 = 0x58 .single 0r1.66665188973472840000e-01p3 = 0x5c .single 0r4.16662059758234840000e-02p4 = 0x60 .single 0r8.36888310539362950000e-03p5 = 0x64 .single 0r1.39504796300460640000e-03one = 0x68 .word 0x3ff00000,0x0 .seg "data" .align 8Sexp: .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,0xb03a5584 .word 0x3ff6a09e,0x667f3bcc .word 0x3ff71f75,0xe8ec5f74 .word 0x3ff7a114,0x73eb0187 .word 0x3ff82589,0x994cce13 .word 0x3ff8ace5,0x422aa0dc .word 0x3ff93737,0xb0cdc5e5 .word 0x3ff9c491,0x82a3f090 .word 0x3ffa5503,0xb23e255c .word 0x3ffae89f,0x995ad3ae .word 0x3ffb7f76,0xf2fb5e47 .word 0x3ffc199b,0xdd85529c .word 0x3ffcb720,0xdcef9069 .word 0x3ffd5818,0xdcfba487 .word 0x3ffdfc97,0x337b9b5f .word 0x3ffea4af,0xa2a490da .word 0x3fff5076,0x5b6e4540 .seg "text"
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -