如何否定(改变符号)__m128类型变量中的浮点元素?

时间:2013-11-19 23:01:29

标签: c x86 vectorization sse simd

是否有任何单个指令或函数可以{_ 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)是一个多指令函数,所以它可能不会很慢吗?

1 个答案:

答案 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做正确的事情,但在某些情况下可能更有效)。