Tizen 2.1 base
[external/gmp.git] / mpn / x86_64 / addmul_2.asm
1 dnl  AMD64 mpn_addmul_2 -- Multiply an n-limb vector with a 2-limb vector and
2 dnl  add the result to a third limb vector.
3
4 dnl  Copyright 2008 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 K8,K9:         2.375
25 C K10:           2.375
26 C P4:            ?
27 C P6 core2:      4.45
28 C P6 corei7:     4.35
29
30 C This code is the result of running a code generation and optimization tool
31 C suite written by David Harvey and Torbjorn Granlund.
32
33 C TODO
34 C  * Work on feed-in and wind-down code.
35 C  * Convert "mov $0" to "xor".
36 C  * Adjust initial lea to save some bytes.
37 C  * Perhaps adjust n from n_param&3 value?
38
39 C INPUT PARAMETERS
40 define(`rp',     `%rdi')
41 define(`up',     `%rsi')
42 define(`n_param',`%rdx')
43 define(`vp',     `%rcx')
44
45 define(`v0', `%r8')
46 define(`v1', `%r9')
47 define(`w0', `%rbx')
48 define(`w1', `%rcx')
49 define(`w2', `%rbp')
50 define(`w3', `%r10')
51 define(`n',  `%r11')
52
53 ASM_START()
54         TEXT
55         ALIGN(16)
56 PROLOGUE(mpn_addmul_2)
57         push    %rbx
58         push    %rbp
59
60         mov     (vp), v0
61         mov     8(vp), v1
62
63         mov     n_param, n
64         neg     n
65         lea     -32(up,n_param,8), up
66         lea     -32(rp,n_param,8), rp
67
68         and     $3, R32(n_param)
69         jz      L(am2p0)
70         cmp     $2, R32(n_param)
71         jc      L(am2p1)
72         jz      L(am2p2)
73 L(am2p3):
74         mov     32(up,n,8), %rax
75         mul     v0
76         mov     %rax, w1
77         mov     32(up,n,8), %rax
78         mov     %rdx, w2
79         xor     R32(w3), R32(w3)
80         add     $2, n
81         jmp     L(am3)
82 L(am2p0):
83         mov     32(up,n,8), %rax
84         mul     v0
85         mov     %rax, w0
86         mov     32(up,n,8), %rax
87         mov     %rdx, w1
88         xor     R32(w2), R32(w2)
89         add     $3, n
90         jmp     L(am0)
91 L(am2p1):
92         mov     32(up,n,8), %rax
93         mul     v0
94         mov     %rax, w3
95         mov     32(up,n,8), %rax
96         mov     %rdx, w0
97         xor     R32(w1), R32(w1)
98         jmp     L(am1)
99 L(am2p2):
100         mov     32(up,n,8), %rax
101         mul     v0
102         mov     %rax, w2
103         mov     32(up,n,8), %rax
104         mov     %rdx, w3
105         xor     R32(w0), R32(w0)
106         xor     R32(w1), R32(w1)
107         add     $1, n
108         jmp     L(am2)
109
110         ALIGN(32)
111 L(top):
112         add     w3, (rp,n,8)            C 0 21
113         adc     %rax, w0                C 1 24
114         mov     8(up,n,8), %rax
115         adc     %rdx, w1                C 3 26
116         mov     $0, R32(w2)
117         mul     v0
118         add     %rax, w0                C 2 26
119         mov     8(up,n,8), %rax
120         adc     %rdx, w1                C 4 28
121         adc     $0, R32(w2)             C 6 30
122 L(am0): mul     v1
123         add     w0, 8(rp,n,8)           C 3 27
124         adc     %rax, w1                C 6 30
125         adc     %rdx, w2                C 8 32
126         mov     16(up,n,8), %rax
127         mov     $0, R32(w3)
128         mul     v0
129         add     %rax, w1                C 8
130         mov     16(up,n,8), %rax
131         adc     %rdx, w2                C 10
132         adc     $0, R32(w3)             C 12
133 L(am3): mul     v1
134         add     w1, 16(rp,n,8)          C 9
135         adc     %rax, w2                C 12
136         mov     24(up,n,8), %rax
137         adc     %rdx, w3                C 14
138         mul     v0
139         mov     $0, R32(w0)
140         add     %rax, w2                C 14
141         adc     %rdx, w3                C 16
142         mov     $0, R32(w1)
143         mov     24(up,n,8), %rax
144         adc     $0, R32(w0)             C 18
145 L(am2): mul     v1
146         add     w2, 24(rp,n,8)          C 15
147         adc     %rax, w3                C 18
148         adc     %rdx, w0                C 20
149         mov     32(up,n,8), %rax
150         mul     v0
151         add     %rax, w3                C 20
152         mov     32(up,n,8), %rax
153         adc     %rdx, w0                C 22
154         adc     $0, R32(w1)             C 24
155 L(am1): mul     v1
156         add     $4, n
157         js      L(top)
158
159         add     w3, (rp,n,8)
160         adc     %rax, w0
161         adc     %rdx, w1
162         mov     w0, 8(rp,n,8)
163         mov     w1, %rax
164
165         pop     %rbp
166         pop     %rbx
167         ret
168 EPILOGUE()