使用SSE指令优化的数学函数(整理)

转载 2006年06月25日 20:22:00

float _SSE_cos( float x)
{
 float temp;
 __asm
 {
  movss xmm0, x
  movss xmm1, _ps_am_inv_sign_mask
  andps xmm0, xmm1
  addss xmm0, _ps_am_pi_o_2
  mulss xmm0, _ps_am_2_o_pi

  cvttss2si ecx, xmm0
  movss xmm5, _ps_am_1
  mov  edx, ecx
  shl  edx, (31 - 1)
  cvtsi2ss xmm1, ecx
  and  edx, 0x80000000
  and  ecx, 0x1

  subss xmm0, xmm1
  movss xmm6, _sincos_masks[ecx * 4]
  minss xmm0, xmm5

  movss xmm1, _ps_sincos_p3
  subss xmm5, xmm0

  andps xmm5, xmm6
  movss xmm7, _ps_sincos_p2
  andnps xmm6, xmm0
  mov  temp, edx
  orps xmm5, xmm6
  movss xmm0, xmm5

  mulss xmm5, xmm5
  movss xmm4, _ps_sincos_p1
  movss xmm2, xmm5
  mulss xmm5, xmm1
  movss xmm1, _ps_sincos_p0
  addss xmm5, xmm7
  mulss xmm5, xmm2
  movss xmm3, temp
  addss xmm5, xmm4
  mulss xmm5, xmm2
  orps xmm0, xmm3
  addss xmm5, xmm1
  mulss xmm0, xmm5
 
  movss   x,    xmm0

 }

 return x;
}


float _SSE2_cos(float x) 
{
 __asm
 {
  movss xmm0, x
  movss xmm1, _ps_am_inv_sign_mask
  movss xmm2, _ps_am_pi_o_2
  movss xmm3, _ps_am_2_o_pi
  andps xmm0, xmm1
  addss xmm0, xmm2
  mulss xmm0, xmm3

  pxor xmm3, xmm3
  movd xmm5, _epi32_1
  movss xmm4, _ps_am_1
  cvttps2dq xmm2, xmm0
  pand xmm5, xmm2
  movd xmm1, _epi32_2
  pcmpeqd xmm5, xmm3
  cvtdq2ps xmm6, xmm2
  pand xmm2, xmm1
  pslld xmm2, (31 - 1)

  subss xmm0, xmm6
  movss xmm3, _ps_sincos_p3
  minss xmm0, xmm4
  subss xmm4, xmm0
  andps xmm0, xmm5
  andnps xmm5, xmm4
  orps xmm0, xmm5

  movaps xmm1, xmm0
  movss xmm4, _ps_sincos_p2
  mulss xmm0, xmm0
  movss xmm5, _ps_sincos_p1
  orps xmm1, xmm2
  movaps xmm7, xmm0
  mulss xmm0, xmm3
  movss xmm6, _ps_sincos_p0
  addss xmm0, xmm4
  mulss xmm0, xmm7
  addss xmm0, xmm5
  mulss xmm0, xmm7
  addss xmm0, xmm6
  mulss xmm0, xmm1
  movss   x,    xmm0
 }

 return x;
}

float _SSE_Sqrt(float x)
{

 float root = 0.f;
 _asm
 {
  sqrtss  xmm0, x
  movss  root, xmm0
 }

 return root;
}

[C] 跨平台使用Intrinsic函数范例2——使用SSE2、AVX指令集 处理 双精度浮点数组求和

作者:zyl910。   本文面对对SSE等SIMD指令集有一定基础的读者,以双精度浮点数组求和为例演示了如何跨平台使用SSE2、AVX指令集。支持vc、gcc编译器,在Windows、Linux、...
  • zyl910
  • zyl910
  • 2012年10月26日 18:06
  • 3944

[C] 跨平台使用Intrinsic函数范例1——使用SSE、AVX指令集 处理 单精度浮点数组求和(支持vc、gcc,兼容Windows、Linux、Mac)

作者:zyl910。   本文面对对SSE等SIMD指令集有一定基础的读者,以单精度浮点数组求和为例演示了如何跨平台使用SSE、AVX指令集。因使用了stdint、zintrin、ccpuid这三个...

[C] 跨平台使用Intrinsic函数范例3——使用MMX、SSE2指令集 处理 32位整数数组求和

作者:zyl910。   本文面对对SSE等SIMD指令集有一定基础的读者,以32位整数数组求和为例演示了如何跨平台使用MMX、SSE2指令集。支持vc、gcc编译器,在Windows、Linux、...
  • zyl910
  • zyl910
  • 2012年10月26日 21:23
  • 5221

跨平台使用Intrinsic函数范例1——使用SSE、AVX指令集 处理 单精度浮点数组求和(支持vc、gcc,兼容Windows、Linux、Mac)

作者:zyl910。   本文面对对SSE等SIMD指令集有一定基础的读者,以单精度浮点数组求和为例演示了如何跨平台使用SSE、AVX指令集。因使用了stdint、zintrin、ccpuid这三个...

[C] 跨平台使用Intrinsic函数范例1——使用SSE、AVX指令集 处理 单精度浮点数组求和(支持vc、gcc,兼容Windows、Linux、Mac)

作者:zyl910。   本文面对对SSE等SIMD指令集有一定基础的读者,以单精度浮点数组求和为例演示了如何跨平台使用SSE、AVX指令集。因使用了stdint、zintrin、ccpuid这三个...
  • zyl910
  • zyl910
  • 2012年10月22日 22:28
  • 2983

使用MMX/SSE汇编指令集优化视频开发

1、汇编指令集 目前大部分的PC机采用的都是Intel或者AMD的CPU,其支持的多媒体汇编指令有: MMX:多媒体扩展指令(MultiMedia eXtention),该指令由Intel在1996年...

使用SSE4指令集优化双线性插值图像缩放

原理:p = p(0) *(1-t) + p(1) * t = p(0) + (p(1) - p(0)) * t水平方向和垂直方向均进行线性插值,缩放系数分别计算,由于水平和垂直成正交关系,因而与计算...

Inter SSE指令集实现的3D数学库

  • 2011年03月09日 19:09
  • 37KB
  • 下载

一个卓有成效的汇编优化范例--使用SSE2指令优化进制转化

本文通过一个64位整数转化为16进制字符串的函数,讲述程序优化的的一些方法。本文包括3个C语言的版本和1个SSE2汇编的版本。性能最强的SSE2版本的性能竟达原始C版函数的性能的21倍。...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:使用SSE指令优化的数学函数(整理)
举报原因:
原因补充:

(最多只允许输入30个字)