|

楼主 |
发表于 2012-2-26 23:48:00
|
显示全部楼层
Re:[MMX]请教packuswb指令的含义
以下是测试结果:
[实例1]
__asm movd mm0, dst
__asm movd mm1, src
__asm packuswb mm0, mm1
dst:00000000 00000000 00000000 00000000 00000000 00000000 00000100 11010010 (1234)
src:00000000 00000000 00000000 00000000 00000000 00000000 00000100 11010010 (1234)
out:00000000 00000000 00000000 11111111 00000000 00000000 00000000 11111111
[实例2]
__asm movd mm0, dst
__asm movd mm1, src
__asm packuswb mm0, mm1
dst:00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 (0)
src:00000000 00000000 00000000 00000000 00000000 00000000 00000100 11010010 (1234)
out:00000000 00000000 00000000 11111111 00000000 00000000 00000000 00000000
[实例3]
__asm movd mm0, dst
__asm movd mm1, src
__asm packuswb mm0, mm1
dst:00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 (0)
src:00000000 00000000 00000000 00000000 11111111 11111111 11111111 11111111 (4294967295)
out:00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 (因为src里两组16位都是负数,所以结果就是0)
[实例4]
__asm movd mm0, dst
__asm movd mm1, src
__asm packuswb mm0, mm1
dst:00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 (0)
src:00000000 00000000 00000000 00000000 00000000 00000100 00000100 11010010 (263378)
out:00000000 00000000 00000100 11111111 00000000 00000000 00000000 00000000
[实例5]
__asm movd mm0, dst
__asm movd mm1, src
__asm packuswb mm0, mm1
dst:00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 (0)
src:00000000 00000000 00000000 00000000 00000100 00000100 00000100 11010010 (67372242)
out:00000000 00000000 11111111 11111111 00000000 00000000 00000000 00000000
[实例6]
__asm movd mm0, dst
__asm movd mm1, src
__asm packuswb mm0, mm1
dst:00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 (0)
src:00000000 00000000 00000000 00000000 00000000 00000000 01111111 11111111 (32767是正数)
out:00000000 00000000 00000000 11111111 00000000 00000000 00000000 00000000 (因为32767大于255,所以该处就是255)
[实例7]
__asm movd mm0, dst
__asm movd mm1, src
__asm packuswb mm0, mm1
dst:00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 (0)
src:00000000 00000000 00000000 00000000 00000000 00000000 10000000 00000000 (32768是负数)
out:00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 (因为负数小于0,所以结果就是0)
从测试结果可以看出,我描述的是没有问题的。
即:每16位分为一组,每一组都会被当成16位有符号数来看待,如果小于0,即大于32767,则被计算成0,如果大于255,则会被算成255,
而计算结果是从先从dst的低位开始,一直到src的低位到高位,每一组WORD转化成1个字节 |
|