summaryrefslogtreecommitdiff
path: root/MdePkg/Library/BaseMemoryLibMmx
diff options
context:
space:
mode:
authorbbahnsen <bbahnsen@6f19259b-4bc3-4df7-8a09-765794883524>2006-05-17 17:35:01 +0000
committerbbahnsen <bbahnsen@6f19259b-4bc3-4df7-8a09-765794883524>2006-05-17 17:35:01 +0000
commitc92e764e05559aac5fbb79fbbf8c58d9ced0d8ca (patch)
tree93d6fdcccd57eb1e85d4f7fe7c979dc938fed0d4 /MdePkg/Library/BaseMemoryLibMmx
parentb6bd81d45f85be8e74abb5b0a4c0e1dfea803e71 (diff)
downloadedk2-platforms-c92e764e05559aac5fbb79fbbf8c58d9ced0d8ca.tar.xz
Port to GNU assembly.
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@188 6f19259b-4bc3-4df7-8a09-765794883524
Diffstat (limited to 'MdePkg/Library/BaseMemoryLibMmx')
-rw-r--r--MdePkg/Library/BaseMemoryLibMmx/ia32/CompareMem.s50
-rw-r--r--MdePkg/Library/BaseMemoryLibMmx/ia32/CopyMem.s90
-rw-r--r--MdePkg/Library/BaseMemoryLibMmx/ia32/ScanMem16.s46
-rw-r--r--MdePkg/Library/BaseMemoryLibMmx/ia32/ScanMem32.s44
-rw-r--r--MdePkg/Library/BaseMemoryLibMmx/ia32/ScanMem64.s53
-rw-r--r--MdePkg/Library/BaseMemoryLibMmx/ia32/ScanMem8.s44
-rw-r--r--MdePkg/Library/BaseMemoryLibMmx/ia32/SetMem.s67
-rw-r--r--MdePkg/Library/BaseMemoryLibMmx/ia32/SetMem16.s60
-rw-r--r--MdePkg/Library/BaseMemoryLibMmx/ia32/SetMem32.s59
-rw-r--r--MdePkg/Library/BaseMemoryLibMmx/ia32/SetMem64.s50
-rw-r--r--MdePkg/Library/BaseMemoryLibMmx/ia32/ZeroMem.s58
11 files changed, 621 insertions, 0 deletions
diff --git a/MdePkg/Library/BaseMemoryLibMmx/ia32/CompareMem.s b/MdePkg/Library/BaseMemoryLibMmx/ia32/CompareMem.s
new file mode 100644
index 0000000000..6bce0e1372
--- /dev/null
+++ b/MdePkg/Library/BaseMemoryLibMmx/ia32/CompareMem.s
@@ -0,0 +1,50 @@
+#------------------------------------------------------------------------------
+#
+# 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:
+#
+# CompareMem.Asm
+#
+# Abstract:
+#
+# CompareMem function
+#
+# Notes:
+#
+# The following BaseMemoryLib instances share the same version of this file:
+#
+# BaseMemoryLibRepStr
+# BaseMemoryLibMmx
+# BaseMemoryLibSse2
+#
+#------------------------------------------------------------------------------
+
+ .686:
+ #.MODEL flat,C
+ .code:
+
+.global _InternalMemCompareMem
+_InternalMemCompareMem:
+ push %esi
+ push %edi
+ movl 12(%esp), %esi
+ movl 16(%esp), %edi
+ movl 20(%esp), %ecx
+ repe cmpsb
+ movzbl -1(%esi), %eax
+ movzbl -1(%edi), %edx
+ subl %edx, %eax
+ subl %edx, %eax
+ pop %edi
+ pop %esi
+ ret
+
+
diff --git a/MdePkg/Library/BaseMemoryLibMmx/ia32/CopyMem.s b/MdePkg/Library/BaseMemoryLibMmx/ia32/CopyMem.s
new file mode 100644
index 0000000000..56788cb981
--- /dev/null
+++ b/MdePkg/Library/BaseMemoryLibMmx/ia32/CopyMem.s
@@ -0,0 +1,90 @@
+#------------------------------------------------------------------------------
+#
+# 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:
+#
+# CopyMem.asm
+#
+# Abstract:
+#
+# CopyMem function
+#
+# Notes:
+#
+#------------------------------------------------------------------------------
+
+ .686:
+ #.MODEL flat,C
+ .xmm:
+ .code:
+
+#------------------------------------------------------------------------------
+# VOID *
+# _mem_CopyMem (
+# IN VOID *Destination,
+# IN VOID *Source,
+# IN UINTN Count
+# )
+#------------------------------------------------------------------------------
+.global _InternalMemCopyMem
+_InternalMemCopyMem:
+ push %esi
+ push %edi
+ movl 16(%esp), %esi # esi <- Source
+ movl 12(%esp), %edi # edi <- Destination
+ movl 20(%esp), %edx # edx <- Count
+ leal -1(%edi,%edx,), %eax # eax <- End of Destination
+ cmpl %edi, %esi
+ jae L0
+ cmpl %esi, %eax # Overlapped?
+ jae @CopyBackward # Copy backward if overlapped
+L0:
+ xorl %ecx, %ecx
+ subl %esi, %ecx
+ andl $7, %ecx # ecx + esi aligns on 8-byte boundary
+ jz L1
+ cmpl %edx, %ecx
+ cmova %edx, %ecx
+ subl %ecx, %edx # edx <- remaining bytes to copy
+ rep
+ movsb
+L1:
+ movl %edx, %ecx
+ andl $7, %edx
+ shrl $3, %ecx # ecx <- # of Qwords to copy
+ jz @CopyBytes
+ pushl %eax
+ pushl %eax
+ movq %mm0, (%esp) # save mm0
+L2:
+ movq (%esi), %mm0
+ movntq %mm0, (%edi)
+ addl $8, %esi
+ addl $8, %edi
+ loop L2
+ mfence
+ movq (%esp), %mm0 # restore mm0
+ popl %ecx # stack cleanup
+ popl %ecx # stack cleanup
+ jmp @CopyBytes
+@CopyBackward:
+ movl %eax, %edi # edi <- Last byte in Destination
+ leal -1(%esi,%edx,), %esi # esi <- Last byte in Source
+ std
+@CopyBytes:
+ movl %edx, %ecx
+ rep
+ movsb
+ cld
+ movl 12(%esp), %eax
+ push %esi
+ push %edi
+ ret
diff --git a/MdePkg/Library/BaseMemoryLibMmx/ia32/ScanMem16.s b/MdePkg/Library/BaseMemoryLibMmx/ia32/ScanMem16.s
new file mode 100644
index 0000000000..e23799e773
--- /dev/null
+++ b/MdePkg/Library/BaseMemoryLibMmx/ia32/ScanMem16.s
@@ -0,0 +1,46 @@
+#------------------------------------------------------------------------------
+#
+# 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:
+#
+# ScanMem16.Asm
+#
+# Abstract:
+#
+# ScanMem16 function
+#
+# Notes:
+#
+# The following BaseMemoryLib instances share the same version of this file:
+#
+# BaseMemoryLibRepStr
+# BaseMemoryLibMmx
+# BaseMemoryLibSse2
+#
+#------------------------------------------------------------------------------
+
+ .686:
+ #.MODEL flat,C
+ .code:
+
+.global _InternalMemScanMem16
+_InternalMemScanMem16:
+ push %edi
+ movl 12(%esp), %ecx
+ movl 8(%esp), %edi
+ movl 16(%esp), %eax
+ repne scasw
+ leal -2(%edi), %eax
+ cmovnz %ecx, %eax
+ pop %edi
+ ret
+
+
diff --git a/MdePkg/Library/BaseMemoryLibMmx/ia32/ScanMem32.s b/MdePkg/Library/BaseMemoryLibMmx/ia32/ScanMem32.s
new file mode 100644
index 0000000000..6b4a919dde
--- /dev/null
+++ b/MdePkg/Library/BaseMemoryLibMmx/ia32/ScanMem32.s
@@ -0,0 +1,44 @@
+#------------------------------------------------------------------------------
+#
+# 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:
+#
+# ScanMem32.Asm
+#
+# Abstract:
+#
+# ScanMem32 function
+#
+# Notes:
+#
+# The following BaseMemoryLib instances share the same version of this file:
+#
+# BaseMemoryLibRepStr
+# BaseMemoryLibMmx
+# BaseMemoryLibSse2
+#
+#------------------------------------------------------------------------------
+
+ .686:
+ #.MODEL flat,C
+ .code:
+
+.global _InternalMemScanMem32
+_InternalMemScanMem32:
+ push %edi
+ movl 12(%esp), %ecx
+ movl 8(%esp), %edi
+ movl 16(%esp), %eax
+ repne scasl
+ leal -4(%edi), %eax
+ cmovnz %ecx, %eax
+ pop %edi
+ ret
diff --git a/MdePkg/Library/BaseMemoryLibMmx/ia32/ScanMem64.s b/MdePkg/Library/BaseMemoryLibMmx/ia32/ScanMem64.s
new file mode 100644
index 0000000000..00f6d74436
--- /dev/null
+++ b/MdePkg/Library/BaseMemoryLibMmx/ia32/ScanMem64.s
@@ -0,0 +1,53 @@
+#------------------------------------------------------------------------------
+#
+# 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:
+#
+# ScanMem64.Asm
+#
+# Abstract:
+#
+# ScanMem64 function
+#
+# Notes:
+#
+# The following BaseMemoryLib instances share the same version of this file:
+#
+# BaseMemoryLibRepStr
+# BaseMemoryLibMmx
+# BaseMemoryLibSse2
+#
+#------------------------------------------------------------------------------
+
+ .686:
+ #.MODEL flat,C
+ .code:
+
+.global _InternalMemScanMem64
+_InternalMemScanMem64:
+ push %edi
+ movl 12(%esp), %ecx
+ movl 16(%esp), %eax
+ movl 20(%esp), %edx
+ movl 8(%esp), %edi
+L0:
+ cmpl (%edi), %eax
+ leal 8(%edi), %edi
+ loopne L0
+ jne L1
+ cmpl -4(%edi), %edx
+ jecxz L1
+ jne L0
+L1:
+ leal -8(%edi), %eax
+ cmovne %ecx, %eax
+ pop %edi
+ ret
diff --git a/MdePkg/Library/BaseMemoryLibMmx/ia32/ScanMem8.s b/MdePkg/Library/BaseMemoryLibMmx/ia32/ScanMem8.s
new file mode 100644
index 0000000000..57640378b4
--- /dev/null
+++ b/MdePkg/Library/BaseMemoryLibMmx/ia32/ScanMem8.s
@@ -0,0 +1,44 @@
+#------------------------------------------------------------------------------
+#
+# 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:
+#
+# ScanMem8.Asm
+#
+# Abstract:
+#
+# ScanMem8 function
+#
+# Notes:
+#
+# The following BaseMemoryLib instances share the same version of this file:
+#
+# BaseMemoryLibRepStr
+# BaseMemoryLibMmx
+# BaseMemoryLibSse2
+#
+#------------------------------------------------------------------------------
+
+ .686:
+ #.MODEL flat,C
+ .code:
+
+.global _InternalMemScanMem8
+_InternalMemScanMem8:
+ push %edi
+ movl 12(%esp), %ecx
+ movl 8(%esp), %edi
+ movb 16(%esp), %al
+ repne scasb
+ leal -1(%edi), %eax
+ cmovnz %ecx, %eax
+ pop %edi
+ ret
diff --git a/MdePkg/Library/BaseMemoryLibMmx/ia32/SetMem.s b/MdePkg/Library/BaseMemoryLibMmx/ia32/SetMem.s
new file mode 100644
index 0000000000..8a893f893a
--- /dev/null
+++ b/MdePkg/Library/BaseMemoryLibMmx/ia32/SetMem.s
@@ -0,0 +1,67 @@
+#------------------------------------------------------------------------------
+#
+# 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:
+#
+# SetMem.asm
+#
+# Abstract:
+#
+# SetMem function
+#
+# Notes:
+#
+#------------------------------------------------------------------------------
+
+ .686:
+ #.MODEL flat,C
+ .xmm:
+ .code:
+
+#------------------------------------------------------------------------------
+# VOID *
+# _mem_SetMem (
+# IN VOID *Buffer,
+# IN UINTN Count,
+# IN UINT8 Value
+# )
+#------------------------------------------------------------------------------
+.global _InternalMemSetMem
+_InternalMemSetMem:
+ push %edi
+ movl 12(%esp), %ecx # ecx <- Count
+ movl 8(%esp), %edi # edi <- Buffer
+ movl %ecx, %edx
+ shrl $3, %ecx # # of Qwords to set
+ movb 16(%esp), %al # al <- Value
+ jz @SetBytes
+ movb %al, %ah # ax <- Value | (Value << 8)
+ pushl %ecx
+ pushl %ecx
+ movq %mm0, (%esp) # save mm0
+ movd %eax, %mm0
+ pshufw $0x0,%mm0,%mm0
+L0:
+ movntq %mm0, (%edi)
+ addl $8, %edi
+ loop L0
+ mfence
+ movq (%esp), %mm0 # restore mm0
+ popl %ecx # stack cleanup
+ popl %ecx
+@SetBytes:
+ andl $7, %edx
+ movl %edx, %ecx
+ rep
+ stosb
+ movl 8(%esp), %eax # eax <- Buffer as return value
+ pop %edi
+ ret
diff --git a/MdePkg/Library/BaseMemoryLibMmx/ia32/SetMem16.s b/MdePkg/Library/BaseMemoryLibMmx/ia32/SetMem16.s
new file mode 100644
index 0000000000..bcbd49e442
--- /dev/null
+++ b/MdePkg/Library/BaseMemoryLibMmx/ia32/SetMem16.s
@@ -0,0 +1,60 @@
+#------------------------------------------------------------------------------
+#
+# 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:
+#
+# SetMem16.asm
+#
+# Abstract:
+#
+# SetMem16 function
+#
+# Notes:
+#
+#------------------------------------------------------------------------------
+
+ .686:
+ #.MODEL flat,C
+ .xmm:
+ .code:
+
+#------------------------------------------------------------------------------
+# VOID *
+# _mem_SetMem16 (
+# IN VOID *Buffer,
+# IN UINTN Count,
+# IN UINT16 Value
+# )
+#------------------------------------------------------------------------------
+.global _InternalMemSetMem16
+_InternalMemSetMem16:
+ push %edi
+ movl 12(%esp), %edx
+ movl 8(%esp), %edi
+ movl %edx, %ecx
+ andl $3, %edx
+ shrl $2, %ecx
+ movl 16(%esp), %eax
+ jz @SetWords
+ movd %eax, %mm0
+ pshufw $0, %mm0, %mm0
+L0:
+ movntq %mm0, (%edi)
+ addl $8, %edi
+ loop L0
+ mfence
+@SetWords:
+ movl %edx, %ecx
+ rep
+ stosw
+ movl 8(%esp), %eax
+ pop %edi
+ ret
diff --git a/MdePkg/Library/BaseMemoryLibMmx/ia32/SetMem32.s b/MdePkg/Library/BaseMemoryLibMmx/ia32/SetMem32.s
new file mode 100644
index 0000000000..a1a0eaf02e
--- /dev/null
+++ b/MdePkg/Library/BaseMemoryLibMmx/ia32/SetMem32.s
@@ -0,0 +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:
+#
+# SetMem32.asm
+#
+# Abstract:
+#
+# SetMem32 function
+#
+# Notes:
+#
+#------------------------------------------------------------------------------
+
+ .686:
+ #.MODEL flat,C
+ .xmm:
+ .code:
+
+#------------------------------------------------------------------------------
+# VOID *
+# _mem_SetMem32 (
+# IN VOID *Buffer,
+# IN UINTN Count,
+# IN UINT32 Value
+# )
+#------------------------------------------------------------------------------
+.global _InternalMemSetMem32
+_InternalMemSetMem32:
+ push %edi
+ movl 12(%esp), %edx
+ movl 8(%esp), %edi
+ movl %edx, %ecx
+ shrl %ecx
+ movd 16(%esp), %mm0
+ movl %edi, %eax
+ jz @SetDwords
+ pshufw $0x44, %mm0, %mm0
+L0:
+ movntq %mm0, (%edi)
+ addl $8, %edi
+ loopl L0
+ mfence
+@SetDwords:
+ testb $1, %dl
+ jz @F
+ movd %mm0, (%edi)
+L1:
+ pop %edi
+ ret
diff --git a/MdePkg/Library/BaseMemoryLibMmx/ia32/SetMem64.s b/MdePkg/Library/BaseMemoryLibMmx/ia32/SetMem64.s
new file mode 100644
index 0000000000..9699581606
--- /dev/null
+++ b/MdePkg/Library/BaseMemoryLibMmx/ia32/SetMem64.s
@@ -0,0 +1,50 @@
+#------------------------------------------------------------------------------
+#
+# 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
+ movq 16(%esp), %mm0
+ movl 12(%esp), %ecx
+ movl 8(%esp), %edi
+ movl %edi, %eax
+L0:
+ movntq %mm0, (%edi)
+ addl $8, %edi
+ loopl L0
+ mfence
+ pop %edi
+ ret
diff --git a/MdePkg/Library/BaseMemoryLibMmx/ia32/ZeroMem.s b/MdePkg/Library/BaseMemoryLibMmx/ia32/ZeroMem.s
new file mode 100644
index 0000000000..0bb19c7da2
--- /dev/null
+++ b/MdePkg/Library/BaseMemoryLibMmx/ia32/ZeroMem.s
@@ -0,0 +1,58 @@
+#------------------------------------------------------------------------------
+#
+# 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:
+#
+# ZeroMem.asm
+#
+# Abstract:
+#
+# ZeroMem function
+#
+# Notes:
+#
+#------------------------------------------------------------------------------
+
+ .686:
+ #.MODEL flat,C
+ .xmm:
+ .code:
+
+#------------------------------------------------------------------------------
+# VOID *
+# _mem_ZeroMem (
+# IN VOID *Buffer,
+# IN UINTN Count
+# )
+#------------------------------------------------------------------------------
+.global _InternalMemZeroMem
+_InternalMemZeroMem:
+ push %edi
+ movl 8(%esp), %edi
+ movl 12(%esp), %ecx
+ movl %ecx, %edx
+ shrl $3, %ecx
+ jz @ZeroBytes
+ pxor %mm0, %mm0
+L0:
+ movntq %mm0, (%edi)
+ addl $8, %edi
+ loop L0
+ mfence
+@ZeroBytes:
+ andl $7, %edx
+ xorl %eax, %eax
+ movl %edx, %ecx
+ rep
+ stosb
+ movl 8(%esp), %eax
+ pop %edi
+ ret