mar*_*zzz 2 c++ truncate simd intrinsics sse2
在float,它似乎很容易floor()和比int(),比如:
float z = floor(LOG2EF * x + 0.5f);
const int32_t n = int32_t(z);
Run Code Online (Sandbox Code Playgroud)
成为:
__m128 z = _mm_add_ps(_mm_mul_ps(log2ef, x), half);
__m128 t = _mm_cvtepi32_ps(_mm_cvttps_epi32(z));
z = _mm_sub_ps(t, _mm_and_ps(_mm_cmplt_ps(z, t), one));
__m128i n = _mm_cvtps_epi32(z);
Run Code Online (Sandbox Code Playgroud)
但是,如果仅double使用SSE2,您将如何实现这一目标?
这是我要转换的双版本:
double z = floor(LOG2E * x + 0.5);
const int32_t n = int32_t(z);
Run Code Online (Sandbox Code Playgroud)
只需使用单精度()内在的双精度等价物(...pd...):...ps...
__m128i n = _mm_cvtpd_epi32(z);
Run Code Online (Sandbox Code Playgroud)
根据英特尔内部指南,SSE2确实可以使用该内在函数:https://software.intel.com/sites/landingpage/IntrinsicsGuide/#expand=4966,1917&techs=SSE2
__m128i _mm_cvtpd_epi32 (__m128d a)将打包的双精度(64位)浮点元素转换
a为打包的32位整数,并将结果存储在dst.Run Code Online (Sandbox Code Playgroud)FOR j := 0 to 1 i := 32*j k := 64*j dst[i+31:i] := Convert_FP64_To_Int32(a[k+63:k]) ENDFOR
| 归档时间: |
|
| 查看次数: |
110 次 |
| 最近记录: |