|
|
1.1 ! root 1: ////////// ! 2: / /usr/src/libm/i387/exp87.s ! 3: / i387 mathematics library ! 4: / exp(d), _two() ! 5: ////////// ! 6: ! 7: RASIZE = 4 ! 8: ! 9: .globl exp ! 10: .globl _exp ! 11: .globl _two ! 12: .globl _floor ! 13: .globl _cfcc ! 14: .globl _erange ! 15: ! 16: ////////// ! 17: / double ! 18: / exp(d) ! 19: / double d; ! 20: / ! 21: / _exp() takes d on the NDP stacktop %st and returns exp(d). ! 22: / Uses: exp(x) = 2 ^ (x * log base 2 of e). ! 23: / ! 24: / _two() takes d on the NDP stacktop %st and returns 2^d. ! 25: ////////// ! 26: ! 27: d = RASIZE / arg offset ! 28: ! 29: exp: ! 30: fldl d(%esp) / Load argument d. ! 31: ! 32: _exp: / d ! 33: fldl2e / Load log base 2 of e. ! 34: fmul / d * log base 2 of e ! 35: ! 36: _two: ! 37: ficoms maxexp ! 38: call _cfcc / Compare d to max exponent. ! 39: jbe ?1 / d is not too big. ! 40: fstp %st / Too big, pop d. ! 41: call _erange / Set errno to indicate out of range ! 42: fldl infin / and return infinity. ! 43: ret ! 44: ! 45: ?1: ! 46: ficoms minexp ! 47: call _cfcc / Compare d to min exponent. ! 48: jae ?2 / d is not too small. ! 49: fstp %st / Too small, pop d ! 50: fldz / and return 0. ! 51: ret ! 52: ! 53: ?2: ! 54: fld %st / d, d ! 55: call _floor / Round d down to int(d), d ! 56: fst %st(2) / int(d), d, int(d) ! 57: fsubr / d-int(d) = fraction(d), int(d) ! 58: fcoml half ! 59: call _cfcc / Compare fraction(d) to .5 ! 60: jbe ?3 / fraction(d) <= .5, ok. ! 61: fsubl half / Set fraction(d) -= .5. ! 62: ! 63: ?3: ! 64: f2xm1 / 2^fraction(d) - 1 ! 65: fld1 ! 66: fadd / 2^fraction(d) ! 67: jbe ?4 / Was not >.5, ok as is. ! 68: fmull sqrt2 / 2^fr(d) = 2^(fr(d)-.5) * 2^.5 ! 69: ! 70: ?4: ! 71: fscale / Scale in the integer part ! 72: fstp %st(1) / and pop, leaving result. ! 73: ret ! 74: ! 75: ////////// ! 76: / Data. ! 77: ////////// ! 78: sqrt2: .byte 0xCD, 0x3B, 0x7F, 0x66, 0x9E, 0xA0, 0xF6, 0x3F / sqrt(2.) ! 79: infin: .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x7F / infinity ! 80: half: .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x3F / .5 ! 81: maxexp: .word 1023 / maximum exponent ! 82: minexp: .word -1022 / minimum exponent ! 83: ! 84: / end of exp87.s
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.