]> git.proxmox.com Git - mirror_edk2.git/blob - EdkCompatibilityPkg/Foundation/Library/EfiCommonLib/Ia32/EfiSetMem.c
Add in the 1st version of ECP.
[mirror_edk2.git] / EdkCompatibilityPkg / Foundation / Library / EfiCommonLib / Ia32 / EfiSetMem.c
1 /*++
2
3 Copyright (c) 2006, Intel Corporation
4 All rights reserved. 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 EfiSetMem.c
15
16 Abstract:
17
18 This is the code that supports IA32-optimized SetMem service
19
20 --*/
21
22 #include "Tiano.h"
23
24 VOID
25 EfiCommonLibSetMem (
26 IN VOID *Buffer,
27 IN UINTN Count,
28 IN UINT8 Value
29 )
30 /*++
31
32 Input: VOID *Buffer - Pointer to buffer to write
33 UINTN Count - Number of bytes to write
34 UINT8 Value - Value to write
35
36 Output: None.
37
38 Saves:
39
40 Modifies:
41
42 Description: This function is an optimized set-memory function.
43
44 Notes: This function tries to set memory 8 bytes at a time. As a result,
45 it first picks up any misaligned bytes, then words, before getting
46 in the main loop that does the 8-byte clears.
47
48 --*/
49 {
50 UINT64 QWordValue;
51 UINT64 MmxSave;
52 __asm {
53 mov edx, Count
54 test edx, edx
55 je _SetMemDone
56
57 push ebx
58
59 mov eax, Buffer
60 mov bl, Value
61 mov edi, eax
62 mov bh, bl
63
64 cmp edx, 256
65 jb _SetRemindingByte
66
67 and al, 07h
68 test al, al
69 je _SetBlock
70
71 mov eax, edi
72 shr eax, 3
73 inc eax
74 shl eax, 3
75 sub eax, edi
76 cmp eax, edx
77 jnb _SetRemindingByte
78
79 sub edx, eax
80 mov ecx, eax
81
82 mov al, bl
83 rep stosb
84
85 _SetBlock:
86 mov eax, edx
87 shr eax, 6
88 test eax, eax
89 je _SetRemindingByte
90
91 shl eax, 6
92 sub edx, eax
93 shr eax, 6
94
95 mov WORD PTR QWordValue[0], bx
96 mov WORD PTR QWordValue[2], bx
97 mov WORD PTR QWordValue[4], bx
98 mov WORD PTR QWordValue[6], bx
99
100
101 movq MmxSave, mm0
102 movq mm0, QWordValue
103
104 _B:
105 movq QWORD PTR ds:[edi], mm0
106 movq QWORD PTR ds:[edi+8], mm0
107 movq QWORD PTR ds:[edi+16], mm0
108 movq QWORD PTR ds:[edi+24], mm0
109 movq QWORD PTR ds:[edi+32], mm0
110 movq QWORD PTR ds:[edi+40], mm0
111 movq QWORD PTR ds:[edi+48], mm0
112 movq QWORD PTR ds:[edi+56], mm0
113 add edi, 64
114 dec eax
115 jnz _B
116
117 ; Restore mm0
118 movq mm0, MmxSave
119 emms ; Exit MMX Instruction
120
121 _SetRemindingByte:
122 mov ecx, edx
123
124 mov eax, ebx
125 shl eax, 16
126 mov ax, bx
127 shr ecx, 2
128 rep stosd
129
130 mov ecx, edx
131 and ecx, 3
132 rep stosb
133
134 pop ebx
135
136 _SetMemDone:
137
138 }
139 }