1.Fix SetMem64.S to not use SSE3 instruction

2.Make sure NULL-terminator can be appended.

git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@945 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
qhuang8 2006-07-13 04:19:34 +00:00
parent 12e17a0aee
commit d08b357f8a
3 changed files with 61 additions and 65 deletions

View File

@ -1,63 +1,59 @@
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
# #
# Copyright (c) 2006, Intel Corporation # Copyright (c) 2006, Intel Corporation
# All rights reserved. This program and the accompanying materials # All rights reserved. This program and the accompanying materials
# are licensed and made available under the terms and conditions of the BSD License # are licensed and made available under the terms and conditions of the BSD License
# which accompanies this distribution. The full text of the license may be found at # which accompanies this distribution. The full text of the license may be found at
# http://opensource.org/licenses/bsd-license.php # http://opensource.org/licenses/bsd-license.php
# #
# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
# #
# Module Name: # Module Name:
# #
# SetMem64.asm # SetMem64.S
# #
# Abstract: # Abstract:
# #
# SetMem64 function # SetMem64 function
# #
# Notes: # Notes:
# #
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
.686: #------------------------------------------------------------------------------
#.MODEL flat,C # VOID *
.xmm: # InternalMemSetMem64 (
.code: # IN VOID *Buffer,
# IN UINTN Count,
#------------------------------------------------------------------------------ # IN UINT64 Value
# VOID * # )
# _mem_SetMem64 ( #------------------------------------------------------------------------------
# IN VOID *Buffer, .globl _InternalMemSetMem64
# IN UINTN Count, _InternalMemSetMem64:
# IN UINT64 Value movl 4(%esp), %eax
# ) movl 8(%esp), %ecx
#------------------------------------------------------------------------------ testb $8, %al
.global _InternalMemSetMem64 movl %eax, %edx
_InternalMemSetMem64: movq 0xc(%esp), %xmm0
push %edi jz L1
movl 12(%esp), %ecx movq %xmm0, (%edx)
movl 8(%esp), %edi addl $8, %edx
testl $8, %edi decl %ecx
movddup 16(%esp), %xmm0 L1:
jz L0 shrl %ecx
movq %xmm0, (%edi) jz @SetQwords
addl $8, %edi movlhps %xmm0, %xmm0
decl %ecx L2:
L0: movntdq %xmm0, (%edx)
movl %ecx, %edx leal 16(%edx), %edx
shrl %ecx loop L2
jz @SetQwords mfence
L1: @SetQwords:
movntdq %xmm0, (%edi) jnc L3
addl $16, %edi movq %xmm0, (%edx)
loop L1 L3:
mfence ret
@SetQwords:
testb $1, %dl
jz L2
movq %xmm0, (%edi)
L2:
pop %edi
ret

View File

@ -550,7 +550,7 @@ BasePrintLibVSPrint (
// //
// Null terminate the Unicode or ASCII string // Null terminate the Unicode or ASCII string
// //
BasePrintLibFillBuffer (Buffer, EndBuffer, 1, 0, BytesPerOutputCharacter); BasePrintLibFillBuffer (Buffer, EndBuffer + BytesPerOutputCharacter, 1, 0, BytesPerOutputCharacter);
// //
// Make sure output buffer cannot contain more than PcdMaximumUnicodeStringLength // Make sure output buffer cannot contain more than PcdMaximumUnicodeStringLength
// Unicode characters if PcdMaximumUnicodeStringLength is not zero. // Unicode characters if PcdMaximumUnicodeStringLength is not zero.

View File

@ -193,7 +193,7 @@ BasePrintLibConvertValueToString (
} }
} }
BasePrintLibFillBuffer (Buffer, EndBuffer, 1, 0, Increment); BasePrintLibFillBuffer (Buffer, EndBuffer + Increment, 1, 0, Increment);
return ((Buffer - OriginalBuffer) / Increment); return ((Buffer - OriginalBuffer) / Increment);
} }