Upload Tizen:Base source
[external/gmp.git] / mpn / x86_64 / atom / aors_n.asm
1 dnl  X86-64 mpn_add_n, mpn_sub_n, optimized for Intel Atom.
2
3 dnl  Copyright 2003, 2004, 2005, 2007, 2008 Free Software Foundation, Inc.
4
5 dnl  This file is part of the GNU MP Library.
6
7 dnl  The GNU MP Library is free software; you can redistribute it and/or modify
8 dnl  it under the terms of the GNU Lesser General Public License as published
9 dnl  by the Free Software Foundation; either version 3 of the License, or (at
10 dnl  your option) any later version.
11
12 dnl  The GNU MP Library is distributed in the hope that it will be useful, but
13 dnl  WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
14 dnl  or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
15 dnl  License for more details.
16
17 dnl  You should have received a copy of the GNU Lesser General Public License
18 dnl  along with the GNU MP Library.  If not, see http://www.gnu.org/licenses/.
19
20 include(`../config.m4')
21
22
23 C            cycles/limb
24 C K8,K9:         1.85
25 C K10:           ?
26 C P4:            ?
27 C P6-15 (Core2): ?
28 C P6-28 (Atom):  3
29
30 C INPUT PARAMETERS
31 define(`rp',    `%rdi')
32 define(`up',    `%rsi')
33 define(`vp',    `%rdx')
34 define(`n',     `%rcx')
35 define(`cy',    `%r8')          C (only for mpn_add_nc)
36
37 ifdef(`OPERATION_add_n', `
38         define(ADCSBB,        adc)
39         define(func,          mpn_add_n)
40         define(func_nc,       mpn_add_nc)')
41 ifdef(`OPERATION_sub_n', `
42         define(ADCSBB,        sbb)
43         define(func,          mpn_sub_n)
44         define(func_nc,       mpn_sub_nc)')
45
46 MULFUNC_PROLOGUE(mpn_add_n mpn_add_nc mpn_sub_n mpn_sub_nc)
47
48 ASM_START()
49         TEXT
50         ALIGN(16)
51 PROLOGUE(func_nc)
52         jmp     L(ent)
53 EPILOGUE()
54 PROLOGUE(func)
55         xor     %r8, %r8
56 L(ent):
57         mov     R32(%rcx), R32(%rax)
58         shr     $2, %rcx
59         and     $3, R32(%rax)
60         jz      L(b0)
61         cmp     $2, R32(%rax)
62         jz      L(b2)
63         jg      L(b3)
64
65 L(b1):  mov     (%rsi), %r10
66         test    R32(%rcx), R32(%rcx)
67         bt      $0, R32(%r8)
68         jnz     L(gt1)
69         ADCSBB  (%rdx), %r10
70         mov     %r10, (%rdi)
71         mov     R32(%rcx), R32(%rax)            C zero rax
72         adc     R32(%rax), R32(%rax)
73         ret
74 L(gt1): ADCSBB  (%rdx), %r10
75         mov     8(%rsi), %r11
76         lea     16(%rsi), %rsi
77         lea     -16(%rdx), %rdx
78         lea     -16(%rdi), %rdi
79         jmp     L(m1)
80
81 L(b2):  mov     (%rsi), %r9
82         mov     8(%rsi), %r10
83         lea     -8(%rdx), %rdx
84         test    R32(%rcx), R32(%rcx)
85         bt      $0, R32(%r8)
86         jnz     L(gt2)
87         lea     -40(%rdi), %rdi
88         jmp     L(e2)
89 L(gt2): ADCSBB  8(%rdx), %r9
90         mov     16(%rsi), %r11
91         lea     -8(%rsi), %rsi
92         lea     -8(%rdi), %rdi
93         jmp     L(m2)
94
95 L(b3):  mov     (%rsi), %rax
96         mov     8(%rsi), %r9
97         mov     16(%rsi), %r10
98         test    R32(%rcx), R32(%rcx)
99         bt      $0, %r8
100         jnz     L(gt3)
101         lea     -32(%rdi), %rdi
102         jmp     L(e3)
103 L(gt3): ADCSBB  (%rdx), %rax
104         jmp     L(m3)
105
106 L(b0):  mov     (%rsi), %r11
107         neg     R32(%r8)
108         lea     -24(%rdx), %rdx
109         lea     -24(%rdi), %rdi
110         lea     8(%rsi), %rsi
111         jmp     L(m0)
112
113         ALIGN(8)
114 L(top): mov     %r11, 24(%rdi)
115         ADCSBB  (%rdx), %rax
116         lea     32(%rdi), %rdi
117 L(m3):  mov     %rax, (%rdi)
118         ADCSBB  8(%rdx), %r9
119         mov     24(%rsi), %r11
120 L(m2):  mov     %r9, 8(%rdi)
121         ADCSBB  16(%rdx), %r10
122         lea     32(%rsi), %rsi
123 L(m1):  mov     %r10, 16(%rdi)
124 L(m0):  ADCSBB  24(%rdx), %r11
125         mov     (%rsi), %rax
126         mov     8(%rsi), %r9
127         lea     32(%rdx), %rdx
128         dec     %rcx
129         mov     16(%rsi), %r10
130         jnz     L(top)
131
132         mov     %r11, 24(%rdi)
133 L(e3):  ADCSBB  (%rdx), %rax
134         mov     %rax, 32(%rdi)
135 L(e2):  ADCSBB  8(%rdx), %r9
136         mov     %r9, 40(%rdi)
137 L(e1):  ADCSBB  16(%rdx), %r10
138         mov     %r10, 48(%rdi)
139         mov     R32(%rcx), R32(%rax)            C zero rax
140         adc     R32(%rax), R32(%rax)
141         ret
142 EPILOGUE()