Annotation of OpenXM_contrib/gmp/mpn/x86/k6/mmx/com_n.asm, Revision 1.1.1.1
1.1 maekawa 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()
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>