Upload Tizen:Base source
[external/gmp.git] / mpn / power / mul_1.asm
1 dnl  IBM POWER mpn_mul_1 -- Multiply a limb vector with a limb and store the
2 dnl  result in a second limb vector.
3
4 dnl  Copyright 1992, 1994, 1999, 2000, 2001 Free Software Foundation, Inc.
5
6 dnl  This file is part of the GNU MP Library.
7
8 dnl  The GNU MP Library is free software; you can redistribute it and/or modify
9 dnl  it under the terms of the GNU Lesser General Public License as published
10 dnl  by the Free Software Foundation; either version 3 of the License, or (at
11 dnl  your option) any later version.
12
13 dnl  The GNU MP Library is distributed in the hope that it will be useful, but
14 dnl  WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
15 dnl  or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
16 dnl  License for more details.
17
18 dnl  You should have received a copy of the GNU Lesser General Public License
19 dnl  along with the GNU MP Library.  If not, see http://www.gnu.org/licenses/.
20
21
22 dnl  INPUT PARAMETERS
23 dnl  res_ptr    r3
24 dnl  s1_ptr     r4
25 dnl  size       r5
26 dnl  s2_limb    r6
27
28 dnl  The POWER architecture has no unsigned 32x32->64 bit multiplication
29 dnl  instruction.  To obtain that operation, we have to use the 32x32->64
30 dnl  signed multiplication instruction, and add the appropriate compensation to
31 dnl  the high limb of the result.  We add the multiplicand if the multiplier
32 dnl  has its most significant bit set, and we add the multiplier if the
33 dnl  multiplicand has its most significant bit set.  We need to preserve the
34 dnl  carry flag between each iteration, so we have to compute the compensation
35 dnl  carefully (the natural, srai+and doesn't work).  Since all POWER can
36 dnl  branch in zero cycles, we use conditional branches for the compensation.
37
38 include(`../config.m4')
39
40 ASM_START()
41 PROLOGUE(mpn_mul_1)
42         cal     3,-4(3)
43         l       0,0(4)
44         cmpi    0,6,0
45         mtctr   5
46         mul     9,0,6
47         srai    7,0,31
48         and     7,7,6
49         mfmq    8
50         ai      0,0,0           C reset carry
51         cax     9,9,7
52         blt     Lneg
53 Lpos:   bdz     Lend
54 Lploop: lu      0,4(4)
55         stu     8,4(3)
56         cmpi    0,0,0
57         mul     10,0,6
58         mfmq    0
59         ae      8,0,9
60         bge     Lp0
61         cax     10,10,6         C adjust high limb for negative limb from s1
62 Lp0:    bdz     Lend0
63         lu      0,4(4)
64         stu     8,4(3)
65         cmpi    0,0,0
66         mul     9,0,6
67         mfmq    0
68         ae      8,0,10
69         bge     Lp1
70         cax     9,9,6           C adjust high limb for negative limb from s1
71 Lp1:    bdn     Lploop
72         b       Lend
73
74 Lneg:   cax     9,9,0
75         bdz     Lend
76 Lnloop: lu      0,4(4)
77         stu     8,4(3)
78         cmpi    0,0,0
79         mul     10,0,6
80         cax     10,10,0         C adjust high limb for negative s2_limb
81         mfmq    0
82         ae      8,0,9
83         bge     Ln0
84         cax     10,10,6         C adjust high limb for negative limb from s1
85 Ln0:    bdz     Lend0
86         lu      0,4(4)
87         stu     8,4(3)
88         cmpi    0,0,0
89         mul     9,0,6
90         cax     9,9,0           C adjust high limb for negative s2_limb
91         mfmq    0
92         ae      8,0,10
93         bge     Ln1
94         cax     9,9,6           C adjust high limb for negative limb from s1
95 Ln1:    bdn     Lnloop
96         b       Lend
97
98 Lend0:  cal     9,0(10)
99 Lend:   st      8,4(3)
100         aze     3,9
101         br
102 EPILOGUE(mpn_mul_1)