add corresponding .S files for BaseMemoryLibXXX X64 arch. Note that we use ".intel_syntax noprefix" directive to simplify the .S implementation.

git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@6184 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
eric_tian 2008-10-22 08:36:39 +00:00
parent 710a5b3584
commit 4df876adfb
36 changed files with 1362 additions and 139 deletions

View File

@ -85,6 +85,17 @@
X64/SetMem16.asm
X64/SetMem.asm
X64/CopyMem.asm
X64/ScanMem64.S
X64/ScanMem32.S
X64/ScanMem16.S
X64/ScanMem8.S
X64/CompareMem.S
X64/SetMem64.S
X64/SetMem32.S
X64/SetMem16.S
X64/ZeroMem.S
X64/SetMem.S
X64/CopyMem.S
[LibraryClasses]

View File

@ -1,3 +1,6 @@
#
# ConvertAsm.py: Automatically generated from CompareMem.asm
#
#------------------------------------------------------------------------------
#
# Copyright (c) 2006, Intel Corporation
@ -11,7 +14,7 @@
#
# Module Name:
#
# CompareMem.Asm
# CompareMem.S
#
# Abstract:
#
@ -29,6 +32,7 @@
#
#------------------------------------------------------------------------------
#------------------------------------------------------------------------------
# INTN
# EFIAPI
@ -38,17 +42,19 @@
# IN UINTN Length
# );
#------------------------------------------------------------------------------
.global _InternalMemCompareMem;
_InternalMemCompareMem:
push %rsi
push %rdi
mov %rcx, %rsi
mov %rdx, %rdi
mov %r8, %rcx
.intel_syntax noprefix
.globl ASM_PFX(InternalMemCompareMem)
ASM_PFX(InternalMemCompareMem):
push rsi
push rdi
mov rsi, rcx
mov rdi, rdx
mov rcx, r8
repe cmpsb
movzbq -1(%rsi), %rax
movzbq -1(%rdi), %rdx
sub %rdx, %rax
pop %rdi
pop %rsi
movzx rax, byte ptr [rsi - 1]
movzx rdx, byte ptr [rdi - 1]
sub rax, rdx
pop rdi
pop rsi
ret

View File

@ -1,3 +1,6 @@
#
# ConvertAsm.py: Automatically generated from CopyMem.asm
#
#------------------------------------------------------------------------------
#
# Copyright (c) 2006, Intel Corporation
@ -11,7 +14,7 @@
#
# Module Name:
#
# CopyMem.asm
# CopyMem.S
#
# Abstract:
#
@ -23,50 +26,42 @@
#------------------------------------------------------------------------------
# VOID *
# EFIAPI
# InternalMemCopyMem (
# OUT VOID *DestinationBuffer,
# IN CONST VOID *SourceBuffer,
# IN UINTN Length
# );
# VOID *
# EFIAPI
# InternalMemCopyMem (
# IN VOID *Destination,
# IN VOID *Source,
# IN UINTN Count
# )
#------------------------------------------------------------------------------
.global _InternalMemCopyMem;
_InternalMemCopyMem:
push %rsi
push %rdi
mov %rdi, %rsi
mov %rcx, %rdi
lea -1(%r8,%rsi,1),%r9
cmp %rdi, %rsi
mov %rdi, %rax
jae L1
cmp %rdi, %r9
jae LCopyBackward # Copy backward if overlapped
L1:
mov %r8, %rcx
and $7, %r8
shr $3, %rcx
jz LCopyBytes
movd %mm0, %r10 # (Save mm0 in r10)
L2:
movd (%rsi), %mm0
movntq %mm0, (%rdi)
add $8, %rsi
add $8, %rdi
loop L2
mfence
movd %r10, %mm0 #(Restore mm0)
jmp LCopyBytes
LCopyBackward:
mov %r9, %rsi
lea -1(%r8,%rdi,1),%rdi
.intel_syntax noprefix
.globl ASM_PFX(InternalMemCopyMem)
ASM_PFX(InternalMemCopyMem):
push rsi
push rdi
mov rsi, rdx # rsi <- Source
mov rdi, rcx # rdi <- Destination
lea r9, [rsi + r8 - 1] # r9 <- End of Source
cmp rsi, rdi
mov rax, rdi # rax <- Destination as return value
jae _InternalMemCopyMem_al_0000
cmp r9, rdi
jae _atSym_CopyBackward # Copy backward if overlapped
_InternalMemCopyMem_al_0000:
mov rcx, r8
and r8, 7
shr rcx, 3
rep movsq # Copy as many Qwords as possible
jmp _atSym_CopyBytes
_atSym_CopyBackward:
mov rsi, r9 # rsi <- End of Source
lea rdi, [rdi + r8 - 1] # esi <- End of Destination
std # set direction flag
LCopyBytes:
mov %r8, %rcx
rep
movsb # Copy bytes backward
_atSym_CopyBytes:
mov rcx, r8
rep movsb # Copy bytes backward
cld
pop %rdi
pop %rsi
pop rdi
pop rsi
ret

