diff options
Diffstat (limited to 'epan/asm_utils_win32_x86.asm')
-rw-r--r-- | epan/asm_utils_win32_x86.asm | 147 |
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 |