Upload Tizen:Base source
[external/gmp.git] / mpn / alpha / addmul_1.asm
1 dnl Alpha mpn_addmul_1 -- Multiply a limb vector with a limb and add the
2 dnl result to a second limb vector.
3
4 dnl  Copyright 1992, 1994, 1995, 2000, 2002 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 include(`../config.m4')
22
23 C      cycles/limb
24 C EV4:     42
25 C EV5:     18
26 C EV6:      7
27
28 C  INPUT PARAMETERS
29 C  rp   r16
30 C  up   r17
31 C  n    r18
32 C  vl   r19
33
34
35 ASM_START()
36 PROLOGUE(mpn_addmul_1)
37         ldq     r2,0(r17)       C r2 = s1_limb
38         addq    r17,8,r17       C s1_ptr++
39         subq    r18,1,r18       C size--
40         mulq    r2,r19,r3       C r3 = prod_low
41         ldq     r5,0(r16)       C r5 = *res_ptr
42         umulh   r2,r19,r0       C r0 = prod_high
43         beq     r18,$Lend1      C jump if size was == 1
44         ldq     r2,0(r17)       C r2 = s1_limb
45         addq    r17,8,r17       C s1_ptr++
46         subq    r18,1,r18       C size--
47         addq    r5,r3,r3
48         cmpult  r3,r5,r4
49         stq     r3,0(r16)
50         addq    r16,8,r16       C res_ptr++
51         beq     r18,$Lend2      C jump if size was == 2
52
53         ALIGN(8)
54 $Loop:  mulq    r2,r19,r3       C r3 = prod_low
55         ldq     r5,0(r16)       C r5 = *res_ptr
56         addq    r4,r0,r0        C cy_limb = cy_limb + 'cy'
57         subq    r18,1,r18       C size--
58         umulh   r2,r19,r4       C r4 = cy_limb
59         ldq     r2,0(r17)       C r2 = s1_limb
60         addq    r17,8,r17       C s1_ptr++
61         addq    r3,r0,r3        C r3 = cy_limb + prod_low
62         cmpult  r3,r0,r0        C r0 = carry from (cy_limb + prod_low)
63         addq    r5,r3,r3
64         cmpult  r3,r5,r5
65         stq     r3,0(r16)
66         addq    r16,8,r16       C res_ptr++
67         addq    r5,r0,r0        C combine carries
68         bne     r18,$Loop
69
70 $Lend2: mulq    r2,r19,r3       C r3 = prod_low
71         ldq     r5,0(r16)       C r5 = *res_ptr
72         addq    r4,r0,r0        C cy_limb = cy_limb + 'cy'
73         umulh   r2,r19,r4       C r4 = cy_limb
74         addq    r3,r0,r3        C r3 = cy_limb + prod_low
75         cmpult  r3,r0,r0        C r0 = carry from (cy_limb + prod_low)
76         addq    r5,r3,r3
77         cmpult  r3,r5,r5
78         stq     r3,0(r16)
79         addq    r5,r0,r0        C combine carries
80         addq    r4,r0,r0        C cy_limb = prod_high + cy
81         ret     r31,(r26),1
82 $Lend1: addq    r5,r3,r3
83         cmpult  r3,r5,r5
84         stq     r3,0(r16)
85         addq    r0,r5,r0
86         ret     r31,(r26),1
87 EPILOGUE(mpn_addmul_1)
88 ASM_END()