Pergunta

Eu tenho dois inteiros quadword embalados em xmm0 e eu preciso adicioná-los juntos e armazenar o resultado em uma posição de memória. Posso garantir que o valor da cada inteiro é inferior a 2 ^ 15 . Agora, eu estou fazendo o seguinte:

int temp;
....   

   movdq2q mm0, xmm0
   psrldq xmm0, 8
   movdq2q mm1, xmm0
   paddq mm0,mm1
   movd temp, mm0

Existe uma maneira melhor de fazer isso?

Foi útil?

Solução

Primeiro, porque você está usando quadwords para representar valores que se encaixam em um formato de 16 bits? Deixando isso de lado, um par de soluções:

pshufd xmm1, xmm0, EEh
paddq  xmm0, xmm1
movd   temp, xmm0

ou

movdqa xmm1, xmm0
psrldq xmm1, 8
paddq  xmm0, xmm1
movd   temp, xmm0

ou

movhlps xmm1, xmm0
paddq   xmm0, xmm1
movd    temp, xmm0

Note que você realmente não precisa usar paddq, você pode sair com um dos mais estreito acrescenta, se preferir.

Editar somando quatro quadwords duplos - o que você tem é bastante bem. Dado que você sabe que todos os dados neles se encaixa no baixo doubleword de cada slot, você pode tentar algo como:

shufps  xmm0, xmm2, 88h
shufps  xmm4, xmm6, 88h
paddd   xmm0, xmm4
psrlq   xmm1, xmm0, 32
paddd   xmm0, xmm1
movhlps xmm1, xmm0
paddd   xmm0, xmm0
movd    temp, xmm0

que pode ou não pode revelar-se mais rápido.

Quanto EMMS, é apenas outra instrução. Depois de qualquer código que toca os registradores MMX, antes de qualquer código que usa o x87 instruções de ponto flutuante você precisa ter emms.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top