游戏开发论坛

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

3DNow!指令集简明参考

[复制链接]

12

主题

47

帖子

52

积分

注册会员

Rank: 2

积分
52
发表于 2004-2-7 16:31:00 | 显示全部楼层 |阅读模式
指令 说明 算法
FEMMS 快速切换3DNow!/MMX指令和浮点指令状态。  
PAVGUSB mmreg1, mmreg2/mem64 8位的无符号压缩整数求平均值。 mmreg1[63:56] = (mmreg1[63:56] + mmreg2/mem64[63:56] + 1) / 2
mmreg1[55:48] = (mmreg1[63:56] + mmreg2/mem64[63:56] + 1) / 2
mmreg1[47:40] = (mmreg1[63:56] + mmreg2/mem64[63:56] + 1) / 2
mmreg1[39:32] = (mmreg1[63:56] + mmreg2/mem64[63:56] + 1) / 2
mmreg1[31:24] = (mmreg1[63:56] + mmreg2/mem64[63:56] + 1) / 2
mmreg1[23:16] = (mmreg1[63:56] + mmreg2/mem64[63:56] + 1) / 2
mmreg1[15:08] = (mmreg1[63:56] + mmreg2/mem64[63:56] + 1) / 2
mmreg1[07:00] = (mmreg1[63:56] + mmreg2/mem64[63:56] + 1) / 2

PF2ID mmreg1, mmreg2/mem64 把压缩浮点数转化为32位压缩整数。 if (mmreg2/mem64[31:0] >= 231)
        mmreg1[31:0] = 7FFF_FFFFh
else
{
        if (mmreg2/mem64[31:0] <= ?231)
                mmreg1[31:0] = 8000_0000h
        else
                mmreg1[31:0] = int(mmreg2/mem64[31:0])
}

if (mmreg2/mem64[63:32] >= 231)
        mmreg1[63:32] = 7FFF_FFFFh
else
{
        if (mmreg2/mem64[63:32] <= ?231)
                mmreg1[63:32] = 8000_0000h
        else
                mmreg1[63:32] = int(mmreg2/mem64[63:32])
}

PFACC mmreg1, mmreg2/mem64 压缩浮点数累加。 mmreg1[31:00] = mmreg1[31:00] + mmreg1[63:32]
mmreg1[63:32] = mmreg2/mem64[31:00] + mmreg2/mem64[63:32]

PFADD mmreg1, mmreg2/mem64 压缩浮点数相加。 mmreg1[31:00] = mmreg1[31:00] + mmreg2/mem64[31:00]
mmreg1[63:32] = mmreg1[63:32] + mmreg2/mem64[63:32]

PFCMPEQ mmreg1, mmreg2/mem64 比较压缩浮点数是否相等。 if (mmreg1[31:00] == mmreg2/mem64[31:00])
        mmreg1[31:00] = FFFF_FFFFh
else
        mmreg1[31:00] = 0000_0000h
       
if (mmreg1[63:32] == mmreg2/mem64[63:32])
        mmreg1[63:32] = FFFF_FFFFh
else
        mmreg1[63:32] = 0000_0000h

PFCMPGE mmreg1, mmreg2/mem64 对压缩浮点数作“大于等于”的判断。 if (mmreg1[31:00] >= mmreg2/mem64[31:00])
        mmreg1[31:00] = FFFF_FFFFh
else
        mmreg1[31:00] = 0000_0000h

if (mmreg1[63:32] >= mmreg2/mem64[63:32])
        mmreg1[63:32] = FFFF_FFFFh
else
        mmreg1[63:32] = 0000_0000h

PFCMPGT mmreg1, mmreg2/mem64 对压缩浮点数作是否“大于”的判断。 if (mmreg1[31:00] > mmreg2/mem64[31:00])
        mmreg1[31:00] = FFFF_FFFFh
else
        mmreg1[31:00] = 0000_0000h

if (mmreg1[63:32] > mmreg2/mem64[63:32])
        mmreg1[63:32] = FFFF_FFFFh
else
        mmreg1[63:32] = 0000_0000h

PFMAX mmreg1, mmreg2/mem64 压缩浮点数求最大值。 if (mmreg1[31:00] > mmreg2/mem64[31:00])
        mmreg1[31:00] = mmreg1[31:00]
else
        mmreg1[31:00] = mmreg2/mem64[31:00]

if (mmreg1[63:32] > mmreg2/mem64[63:32])
        reg1[63:32] = mmreg1[63:32]
else
        reg1[63:32] = mmreg2/mem64[63:32]

PFMIN mmreg1, mmreg2/mem64 压缩浮点数求最小值。 if (mmreg1[31:00] < mmreg2/mem64[31:00])
        mmreg1[31:00] = mmreg1[31:00]
else
        mmreg1[31:00] = mmreg2/mem64[31:00]

if (mmreg1[63:32] < mmreg2/mem64[63:32])
        mmreg1[63:32] = mmreg1[63:32]
else
        mmreg1[63:32] = mmreg2/mem64[63:32]

PFMUL mmreg1, mmreg2/mem64 压缩浮点数乘法运算。 mmreg1[31:00] = mmreg1[31:00] * mmreg2/mem64[31:00]
mmreg1[63:32] = mmreg1[63:32] * mmreg2/mem64[63:32]

PFRCP mmreg1, mmreg2/mem64 压缩浮点数倒数的近似值。 mmreg1[31:00] = 1.0f / mmreg2/mem64[31:00]
mmreg1[63:32] = 1.0f / mmreg2/mem64[31:00]

