我使用SSE内在函数实现了modf
的以下工作实现,但是当我需要将结果作为{{1}时,转换到__m128i
并返回过程似乎非常浪费}。
__m128
是否存在没有类型转换的截断指令,或者某些幻数黑客?
答案 0 :(得分:4)
使用SSE4.1,您可以使用roundps
and roundpd
说明:
// Single Precision
__m128 integer = _mm_round_ps(value,_MM_FROUND_TRUNC);
__m128 fraction = _mm_sub_ps(value,integer);
// Double Precision
__m128d integer = _mm_round_pd(value,_MM_FROUND_TRUNC);
__m128d fraction = _mm_sub_pd(value,integer);
这将分隔整数和小数部分,同时保留它们的符号。
同样,对于AVX:
// Single Precision
__m256 integer = _mm256_round_ps(value,_MM_FROUND_TRUNC);
__m256 fraction = _mm256_sub_ps(value,integer);
// Double Precision
__m256d integer = _mm256_round_pd(value,_MM_FROUND_TRUNC);
__m256d fraction = _mm256_sub_pd(value,integer);
如果您还有XOP指令集,只需一条指令(通过_mm256_frcz_pd
和系列),就可以单独得到小数部分。
但是没有SSE4.1,除了转换或做+/-魔术数字技巧之外,没有更好的方法可以做到这一点。 (两者都会在溢出的情况下遇到问题)