merge trunk head (37902)
[reactos.git] / reactos / lib / rtl / amd64 / rtlmem.S
1 /*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS Run-Time Library
4 * PURPOSE: Memory functions for amd64
5 * FILE: lib/rtl/i386/rtlswap.S
6 * PROGRAMER: Timo Kreuzer (timo.kreuzer@reactos.org)
7 */
8
9 /* INCLUDES ******************************************************************/
10
11 #include <ndk/amd64/asmmacro.S>
12
13 /* FUNCTIONS *****************************************************************/
14 .intel_syntax noprefix
15
16 /* SIZE_T
17 * RtlCompareMemory(
18 * IN CONST VOID *Source1, <rcx>
19 * IN CONST VOID *Source2, <rdx>
20 * IN SIZE_T Length <r8>
21 * );
22 */
23 .proc RtlCompareMemory
24
25 /* Save registers */
26 push rsi
27 .pushreg rsi
28 push rdi
29 .pushreg rdi
30
31 /* Setup registers for compare */
32 mov rsi, rcx
33 mov rdi, rdx
34
35 /* Clear direction flag */
36 cli
37
38 /* Get number of qwords */
39 mov rcx, r8
40 shr rcx, 3
41 jz 2f
42
43 /* Compare qwords */
44 repe cmpsq
45 jnz 4f
46
47 2: /* Compare rest */
48 mov rcx, r8
49 and rcx, 7
50 jz 3f
51
52 repe cmpsb
53 jnz 5f
54
55 3: /* All equal */
56 /* Return the full count */
57 mov rax, rcx
58 jmp 6f
59
60 4: /* Not equal after comparing qwords */
61 /* Compare the last qword */
62 sub rsi, 8
63 sub rdi, 8
64 mov rcx, 8
65 repe cmpsb
66
67 5: /* Not equal after comparing bytes */
68 /* Return difference */
69 sub rdi, rdx
70 dec rdi
71 mov rax, rdi
72
73 6: /* Cleanup and return */
74 pop rdi
75 pop rsi
76 ret
77 .endproc
78