游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3021|回复: 4

[MMX]请教packuswb指令的含义

[复制链接]

50

主题

236

帖子

454

积分

中级会员

Rank: 3Rank: 3

积分
454
发表于 2012-2-24 17:48:00 | 显示全部楼层 |阅读模式
网上找遍了,实在找不到一个通俗的解释,能找到的,都表达不清楚,看不懂,
不过最后还是憋出了一个理解,只是不知道是否正确:

  1. int a = 1234;
  2. int b = 4567;

  3. __asm
  4. {
  5.         movd        mm0, a
  6.         movd        mm1, b
  7.         packuswb        mm0, mm1
  8.         EMMS
  9. }


  10. ; 我对"packuswb dst, src"的理解:
  11. ; dst:00000000 00000000 00000000 00000000 00000000 00000000 00000100 11010010 (十进制为1234)
  12. ; src:00000000 00000000 00000000 00000000 00000000 00000000 00010001 11010111 (十进制为4567)
  13. ; out:00000000 00000000 00000000 11111111 00000000 00000000 00000000 11111111 (这是执行结果)

  14. ; 描述:
  15. ; out中的0~7位为dst的0~15位转化而来,转化原则是首先把0~15位当成有符号数(short类型),然后若该值大于255,则
  16. 为255,若小于0(即大于32767),则为0
  17. ; out中的8~15位为dst的16~31位转化而来,转化原则同上
  18. ; out中的16~23位为dst的32~47位转化而来,转化原则同上
  19. ; out中的24~31位为dst的48~63位转化而来,转化原则同上
  20. ; out中的32~39位为src的0~15位转化而来,转化原则同上
  21. ; ...
复制代码


求大侠指正.. [em24]

1万

主题

1万

帖子

2万

积分

管理员

中级会员

Rank: 9Rank: 9Rank: 9

积分
20547
发表于 2012-2-24 18:05:00 | 显示全部楼层

Re:[MMX]请教packuswb指令的含义

不记得packuswb指令是干嘛的,

0000 0000 0000 0000   0000 0000 0000 0000
1111 1111 1111 1111   1111 1111 1111 1111

同时计算前4组和后4组

当然一行就是都存在一个寄存器里。

59

主题

984

帖子

1200

积分

金牌会员

Rank: 6Rank: 6

积分
1200
发表于 2012-2-25 14:19:00 | 显示全部楼层

Re:[MMX]请教packuswb指令的含义

PACKUSWB—Pack with Unsigned Saturation

Description
Converts 4 or 8 signed word integers from the destination operand (first operand) and 4 or 8 signed word integers from the source operand (second operand) into 8 or 16 unsigned byte integers and stores the result in the destination operand. (See Figure 4-1 for an example of the packing operation.) If a signed word integer value is beyond the range of an unsigned byte integer (that is, greater than FFH or less than 00H), the saturated unsigned byte integer value of FFH or 00H, respectively, is stored in the destination.
The PACKUSWB instruction operates on either 64-bit or 128-bit operands. When operating on 64-bit operands, the destination operand must be an MMX technology register and the source operand can be either an MMX technology register or a 64-bit memory location. When operating on 128-bit operands, the destination operand must be an XMM register and the source operand can be either an XMM register or a 128-bit memory location.
In 64-bit mode, using a REX prefix in the form of REX.R permits this instruction to access additional registers (XMM8-XMM15).

Operation
PACKUSWB instruction with 64-bit operands:
DEST[7:0] ← SaturateSignedWordToUnsignedByte DEST[15:0];
DEST[15:8] ← SaturateSignedWordToUnsignedByte DEST[31:16];
DEST[23:16] ← SaturateSignedWordToUnsignedByte DEST[47:32];
DEST[31:24] ← SaturateSignedWordToUnsignedByte DEST[63:48];
DEST[39:32] ← SaturateSignedWordToUnsignedByte SRC[15:0];
DEST[47:40] ← SaturateSignedWordToUnsignedByte SRC[31:16];
DEST[55:48] ← SaturateSignedWordToUnsignedByte SRC[47:32];
DEST[63:56] ← SaturateSignedWordToUnsignedByte SRC[63:48];


Compiler Intrinsic Equivalent
PACKUSWB __m64 _mm_packs_pu16(__m64 m1, __m64 m2)

50

主题

236

帖子

454

积分

中级会员

Rank: 3Rank: 3

积分
454
 楼主| 发表于 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个字节

50

主题

236

帖子

454

积分

中级会员

Rank: 3Rank: 3

积分
454
 楼主| 发表于 2012-2-27 09:17:00 | 显示全部楼层

Re: Re:[MMX]请教packuswb指令的含义

clayman: Re:[MMX]请教packuswb指令的含义

PACKUSWB—Pack with Unsigned Saturation

Description
Converts 4 or 8 signed word integers from th...


仔细看了一下才发现,他的描述和我的竟有着惊人的相似^_^
这下这个问题就OK了。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-8-1 00:58

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表