是否有任何单个指令或函数可以{_ 3}} __m128中的每个浮点数?
即a = r0:r1:r2:r3 ===> a = -r0:-r1:-r2:-r3
?
我知道这可以由_mm_sub_ps(_mm_set1_ps(0.0),a)
来完成,但是因为_mm_set1_ps(0.0)
是一个多指令函数,所以它可能不会很慢吗?
答案 0 :(得分:15)
实际上,编译器应该很好地为0.0生成常量向量。它可能只使用_mm_xor_ps
,如果你的代码在循环中,它应该将循环中的常量生成提升出来。所以,底线,使用你原来的想法:
v = _mm_sub_ps(_mm_set1_ps(0.0), v);
或其他常见技巧,即:
v = _mm_xor_ps(v, _mm_set1_ps(-0.0));
它只是翻转符号位而不是进行减法(不像第一种方法那样安全,因为它不能用NaN做正确的事情,但在某些情况下可能更有效)。