Annotation of coherent/b/lib/libm/i8087/log87.m, revision 1.1

1.1     ! root        1: //////////
        !             2: / libm 8087
        !             3: / log(x), log10(x), ylog2x
        !             4: //////////
        !             5: 
        !             6: #include "larges.h"
        !             7: #include "ifno8087.h"
        !             8: 
        !             9:        .globl  log10_
        !            10:        .globl  log_
        !            11:        .globl  ylog2x
        !            12:        .globl  cfcc87
        !            13:        .globl  tstcc
        !            14:        .globl  edomain
        !            15: 
        !            16: //////////
        !            17: / double
        !            18: / log(x)
        !            19: / double x;
        !            20: /
        !            21: / double
        !            22: / log10(x)
        !            23: / double x;
        !            24: /
        !            25: / ylog2x does the work for log functions and pow().
        !            26: / Passed args x, y on the 8087 stack,
        !            27: / it pops both and returns y * log base 2 of x on the 8087 stack.
        !            28: /
        !            29: / Useful identity:
        !            30: /       log base n of x = log base n of 2 * log base 2 of x.
        !            31: / Uses fyl2x, which requires x > 0.
        !            32: //////////
        !            33: 
        !            34: x      =       RASIZE          / arg offset
        !            35: 
        !            36: log10_:
        !            37:        ifno8087(_log10_)
        !            38:        fldlg2                  / Load y = log base 10 of 2.
        !            39:        jmp     1f
        !            40: 
        !            41: log_:
        !            42:        ifno8087(_log_)
        !            43:        fldln2                  / Load y = log base e of 2.
        !            44: 
        !            45: 1:     mov     bx, sp
        !            46:        fdld    Pss x(bx)       / Load argument x.
        !            47: 
        !            48: ylog2x:                                / x, y
        !            49:        Gcall   tstcc           / Check sign of x.
        !            50:        ja      2f              / x > 0., ok.
        !            51:        fstp    st              / x <= 0, pop y.
        !            52:        Gjmp    edomain         / Issue EDOM error and return 0.
        !            53: 
        !            54: 2:
        !            55: //////////
        !            56: / The code below uses
        !            57: /      fyl2x   if d <= 1 or d >= 2-sqrt(2)/2,
        !            58: /      fyl2xp1 if 1 < d < 2-sqrt(2)/2.
        !            59: / Since the precision fyl2xp1 purports to save is already lost,
        !            60: / this appears to make no difference in the result.
        !            61: / The code is commented out for now and should be removed eventually.
        !            62: /      fdcom   cs:near1
        !            63: /      Gcall   cfcc87          / Compare d to 2+sqrt(2)/2.
        !            64: /      jae     4f              / d >= 2+sqrt(2)/2, use fyl2x.
        !            65: /      fld1                    / Load 1.
        !            66: /      fcom
        !            67: /      Gcall   cfcc87          / Compare 1 to d.
        !            68: /      jae     3f              / 1 >= d, use fyl2x.
        !            69: /      fsub                    / d = d-1 and pop off the 1.
        !            70: /      fyl2xp1                 / result = y * log base 2 of d+1.
        !            71: /      Gret
        !            72: /
        !            73: /3:    fstp    st              / Pop off the 1.
        !            74: /
        !            75: /4:
        !            76: //////////
        !            77:        fyl2x                   / result = y * log base 2 of x.
        !            78:        Gret
        !            79: 
        !            80: //////////
        !            81: / Commented out as above...
        !            82: /near1:        .byte   0x1A, 0x62, 0xC0, 0xCC, 0xB0, 0xAF, 0xF4, 0x3F  / 2 - sqrt(2)/2
        !            83: //////////

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.