diff options
author | qhuang8 <qhuang8@6f19259b-4bc3-4df7-8a09-765794883524> | 2006-07-13 04:19:34 +0000 |
---|---|---|
committer | qhuang8 <qhuang8@6f19259b-4bc3-4df7-8a09-765794883524> | 2006-07-13 04:19:34 +0000 |
commit | d08b357f8ac448f8e7180f920faa4b335e1fc65e (patch) | |
tree | 53d77f772a283e745438e7b65289d2aed23c941c /MdePkg/Library/BaseMemoryLibSse2 | |
parent | 12e17a0aee55f17840745b0f6c1a15cd47a4aded (diff) | |
download | edk2-platforms-d08b357f8ac448f8e7180f920faa4b335e1fc65e.tar.xz |
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
Diffstat (limited to 'MdePkg/Library/BaseMemoryLibSse2')
-rw-r--r-- | MdePkg/Library/BaseMemoryLibSse2/Ia32/SetMem64.S | 122 |
1 files changed, 59 insertions, 63 deletions
diff --git a/MdePkg/Library/BaseMemoryLibSse2/Ia32/SetMem64.S b/MdePkg/Library/BaseMemoryLibSse2/Ia32/SetMem64.S index 2535a61aca..fa60007f5a 100644 --- a/MdePkg/Library/BaseMemoryLibSse2/Ia32/SetMem64.S +++ b/MdePkg/Library/BaseMemoryLibSse2/Ia32/SetMem64.S @@ -1,63 +1,59 @@ -#------------------------------------------------------------------------------ -# -# Copyright (c) 2006, Intel Corporation -# All rights reserved. This program and the accompanying materials -# 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 -# http://opensource.org/licenses/bsd-license.php -# -# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. -# -# Module Name: -# -# SetMem64.asm -# -# Abstract: -# -# SetMem64 function -# -# Notes: -# -#------------------------------------------------------------------------------ - - .686: - #.MODEL flat,C - .xmm: - .code: - -#------------------------------------------------------------------------------ -# VOID * -# _mem_SetMem64 ( -# IN VOID *Buffer, -# IN UINTN Count, -# IN UINT64 Value -# ) -#------------------------------------------------------------------------------ -.global _InternalMemSetMem64 -_InternalMemSetMem64: - push %edi - movl 12(%esp), %ecx - movl 8(%esp), %edi - testl $8, %edi - movddup 16(%esp), %xmm0 - jz L0 - movq %xmm0, (%edi) - addl $8, %edi - decl %ecx -L0: - movl %ecx, %edx - shrl %ecx - jz @SetQwords -L1: - movntdq %xmm0, (%edi) - addl $16, %edi - loop L1 - mfence -@SetQwords: - testb $1, %dl - jz L2 - movq %xmm0, (%edi) -L2: - pop %edi - ret +#------------------------------------------------------------------------------
+#
+# Copyright (c) 2006, Intel Corporation
+# All rights reserved. This program and the accompanying materials
+# 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
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+# Module Name:
+#
+# SetMem64.S
+#
+# Abstract:
+#
+# SetMem64 function
+#
+# Notes:
+#
+#------------------------------------------------------------------------------
+
+#------------------------------------------------------------------------------
+# VOID *
+# InternalMemSetMem64 (
+# IN VOID *Buffer,
+# IN UINTN Count,
+# IN UINT64 Value
+# )
+#------------------------------------------------------------------------------
+.globl _InternalMemSetMem64
+_InternalMemSetMem64:
+ movl 4(%esp), %eax
+ movl 8(%esp), %ecx
+ testb $8, %al
+ movl %eax, %edx
+ movq 0xc(%esp), %xmm0
+ jz L1
+ movq %xmm0, (%edx)
+ addl $8, %edx
+ decl %ecx
+L1:
+ shrl %ecx
+ jz @SetQwords
+ movlhps %xmm0, %xmm0
+L2:
+ movntdq %xmm0, (%edx)
+ leal 16(%edx), %edx
+ loop L2
+ mfence
+@SetQwords:
+ jnc L3
+ movq %xmm0, (%edx)
+L3:
+ ret
+
+
+
|