View File

@ -0,0 +1,57 @@
#
# ConvertAsm.py: Automatically generated from ScanMem16.asm
#
#------------------------------------------------------------------------------
#
# 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.S
#
# Abstract:
#
# ScanMem16 function
#
# Notes:
#
# The following BaseMemoryLib instances contain the same copy of this file:
#
# BaseMemoryLibRepStr
# BaseMemoryLibMmx
# BaseMemoryLibSse2
# BaseMemoryLibOptDxe
# BaseMemoryLibOptPei
#
#------------------------------------------------------------------------------
#------------------------------------------------------------------------------
# CONST VOID *
# EFIAPI
# InternalMemScanMem16 (
# IN CONST VOID *Buffer,
# IN UINTN Length,
# IN UINT16 Value
# );
#------------------------------------------------------------------------------
.intel_syntax noprefix
.globl ASM_PFX(InternalMemScanMem16)
ASM_PFX(InternalMemScanMem16):
push rdi
mov rdi, rcx
mov rax, r8
mov rcx, rdx
repne scasw
lea rax, [rdi - 2]
cmovnz rax, rcx
pop rdi
ret

View File

@ -0,0 +1,57 @@
#
# ConvertAsm.py: Automatically generated from ScanMem32.asm
#
#------------------------------------------------------------------------------
#
# 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.S
#
# Abstract:
#
# ScanMem32 function
#
# Notes:
#
# The following BaseMemoryLib instances contain the same copy of this file:
#
# BaseMemoryLibRepStr
# BaseMemoryLibMmx
# BaseMemoryLibSse2
# BaseMemoryLibOptDxe
# BaseMemoryLibOptPei
#
#------------------------------------------------------------------------------
#------------------------------------------------------------------------------
# CONST VOID *
# EFIAPI
# InternalMemScanMem32 (
# IN CONST VOID *Buffer,
# IN UINTN Length,
# IN UINT32 Value
# );
#------------------------------------------------------------------------------
.intel_syntax noprefix
.globl ASM_PFX(InternalMemScanMem32)
ASM_PFX(InternalMemScanMem32):
push rdi
mov rdi, rcx
mov rax, r8
mov rcx, rdx
repne scasd
lea rax, [rdi - 4]
cmovnz rax, rcx
pop rdi
ret

View File

@ -0,0 +1,56 @@
#
# ConvertAsm.py: Automatically generated from ScanMem64.asm
#
#------------------------------------------------------------------------------
#
# 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.S
#
# Abstract:
#
# ScanMem64 function
#
# Notes:
#
# The following BaseMemoryLib instances contain the same copy of this file:
#
# BaseMemoryLibRepStr
# BaseMemoryLibMmx
# BaseMemoryLibSse2
# BaseMemoryLibOptDxe
# BaseMemoryLibOptPei
#
#------------------------------------------------------------------------------
#------------------------------------------------------------------------------
# CONST VOID *
# EFIAPI
# InternalMemScanMem64 (
# IN CONST VOID *Buffer,
# IN UINTN Length,
# IN UINT64 Value
# );
#------------------------------------------------------------------------------
.intel_syntax noprefix
.globl ASM_PFX(InternalMemScanMem64)
ASM_PFX(InternalMemScanMem64):
push rdi
mov rdi, rcx
mov rax, r8
mov rcx, rdx
repne scasq
lea rax, [rdi - 8]
cmovnz rax, rcx
pop rdi
ret

View File

@ -0,0 +1,57 @@
#
# ConvertAsm.py: Automatically generated from ScanMem8.asm
#
#------------------------------------------------------------------------------
#
# 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.S
#
# Abstract:
#
# ScanMem8 function
#
# Notes:
#
# The following BaseMemoryLib instances contain the same copy of this file:
#
# BaseMemoryLibRepStr
# BaseMemoryLibMmx
# BaseMemoryLibSse2
# BaseMemoryLibOptDxe
# BaseMemoryLibOptPei
#
#------------------------------------------------------------------------------
#------------------------------------------------------------------------------
# CONST VOID *
# EFIAPI
# InternalMemScanMem8 (
# IN CONST VOID *Buffer,
# IN UINTN Length,
# IN UINT8 Value
# );
#------------------------------------------------------------------------------
.intel_syntax noprefix
.globl ASM_PFX(InternalMemScanMem8)
ASM_PFX(InternalMemScanMem8):
push rdi
mov rdi, rcx
mov rcx, rdx
mov rax, r8
repne scasb
lea rax, [rdi - 1]
cmovnz rax, rcx # set rax to 0 if not found
pop rdi
ret