PFRCPIT1 mmreg1, mmreg2/mem64 压缩浮点数到数迭代的第一步。  
PFRCPIT2 mmreg1, mmreg2/mem64 压缩浮点数的倒数(或浮点数平方根的倒数)的迭代的第二步。  
PFRSQIT1 mmreg1,mmreg2/mem64 压缩浮点数的平方根的倒数的迭代的第一步。  
PFRSQRT mmreg1, mmreg2/mem64 求浮点数平方根的倒数的近似值。 mmreg1[31:00] = 1.0f / sqrt(mmreg2/mem64[31:00])
mmreg1[63:32] = 1.0f / sqrt(mmreg2/mem64[31:00])

PFSUB mmreg1, mmreg2/mem64 压缩浮点数减法运算。 mmreg1[31:00] = mmreg1[31: 0] - mmreg2/mem64[31:00]
mmreg1[63:32] = mmreg1[63:32] - mmreg2/mem64[63:32]

PFSUBR mmreg1, mmreg2/mem64 压缩浮点数反向减法运算。 mmreg1[31:00] = mmreg2/mem64[31:00] - mmreg1[31:00]
mmreg1[63:32] = mmreg2/mem64[63:32] - mmreg1[63:32]

PI2FD mmreg1, mmreg2/mem64 将压缩的32位整数转化成浮点数。 mmreg1[31:00] = float(mmreg2 / mem64[31:00])
mmreg1[63:32] = float(mmreg2 / mem64[63:32])

PMULHRW mmreg1, mreg2/mem64 将16位有符号压缩整数相乘,并作循环处理。保存结果的高16位。 mmreg1[63:48] = (mmreg1[63:48] * mmreg2/mem64[63:48] + 8000h) >> 16
mmreg1[47:32] = (mmreg1[47:32] * mmreg2/mem64[47:32] + 8000h) >> 16
mmreg1[31:16] = (mmreg1[31:16] * mmreg2/mem64[31:16] + 8000h) >> 16
mmreg1[15:00] = (mmreg1[15:00] * mmreg2/mem64[15:00] + 8000h) >> 16

PREFETCH(W) mem8 数据预取指令,把将要用到的数据置入L1数据缓存。  


3DNow!扩展指令简明参考
指令 说明 算法
PF2IW memreg1, memreg2/mem64 把压缩浮点数转化为16位整数。 if (mmreg2/mem64[31:00] >= 215)
        mmreg1[31:00] = 0000_7FFFh
else
{
        if (mmreg2/mem64[31:00] <= -215)
                mmreg1[31:00] = FFFF_8000h
        else
                mmreg1[31:00] = int(mmreg2/mem64[31:00])
}

if (mmreg2/mem64[63:32] >= 215)
        mmreg1[63:32] = 0000_7FFFh
else
{
        if (mmreg2/mem64[63:32] <= -215)
                mmreg1[63:32] = FFFF_8000h
        else
                mmreg1[63:32] = int(mmreg2/mem64[63:32])
}

PFNACC mmreg1, mmreg2/mem64 压缩浮点数累减 mmreg1[31:00] = mmreg1[31:00] - mmreg1[63:32]
mmreg1[63:32] = memreg2/mem64[31:0] - memreg2/mem64[63:32]

PFPNACC mmreg1, mreg2/mem64 压缩浮点数混合加减 mmreg1[31:00] = mmreg1[31:00] - mmreg1[63:32]
mmreg1[63:32] = memreg2/mem64[31:00] + memreg2/mem64[63:32]

PI2FW mmreg1, mmreg2/mem64 压缩16位整数转化成浮点数 mmreg1[31:00] = float(mmreg2/mem64[15:00])
mmreg1[63:32] = float(mmreg2/mem64[47:32])

PSWAPD mmreg1, mmreg2/mem64 压缩交换双字 mmreg1[63:32] = mmreg2/mem64[31:00]
mmreg1[31:00] = mmreg2/mem64[63:32]

6

主题

444

帖子

457

积分

中级会员

Rank: 3Rank: 3

积分
457
发表于 2004-2-7 17:43:00 | 显示全部楼层

Re:3DNow!指令集简明参考

感?3DNow!实际用途不大,毕竟兼容性不高,不如SSE,至少K7和P3就都开始支持。
我认为与其手动代码优化不如编译器代码优化,比如Intel CPP Complier,效果就很不错的。最关键是省事。不过我听说过可以为3D Now优化的编译器好像只有codeplay一个,哎……编译器这方面AMD比Intel落后了不是一星半点啊。

12

主题

47

帖子

52

积分

注册会员

Rank: 2

积分
52
 楼主| 发表于 2004-2-7 18:42:00 | 显示全部楼层

Re: 3DNow!指令集简明参考

我的cpu是p4的。我上次在intel官方上下了不少开发平台工具,我下的 Intel CPP Complier没有注册的只能用1个月.Intel CPP Complier的升级速度太快了。

37

主题

378

帖子

388

积分

中级会员

Rank: 3Rank: 3

积分
388
QQ
发表于 2004-6-17 22:04:00 | 显示全部楼层

Re:3DNow!指令集简明参考

将来3DNow!会越来越重要的,所以这个东西是要得的!

另外说说楼主我太爱你了……!

37

主题

378

帖子

388

积分

中级会员

Rank: 3Rank: 3

积分
388
QQ
发表于 2004-6-17 22:09:00 | 显示全部楼层

Re:3DNow!指令集简明参考

至于编译器,vs2003完全支持3DNow!指令集……因为在调试的时候可以很容易地看见3DNow!寄存器的变化……
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-7-2 00:00

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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