kolibrios/programs/develop/open watcom/trunk/clib/cgsupp/__stos.asm
Sergey Semyonov (Serge) 836c97f0ac Clib string & memory functions
git-svn-id: svn://kolibrios.org@553 a494cfbc-eb01-0410-851d-a64ba20cac60
2007-06-26 00:54:22 +00:00

144 lines
6.9 KiB
NASM

;*****************************************************************************
;*
;* Open Watcom Project
;*
;* Portions Copyright (c) 1983-2002 Sybase, Inc. All Rights Reserved.
;*
;* ========================================================================
;*
;* This file contains Original Code and/or Modifications of Original
;* Code as defined in and that are subject to the Sybase Open Watcom
;* Public License version 1.0 (the 'License'). You may not use this file
;* except in compliance with the License. BY USING THIS FILE YOU AGREE TO
;* ALL TERMS AND CONDITIONS OF THE LICENSE. A copy of the License is
;* provided with the Original Code and Modifications, and is also
;* available at www.sybase.com/developer/opensource.
;*
;* The Original Code and all software distributed under the License are
;* distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
;* EXPRESS OR IMPLIED, AND SYBASE AND ALL CONTRIBUTORS HEREBY DISCLAIM
;* ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF
;* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR
;* NON-INFRINGEMENT. Please see the License for the specific language
;* governing rights and limitations under the License.
;*
;* ========================================================================
;*
;* Description: WHEN YOU FIGURE OUT WHAT THIS FILE DOES, PLEASE
;* DESCRIBE IT HERE!
;*
;*****************************************************************************
;
; __STOSB( char *EAX, int EDX, unsigned ECX );
; __STOSD( char *EAX, int EDX, unsigned ECX );
;
include mdef.inc
include struct.inc
modstart __stos,para
xdefp __STOSB
xdefp __STOSD
defpe __STOSB
or ECX,ECX ; if length not zero
_if ne ; then
cmp [EAX],DL ; - access cache line
_loop ; - loop (get onto 4-byte boundary)
test AL,3 ; - - quit if on 4-byte boundary
_quif e ; - - ...
mov [EAX],DL ; - - store byte
inc EAX ; - - increment address
ror EDX,8 ; - - (DH can be different from DL)
dec ECX ; - - decrement length
_until e ; - until done
push ECX ; - save length
shr ECX,2 ; - calculate number of dwords
call __STOSD ; - store dwords
pop ECX ; - restore length
_guess ; - guess: some bytes left to do
and ECX,3 ; - - calculate number of bytes left
_quif e ; - - quit if done
mov [EAX],DL ; - - store a byte
dec ECX ; - - decrement length
_quif e ; - - quit if done
mov 1[EAX],DH ; - - store a byte
dec ECX ; - - decrement length
_quif e ; - - quit if done
mov 2[EAX],DL ; - - store a byte
_endguess ; - endguess
_endif ; endif
ret ; return
endproc __STOSB
nop
nop
nop
nop
nop
nop
defpe __STOSD
or ECX,ECX ; if length not zero
_if ne ; then
_loop ; - loop (get onto 32-byte boundary)
test AL,1Fh ; - - quit if on 32-byte boundary
_quif e ; - - ...
mov [EAX],EDX ; - - store dword
lea EAX,4[EAX] ; - - increment address
dec ECX ; - - decrement length
_until e ; - until done
push ECX ; - save length
shr ECX,2 ; - calculate number of paragraphs
_if ne ; - if at least one paragraph
dec ECX ; - - decrement # of paragraphs
_if ne ; - - if still have paragraphs to do
_loop ; - - - loop
mov [EAX],EDX ; - - - - store dword
mov 4[EAX],EDX ; - - - - ...
dec ECX ; - - - - decrement count
mov 8[EAX],EDX ; - - - - store dword
mov 12[EAX],EDX ; - - - - ...
je short add16 ; - - - - quit if done
cmp 32[EAX],DL ; - - - - access next cache line
mov 16[EAX],EDX ; - - - - store dword
mov 20[EAX],EDX ; - - - - ...
dec ECX ; - - - - decrement count
mov 24[EAX],EDX ; - - - - store dword
mov 28[EAX],EDX ; - - - - ...
lea EAX,32[EAX] ; - - - - advance to next 32-byte chunk
_until e ; - - - until done
lea EAX,-16[EAX] ; - - - back up 16
add16: lea EAX,16[EAX] ; - - - advance 16
_endif ; - - endif
mov [EAX],EDX ; - - fill last full paragraph
mov 4[EAX],EDX ; - - ...
mov 8[EAX],EDX ; - - ...
mov 12[EAX],EDX ; - - ...
lea EAX,16[EAX] ; - - advance pointer
_endif ; - endif
pop ECX ; - restore length
_guess ; - guess: some dwords left to do
and ECX,3 ; - - calculate number of dwords left
_quif e ; - - quit if done
mov [EAX],EDX ; - - store dword
lea EAX,4[EAX] ; - - advance pointer
dec ECX ; - - decrement length
_quif e ; - - quit if done
mov [EAX],EDX ; - - store dword
lea EAX,4[EAX] ; - - advance pointer
dec ECX ; - - decrement length
_quif e ; - - quit if done
mov [EAX],EDX ; - - store dword
lea EAX,4[EAX] ; - - advance pointer
_endguess ; - endguess
_endif ; endif
ret ; return
endproc __STOSD
endmod
end