View File

@ -0,0 +1,62 @@
#
# ConvertAsm.py: Automatically generated from SetMem.asm
#
#------------------------------------------------------------------------------
#
# 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.S
#
# Abstract:
#
# SetMem function
#
# Notes:
#
#------------------------------------------------------------------------------
#------------------------------------------------------------------------------
# VOID *
# EFIAPI
# InternalMemSetMem (
# IN VOID *Buffer,
# IN UINTN Count,
# IN UINT8 Value
# )
#------------------------------------------------------------------------------
.intel_syntax noprefix
.globl ASM_PFX(InternalMemSetMem)
ASM_PFX(InternalMemSetMem):
push rdi
mov rax, r8
mov ah, al
movq mm0, rax
mov r8, rcx
mov rdi, r8 # rdi <- Buffer
mov rcx, rdx
and edx, 7
shr rcx, 3
jz L_SetBytes
pshufw mm0, mm0, 0x0
L0:
movntq [rdi], mm0
add rdi, 8
loop L0
mfence
L_SetBytes:
mov ecx, edx
rep stosb
mov rax, r8
pop rdi
ret

View File

@ -0,0 +1,61 @@
#
# ConvertAsm.py: Automatically generated from SetMem16.asm
#
#------------------------------------------------------------------------------
#
# 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.S
#
# Abstract:
#
# SetMem16 function
#
# Notes:
#
#------------------------------------------------------------------------------
#------------------------------------------------------------------------------
# VOID *
# EFIAPI
# InternalMemSetMem16 (
# IN VOID *Buffer,
# IN UINTN Count,
# IN UINT16 Value
# )
#------------------------------------------------------------------------------
.intel_syntax noprefix
.globl ASM_PFX(InternalMemSetMem16)
ASM_PFX(InternalMemSetMem16):
push rdi
mov rax, r8
movq mm0, rax
mov r8, rcx
mov rdi, r8
mov rcx, rdx
and edx, 3
shr rcx, 2
jz L_SetWords
pshufw mm0, mm0, 0x0
L0:
movntq [rdi], mm0
add rdi, 8
loop L0
mfence
L_SetWords:
mov ecx, edx
rep stosw
mov rax, r8
pop rdi
ret

View File

@ -0,0 +1,56 @@
#
# ConvertAsm.py: Automatically generated from SetMem32.asm
#
#------------------------------------------------------------------------------
#
# 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.S
#
# Abstract:
#
# SetMem32 function
#
# Notes:
#
#------------------------------------------------------------------------------
#------------------------------------------------------------------------------
# VOID *
# EFIAPI
# InternalMemSetMem32 (
# IN VOID *Buffer,
# IN UINTN Count,
# IN UINT32 Value
# );
#------------------------------------------------------------------------------
.intel_syntax noprefix
.globl ASM_PFX(InternalMemSetMem32)
ASM_PFX(InternalMemSetMem32):
movq mm0, r8 # mm0 <- Value
mov rax, rcx # rax <- Buffer
xchg rcx, rdx # rcx <- Count rdx <- Buffer
shr rcx, 1 # rcx <- # of qwords to set
jz L_SetDwords
pshufw mm0, mm0, 0x44
L0:
movntq [rdx], mm0
lea rdx, [rdx + 8] # use "lea" to avoid flag changes
loop L0
mfence
L_SetDwords:
jnc L1
movd [rdx], mm0
L1:
ret

View File

@ -0,0 +1,48 @@
#
# ConvertAsm.py: Automatically generated from SetMem64.asm
#
#------------------------------------------------------------------------------
#
# 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
# )
#------------------------------------------------------------------------------
.intel_syntax noprefix
.globl ASM_PFX(InternalMemSetMem64)
ASM_PFX(InternalMemSetMem64):
movq mm0, r8 #Value
mov rax, rcx #rax <- Buffer
xchg rcx, rdx #rcx <- Count
L0:
movntq [rdx], mm0
add rdx, 8
loop L0
mfence
ret

View File

@ -0,0 +1,58 @@
#
# ConvertAsm.py: Automatically generated from ZeroMem.asm
#
#------------------------------------------------------------------------------
#
# 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.S
#
# Abstract:
#
# ZeroMem function
#
# Notes:
#
#------------------------------------------------------------------------------
#------------------------------------------------------------------------------
# VOID *
# InternalMemZeroMem (
# IN VOID *Buffer,
# IN UINTN Count
# );
#------------------------------------------------------------------------------
.intel_syntax noprefix
.globl ASM_PFX(InternalMemZeroMem)
ASM_PFX(InternalMemZeroMem):
push rdi
mov rdi, rcx
mov rcx, rdx
mov r8, rdi
and edx, 7
shr rcx, 3
jz L_ZeroBytes
pxor mm0, mm0
L0:
movntq [rdi], mm0
add rdi, 8
loop L0
mfence
L_ZeroBytes:
xor eax, eax
mov ecx, edx
rep stosb
mov rax, r8
pop rdi
ret

