\r
.code\r
\r
-InternalMemSetMem32 PROC USES rdi\r
- DB 49h, 0fh, 6eh, 0c0h ; movq mm0, r8 ; mm0 <- Value\r
- mov rax, rcx ; rax <- Buffer\r
- mov rdi, rax\r
- mov rcx, rdx\r
- shr rcx, 1 \r
+;------------------------------------------------------------------------------\r
+; VOID *\r
+; InternalMemSetMem32 (\r
+; IN VOID *Buffer,\r
+; IN UINTN Count,\r
+; IN UINT32 Value\r
+; )\r
+;------------------------------------------------------------------------------\r
+InternalMemSetMem32 PROC\r
+ DB 49h, 0fh, 6eh, 0c0h ; movd mm0, r8 (Value)\r
+ mov rax, rcx ; rax <- Buffer\r
+ xchg rcx, rdx ; rcx <- Count rdx <- Buffer\r
+ shr rcx, 1 ; rcx <- # of qwords to set\r
jz @SetDwords\r
- DB 0fh, 70h, 0C0h, 44h ; pshufw mm0, mm0, 44h\r
+ DB 0fh, 70h, 0C0h, 44h ; pshufw mm0, mm0, 44h\r
@@:\r
- DB 48h, 0fh, 0e7h, 07h ; movntq [rdi], mm0\r
- add rdi, 8\r
+ DB 0fh, 0e7h, 02h ; movntq [rdx], mm0\r
+ lea rdx, [rdx + 8] ; use "lea" to avoid flag changes\r
loop @B\r
mfence\r
@SetDwords:\r
- test dl, 1\r
- jz @F\r
- DB 0fh, 7eh, 07h ; movd [rdi], mm0\r
+ jnc @F\r
+ DB 0fh, 7eh, 02h ; movd [rdx], mm0\r
@@:\r
ret\r
InternalMemSetMem32 ENDP\r