Annotation of coherent/b/kernel/emulator/polynomial.S, revision 1.1

1.1     ! root        1: /*---------------------------------------------------------------------------+
        !             2:  |  polynomial.S                                                             |
        !             3:  |                                                                           |
        !             4:  | Fixed point arithmetic polynomial evaluation.                             |
        !             5:  |                                                                           |
        !             6:  | Copyright (C) 1992    W. Metzenthen, 22 Parker St, Ormond, Vic 3163,      |
        !             7:  |                       Australia.  E-mail [email protected]    |
        !             8:  |                                                                           |
        !             9:  | Call from C as:                                                           |
        !            10:  |   void polynomial(unsigned accum[], unsigned x[], unsigned terms[][2],    |
        !            11:  |                   int n)                                                  |
        !            12:  |                                                                           |
        !            13:  | Computes:                                                                 |
        !            14:  | terms[0] + (terms[1] + (terms[2] + ... + (terms[n-1]*x)*x)*x)*x) ... )*x  |
        !            15:  | The result is returned in accum.                                          |
        !            16:  |                                                                           |
        !            17:  +---------------------------------------------------------------------------*/
        !            18: 
        !            19:        .file   "fpolynom.s"
        !            20: 
        !            21: #include "fpu_asm.h"
        !            22: 
        !            23: 
        !            24: //     #define EXTRA_PRECISE
        !            25: 
        !            26: #define        TERM_SIZE       $8
        !            27: 
        !            28: 
        !            29: .text
        !            30:        .align 2,144
        !            31: .globl polynomial
        !            32: polynomial:
        !            33:        pushl   %ebp
        !            34:        movl    %esp,%ebp
        !            35:        subl    $32,%esp
        !            36:        pushl   %esi
        !            37:        pushl   %edi
        !            38:        pushl   %ebx
        !            39: 
        !            40:        movl    PARAM1,%esi             // accum
        !            41:        movl    PARAM2,%edi             // x
        !            42:        movl    PARAM3,%ebx             // terms
        !            43:        movl    PARAM4,%ecx             // n
        !            44: 
        !            45:        movl    TERM_SIZE,%eax
        !            46:        mull    %ecx
        !            47:        movl    %eax,%ecx
        !            48: 
        !            49:        movl    4(%ebx,%ecx,1),%edx     // terms[n]
        !            50:        movl    %edx,-20(%ebp)
        !            51:        movl    (%ebx,%ecx,1),%edx      // terms[n]
        !            52:        movl    %edx,-24(%ebp)          
        !            53:        xor     %eax,%eax
        !            54:        movl    %eax,-28(%ebp)
        !            55: 
        !            56:        subl    TERM_SIZE,%ecx
        !            57:        js      xL_accum_done
        !            58: 
        !            59: xL_accum_loop:
        !            60:        xor     %eax,%eax
        !            61:        movl    %eax,-4(%ebp)
        !            62:        movl    %eax,-8(%ebp)
        !            63: 
        !            64: #ifdef EXTRA_PRECISE
        !            65:        movl    -28(%ebp),%eax
        !            66:        mull    4(%edi)                 // x ms long
        !            67:        movl    %edx,-12(%ebp)
        !            68: #endif EXTRA_PRECISE
        !            69: 
        !            70:        movl    -24(%ebp),%eax
        !            71:        mull    (%edi)                  // x ls long
        !            72: //     movl    %eax,-16(%ebp)          // Not needed
        !            73:        addl    %edx,-12(%ebp)
        !            74:        adcl    $0,-8(%ebp)
        !            75: 
        !            76:        movl    -24(%ebp),%eax
        !            77:        mull    4(%edi)                 // x ms long
        !            78:        addl    %eax,-12(%ebp)
        !            79:        adcl    %edx,-8(%ebp)
        !            80:        adcl    $0,-4(%ebp)
        !            81: 
        !            82:        movl    -20(%ebp),%eax
        !            83:        mull    (%edi)
        !            84:        addl    %eax,-12(%ebp)
        !            85:        adcl    %edx,-8(%ebp)
        !            86:        adcl    $0,-4(%ebp)
        !            87: 
        !            88:        movl    -20(%ebp),%eax
        !            89:        mull    4(%edi)
        !            90:        addl    %eax,-8(%ebp)
        !            91:        adcl    %edx,-4(%ebp)
        !            92: 
        !            93: /* Now add the next term */
        !            94:        movl    (%ebx,%ecx,1),%eax
        !            95:        addl    %eax,-8(%ebp)
        !            96:        movl    4(%ebx,%ecx,1),%eax
        !            97:        adcl    %eax,-4(%ebp)
        !            98: 
        !            99: /* And put into the second register */
        !           100:        movl    -4(%ebp),%eax
        !           101:        movl    %eax,-20(%ebp)
        !           102:        movl    -8(%ebp),%eax
        !           103:        movl    %eax,-24(%ebp)
        !           104: 
        !           105: #ifdef EXTRA_PRECISE
        !           106:        movl    -12(%ebp),%eax
        !           107:        movl    %eax,-28(%ebp)
        !           108: #else
        !           109:        testb   $128,-25(%ebp)
        !           110:        je      xL_no_poly_round
        !           111: 
        !           112:        addl    $1,-24(%ebp)
        !           113:        adcl    $0,-20(%ebp)
        !           114: xL_no_poly_round:
        !           115: #endif EXTRA_PRECISE
        !           116: 
        !           117:        subl    TERM_SIZE,%ecx
        !           118:        jns     xL_accum_loop
        !           119: 
        !           120: xL_accum_done:
        !           121: #ifdef EXTRA_PRECISE
        !           122: /* And round the result */
        !           123:        testb   $128,-25(%ebp)
        !           124:        je      xL_poly_done
        !           125: 
        !           126:        addl    $1,-24(%ebp)
        !           127:        adcl    $0,-20(%ebp)
        !           128: #endif EXTRA_PRECISE
        !           129: 
        !           130: xL_poly_done:
        !           131:        movl    -24(%ebp),%eax
        !           132:        movl    %eax,(%esi)
        !           133:        movl    -20(%ebp),%eax
        !           134:        movl    %eax,4(%esi)
        !           135: 
        !           136:        popl    %ebx
        !           137:        popl    %edi
        !           138:        popl    %esi
        !           139:        leave
        !           140:        ret

unix.superglobalmegacorp.com

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