diff options
Diffstat (limited to 'MdePkg/Library/BaseMemoryLibMmx')
-rw-r--r-- | MdePkg/Library/BaseMemoryLibMmx/X64/CopyMem.S | 28 |
1 files changed, 18 insertions, 10 deletions
diff --git a/MdePkg/Library/BaseMemoryLibMmx/X64/CopyMem.S b/MdePkg/Library/BaseMemoryLibMmx/X64/CopyMem.S index 3e7a396b5b..426a602286 100644 --- a/MdePkg/Library/BaseMemoryLibMmx/X64/CopyMem.S +++ b/MdePkg/Library/BaseMemoryLibMmx/X64/CopyMem.S @@ -44,24 +44,32 @@ ASM_PFX(InternalMemCopyMem): lea r9, [rsi + r8 - 1] # r9 <- End of Source cmp rsi, rdi mov rax, rdi # rax <- Destination as return value - jae _InternalMemCopyMem_al_0000 + jae L0 cmp r9, rdi - jae _atSym_CopyBackward # Copy backward if overlapped -_InternalMemCopyMem_al_0000: + jae L_CopyBackward # Copy backward if overlapped +L0: mov rcx, r8 and r8, 7 - shr rcx, 3 - rep movsq # Copy as many Qwords as possible - jmp _atSym_CopyBytes -_atSym_CopyBackward: + shr rcx, 3 # rcx <- # of Qwords to copy + jz L_CopyBytes + movd r10, mm0 # (Save mm0 in r10) +L1: + movq mm0, [rsi] + movntq [rdi], mm0 + add rsi, 8 + add rdi, 8 + loop L1 + mfence + movd mm0, r10 # (Restore mm0) + jmp L_CopyBytes +L_CopyBackward: mov rsi, r9 # rsi <- End of Source - lea rdi, [rdi + r8 - 1] # esi <- End of Destination + lea rdi, [rdi + r8 - 1] # rdi <- End of Destination std # set direction flag -_atSym_CopyBytes: +L_CopyBytes: mov rcx, r8 rep movsb # Copy bytes backward cld pop rdi pop rsi ret - |