|
|
1.1 ! root 1: ////////// ! 2: / libm 8087 ! 3: / exp(d), two() ! 4: ////////// ! 5: ! 6: #include "larges.h" ! 7: #include "ifno8087.h" ! 8: ! 9: .globl exp_ ! 10: .globl exp ! 11: .globl two ! 12: .globl floor ! 13: .globl cfcc87 ! 14: .globl erange ! 15: ! 16: ////////// ! 17: / double ! 18: / exp(d) ! 19: / double d; ! 20: / ! 21: / exp() is passed d on the 8087 stack and returns exp(d). ! 22: / Uses: exp(x) = 2 ^ (x * log base 2 of e). ! 23: / ! 24: / two() is passed d on the 8087 stack and returns 2^d. ! 25: ////////// ! 26: ! 27: d = RASIZE / arg offset ! 28: ! 29: exp_: ! 30: ifno8087(_exp_) ! 31: mov bx, sp ! 32: fdld Pss d(bx) / Load argument d. ! 33: ! 34: exp: / d ! 35: fldl2e / Load log base 2 of e. ! 36: fmul / d * log base 2 of e ! 37: ! 38: two: ! 39: ficom cs:maxexp ! 40: Gcall cfcc87 / Compare d to max exponent. ! 41: jbe 1f / d is not too big. ! 42: fstp st / Too big, pop d. ! 43: Gcall erange / Set errno to indicate out of range ! 44: fdld cs:infin / and return infinity. ! 45: Gret ! 46: ! 47: 1: ficom cs:minexp ! 48: Gcall cfcc87 / Compare d to min exponent. ! 49: jae 2f / d is not too small. ! 50: fstp st / Too small, pop d ! 51: fldz / and return 0. ! 52: Gret ! 53: ! 54: 2: fld st / d, d ! 55: Gcall floor / Round d down to int(d), d ! 56: fst st2 / int(d), d, int(d) ! 57: fsub / d-int(d) = fraction(d), int(d) ! 58: fdcom cs:half ! 59: Gcall cfcc87 / Compare fraction(d) to .5 ! 60: jbe 3f / fraction(d) <= .5, ok. ! 61: fdsub cs:half / Set fraction(d) -= .5. ! 62: ! 63: 3: f2xm1 / 2^fraction(d) - 1 ! 64: fld1 ! 65: fadd / 2^fraction(d) ! 66: jbe 4f / Was not >.5, ok as is. ! 67: fdmul cs:sqrt2 / 2^fr(d) = 2^(fr(d)-.5) * 2^.5 ! 68: ! 69: 4: fscale / Scale in the integer part ! 70: fstp st1 / and pop, leaving result. ! 71: Gret ! 72: ! 73: ////////// ! 74: / data ! 75: ////////// ! 76: sqrt2: .byte 0xCD, 0x3B, 0x7F, 0x66, 0x9E, 0xA0, 0xF6, 0x3F / sqrt(2.) ! 77: infin: .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x7F / infinity ! 78: half: .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x3F / .5 ! 79: maxexp: .word 1023 / maximum exponent ! 80: minexp: .word -1022 / minimum exponent
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.