Switched to GPLv3.
[gnupg.git] / mpi / mips3 / mpih-mul1.S
1 /* mips3 mpih-mul1.S -- Multiply a limb vector with a limb and store
2  *                      the result in a second limb vector.
3  *
4  *      Copyright (C) 1992, 1994, 1995, 1998, 2000
5  *                    2001 Free Software Foundation, Inc.
6  *
7  * This file is part of GnuPG.
8  *
9  * GnuPG is free software; you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License as published by
11  * the Free Software Foundation; either version 3 of the License, or
12  * (at your option) any later version.
13  *
14  * GnuPG is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program; if not, see <http://www.gnu.org/licenses/>.
21  */
22
23
24 /*******************
25  * mpi_limb_t
26  * mpihelp_mul_1( mpi_ptr_t res_ptr,    (r4)
27  *                mpi_ptr_t s1_ptr,     (r5)
28  *                mpi_size_t s1_size,   (r6)
29  *                mpi_limb_t s2_limb)   (r7)
30  */
31
32         .text
33         .align  4
34         .globl  mpihelp_mul_1
35         .ent    mpihelp_mul_1
36 mpihelp_mul_1:
37         .set    noreorder
38         .set    nomacro
39
40 /* # warm up phase 0 */
41         ld      $8,0($5)
42
43 /* # warm up phase 1 */
44         daddiu  $5,$5,8
45         dmultu  $8,$7
46
47         daddiu  $6,$6,-1
48         beq     $6,$0,$LC0
49          move   $2,$0           # zero cy2
50
51         daddiu  $6,$6,-1
52         beq     $6,$0,$LC1
53         ld      $8,0($5)        # load new s1 limb as early as possible
54
55 Loop:   mflo    $10
56         mfhi    $9
57         daddiu  $5,$5,8
58         daddu   $10,$10,$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,$10,$2       # carry from previous addition -> $2
63         sd      $10,0($4)
64         daddiu  $4,$4,8
65         bne     $6,$0,Loop
66          daddu  $2,$9,$2        # add high product limb and carry from addition
67
68 /* # cool down phase 1 */
69 $LC1:   mflo    $10
70         mfhi    $9
71         daddu   $10,$10,$2
72         sltu    $2,$10,$2
73         dmultu  $8,$7
74         sd      $10,0($4)
75         daddiu  $4,$4,8
76         daddu   $2,$9,$2        # add high product limb and carry from addition
77
78 /* # cool down phase 0 */
79 $LC0:   mflo    $10
80         mfhi    $9
81         daddu   $10,$10,$2
82         sltu    $2,$10,$2
83         sd      $10,0($4)
84         j       $31
85         daddu   $2,$9,$2        # add high product limb and carry from addition
86
87         .end    mpihelp_mul_1
88