nearly ready for 0.3.0
[libgcrypt.git] / mpi / mips3 / mpih-mul2.S
1 /* MIPS3   addmul_1 -- Multiply a limb vector with a single limb and
2  *                     add the product to a second limb vector.
3  * Copyright (C) 1992, 1994, 1995, 1998 Free Software Foundation, Inc.
4  *
5  * This file is part of GNUPG.
6  *
7  * GNUPG is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 2 of the License, or
10  * (at your option) any later version.
11  *
12  * GNUPG is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
20  */
21
22
23 /*******************
24  * mpi_limb_t
25  * mpihelp_addmul_1( mpi_ptr_t res_ptr,      (r4)
26  *                   mpi_ptr_t s1_ptr,       (r5)
27  *                   mpi_size_t s1_size,     (r6)
28  *                   mpi_limb_t s2_limb)     (r7)
29  */
30
31         .text
32         .align  4
33         .globl  mpihelp_addmul_1
34         .ent    mpihelp_addmul_1
35 mpihelp_addmul_1:
36         .set    noreorder
37         .set    nomacro
38
39  # warm up phase 0
40         ld      $8,0($5)
41
42  # warm up phase 1
43         daddiu  $5,$5,8
44         dmultu  $8,$7
45
46         daddiu  $6,$6,-1
47         beq     $6,$0,$LC0
48          move   $2,$0           # zero cy2
49
50         daddiu  $6,$6,-1
51         beq     $6,$0,$LC1
52         ld      $8,0($5)        # load new s1 limb as early as possible
53
54 Loop:   ld      $10,0($4)
55         mflo    $3
56         mfhi    $9
57         daddiu  $5,$5,8
58         daddu   $3,$3,$2        # add old carry limb to low product limb
59         dmultu  $8,$7
60         ld      $8,0($5)        # load new s1 limb as early as possible
61         daddiu  $6,$6,-1        # decrement loop counter
62         sltu    $2,$3,$2        # carry from previous addition -> $2
63         daddu   $3,$10,$3
64         sltu    $10,$3,$10
65         daddu   $2,$2,$10
66         sd      $3,0($4)
67         daddiu  $4,$4,8
68         bne     $6,$0,Loop
69          daddu  $2,$9,$2        # add high product limb and carry from addition
70
71  # cool down phase 1
72 $LC1:   ld      $10,0($4)
73         mflo    $3
74         mfhi    $9
75         daddu   $3,$3,$2
76         sltu    $2,$3,$2
77         dmultu  $8,$7
78         daddu   $3,$10,$3
79         sltu    $10,$3,$10
80         daddu   $2,$2,$10
81         sd      $3,0($4)
82         daddiu  $4,$4,8
83         daddu   $2,$9,$2        # add high product limb and carry from addition
84
85  # cool down phase 0
86 $LC0:   ld      $10,0($4)
87         mflo    $3
88         mfhi    $9
89         daddu   $3,$3,$2
90         sltu    $2,$3,$2
91         daddu   $3,$10,$3
92         sltu    $10,$3,$10
93         daddu   $2,$2,$10
94         sd      $3,0($4)
95         j       $31
96         daddu   $2,$9,$2        # add high product limb and carry from addition
97
98         .end    mpihelp_addmul_1
99