Annotation of coherent/b/lib/libm/i387/pow87.s, revision 1.1.1.1

1.1       root        1: //////////
                      2: / /usr/src/libm/i387/pow87.s
                      3: / i387 mathematics library
                      4: / pow(x, y)
                      5: //////////
                      6: 
                      7: RASIZE =       4
                      8: 
                      9:        .globl  pow
                     10:        .globl  _pow
                     11:        .globl  _two
                     12:        .globl  _ylog2x
                     13:        .globl  _cfcc
                     14:        .globl  _tstcc
                     15:        .globl  _edomain
                     16: 
                     17: //////////
                     18: / double
                     19: / pow(x, y)
                     20: / double x, y;
                     21: /
                     22: / _pow takes x, y on the  NDP stack.
                     23: //////////
                     24: x      =       RASIZE          / x arg offset
                     25: y      =       RASIZE+8        / y arg offset
                     26: 
                     27: pow:
                     28:        fldl    y(%esp)         / Load argument y.
                     29:        fldl    x(%esp)         / Load argument x.
                     30: 
                     31: _pow:                          / x, y
                     32:        call    _tstcc          / Test if x == 0.
                     33:        je      ?0              / x is zero.
                     34:        jb      ?1              / x is negative.
                     35:        subl    %eax, %eax      / x is positive, clear ZF flag
                     36:        jmp     ?4              / to indicate result sign positive.
                     37: 
                     38: ?0:
                     39:        fxch                    / y, 0
                     40:        call    _tstcc          / Compare y to 0.
                     41:        fstp    %st             / Pop y, leaving 0.
                     42:        jbe     ?2              / y <= 0, issue EDOM error and return 0.
                     43:        ret                     / y > 0, return 0.
                     44: 
                     45: ?1:
                     46:        fld     %st(1)          / y, x, y with x negative.
                     47:        call    tstintp         / Test if y is integral and pop.
                     48:        je      ?3              / y is integral.
                     49:        fstp    %st             / y is nonintegral, pop x
                     50: ?2:
                     51:        jmp     _edomain        / and issue EDOM error and return.
                     52: 
                     53: ?3:
                     54:        fchs                    / x is negative, force it positive.
                     55:        fld1                    / 1, x, y
                     56:        fadd    %st, %st        / 2, x, y
                     57:        fdivr   %st, %st(2)     / y/2, x, y
                     58:        call    tstintp         / Test if y/2 is integral.
                     59: 
                     60: / At 4:, ZF flag contains the desired result sign.
                     61: / The NDP stack contains abs(x), y.
                     62: ?4:
                     63:        pushf                   / Save the flags.
                     64:        call    _ylog2x         / y * log base 2 of x
                     65:        call    _two            / 2 ^ (y * log base 2 of x) = x ^ y
                     66:        popf                    / Restore the flags.
                     67:        je      ?5              / No sign change, done.
                     68:        fchs                    / Flip the result sign.
                     69: 
                     70: ?5:
                     71:        ret
                     72: 
                     73: //////////
                     74: / tstintp tests whether the NDP stacktop %st contains
                     75: / an integral value and sets ZF flag accordingly.
                     76: / It pops the NDP stack before returning.
                     77: / This works with any of the four NDP rounding modes.
                     78: //////////
                     79: tstintp:                       / x
                     80:        fld     %st             / x, x
                     81:        frndint                 / int(x), x
                     82:        fcompp                  / Compare int(x) to x and pop both.
                     83:        jmp     _cfcc           / Load condition codes and return.
                     84: 
                     85: / end of pow87.s

unix.superglobalmegacorp.com

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