Написал функцию memzero(), хотел применить SSE2 для оптимизации. Протестировал,
не работает на эмуляторах (VMWare, Bochs, Oracle VirtualBox), падает на первой
SSE-шной инструкции xorpd xmm0, xmm0. При этом на всех реальных компах, которые есть дома, эта же функция
работает без проблем. В чем подвох? Поддержка SSE2 в том же Bochs декларирована... Можно, конечно без SSE2 обойтись... но обидно.
Код:
; eax edx
;void memzero(void * mem, size_t size);
;
section .text
[BITS 32]
global memzero
memzero:
pushf
push edi
cld
mov edi, eax
and eax, 0xf
jz use_sse2
use_stos:
mov ecx, edx
mov eax, edx
and eax, 0x3
jz zero_dwords
and eax, 0x1
jz zero_words
xor eax, eax
rep stosb
jmp end
zero_words:
shr ecx, 1
rep stosw
jmp end
zero_dwords:
shr ecx, 2
rep stosd
jmp end
use_sse2:
xorpd xmm0, xmm0
mov ecx, edx
mov eax, edx
and eax, 0x7f
jz fast_sse2
and eax, 0xf
jnz use_stos
slow_sse2:
movdqa [edi], xmm0
add edi, 16
sub ecx, 16
jnz slow_sse2
jmp end
fast_sse2:
movdqa [edi], xmm0
movdqa [edi + 16], xmm0
movdqa [edi + 32], xmm0
movdqa [edi + 48], xmm0
movdqa [edi + 64], xmm0
movdqa [edi + 80], xmm0
movdqa [edi + 96], xmm0
movdqa [edi + 112], xmm0
add edi, 128
sub ecx, 128
jnz fast_sse2
end:
pop edi
popf
ret