View File

@ -32,6 +32,18 @@
[Sources.common]
MemLibInternals.h
ScanMem64Wrapper.c
ScanMem32Wrapper.c
ScanMem16Wrapper.c
ScanMem8Wrapper.c
ZeroMemWrapper.c
CompareMemWrapper.c
SetMem64Wrapper.c
SetMem32Wrapper.c
SetMem16Wrapper.c
SetMemWrapper.c
CopyMemWrapper.c
MemLibGuid.c
[Sources.Ia32]
Ia32/ScanMem64.S
@ -56,18 +68,6 @@
Ia32/SetMem16.asm
Ia32/SetMem.asm
Ia32/CopyMem.asm
ScanMem64Wrapper.c
ScanMem32Wrapper.c
ScanMem16Wrapper.c
ScanMem8Wrapper.c
ZeroMemWrapper.c
CompareMemWrapper.c
SetMem64Wrapper.c
SetMem32Wrapper.c
SetMem16Wrapper.c
SetMemWrapper.c
CopyMemWrapper.c
MemLibGuid.c
[Sources.X64]
X64/ScanMem64.S
@ -92,19 +92,6 @@
X64/SetMem16.asm
X64/SetMem.asm
X64/CopyMem.asm
ScanMem64Wrapper.c
ScanMem32Wrapper.c
ScanMem16Wrapper.c
ScanMem8Wrapper.c
ZeroMemWrapper.c
CompareMemWrapper.c
SetMem64Wrapper.c
SetMem32Wrapper.c
SetMem16Wrapper.c
SetMemWrapper.c
CopyMemWrapper.c
MemLibGuid.c
[Packages]
MdePkg/MdePkg.dec

View File

@ -42,9 +42,9 @@
# IN UINTN Length
# );
#------------------------------------------------------------------------------
.intel_syntax
.globl _InternalMemCompareMem
_InternalMemCompareMem:
.intel_syntax noprefix
.globl ASM_PFX(InternalMemCompareMem)
ASM_PFX(InternalMemCompareMem):
push rsi
push rdi
mov rsi, rcx

View File

@ -34,9 +34,9 @@
# IN UINTN Count
# )
#------------------------------------------------------------------------------
.intel_syntax
.globl _InternalMemCopyMem
_InternalMemCopyMem:
.intel_syntax noprefix
.globl ASM_PFX(InternalMemCopyMem)
ASM_PFX(InternalMemCopyMem):
push rsi
push rdi
mov rsi, rdx # rsi <- Source

View File

@ -42,9 +42,9 @@
# IN UINT16 Value
# );
#------------------------------------------------------------------------------
.intel_syntax
.globl _InternalMemScanMem16
_InternalMemScanMem16:
.intel_syntax noprefix
.globl ASM_PFX(InternalMemScanMem16)
ASM_PFX(InternalMemScanMem16):
push rdi
mov rdi, rcx
mov rax, r8

View File

@ -42,9 +42,9 @@
# IN UINT32 Value
# );
#------------------------------------------------------------------------------
.intel_syntax
.globl _InternalMemScanMem32
_InternalMemScanMem32:
.intel_syntax noprefix
.globl ASM_PFX(InternalMemScanMem32)
ASM_PFX(InternalMemScanMem32):
push rdi
mov rdi, rcx
mov rax, r8

View File

@ -42,9 +42,9 @@
# IN UINT64 Value
# );
#------------------------------------------------------------------------------
.intel_syntax
.globl _InternalMemScanMem64
_InternalMemScanMem64:
.intel_syntax noprefix
.globl ASM_PFX(InternalMemScanMem64)
ASM_PFX(InternalMemScanMem64):
push rdi
mov rdi, rcx
mov rax, r8

View File

@ -42,9 +42,9 @@
# IN UINT8 Value
# );
#------------------------------------------------------------------------------
.intel_syntax
.globl _InternalMemScanMem8
_InternalMemScanMem8:
.intel_syntax noprefix
.globl ASM_PFX(InternalMemScanMem8)
ASM_PFX(InternalMemScanMem8):
push rdi
mov rdi, rcx
mov rcx, rdx

View File

