Annotation of coherent/b/kernel/emulator/poly_mul64.S, revision 1.1.1.1

1.1       root        1: /*---------------------------------------------------------------------------+
                      2:  |  poly_mul64.S                                                             |
                      3:  |                                                                           |
                      4:  | Multiply two 64 bit integers.                                             |
                      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 mul64(long long *a, long long *b, long long *result)               |
                     11:  |                                                                           |
                     12:  +---------------------------------------------------------------------------*/
                     13: 
                     14: 
                     15: #include "fpu_asm.h"
                     16: 
                     17: .text
                     18:        .align 2,144
                     19: .globl mul64
                     20: mul64:
                     21:        pushl %ebp
                     22:        movl %esp,%ebp
                     23:        subl $16,%esp
                     24:        pushl %esi
                     25:        pushl %ebx
                     26: 
                     27:        movl PARAM1,%esi
                     28:        movl PARAM2,%ecx
                     29:        movl PARAM3,%ebx
                     30: 
                     31:        xor %eax,%eax
                     32:        movl %eax,-4(%ebp)
                     33:        movl %eax,-8(%ebp)
                     34: 
                     35:        movl (%esi),%eax
                     36:        mull (%ecx)
                     37:        movl %eax,-16(%ebp)     // Not used
                     38:        movl %edx,-12(%ebp)
                     39: 
                     40:        movl (%esi),%eax
                     41:        mull 4(%ecx)
                     42:        addl %eax,-12(%ebp)
                     43:        adcl %edx,-8(%ebp)
                     44:        adcl $0,-4(%ebp)
                     45: 
                     46:        movl 4(%esi),%eax
                     47:        mull (%ecx)
                     48:        addl %eax,-12(%ebp)
                     49:        adcl %edx,-8(%ebp)
                     50:        adcl $0,-4(%ebp)
                     51: 
                     52:        movl 4(%esi),%eax
                     53:        mull 4(%ecx)
                     54:        addl %eax,-8(%ebp)
                     55:        adcl %edx,-4(%ebp)
                     56: 
                     57:        testb $128,-9(%ebp)
                     58:        je L_no_round
                     59: 
                     60:        addl $1,-8(%ebp)
                     61:        adcl $0,-4(%ebp)
                     62: 
                     63: L_no_round:
                     64:        movl -8(%ebp),%esi
                     65:        movl %esi,(%ebx)
                     66:        movl -4(%ebp),%esi
                     67:        movl %esi,4(%ebx)
                     68: 
                     69:        popl %ebx
                     70:        popl %esi
                     71:        leave
                     72:        ret

unix.superglobalmegacorp.com

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