SSE指令集的一个问题
F32vec4 a(1.001,1.22,1.33,1.000);
要求得到其小数位->(0.01,0.22,0.33,0.0),有好的办法吗?
[解决办法]
如果使用汇编的话,需要用到以下指令 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
[解决办法]
参考
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);}