@ -34,9 +34,9 @@
# IN UINT8 Value
# )
#------------------------------------------------------------------------------
.intel_syntax
.globl _InternalMemSetMem
_InternalMemSetMem:
.intel_syntax noprefix
.globl ASM_PFX(InternalMemSetMem)
ASM_PFX(InternalMemSetMem):
push rdi
mov rax, r8 # rax = Value
mov rdi, rcx # rdi = Buffer

View File

@ -34,9 +34,9 @@
# IN UINT16 Value
# )
#------------------------------------------------------------------------------
.intel_syntax
.globl _InternalMemSetMem16
_InternalMemSetMem16:
.intel_syntax noprefix
.globl ASM_PFX(InternalMemSetMem16)
ASM_PFX(InternalMemSetMem16):
push rdi
mov rdi, rcx
mov rax, r8

View File

@ -34,9 +34,9 @@
# IN UINT32 Value
# );
#------------------------------------------------------------------------------
.intel_syntax
.globl _InternalMemSetMem32
_InternalMemSetMem32:
.intel_syntax noprefix
.globl ASM_PFX(InternalMemSetMem32)
ASM_PFX(InternalMemSetMem32):
push rdi
mov rdi, rcx
mov rax, r8

View File

@ -33,9 +33,9 @@
# IN UINT64 Value
# )
#------------------------------------------------------------------------------
.intel_syntax
.globl _InternalMemSetMem64
_InternalMemSetMem64:
.intel_syntax noprefix
.globl ASM_PFX(InternalMemSetMem64)
ASM_PFX(InternalMemSetMem64):
push rdi
mov rdi, rcx
mov rax, r8

View File

@ -32,9 +32,9 @@
# IN UINTN Count
# );
#------------------------------------------------------------------------------
.intel_syntax
.globl _InternalMemZeroMem
_InternalMemZeroMem:
.intel_syntax noprefix
.globl ASM_PFX(InternalMemZeroMem)
ASM_PFX(InternalMemZeroMem):
push rdi
push rcx
xor rax, rax

View File

@ -32,6 +32,18 @@
[Sources.common]
MemLibInternals.h
ScanMem64Wrapper.c
ScanMem32Wrapper.c
ScanMem16Wrapper.c
ScanMem8Wrapper.c
ZeroMemWrapper.c
CompareMemWrapper.c
SetMem64Wrapper.c
SetMem32Wrapper.c
SetMem16Wrapper.c
SetMemWrapper.c
CopyMemWrapper.c
MemLibGuid.c
[Sources.Ia32]
Ia32/ScanMem64.S
@ -56,18 +68,6 @@
Ia32/SetMem16.asm
Ia32/SetMem.asm
Ia32/CopyMem.asm
ScanMem64Wrapper.c
ScanMem32Wrapper.c
ScanMem16Wrapper.c
ScanMem8Wrapper.c
ZeroMemWrapper.c
CompareMemWrapper.c
SetMem64Wrapper.c
SetMem32Wrapper.c
SetMem16Wrapper.c
SetMemWrapper.c
CopyMemWrapper.c
MemLibGuid.c
[Sources.X64]
X64/ScanMem64.asm
@ -81,18 +81,17 @@
X64/SetMem16.asm
X64/SetMem.asm
X64/CopyMem.asm
ScanMem64Wrapper.c
ScanMem32Wrapper.c
ScanMem16Wrapper.c
ScanMem8Wrapper.c
ZeroMemWrapper.c
CompareMemWrapper.c
SetMem64Wrapper.c
SetMem32Wrapper.c
SetMem16Wrapper.c
SetMemWrapper.c
CopyMemWrapper.c
MemLibGuid.c
X64/ScanMem64.S
X64/ScanMem32.S
X64/ScanMem16.S
X64/ScanMem8.S
X64/CompareMem.S
X64/ZeroMem.S
X64/SetMem64.S
X64/SetMem32.S
X64/SetMem16.S
X64/SetMem.S
X64/CopyMem.S
[Packages]
MdePkg/MdePkg.dec

View File

@ -0,0 +1,60 @@
#
# ConvertAsm.py: Automatically generated from CompareMem.asm
#
#------------------------------------------------------------------------------
#
# 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.S
#
# Abstract:
#
# CompareMem function
#
# Notes:
#
# The following BaseMemoryLib instances contain the same copy of this file:
#
# BaseMemoryLibRepStr
# BaseMemoryLibMmx
# BaseMemoryLibSse2
# BaseMemoryLibOptDxe
# BaseMemoryLibOptPei
#
#------------------------------------------------------------------------------
#------------------------------------------------------------------------------
# INTN
# EFIAPI
# InternalMemCompareMem (
# IN CONST VOID *DestinationBuffer,
# IN CONST VOID *SourceBuffer,
# IN UINTN Length
# );
#------------------------------------------------------------------------------
.intel_syntax noprefix
.globl ASM_PFX(InternalMemCompareMem)
ASM_PFX(InternalMemCompareMem):
push rsi
push rdi
mov rsi, rcx
mov rdi, rdx
mov rcx, r8
repe cmpsb
movzx rax, byte ptr [rsi - 1]
movzx rdx, byte ptr [rdi - 1]
sub rax, rdx
pop rdi
pop rsi
ret

