Beruflich Dokumente
Kultur Dokumente
1.
Introduo
A unidade SSE2, disponvel a partir dos processadores Pentium IV, faz uso dos registradores de 128
bits XMM0 a XMM7 (para programao em modo de operao de 32 bits), permitindo operar sobre 16 bytes, 8 words, 4 dwords, 2 qwords ou 1 dqword inteiros simultaneamente. Este documento visa fornecer algumas informaes teis para um primeiro uso dessas facilidades no que diz respeito a processamento de inteiros. As operaes com operandos no formato ponto flutuante,
tambm disponveis na unidade SSE2, no sero abordadas aqui.
2.
Duas instrues permitem carregar um bloco de 16 bytes diretamente da memria para um registrador XMM:
movdqa
movdqu
A largura de 16 bytes dos operandos pode ser especificada com xmmword ptr:
movdqu xmm0, xmmword ptr [esi+ecx*8-16]
Note-se, no exemplo acima, que foi utilizado um fator de escala 8 com o registrador ecx, o qual o
maior fator de escala suportado pelo Pentium. A utilizao de fatores de escala 16 no portanto
possvel, mas pode ser simulada alterando-se a forma de decremento/incremento do registrador.
Por exemplo, supondo que desejemos carregar sucessivamente 4 blocos contguos de 16 bytes
cada da memria para o registrador XMM0, partindo do ltimo bloco, utilizando o registrador ecx
como contador de blocos e o registrador esi apontando para o primeiro bloco. Nesse caso, supondo os blocos alinhados na fronteira de 16 bytes, teremos o seguinte fragmento de programa:
loop1:
mov ecx, 8
; ecx = nr. de blocos x 2
movdqa xmm0, xmmword ptr [esi+ecx*8-16] ; carrega o bloco
processa o bloco
sub ecx, 2
; ecx decr. de 2 em 2
jnz
loop1
Note-se que a instruo PMADDWD, que pode ser utilizada com um operando sendo um registrador XMM e o outro um bloco de 16 bytes na memria, tambm requer alinhamento na fronteira
de 16 bytes, ainda que no explicitamente especificado no manual do Pentium.
3.
No existe uma API no Windows especfica para alocao de memria com um determinado ali-
fl. 1/2
USHORT ptr,ptr1
if(((DWORD)ptr)&ptrMask)
; se estiver desalinhado
{
ptr+=4
4.
if(dwItems%8)
{
dwItems = ((dwItems/8)+1)*8
O quadro acima ilustra uma forma simples de arredondar a quantidade de taps para o inteiro mais
prximo divisvel por 8.
fl. 2/2