Update.
[glibc.git] / sysdeps / mips / addmul_1.S
blobdc1dc1ba501cf0075bafcf86f83e51de28cdb286
1 /* MIPS __mpn_addmul_1 -- Multiply a limb vector with a single limb and
2 add the product to a second limb vector.
4 Copyright (C) 1995 Free Software Foundation, Inc.
6 This file is part of the GNU MP Library.
8 The GNU MP Library is free software; you can redistribute it and/or modify
9 it under the terms of the GNU Library General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or (at your
11 option) any later version.
13 The GNU MP Library is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
15 or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Library General Public
16 License for more details.
18 You should have received a copy of the GNU Library General Public License
19 along with the GNU MP Library; see the file COPYING.LIB.  If not, write to
20 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
21 MA 02111-1307, USA.  */
23 #include <sysdep.h>
25 /* INPUT PARAMETERS
26    res_ptr      $4
27    s1_ptr       $5
28    size         $6
29    s2_limb      $7
31 #ifdef PIC
32         .option pic2
33 #endif
34 ENTRY (__mpn_addmul_1)
35         .set    noreorder
36 #ifdef PIC
37         .cpload t9
38 #endif
39         .set    nomacro
41         /* warm up phase 0 */
42         lw      $8,0($5)
44         /* warm up phase 1 */
45         addiu   $5,$5,4
46         multu   $8,$7
48         addiu   $6,$6,-1
49         beq     $6,$0,$LC0
50         move    $2,$0           /* zero cy2 */
52         addiu   $6,$6,-1
53         beq     $6,$0,$LC1
54         lw      $8,0($5)        /* load new s1 limb as early as possible */
56 Loop:   lw      $10,0($4)
57         mflo    $3
58         mfhi    $9
59         addiu   $5,$5,4
60         addu    $3,$3,$2        /* add old carry limb to low product limb */
61         multu   $8,$7
62         lw      $8,0($5)        /* load new s1 limb as early as possible */
63         addiu   $6,$6,-1        /* decrement loop counter */
64         sltu    $2,$3,$2        /* carry from previous addition -> $2 */
65         addu    $3,$10,$3
66         sltu    $10,$3,$10
67         addu    $2,$2,$10
68         sw      $3,0($4)
69         addiu   $4,$4,4
70         bne     $6,$0,Loop      /* should be "bnel" */
71         addu    $2,$9,$2        /* add high product limb and carry from addition */
73         /* cool down phase 1 */
74 $LC1:   lw      $10,0($4)
75         mflo    $3
76         mfhi    $9
77         addu    $3,$3,$2
78         sltu    $2,$3,$2
79         multu   $8,$7
80         addu    $3,$10,$3
81         sltu    $10,$3,$10
82         addu    $2,$2,$10
83         sw      $3,0($4)
84         addiu   $4,$4,4
85         addu    $2,$9,$2        /* add high product limb and carry from addition */
87         /* cool down phase 0 */
88 $LC0:   lw      $10,0($4)
89         mflo    $3
90         mfhi    $9
91         addu    $3,$3,$2
92         sltu    $2,$3,$2
93         addu    $3,$10,$3
94         sltu    $10,$3,$10
95         addu    $2,$2,$10
96         sw      $3,0($4)
97         j       $31
98         addu    $2,$9,$2        /* add high product limb and carry from addition */