View File

@ -0,0 +1,84 @@
#
# ConvertAsm.py: Automatically generated from CopyMem.asm
#
#------------------------------------------------------------------------------
#
# 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.S
#
# Abstract:
#
# CopyMem function
#
# Notes:
#
#------------------------------------------------------------------------------
#------------------------------------------------------------------------------
# VOID *
# EFIAPI
# InternalMemCopyMem (
# IN VOID *Destination,
# IN VOID *Source,
# IN UINTN Count
# )
#------------------------------------------------------------------------------
.intel_syntax noprefix
.globl ASM_PFX(InternalMemCopyMem)
ASM_PFX(InternalMemCopyMem):
push rsi
push rdi
mov rsi, rdx # rsi <- Source
mov rdi, rcx # rdi <- Destination
lea r9, [rsi + r8 - 1] # r9 <- Last byte of Source
cmp rsi, rdi
mov rax, rdi # rax <- Destination as return value
jae _InternalMemCopyMem_al_0000 # Copy forward if Source > Destination
cmp r9, rdi # Overlapped?
jae _atSym_CopyBackward # Copy backward if overlapped
_InternalMemCopyMem_al_0000:
xor rcx, rcx
sub rcx, rdi # rcx <- -rdi
and rcx, 15 # rcx + rsi should be 16 bytes aligned
jz _InternalMemCopyMem_al_0001 # skip if rcx == 0
cmp rcx, r8
cmova rcx, r8
sub r8, rcx
rep movsb
_InternalMemCopyMem_al_0001:
mov rcx, r8
and r8, 15
shr rcx, 4 # rcx <- # of DQwords to copy
jz _atSym_CopyBytes
movdqa [rsp + 0x18], xmm0 # save xmm0 on stack
_InternalMemCopyMem_al_0002:
movdqu xmm0, [rsi] # rsi may not be 16-byte aligned
movntdq [rdi], xmm0 # rdi should be 16-byte aligned
add rsi, 16
add rdi, 16
loop _InternalMemCopyMem_al_0002
mfence
movdqa xmm0, [rsp + 0x18] # restore xmm0
jmp _atSym_CopyBytes # copy remaining bytes
_atSym_CopyBackward:
mov rsi, r9 # rsi <- Last byte of Source
lea rdi, [rdi + r8 - 1] # rdi <- Last byte of Destination
std
_atSym_CopyBytes:
mov rcx, r8
rep movsb
cld
pop rdi
pop rsi
ret

View File

@ -0,0 +1,57 @@
#
# ConvertAsm.py: Automatically generated from ScanMem16.asm
#
#------------------------------------------------------------------------------
#
# 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.S
#
# Abstract:
#
# ScanMem16 function
#
# Notes:
#
# The following BaseMemoryLib instances contain the same copy of this file:
#
# BaseMemoryLibRepStr
# BaseMemoryLibMmx
# BaseMemoryLibSse2
# BaseMemoryLibOptDxe
# BaseMemoryLibOptPei
#
#------------------------------------------------------------------------------
#------------------------------------------------------------------------------
# CONST VOID *
# EFIAPI
# InternalMemScanMem16 (
# IN CONST VOID *Buffer,
# IN UINTN Length,
# IN UINT16 Value
# );
#------------------------------------------------------------------------------
.intel_syntax noprefix
.globl ASM_PFX(InternalMemScanMem16)
ASM_PFX(InternalMemScanMem16):
push rdi
mov rdi, rcx
mov rax, r8
mov rcx, rdx
repne scasw
lea rax, [rdi - 2]
cmovnz rax, rcx
pop rdi
ret

View File

@ -0,0 +1,57 @@
#
# ConvertAsm.py: Automatically generated from ScanMem32.asm
#
#------------------------------------------------------------------------------
#
# 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.S
#
# Abstract:
#
# ScanMem32 function
#
# Notes:
#
# The following BaseMemoryLib instances contain the same copy of this file:
#
# BaseMemoryLibRepStr
# BaseMemoryLibMmx
# BaseMemoryLibSse2
# BaseMemoryLibOptDxe
# BaseMemoryLibOptPei
#
#------------------------------------------------------------------------------
#------------------------------------------------------------------------------
# CONST VOID *
# EFIAPI
# InternalMemScanMem32 (
# IN CONST VOID *Buffer,
# IN UINTN Length,
# IN UINT32 Value
# );
#------------------------------------------------------------------------------
.intel_syntax noprefix
.globl ASM_PFX(InternalMemScanMem32)
ASM_PFX(InternalMemScanMem32):
push rdi
mov rdi, rcx
mov rax, r8
mov rcx, rdx
repne scasd
lea rax, [rdi - 4]
cmovnz rax, rcx
pop rdi
ret

