]> git.proxmox.com Git - mirror_edk2.git/blame - EdkCompatibilityPkg/Foundation/Library/EfiCommonLib/Ia32/EfiSetMem.S
Add Acpi System Description Table protocol from PI 1.2 specification.
[mirror_edk2.git] / EdkCompatibilityPkg / Foundation / Library / EfiCommonLib / Ia32 / EfiSetMem.S
CommitLineData
b962b6b5 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.asm
15#
16#Abstract:
17#
18# This is the code that supports IA32-optimized SetMem service
19#
20#--*/
21#include "EfiBind.h"
22#---------------------------------------------------------------------------
23 .686:
24 #.MODEL flat,C
25 .mmx:
26 .code:
27
28#---------------------------------------------------------------------------
29.globl ASM_PFX(EfiCommonLibSetMem)
30
31#VOID
32#EfiCommonLibSetMem (
33# IN VOID *Buffer,
34# IN UINTN Count,
35# IN UINT8 Value
36# )
37#/*++
38#
39#Input: VOID *Buffer - Pointer to buffer to write
40# UINTN Count - Number of bytes to write
41# UINT8 Value - Value to write
42#
43#Output: None.
44#
45#Saves:
46#
47#Modifies:
48#
49#Description: This function is an optimized set-memory function.
50#
51#Notes: This function tries to set memory 8 bytes at a time. As a result,
52# it first picks up any misaligned bytes, then words, before getting
53# in the main loop that does the 8-byte clears.
54#
55#--*/
56ASM_PFX(EfiCommonLibSetMem):
57
58 pushl %ebp
59 movl %esp, %ebp
60 subl $0x10, %esp # Reserve space for local variable UINT64 QWordValue @[ebp - 10H] & UINT64 MmxSave @[ebp - 18H]
61 pushl %ebx
62 pushl %edi
63
64 movl 0xC(%ebp), %edx # Count
65 testl %edx, %edx
66 je _SetMemDone
67
68 pushl %ebx
69
70 movl 8(%ebp), %eax # Buffer
71 movb 0x10(%ebp), %bl # Value
72 movl %eax, %edi
73 movb %bl, %bh
74
75 cmpl $256, %edx
76 jb _SetRemindingByte
77
78 andb $0x7, %al
79 testb %al, %al
80 je _SetBlock
81
82 movl %edi, %eax
83 shrl $3, %eax
84 incl %eax
85 shll $3, %eax
86 subl %edi, %eax
87 cmpl %edx, %eax
88 jnb _SetRemindingByte
89
90 subl %eax, %edx
91 movl %eax, %ecx
92
93 movb %bl, %al
94 rep
95 stosb
96
97_SetBlock:
98 movl %edx, %eax
99 shrl $6, %eax
100 testl %eax, %eax
101 je _SetRemindingByte
102
103 shll $6, %eax
104 subl %eax, %edx
105 shrl $6, %eax
106
107 movw %bx, -0x10(%ebp) # QWordValue[0]
108 movw %bx, -0x10+2(%ebp) # QWordValue[2]
109 movw %bx, -0x10+4(%ebp) # QWordValue[4]
110 movw %bx, -0x10+6(%ebp) # QWordValue[6]
111
112
113 movq %mm0, -8(%ebp) # Save mm0 to MmxSave
114 movq -0x10(%ebp), %mm0 # Load QWordValue to mm0
115
116_B:
117 movq %mm0, %ds:(%edi)
118 movq %mm0, %ds:8(%edi)
119 movq %mm0, %ds:16(%edi)
120 movq %mm0, %ds:24(%edi)
121 movq %mm0, %ds:32(%edi)
122 movq %mm0, %ds:40(%edi)
123 movq %mm0, %ds:48(%edi)
124 movq %mm0, %ds:56(%edi)
125 addl $64, %edi
126 decl %eax
127 jnz _B
128
129# Restore mm0
130 movq -8(%ebp), %mm0 # Restore MmxSave to mm0
131 emms # Exit MMX Instruction
132
133_SetRemindingByte:
134 movl %edx, %ecx
135
136 movl %ebx, %eax
137 shll $16, %eax
138 movw %bx, %ax
139 shrl $2, %ecx
140 rep
141 stosl
142
143 movl %edx, %ecx
144 andl $3, %ecx
145 rep
146 stosb
147
148 popl %ebx
149
150_SetMemDone:
151
152 popl %edi
153 popl %ebx
154 leave
155 ret
156
157#EfiCommonLibSetMem ENDP
158