mpi_x86.s
上传用户:lyxiangda
上传日期:2007-01-12
资源大小:3042k
文件大小:8k
源码类别:

CA认证

开发平台:

WINDOWS

  1.  #
  2.  # The contents of this file are subject to the Mozilla Public
  3.  # License Version 1.1 (the "License"); you may not use this file
  4.  # except in compliance with the License. You may obtain a copy of
  5.  # the License at http://www.mozilla.org/MPL/
  6.  # 
  7.  # Software distributed under the License is distributed on an "AS
  8.  # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
  9.  # implied. See the License for the specific language governing
  10.  # rights and limitations under the License.
  11.  # 
  12.  # The Original Code is the Netscape security libraries.
  13.  # 
  14.  # The Initial Developer of the Original Code is Netscape
  15.  # Communications Corporation. Portions created by Netscape are 
  16.  # Copyright (C) 2000 Netscape Communications Corporation.  All
  17.  # Rights Reserved.
  18.  # 
  19.  # Contributor(s):
  20.  # 
  21.  # Alternatively, the contents of this file may be used under the
  22.  # terms of the GNU General Public License Version 2 or later (the
  23.  # "GPL"), in which case the provisions of the GPL are applicable 
  24.  # instead of those above. If you wish to allow use of your 
  25.  # version of this file only under the terms of the GPL and not to
  26.  # allow others to use your version of this file under the MPL,
  27.  # indicate your decision by deleting the provisions above and
  28.  # replace them with the notice and other provisions required by
  29.  # the GPL.  If you do not delete the provisions above, a recipient
  30.  # may use your version of this file under either the MPL or the
  31.  # GPL.
  32.  #  $Id: mpi_x86.s,v 1.2 2000/08/31 03:45:39 nelsonb%netscape.com Exp $
  33.  #
  34. .text
  35.  #  ebp - 36: caller's esi
  36.  #  ebp - 32: caller's edi
  37.  #  ebp - 28:
  38.  #  ebp - 24:
  39.  #  ebp - 20:
  40.  #  ebp - 16:
  41.  #  ebp - 12:
  42.  #  ebp - 8:
  43.  #  ebp - 4:
  44.  #  ebp + 0: caller's ebp
  45.  #  ebp + 4: return address
  46.  #  ebp + 8: a argument
  47.  #  ebp + 12: a_len argument
  48.  #  ebp + 16: b argument
  49.  #  ebp + 20: c argument
  50.  #  registers:
  51.  #  eax:
  52.  # ebx: carry
  53.  # ecx: a_len
  54.  # edx:
  55.  # esi: a ptr
  56.  # edi: c ptr
  57. .globl s_mpv_mul_d
  58. .type s_mpv_mul_d,@function
  59. s_mpv_mul_d:
  60.     push   %ebp
  61.     mov    %esp,%ebp
  62.     sub    $28,%esp
  63.     push   %edi
  64.     push   %esi
  65.     movl   $0,%ebx # carry = 0
  66.     mov    12(%ebp),%ecx # ecx = a_len
  67.     mov    20(%ebp),%edi
  68.     cmp    $0,%ecx
  69.     je     2f # jmp if a_len == 0
  70.     mov    8(%ebp),%esi # esi = a
  71.     cld
  72. 1:
  73.     lodsl # eax = [ds:esi]; esi += 4
  74.     mov    16(%ebp),%edx # edx = b
  75.     mull   %edx # edx:eax = Phi:Plo = a_i * b
  76.     add    %ebx,%eax # add carry (%ebx) to edx:eax
  77.     adc    $0,%edx
  78.     mov    %edx,%ebx # high half of product becomes next carry
  79.     stosl # [es:edi] = ax; edi += 4;
  80.     dec    %ecx # --a_len
  81.     jnz    1b # jmp if a_len != 0
  82. 2:
  83.     mov    %ebx,0(%edi) # *c = carry
  84.     pop    %esi
  85.     pop    %edi
  86.     leave  
  87.     ret    
  88.     nop
  89.  #  ebp - 36: caller's esi
  90.  #  ebp - 32: caller's edi
  91.  #  ebp - 28:
  92.  #  ebp - 24:
  93.  #  ebp - 20:
  94.  #  ebp - 16:
  95.  #  ebp - 12:
  96.  #  ebp - 8:
  97.  #  ebp - 4:
  98.  #  ebp + 0: caller's ebp
  99.  #  ebp + 4: return address
  100.  #  ebp + 8: a argument
  101.  #  ebp + 12: a_len argument
  102.  #  ebp + 16: b argument
  103.  #  ebp + 20: c argument
  104.  #  registers:
  105.  #  eax:
  106.  # ebx: carry
  107.  # ecx: a_len
  108.  # edx:
  109.  # esi: a ptr
  110.  # edi: c ptr
  111. .globl s_mpv_mul_d_add
  112. .type s_mpv_mul_d_add,@function
  113. s_mpv_mul_d_add:
  114.     push   %ebp
  115.     mov    %esp,%ebp
  116.     sub    $28,%esp
  117.     push   %edi
  118.     push   %esi
  119.     movl   $0,%ebx # carry = 0
  120.     mov    12(%ebp),%ecx # ecx = a_len
  121.     mov    20(%ebp),%edi
  122.     cmp    $0,%ecx
  123.     je     4f # jmp if a_len == 0
  124.     mov    8(%ebp),%esi # esi = a
  125.     cld
  126. 3:
  127.     lodsl # eax = [ds:esi]; esi += 4
  128.     mov    16(%ebp),%edx # edx = b
  129.     mull   %edx # edx:eax = Phi:Plo = a_i * b
  130.     add    %ebx,%eax # add carry (%ebx) to edx:eax
  131.     adc    $0,%edx
  132.     mov    0(%edi),%ebx # add in current word from *c
  133.     add    %ebx,%eax
  134.     adc    $0,%edx
  135.     mov    %edx,%ebx # high half of product becomes next carry
  136.     stosl # [es:edi] = ax; edi += 4;
  137.     dec    %ecx # --a_len
  138.     jnz    3b # jmp if a_len != 0
  139. 4:
  140.     mov    %ebx,0(%edi) # *c = carry
  141.     pop    %esi
  142.     pop    %edi
  143.     leave  
  144.     ret    
  145.     nop
  146.  #  ebp - 36: caller's esi
  147.  #  ebp - 32: caller's edi
  148.  #  ebp - 28:
  149.  #  ebp - 24:
  150.  #  ebp - 20:
  151.  #  ebp - 16:
  152.  #  ebp - 12:
  153.  #  ebp - 8:
  154.  #  ebp - 4:
  155.  #  ebp + 0: caller's ebp
  156.  #  ebp + 4: return address
  157.  #  ebp + 8: a argument
  158.  #  ebp + 12: a_len argument
  159.  #  ebp + 16: b argument
  160.  #  ebp + 20: c argument
  161.  #  registers:
  162.  #  eax:
  163.  # ebx: carry
  164.  # ecx: a_len
  165.  # edx:
  166.  # esi: a ptr
  167.  # edi: c ptr
  168. .globl s_mpv_mul_d_add_prop
  169. .type s_mpv_mul_d_add_prop,@function
  170. s_mpv_mul_d_add_prop:
  171.     push   %ebp
  172.     mov    %esp,%ebp
  173.     sub    $28,%esp
  174.     push   %edi
  175.     push   %esi
  176.     movl   $0,%ebx # carry = 0
  177.     mov    12(%ebp),%ecx # ecx = a_len
  178.     mov    20(%ebp),%edi
  179.     cmp    $0,%ecx
  180.     je     6f # jmp if a_len == 0
  181.     cld
  182.     mov    8(%ebp),%esi # esi = a
  183. 5:
  184.     lodsl # eax = [ds:esi]; esi += 4
  185.     mov    16(%ebp),%edx # edx = b
  186.     mull   %edx # edx:eax = Phi:Plo = a_i * b
  187.     add    %ebx,%eax # add carry (%ebx) to edx:eax
  188.     adc    $0,%edx
  189.     mov    0(%edi),%ebx # add in current word from *c
  190.     add    %ebx,%eax
  191.     adc    $0,%edx
  192.     mov    %edx,%ebx # high half of product becomes next carry
  193.     stosl # [es:edi] = ax; edi += 4;
  194.     dec    %ecx # --a_len
  195.     jnz    5b # jmp if a_len != 0
  196. 6:
  197.     cmp    $0,%ebx # is carry zero?
  198.     jz     8f
  199.     mov    0(%edi),%eax # add in current word from *c
  200.     add    %ebx,%eax
  201.     stosl # [es:edi] = ax; edi += 4;
  202.     jnc    8f
  203. 7:
  204.     mov    0(%edi),%eax # add in current word from *c
  205.     adc    $0,%eax
  206.     stosl # [es:edi] = ax; edi += 4;
  207.     jc     7b
  208. 8:
  209.     pop    %esi
  210.     pop    %edi
  211.     leave  
  212.     ret    
  213.     nop
  214.  #  ebp - 20: caller's esi
  215.  #  ebp - 16: caller's edi
  216.  #  ebp - 12:
  217.  #  ebp - 8: carry
  218.  #  ebp - 4: a_len local
  219.  #  ebp + 0: caller's ebp
  220.  #  ebp + 4: return address
  221.  #  ebp + 8: pa argument
  222.  #  ebp + 12: a_len argument
  223.  #  ebp + 16: ps argument
  224.  #  ebp + 20:
  225.  #  registers:
  226.  #  eax:
  227.  # ebx: carry
  228.  # ecx: a_len
  229.  # edx:
  230.  # esi: a ptr
  231.  # edi: c ptr
  232. .globl s_mpv_sqr_add_prop
  233. .type s_mpv_sqr_add_prop,@function
  234. s_mpv_sqr_add_prop:
  235.      push   %ebp
  236.      mov    %esp,%ebp
  237.      sub    $12,%esp
  238.      push   %edi
  239.      push   %esi
  240.      movl   $0,%ebx # carry = 0
  241.      mov    12(%ebp),%ecx # a_len
  242.      mov    16(%ebp),%edi # edi = ps
  243.      cmp    $0,%ecx
  244.      je     11f # jump if a_len == 0
  245.      cld
  246.      mov    8(%ebp),%esi # esi = pa
  247. 10:
  248.      lodsl # %eax = [ds:si]; si += 4;
  249.      mull   %eax
  250.      add    %ebx,%eax # add "carry"
  251.      adc    $0,%edx
  252.      mov    0(%edi),%ebx
  253.      add    %ebx,%eax # add low word from result
  254.      mov    4(%edi),%ebx
  255.      stosl # [es:di] = %eax; di += 4;
  256.      adc    %ebx,%edx # add high word from result
  257.      movl   $0,%ebx
  258.      mov    %edx,%eax
  259.      adc    $0,%ebx
  260.      stosl # [es:di] = %eax; di += 4;
  261.      dec    %ecx # --a_len
  262.      jnz    10b # jmp if a_len != 0
  263. 11:
  264.     cmp    $0,%ebx # is carry zero?
  265.     jz     14f
  266.     mov    0(%edi),%eax # add in current word from *c
  267.     add    %ebx,%eax
  268.     stosl # [es:edi] = ax; edi += 4;
  269.     jnc    14f
  270. 12:
  271.     mov    0(%edi),%eax # add in current word from *c
  272.     adc    $0,%eax
  273.     stosl # [es:edi] = ax; edi += 4;
  274.     jc     12b
  275. 14:
  276.     pop    %esi
  277.     pop    %edi
  278.     leave  
  279.     ret    
  280.     nop
  281.  #
  282.  # Divide 64-bit (Nhi,Nlo) by 32-bit divisor, which must be normalized
  283.  # so its high bit is 1.   This code is from NSPR.
  284.  #
  285.  # mp_err s_mpv_div_2dx1d(mp_digit Nhi, mp_digit Nlo, mp_digit divisor,
  286.  #            mp_digit *qp, mp_digit *rp)
  287.  # Dump of assembler code for function s_mpv_div_2dx1d:
  288.  # 
  289.  #  esp +  0: return address
  290.  #  esp +  4: Nhi argument
  291.  #  esp +  8: Nlo argument
  292.  #  esp + 12: divisor argument
  293.  #  esp + 16: qp argument
  294.  #  esp + 20:   rp argument
  295.  #  registers:
  296.  #  eax:
  297.  # ebx: carry
  298.  # ecx: a_len
  299.  # edx:
  300.  # esi: a ptr
  301.  # edi: c ptr
  302.  # 
  303. .globl s_mpv_div_2dx1d
  304. .type s_mpv_div_2dx1d,@function
  305. s_mpv_div_2dx1d:
  306.        mov    4(%esp),%edx
  307.        mov    8(%esp),%eax
  308.        mov    12(%esp),%ebx
  309.        div    %ebx
  310.        mov    16(%esp),%ebx
  311.        mov    %eax,0(%ebx)
  312.        mov    20(%esp),%ebx
  313.        mov    %edx,0(%ebx)
  314.        xor    %eax,%eax # return zero
  315.        ret    
  316.        nop
  317.