SSE指令集的一个问题

ahwood 2012-06-01 09:48:44
F32vec4 a(1.001,1.22,1.33,1.000);

要求得到其小数位->(0.01,0.22,0.33,0.0),有好的办法吗?
...全文
175 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2012-06-01
  • 打赏
  • 举报
回复
参考
C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src\fvec.h
300..306:
/* Convert first element of F32vec4 to int with truncation */
inline int F32vec4ToInt(const F32vec4 &a)
{

return _mm_cvtt_ss2si(a);

}
liangbch 2012-06-01
  • 打赏
  • 举报
回复
如果使用汇编的话,需要用到以下指令 SSE/SSE2指令

MOVAPS
把4个对准的打包单精度值传送到XMM寄存器或者内存

MOVUPS
把4个不对准的打包单精度值传送到XMM寄存器或者内存


CVTDQ2PS
转化打包的double-word 整数 到 打包的单精度浮点值
CVTPS2DQ
转化打包的单精度浮点值到打包的double-word整数

如果使用函数的话,需要用到在3楼头文件中定义的函数
比如,可检查文件 C:\Program Files\Microsoft Visual Studio 9.0\VC\include\emmintrin.h 来获得这些函数的用法。

另外,可从msdn中获得帮助。下面是我查到的一些函数的说明:


Converts the four signed 32-bit integer values of a to single-precision, floating-point values.

Copy
__m128 _mm_cvtepi32_ps (__m128i a);
CVTDQ2PS
Return Value
--------------------------------------------------------------------------------
r0 := (float) a0
r1 := (float) a1
r2 := (float) a2
r3 := (float) a3



Converts the four single-precision, floating-point values of a to signed 32-bit integer values.

Copy
__m128i _mm_cvtps_epi32 (__m128 a);
CVTPS2DQ
Return Value
--------------------------------------------------------------------------------

r0 := (int) a0
r1 := (int) a1
r2 := (int) a2
r3 := (int) a3
ahwood 2012-06-01
  • 打赏
  • 举报
回复
请在以下头文件中提供的函数范围内解决,3Q
#include <xmmintrin.h>
#include <emmintrin.h>
#include <immintrin.h>
#include <fvec.h>
赵4老师 2012-06-01
  • 打赏
  • 举报
回复
FRNDINT 这个指令是把 ST 的数值舍入成整数,FPU 提供四种舍入方式,由 FPU 的控制字组(control word)中的 RC 两个位决定
RC 舍入控制
00 四舍五入
01 向负无限大舍入
10 向正无限大舍入
11 向零舍去
hard9999 2012-06-01
  • 打赏
  • 举报
回复
取整,然后相减。
ahwood 2012-06-01
  • 打赏
  • 举报
回复
谢谢各位解答,已解决问题,散分

70,037

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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