\r
.686\r
.model flat,C\r
- .xmm\r
+ .mmx\r
.code\r
\r
;------------------------------------------------------------------------------\r
; VOID *\r
-; _mem_SetMem32 (\r
+; EFIAPI\r
+; InternalMemSetMem32 (\r
; IN VOID *Buffer,\r
; IN UINTN Count,\r
; IN UINT32 Value\r
-; )\r
+; );\r
;------------------------------------------------------------------------------\r
-InternalMemSetMem32 PROC USES edi\r
- mov edx, [esp + 12]\r
- mov edi, [esp + 8]\r
- mov ecx, edx\r
- shr ecx, 1\r
- movd mm0, [esp + 16]\r
- mov eax, edi\r
+InternalMemSetMem32 PROC\r
+ mov eax, [esp + 4] ; eax <- Buffer as return value\r
+ mov ecx, [esp + 8] ; ecx <- Count\r
+ movd mm0, [esp + 12] ; mm0 <- Value\r
+ shr ecx, 1 ; ecx <- number of qwords to set\r
+ mov edx, eax ; edx <- Buffer\r
jz @SetDwords\r
- pshufw mm0, mm0, 44h\r
+ movq mm1, mm0\r
+ psllq mm1, 32\r
+ por mm0, mm1\r
@@:\r
- movntq [edi], mm0\r
- add edi, 8\r
+ movq [edx], mm0\r
+ lea edx, [edx + 8] ; use "lea" to avoid change in flags\r
loop @B\r
- mfence\r
@SetDwords:\r
- test dl, 1\r
- jz @F\r
- movd [edi], mm0\r
+ jnc @F\r
+ movd [edx], mm0\r
@@:\r
ret\r
InternalMemSetMem32 ENDP\r