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