merge2_1.asm 1.1 KB

1234567891011121314151617181920
  1. .calc_value:
  2. ; Proceso 2 pixeles al mismo tiempo, por que ya no estoy limitado a solo 4 floats por registro.
  3. ; MUL_S (Float) y MUL(Word) son las mismas elegidas para realizar la multiplicacion y luego el shifteo.
  4. ; MUL_S sirve para multiplicar el valor de merge antes de convertirlo a entero, asi no se pierde presicion.
  5. ; MUL sirve para multiplicar cada componente de los dos pixeles que se procesan
  6. pxor xmm15, xmm15
  7. movups xmm14, [shiftf] ; xmm14 = |MUL_S|MUL_S|MUL_S|MUL_S|
  8. mulps xmm0, xmm14 ; |0|0|0|VALUE*MUL_S|
  9. cvttps2dq xmm0, xmm0 ; Lo paso a entero
  10. pshuflw xmm15, xmm0, MASK_REPEAT ; xmm15 = |00|00|00|00|VALUE*MUL_S|VALUE*MUL_S|VALUE*MUL_S|VALUE*MUL_S|
  11. movdqa xmm13, xmm15 ; xmm13 = xmm15
  12. pslldq xmm15, MASK_MV_W_L2H ; xmm15 = |VALUE*MUL_S|VALUE*MUL_S|VALUE*MUL_S|VALUE*MUL_S|00|00|00|00|
  13. paddw xmm15, xmm13 ; xmm15 = |VAL*S|VAL*S|VAL*S|VAL*S|VAL*S|VAL*S|VAL*S|VAL*S|
  14. movdqu xmm14, [shift] ; xmm14 = |MUL|MUL|MUL|MUL|MUL|MUL|MUL|MUL|
  15. psubw xmm14, xmm15 ; xmm14 = |MUL-(VALUE*MUL_S)|......
  16. ; Ahora cuando calcule el value tengo que "dividir" por MUL, realizando un shift