PowerPC specific implementation of llround.
[glibc/history.git] / sysdeps / mips / mul_1.S
blob184aae6fa13099917990e1f1b469eec55b58bb12
1 /* MIPS __mpn_mul_1 -- Multiply a limb vector with a single limb and
2 store the product in 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_mul_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:   mflo    $10
57         mfhi    $9
58         addiu   $5,$5,4
59         addu    $10,$10,$2      /* add old carry limb to low product limb */
60         multu   $8,$7
61         lw      $8,0($5)        /* load new s1 limb as early as possible */
62         addiu   $6,$6,-1        /* decrement loop counter */
63         sltu    $2,$10,$2       /* carry from previous addition -> $2 */
64         sw      $10,0($4)
65         addiu   $4,$4,4
66         bne     $6,$0,Loop      /* should be "bnel" */
67         addu    $2,$9,$2        /* add high product limb and carry from addition */
69         /* cool down phase 1 */
70 $LC1:   mflo    $10
71         mfhi    $9
72         addu    $10,$10,$2
73         sltu    $2,$10,$2
74         multu   $8,$7
75         sw      $10,0($4)
76         addiu   $4,$4,4
77         addu    $2,$9,$2        /* add high product limb and carry from addition
79         /* cool down phase 0 */
80 $LC0:   mflo    $10
81         mfhi    $9
82         addu    $10,$10,$2
83         sltu    $2,$10,$2
84         sw      $10,0($4)
85         j       $31
86         addu    $2,$9,$2        /* add high product limb and carry from addition */