diff options
Diffstat (limited to 'strings/ptr_cmp.asm')
-rw-r--r-- | strings/ptr_cmp.asm | 180 |
1 files changed, 180 insertions, 0 deletions
diff --git a/strings/ptr_cmp.asm b/strings/ptr_cmp.asm new file mode 100644 index 00000000000..6106016ee32 --- /dev/null +++ b/strings/ptr_cmp.asm @@ -0,0 +1,180 @@ +; Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB +; +; This library is free software; you can redistribute it and/or +; modify it under the terms of the GNU Library General Public +; License as published by the Free Software Foundation; either +; version 2 of the License, or (at your option) any later version. +; +; This 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 +; Library General Public License for more details. +; +; You should have received a copy of the GNU Library General Public +; License along with this library; if not, write to the Free +; Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, +; MA 02111-1307, USA + + TITLE Optimized cmp of pointer to strings of unsigned chars + +ifndef M_I386 + .8087 + DOSSEG + .MODEL LARGE + .DATA +compare_length dw 0 + .CODE STRINGS + + PUBLIC _get_ptr_compare +_get_ptr_compare PROC + mov bx,sp + mov cx,ss:[BX+4] + mov compare_length,cx + mov dx,seg strings:_ptr_cmp + mov ax,offset _ptr_cmp_0 + jcxz @F + mov ax,offset _ptr_cmp_1 + dec cx + jz @F + mov ax,offset _ptr_cmp +@@: ret +_get_ptr_compare ENDP + +_ptr_cmp_0 PROC + mov AX,0 ; Emptyt strings are always equal + ret +_ptr_cmp_0 ENDP + + +_ptr_cmp_1 PROC + mov bx,sp + mov dx,si ; Save si and ds + mov cx,ds + lds si,DWORD PTR ss:[bx+4] ; s1 + lds si,DWORD PTR ds:[si] + mov al,ds:[si] + xor ah,ah + lds si,DWORD PTR ss:[bx+8] ; s2 + lds si,DWORD PTR ds:[si] + mov bl,ds:[si] + mov bh,ah + sub ax,bx + mov ds,cx ; restore si and ds + mov si,dx + ret +_ptr_cmp_1 ENDP + +_ptr_cmp PROC + mov bx,bp ; Save bp + mov dx,di ; Save di + mov bp,sp + push ds + push si + mov cx,compare_length ; Length of memory-area + lds si,DWORD PTR [bp+4] ; s1 + lds si,DWORD PTR ds:[si] + les di,DWORD PTR [bp+8] ; s2 + les di,DWORD PTR es:[di] +; cld ; Work uppward + xor ax,ax + repe cmpsb ; Compare strings + je @F ; Strings are equal + sbb ax,ax + cmc + adc ax,0 + +@@: pop si + pop ds + mov di,dx + mov bp,bx + ret +_ptr_cmp ENDP + +else + +include macros.asm + +fix_es MACRO fix_cld ; Load ES if neaded + ife ESeqDS + mov ax,ds + mov es,ax + endif + ifnb <fix_cld> + cld + endif + ENDM + + begdata +compare_length dd 0 ; Length of strings + enddata + + begcode get_ptr_compare + public _get_ptr_compare +_get_ptr_compare proc near + mov ecx,P-SIZEPTR[esp] + mov compare_length,ecx + mov eax,offset _TEXT:_ptr_cmp_0 + jecxz @F + mov eax,offset _TEXT:_ptr_cmp_1 + dec ecx + jz @F + mov eax,offset _TEXT:_ptr_cmp +@@: ret +_get_ptr_compare endp + endcode _get_ptr_compare + + + begcode ptr_cmp_0 +_ptr_cmp_0 PROC + mov EAX,0 ; Emptyt strings are always equal + ret +_ptr_cmp_0 ENDP + endcode ptr_cmp_0 + + + begcode ptr_cmp_1 +_ptr_cmp_1 proc near + mov edx,esi ; Save esi + mov esi,P-SIZEPTR[esp] ; *s1 + mov esi,[esi] + movzx eax,[esi] + mov esi,P[esp] ; *s2 + mov esi,[esi] + movzx ecx,[esi] + sub eax,ecx + mov esi,edx ; Restore esi + ret +_ptr_cmp_1 ENDP + endcode ptr_cmp_1 + + + begcode ptr_cmp +_ptr_cmp proc near + fix_es 1 + push ebp + mov ebp,esp + mov edx,edi ; Save esi + push esi + mov esi,P[ebp] ; *s1 + mov esi,[esi] + mov edi,P+SIZEPTR[ebp] ; *s2 + mov edi,[edi] + mov ecx,compare_length ; Length of memory-area + xor eax,eax + repe cmpsb ; Compare strings + je @F ; Strings are equal + + sbb eax,eax + cmc + adc eax,0 + +@@: pop esi + mov edi,edx + pop ebp + ret +_ptr_cmp ENDP + endcode ptr_cmp + +endif + + END |