View File

@ -0,0 +1,57 @@
#
# ConvertAsm.py: Automatically generated from ScanMem64.asm
#
#------------------------------------------------------------------------------
#
# 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.S
#
# Abstract:
#
# ScanMem64 function
#
# Notes:
#
# The following BaseMemoryLib instances contain the same copy of this file:
#
# BaseMemoryLibRepStr
# BaseMemoryLibMmx
# BaseMemoryLibSse2
# BaseMemoryLibOptDxe
# BaseMemoryLibOptPei
#
#------------------------------------------------------------------------------
#------------------------------------------------------------------------------
# CONST VOID *
# EFIAPI
# InternalMemScanMem64 (
# IN CONST VOID *Buffer,
# IN UINTN Length,
# IN UINT64 Value
# );
#------------------------------------------------------------------------------
.intel_syntax noprefix
.globl ASM_PFX(InternalMemScanMem64)
ASM_PFX(InternalMemScanMem64):
push rdi
mov rdi, rcx
mov rax, r8
mov rcx, rdx
repne scasq
lea rax, [rdi - 8]
cmovnz rax, rcx
pop rdi
ret

View File

@ -0,0 +1,57 @@
#
# ConvertAsm.py: Automatically generated from ScanMem8.asm
#
#------------------------------------------------------------------------------
#
# 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.S
#
# Abstract:
#
# ScanMem8 function
#
# Notes:
#
# The following BaseMemoryLib instances contain the same copy of this file:
#
# BaseMemoryLibRepStr
# BaseMemoryLibMmx
# BaseMemoryLibSse2
# BaseMemoryLibOptDxe
# BaseMemoryLibOptPei
#
#------------------------------------------------------------------------------
#------------------------------------------------------------------------------
# CONST VOID *
# EFIAPI
# InternalMemScanMem8 (
# IN CONST VOID *Buffer,
# IN UINTN Length,
# IN UINT8 Value
# );
#------------------------------------------------------------------------------
.intel_syntax noprefix
.globl ASM_PFX(InternalMemScanMem8)
ASM_PFX(InternalMemScanMem8):
push rdi
mov rdi, rcx
mov rcx, rdx
mov rax, r8
repne scasb
lea rax, [rdi - 1]
cmovnz rax, rcx # set rax to 0 if not found
pop rdi
ret

View File

@ -0,0 +1,73 @@
#
# ConvertAsm.py: Automatically generated from SetMem.asm
#
#------------------------------------------------------------------------------
#
# 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.S
#
# Abstract:
#
# SetMem function
#
# Notes:
#
#------------------------------------------------------------------------------
#------------------------------------------------------------------------------
# VOID *
# EFIAPI
# InternalMemSetMem (
# IN VOID *Buffer,
# IN UINTN Count,
# IN UINT8 Value
# )
#------------------------------------------------------------------------------
.intel_syntax noprefix
.globl ASM_PFX(InternalMemSetMem)
ASM_PFX(InternalMemSetMem):
push rdi
mov rdi, rcx # rdi <- Buffer
mov al, r8b # al <- Value
mov r9, rdi # r9 <- Buffer as return value
xor rcx, rcx
sub rcx, rdi
and rcx, 15 # rcx + rdi aligns on 16-byte boundary
jz L0
cmp rcx, rdx
cmova rcx, rdx
sub rdx, rcx
rep stosb
L0:
mov rcx, rdx
and rdx, 15
shr rcx, 4
jz _SetBytes_L2
mov ah, al # ax <- Value repeats twice
movdqa [rsp + 0x10], xmm0 # save xmm0
movd xmm0, eax # xmm0[0..16] <- Value repeats twice
pshuflw xmm0, xmm0, 0 # xmm0[0..63] <- Value repeats 8 times
movlhps xmm0, xmm0 # xmm0 <- Value repeats 16 times
L1:
movntdq [rdi], xmm0 # rdi should be 16-byte aligned
add rdi, 16
loop L1
mfence
movdqa xmm0, [rsp + 0x10] # restore xmm0
_SetBytes_L2:
mov ecx, edx # high 32 bits of rcx are always zero
rep stosb
mov rax, r9 # rax <- Return value
pop rdi
ret

View File

