当前位置: 代码迷 >> 汇编语言 >> SSE下除法的实现
  详细解决方案

SSE下除法的实现

热度:307   发布时间:2016-05-02 04:34:28.0
求一个SSE下除法的实现
我用寄存器xmm0存储除数a(a0, a1, a2, a3)(单精度),用xmm1存储被除数b(b0, b1, b2, b3)(单精度),
一般情况下,应该是a0 = a0 / b0, a1 = a1/b1,  a2= a2/b2, a3=a3/b3, 若bi=0,测ai也应该为0,其中i ~[0,3].
请问在SSE下该如何高效实现??
------解决方案--------------------
引用:
Quote: 引用:

如果a0 = a0 / b0,这应该a0是被除数,b0是除数啊。
不好意思,写错了,谢谢指出错误,多说两句呗……


多说两句,SIMD指令运算异常(比如除以0)不会导致程序异常结束的,只是结果无意义而已,比如是INF(无穷大)、NAN(不是有效数)之类的。


------解决方案--------------------
写个小程序测试一下:


#include <stdio.h>

float PDest[4] = {1.0, 2.0, 0.0, 0.0};
float PSrc[4] = {1.0, 2.0, 3.0, 0.0};

// Calcutes Dest[0..3] = Dest[0..3] / Src[0..3]
void __DIVPS_FIX(float *Dest, float *Src)
{
  __asm{
    mov eax,Dest
    mov edx,Src

    pxor xmm2,xmm2
    movdqu xmm1,[edx]
    movdqu xmm0,[eax]
    pcmpeqd xmm2,xmm1
    rcpps xmm1,xmm1
    pandn xmm2,xmm1
    mulps xmm0,xmm2
    movdqu [eax],xmm0
  }
}

int main()
{
  __DIVPS_FIX(PDest, PSrc);

  printf("%8.3f %8.3f %8.3f %8.3f\n", PDest[0], PDest[1], PDest[2], PDest[3]);
  printf("%08X %08X %08X %08X (hex)\n", *(int*)&PDest[0], *(int*)&PDest[1], *(int*)&PDest[2], *(int*)&PDest[3]);

  return 0;
}


把mulps xmm0,xmm2改成mulps xmm0,xmm1就能看见未修正前的结果。

------解决方案--------------------
啊,Calcutes -> Calculates
  相关解决方案