aboutsummaryrefslogtreecommitdiffstats
path: root/epan/asm_utils_win32_x86.asm
diff options
context:
space:
mode:
Diffstat (limited to 'epan/asm_utils_win32_x86.asm')
-rw-r--r--epan/asm_utils_win32_x86.asm147
1 files changed, 147 insertions, 0 deletions
diff --git a/epan/asm_utils_win32_x86.asm b/epan/asm_utils_win32_x86.asm
new file mode 100644
index 0000000000..767d303994
--- /dev/null
+++ b/epan/asm_utils_win32_x86.asm
@@ -0,0 +1,147 @@
+; asm_utils_win32_x86.c
+; Functions optionally implemented in assembler
+;
+; $Id$
+;
+; Wireshark - Network traffic analyzer
+; By Gerald Combs <gerald@wireshark.org>
+; Copyright 1998 Gerald Combs
+;
+; This program is free software; you can redistribute it and/or
+; modify it under the terms of the GNU General Public License
+; as published by the Free Software Foundation; either version 2
+; of the License, or (at your option) any later version.
+;
+; This program 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 General Public License for more details.
+;
+; You should have received a copy of the GNU General Public License
+; along with this program; if not, write to the Free Software
+; Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+;
+
+SECTION .text
+
+GLOBAL _wrs_strcmp
+GLOBAL _wrs_strcmp_with_data
+GLOBAL _wrs_check_charset
+GLOBAL _wrs_str_hash
+
+ align 16
+_wrs_strcmp
+_wrs_strcmp_with_data
+ mov ecx, dword [esp + 4] ; a
+ mov edx, dword [esp + 8] ; b
+ push ebx
+CMP_LOOP:
+ mov eax, dword [ecx]
+ mov ebx, dword [edx]
+ cmp al, bl
+ jne CMP_NEQ_END
+ or al, al
+ jz CMP_EQ_END
+ cmp ah, bh
+ jne CMP_NEQ_END
+ or ah, ah
+ jz CMP_EQ_END
+ shr eax, 16
+ shr ebx, 16
+ add ecx, byte 4
+ add edx, byte 4
+ cmp al, bl
+ jne CMP_NEQ_END
+ or al, al
+ jz CMP_EQ_END
+ cmp ah, bh
+ jne CMP_NEQ_END
+ or ah, ah
+ jnz CMP_LOOP
+CMP_EQ_END:
+ pop ebx
+ xor eax, eax
+ retn
+CMP_NEQ_END:
+ ; returns 1 or -1 based on CF flag from the last comparision
+ sbb eax, eax
+ pop ebx
+ shl eax, 1
+ inc eax
+ retn
+
+ align 16
+_wrs_check_charset:
+ mov edx, dword [esp + 4] ; table
+ mov ecx, dword [esp + 8] ; str
+ push edi
+ push ebx
+ mov edi, edx
+ mov bl, byte 0xFF
+CHK_LOOP:
+ mov eax, dword [ecx]
+ movzx edx, al
+ test bl, byte [edi+edx]
+ jz CHK_AL_END
+ movzx edx, ah
+ test bl, byte [edi+edx]
+ jz CHK_AH_END
+ shr eax, 16
+ add ecx, byte 4
+ movzx edx, al
+ test bl, byte [edi+edx]
+ jz CHK_AL_END
+ movzx edx, ah
+ test bl, byte [edi+edx]
+ jnz CHK_LOOP
+CHK_AH_END
+ movzx eax, ah
+ pop ebx
+ pop edi
+ retn
+CHK_AL_END
+ movzx eax, al
+ pop ebx
+ pop edi
+ retn
+
+ align 16
+_wrs_str_hash:
+ mov edx, dword [esp + 4] ; v
+ push ebx
+ xor eax, eax
+ mov ecx, dword [edx]
+ or cl, cl
+ movzx ebx, cl
+ jz HASH_END
+HASH_LOOP:
+ sub ebx, eax
+ shl eax, 5
+ add eax, ebx
+ or ch, ch
+ movzx ebx, ch
+ jz HASH_END
+ sub ebx, eax
+ shl eax, 5
+ add eax, ebx
+ shr ecx, 16
+ add edx, byte 4
+ or cl, cl
+ movzx ebx, cl
+ jz HASH_END
+ sub ebx, eax
+ shl eax, 5
+ add eax, ebx
+ or ch, ch
+ movzx ebx, ch
+ jz HASH_END
+ sub ebx, eax
+ shl eax, 5
+ add eax, ebx
+ mov ecx, dword [edx]
+ or cl, cl
+ movzx ebx, cl
+ jnz HASH_LOOP
+HASH_END:
+ pop ebx
+ retn