@ -0,0 +1,71 @@
#
# ConvertAsm.py: Automatically generated from SetMem16.asm
#
#------------------------------------------------------------------------------
#
# 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.S
#
# Abstract:
#
# SetMem16 function
#
# Notes:
#
#------------------------------------------------------------------------------
#------------------------------------------------------------------------------
# VOID *
# EFIAPI
# InternalMemSetMem16 (
# IN VOID *Buffer,
# IN UINTN Count,
# IN UINT16 Value
# )
#------------------------------------------------------------------------------
.intel_syntax noprefix
.globl ASM_PFX(InternalMemSetMem16)
ASM_PFX(InternalMemSetMem16):
push rdi
mov rdi, rcx
mov r9, rdi
xor rcx, rcx
sub rcx, rdi
and rcx, 15
mov rax, r8
jz L0
shr rcx, 1
cmp rcx, rdx
cmova rcx, rdx
sub rdx, rcx
rep stosw
L0:
mov rcx, rdx
and edx, 7
shr rcx, 3
jz _SetWords_L2
movd xmm0, eax
pshuflw xmm0, xmm0, 0
movlhps xmm0, xmm0
L1:
movntdq [rdi], xmm0
add rdi, 16
loop L1
mfence
_SetWords_L2:
mov ecx, edx
rep stosw
mov rax, r9
pop rdi
ret

View File

@ -0,0 +1,70 @@
#
# ConvertAsm.py: Automatically generated from SetMem32.asm
#
#------------------------------------------------------------------------------
#
# 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.S
#
# Abstract:
#
# SetMem32 function
#
# Notes:
#
#------------------------------------------------------------------------------
#------------------------------------------------------------------------------
# VOID *
# EFIAPI
# InternalMemSetMem32 (
# IN VOID *Buffer,
# IN UINTN Count,
# IN UINT32 Value
# );
#------------------------------------------------------------------------------
.intel_syntax noprefix
.globl ASM_PFX(InternalMemSetMem32)
ASM_PFX(InternalMemSetMem32):
push rdi
mov rdi, rcx
mov r9, rdi
xor rcx, rcx
sub rcx, rdi
and rcx, 15
mov rax, r8
jz L0
shr rcx, 2
cmp rcx, rdx
cmova rcx, rdx
sub rdx, rcx
rep stosd
L0:
mov rcx, rdx
and edx, 3
shr rcx, 2
jz _SetDwords_L2
movd xmm0, eax
pshufd xmm0, xmm0, 0
L1:
movntdq [rdi], xmm0
add rdi, 16
loop L1
mfence
_SetDwords_L2:
mov ecx, edx
rep stosd
mov rax, r9
pop rdi
ret

View File

@ -0,0 +1,61 @@
#
# ConvertAsm.py: Automatically generated from SetMem64.asm
#
#------------------------------------------------------------------------------
#
# 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
# )
#------------------------------------------------------------------------------
.intel_syntax noprefix
.globl ASM_PFX(InternalMemSetMem64)
ASM_PFX(InternalMemSetMem64):
mov rax, rcx # rax <- Buffer
xchg rcx, rdx # rcx <- Count & rdx <- Buffer
test dl, 8
movq xmm0, r8
jz L0
mov [rdx], r8
add rdx, 8
dec rcx
L0:
shr rcx, 1
jz _SetQwords_L2
movlhps xmm0, xmm0
L1:
movntdq [rdx], xmm0
lea rdx, [rdx + 16]
loop L1
mfence
_SetQwords_L2:
jnc L2
mov [rdx], r8
L2:
ret

View File

@ -0,0 +1,66 @@
#
# ConvertAsm.py: Automatically generated from ZeroMem.asm
#
#------------------------------------------------------------------------------
#
# 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.S
#
# Abstract:
#
# ZeroMem function
#
# Notes:
#
#------------------------------------------------------------------------------
#------------------------------------------------------------------------------
# VOID *
# InternalMemZeroMem (
# IN VOID *Buffer,
# IN UINTN Count
# );
#------------------------------------------------------------------------------
.intel_syntax noprefix
.globl ASM_PFX(InternalMemZeroMem)
ASM_PFX(InternalMemZeroMem):
push rdi
mov rdi, rcx
xor rcx, rcx
xor eax, eax
sub rcx, rdi
and rcx, 15
mov r8, rdi
jz L0
cmp rcx, rdx
cmova rcx, rdx
sub rdx, rcx
rep stosb
L0:
mov rcx, rdx
and edx, 15
shr rcx, 4
jz _ZeroBytes_L2
pxor xmm0, xmm0
L1:
movntdq [rdi], xmm0 # rdi should be 16-byte aligned
add rdi, 16
loop L1
mfence
_ZeroBytes_L2:
mov ecx, edx
rep stosb
mov rax, r8
pop rdi
ret