48248cda46
2. longlong.h rearrangement for Intel compiler 3. MSVC additions in test code 4. GMP 4.2.1 bug fixes 5. Intel format assembly code
127 lines
2.7 KiB
NASM
127 lines
2.7 KiB
NASM
|
|
; Copyright 2000, 2001, 2002 Free Software Foundation, Inc.
|
|
;
|
|
; This file is part of the GNU MP Library.
|
|
;
|
|
; The GNU MP Library is free software; you can redistribute it and/or
|
|
; modify it under the terms of the GNU Lesser General Public License as
|
|
; published by the Free Software Foundation; either version 2.1 of the
|
|
; License, or (at your option) any later version.
|
|
;
|
|
; The GNU MP Library is distributed in the hope that it will be useful,
|
|
; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
; Lesser General Public License for more details.
|
|
;
|
|
; You should have received a copy of the GNU Lesser General Public
|
|
; License along with the GNU MP Library; see the file COPYING.LIB. If
|
|
; not, write to the Free Software Foundation, Inc., 59 Temple Place -
|
|
; Suite 330, Boston, MA 02111-1307, USA.
|
|
;
|
|
; Translation of AT&T syntax code by Brian Gladman
|
|
|
|
%macro ph_fun 1
|
|
%ifdef PIC
|
|
mov edx,0xAAAAAAAA
|
|
movd mm7,edx
|
|
punpckldq mm7,mm7
|
|
mov edx,0x33333333
|
|
movd mm6,edx
|
|
punpckldq mm6,mm6
|
|
mov edx,0x0F0F0F0F
|
|
movd mm5,edx
|
|
punpckldq mm5,mm5
|
|
%else
|
|
movq mm7,[L_AA]
|
|
movq mm6,[L_33]
|
|
movq mm5,[L_0F]
|
|
%endif
|
|
mov ecx,[esp+PARAM_SIZE]
|
|
mov eax,[esp+PARAM_SRC]
|
|
%if %1 == 1
|
|
mov edx,[esp+PARAM_SRC2]
|
|
%endif
|
|
pxor mm4,mm4
|
|
pxor mm0,mm0
|
|
sub ecx,1
|
|
ja %%L_top
|
|
|
|
%%L_last:
|
|
movd mm1,[eax+ecx*4]
|
|
%if %1 == 1
|
|
movd mm2,[edx+ecx*4]
|
|
pxor mm1,mm2
|
|
%endif
|
|
jmp %%L_loaded
|
|
|
|
%%L_top:
|
|
movd mm1,[eax]
|
|
movd mm2,[eax+4]
|
|
punpckldq mm1,mm2
|
|
add eax,8
|
|
%if %1 == 1
|
|
movd mm2,[edx]
|
|
movd mm3,[edx+4]
|
|
punpckldq mm2,mm3
|
|
pxor mm1,mm2
|
|
add edx,8
|
|
%endif
|
|
%%L_loaded:
|
|
movq mm2,mm7
|
|
pand mm2,mm1
|
|
psrlq mm2,1
|
|
psubd mm1,mm2
|
|
movq mm2,mm6
|
|
pand mm2,mm1
|
|
psrlq mm1,2
|
|
pand mm1,mm6
|
|
paddd mm1,mm2
|
|
movq mm2,mm5
|
|
pand mm2,mm1
|
|
psrlq mm1,4
|
|
pand mm1,mm5
|
|
paddd mm1,mm2
|
|
psadbw mm1,mm4
|
|
paddd mm0,mm1
|
|
sub ecx,2
|
|
jg %%L_top
|
|
jz %%L_last
|
|
movd eax,mm0
|
|
emms
|
|
ret
|
|
%endmacro
|
|
|
|
%ifndef PIC
|
|
data
|
|
align 8
|
|
|
|
L_AA: dq 0xAAAAAAAAAAAAAAAA
|
|
L_33: dq 0x3333333333333333
|
|
L_0F: dq 0x0F0F0F0F0F0F0F0F
|
|
%endif
|
|
|
|
section .text
|
|
|
|
%define PARAM_SIZE 8
|
|
%define PARAM_SRC 4
|
|
global ___gmpn_popcount
|
|
%ifdef DLL
|
|
export ___gmpn_popcount
|
|
%endif
|
|
align 16
|
|
___gmpn_popcount:
|
|
ph_fun 0
|
|
|
|
%define PARAM_SIZE 12
|
|
%define PARAM_SRC2 8
|
|
%define PARAM_SRC 4
|
|
global ___gmpn_hamdist
|
|
%ifdef DLL
|
|
export ___gmpn_hamdist
|
|
%endif
|
|
align 16
|
|
___gmpn_hamdist:
|
|
ph_fun 1
|
|
|
|
end
|