我正在尝试编写一个简单的游戏,我需要研究一些用于向量运算的 x86 汇编。使用xmm作为4压缩单精度浮点,是否有聚合运算?如:
“MAXPS”计算 4 fp32 的最大值。 (用于切比雪夫距离等)
“SUMPS”计算 4 个 fp32 的总和。 (用于点积或矢量幅度)
一种获取 SSE 向量的最大浮点值的非循环、非分支方法如下所示。
inline float _mm_hmax_ps(__m128 arg) {
// Returns the maximum 32 bit float value in arg.
// Requires SSE.
float res;
__m128 temp, temp2;
temp = _mm_shuffle_ps(arg, arg, 78); // 78 = 01001110b
temp = _mm_max_ps(arg, temp);
temp2 = _mm_shuffle_ps(temp, temp, 165); // 165 = 10100101b
temp2 = _mm_max_ps(temp2, temp);
_mm_store_ps1(&res, temp2);
return res;
}