1;------------------------------------------------------------------------------
2;
3; Copyright (c) 2006, Intel Corporation. All rights reserved.<BR>
4; This program and the accompanying materials
5; are licensed and made available under the terms and conditions of the BSD License
6; which accompanies this distribution.  The full text of the license may be found at
7; http://opensource.org/licenses/bsd-license.php.
8;
9; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
10; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
11;
12; Module Name:
13;
14;   SetMem64.asm
15;
16; Abstract:
17;
18;   SetMem64 function
19;
20; Notes:
21;
22;------------------------------------------------------------------------------
23
24    .code
25
26;------------------------------------------------------------------------------
27;  VOID *
28;  InternalMemSetMem64 (
29;    IN VOID   *Buffer,
30;    IN UINTN  Count,
31;    IN UINT64 Value
32;    )
33;------------------------------------------------------------------------------
34InternalMemSetMem64 PROC
35    mov     rax, rcx                    ; rax <- Buffer
36    xchg    rcx, rdx                    ; rcx <- Count & rdx <- Buffer
37    test    dl, 8
38    movd    xmm0, r8
39    jz      @F
40    mov     [rdx], r8
41    add     rdx, 8
42    dec     rcx
43@@:
44    shr     rcx, 1
45    jz      @SetQwords
46    movlhps xmm0, xmm0
47@@:
48    movntdq [rdx], xmm0
49    lea     rdx, [rdx + 16]
50    loop    @B
51    mfence
52@SetQwords:
53    jnc     @F
54    mov     [rdx], r8
55@@:
56    ret
57InternalMemSetMem64 ENDP
58
59    END
60