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
-