Reorganisation of the source tree
[ghc-hetmet.git] / rts / gmp / mpn / x86 / k6 / mmx / com_n.asm
1 dnl  AMD K6-2 mpn_com_n -- mpn bitwise one's complement.
2 dnl   
3 dnl     alignment dst/src, A=0mod8 N=4mod8
4 dnl        A/A   A/N   N/A   N/N
5 dnl  K6-2  1.0   1.18  1.18  1.18  cycles/limb
6 dnl  K6    1.5   1.85  1.75  1.85
7
8
9 dnl  Copyright (C) 1999, 2000 Free Software Foundation, Inc.
10 dnl 
11 dnl  This file is part of the GNU MP Library.
12 dnl 
13 dnl  The GNU MP Library is free software; you can redistribute it and/or
14 dnl  modify it under the terms of the GNU Lesser General Public License as
15 dnl  published by the Free Software Foundation; either version 2.1 of the
16 dnl  License, or (at your option) any later version.
17 dnl 
18 dnl  The GNU MP Library is distributed in the hope that it will be useful,
19 dnl  but WITHOUT ANY WARRANTY; without even the implied warranty of
20 dnl  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
21 dnl  Lesser General Public License for more details.
22 dnl 
23 dnl  You should have received a copy of the GNU Lesser General Public
24 dnl  License along with the GNU MP Library; see the file COPYING.LIB.  If
25 dnl  not, write to the Free Software Foundation, Inc., 59 Temple Place -
26 dnl  Suite 330, Boston, MA 02111-1307, USA.
27
28
29 include(`../config.m4')
30
31
32 C void mpn_com_n (mp_ptr dst, mp_srcptr src, mp_size_t size);
33 C
34 C Take the bitwise ones-complement of src,size and write it to dst,size.
35
36 defframe(PARAM_SIZE,12)
37 defframe(PARAM_SRC, 8)
38 defframe(PARAM_DST, 4)
39
40         .text
41         ALIGN(32)
42 PROLOGUE(mpn_com_n)
43 deflit(`FRAME',0)
44
45         movl    PARAM_SIZE, %ecx
46         movl    PARAM_SRC, %eax
47         movl    PARAM_DST, %edx
48         shrl    %ecx
49         jnz     L(two_or_more)
50
51         movl    (%eax), %eax
52         notl    %eax
53         movl    %eax, (%edx)
54         ret
55
56
57 L(two_or_more):
58         pushl   %ebx
59 FRAME_pushl()
60         movl    %ecx, %ebx
61
62         pcmpeqd %mm7, %mm7      C all ones
63
64
65         ALIGN(16)
66 L(top):
67         C eax   src
68         C ebx   floor(size/2)
69         C ecx   counter
70         C edx   dst
71         C esi
72         C edi
73         C ebp
74
75         movq    -8(%eax,%ecx,8), %mm0
76         pxor    %mm7, %mm0
77         movq    %mm0, -8(%edx,%ecx,8)
78         loop    L(top)
79
80
81         jnc     L(no_extra)
82         movl    (%eax,%ebx,8), %eax
83         notl    %eax
84         movl    %eax, (%edx,%ebx,8)
85 L(no_extra):
86
87         popl    %ebx
88         emms_or_femms
89         ret
90
91 EPILOGUE()