_mm_max_ps和NaN

时间:2016-05-03 13:13:25

标签: c++ c sse

我的问题在某种程度上与this主题的答案有关。

考虑以下C程序:

#include <emmintrin.h>
#include <stdio.h>

void print(__m128* v)
{
    union Helper
    {
        __m128 m128;
        __attribute__((aligned(16))) float f[4];
    };

    Helper h;
    h.m128 = *v;

    printf("%f %f %f %f\n", h.f[0], h.f[1], h.f[2], h.f[3]);
}

int main()
{
    __m128 a  = _mm_set1_ps(0.0f / 0.0f);
    __m128 b  = _mm_set1_ps(0.0f);
    __m128 m1 = _mm_max_ps(a, b);
    __m128 m2 = _mm_max_ps(b, a);

    print(&m1);
    print(&m2);
}

打印

0.000000 0.000000 0.000000 0.000000
nan nan nan nan

我使用Xcode的Mac OS X Clang进行了编译,但在Linux上观察到与GCC类似的行为。有人对此有解释吗?我一般可以依赖这种行为(如果其中一个参数是NaN或-NaN,_mm_max_ps会返回其第二个参数的值)吗? This document here表示如果MAXPS的单个操作数是NaN,则返回源操作数。虽然这似乎与我观察到的行为正交,但内在的(与实际的SSE指令相反)是一个没有副作用的二元运算,在这种情况下不能说源操作数等。

0 个答案:

没有答案