关于xmm0~7寄存器问题(SSE)

EndDuke 2007-10-31 08:53:29
我在用SSE写一段四元数运算,一种一个步骤需要对xmm1寄存的中的最高位 xmm1[3] 进行取反
即xmm1[3]=0-xmm1[3]

经过了多次实验 但最终还是失败了

希望高手能够指教 希望代价不会太大 总觉得可以很简单的解决
...全文
2847 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
EndDuke 2007-11-04
  • 打赏
  • 举报
回复
真的是十分感谢,受益匪浅。我做图形这部分 刚刚涉及到SSE,很多东西不是很清楚 谢谢
housisong 2007-11-04
  • 打赏
  • 举报
回复
> EndDuke:"方案2 是乘法,速度应该比较慢 和加减运算不是一个数量级的 "

SSE中的乘法也没有你想的那么恐怖


> EndDuke:"方案3 要定义变量 申请和释放都会有消耗,本不想过多地调用内存完成这样的"

不用申请和释放的,所以没有这方面的消耗; 但确实会访问一次内存,多次访问代价相当于一级
缓存的延迟 也可以考虑把它放到寄存器

housisong 2007-11-04
  • 打赏
  • 举报
回复
说“xorps xmm4,xmm4 要比 subps xmm4,xmm4 好? ”

我是基于这样的考虑:
如果是整数,xor和sub方案都没有多大关系,但浮点指令不一样;

比如现在寄存器中存放着整数,把它按照二进制格式映射到float,就可能得到4种类型的float:
正常的规格化float值a、未规格化的float值b、特殊float值(正负无穷大)c、无效float d
调用subps将按照浮点减法: a-a=0; b-b一般的CPU都会正确地得到0; c-c一般还是c;而d-d一般是NaN
(没有查手册)

所以xmm寄存器清零用xorps而不是subps

EndDuke 2007-11-02
  • 打赏
  • 举报
回复
多谢
大熊猫侯佩 2007-11-02
  • 打赏
  • 举报
回复
//xorps xmm4,xmm4 要比 subps xmm4,xmm4 好?
可能指令本身设计的原因。就好像xor比sub make null 更快一样
EndDuke 2007-11-02
  • 打赏
  • 举报
回复
没有测试 不过我青睐于第一种方案 多谢
原因
方案2 是乘法,速度应该比较慢 和加减运算不是一个数量级的
方案3 要定义变量 申请和释放都会有消耗,本不想过多地调用内存完成这样的

附加一个问题
为什么
xorps xmm4,xmm4 要比 subps xmm4,xmm4 好?
当是整数或double的时候 subps不也是零么?
EndDuke 2007-11-01
  • 打赏
  • 举报
回复
问题 暂时解决 期待更好的解决方案

解决代码如下:
subps xmm4,xmm4
movss xmm4,xmm1
subps xmm1,xmm4
subps xmm1,xmm4

一共4行 觉得多少有点 小题大做了 。。。。。 期待更好的解决方案
EndDuke 2007-11-01
  • 打赏
  • 举报
回复
housisong:这种方法可以么 比较青睐 可以这样 操作 xmm0 的最低位的浮点数么?
EndDuke 2007-11-01
  • 打赏
  • 举报
回复
现在我考虑想这样做
movss st0,xmm0
FLDZ
FSUB
movss xmm0,st0
但是 st0 没有定义 不知道应该怎么写 我浮点这块完全 不会
EndDuke 2007-11-01
  • 打赏
  • 举报
回复
能给几行代码么 我很少用汇编的。。。。
housisong 2007-11-01
  • 打赏
  • 举报
回复
如果是浮点数 最高位取反 和 最高寄存器取负 完全一样 (负0的问题不用担心,也是符合IEEE浮点规格的)
所以可以利用 SSE2的整数 位运算 来达到目的
EndDuke 2007-11-01
  • 打赏
  • 举报
回复
其实我发现我挺愚蠢的,把公式变下型现在只用对最低位 求负了

用subss求负应该怎么弄?
EndDuke 2007-11-01
  • 打赏
  • 举报
回复
只取反一位
因为在公式中,其它位都是加,而最有一位应该是减法

我想有没有办法直接操作最高位 subss只能操作最低位,我觉得用shufps来会混合 代价比较大
大熊猫侯佩 2007-11-01
  • 打赏
  • 举报
回复
是最高寄存器整个取反,还是最高位取反?
housisong 2007-11-01
  • 打赏
  • 举报
回复
低寄存器浮点数取反操作

1.
你的方案可以写为3条指令
movss xmm4,xmm1
subss xmm1,xmm4
subss xmm1,xmm4

而且subps xmm4,xmm4清零并不是一个好主意,
这个时候xmm4的当前值可能不一定是一个float浮点数(可能存着整数或double)
可以改成 xorps xmm4,xmm4

2.
可以定义一个常量 float tt=-1.0;
(如果需要多次使用,而且寄存器够用,可以预先载入到寄存器中)
mulss xmm1,tt
(补充: 如果是高位取反,可以定义 float tt[]=(1.0,1.0,1.0,-1.0);
mulps xmm1,tt )

3.
位操作的话这样,定义 int32 tt[]=(0x80000000,0x00000000,0x00000000,0x00000000);
xorps xmm1,tt


你试下哪个快


21,458

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