Как преобразовать 'long long' (или __int64) в __m64 - PullRequest
7 голосов
/ 30 января 2012

Как правильно преобразовать значение __int64 в значение __m64 для использования с SSE?

1 Ответ

6 голосов
/ 30 января 2012

С gcc вы можете просто использовать _mm_set_pi64x:

#include <mmintrin.h>

__int64 i = 0x123456LL; 
__m64 v = _mm_set_pi64x(i);

Обратите внимание, что не во всех компиляторах _mm_set_pi64x определено в mmintrin.h.Для gcc это определено так:

extern __inline __m64  __attribute__((__gnu_inline__, __always_inline__, __artificial__))
_mm_set_pi64x (long long __i)
{
  return (__m64) __i;
}

, что предполагает, что вы, возможно, можете просто использовать приведение, если хотите, например:

__int64 i = 0x123456LL; 
__m64 v = (__m64)i;

Если вы не справитесь, если вы застряли счрезмерно разборчивый компилятор, такой как Visual C / C ++, в качестве последнего средства вы можете просто использовать объединение и реализовать свою собственную внутреннюю сущность:

#ifdef _MSC_VER // if Visual C/C++
__inline __m64 _mm_set_pi64x (const __int64 i) {
    union {
        __int64 i;
        __m64 v;
    } u;

    u.i = i;
    return u.v;
}
#endif

Обратите внимание, что строго говоря, это UB, так как мы пишемк одному варианту объединения и чтения из другого, но в этом случае это должно сработать.

...