sse2_64_32.h 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. #ifndef sse2_64_32_H
  2. #define sse2_64_32_H 1
  3. #include "private/common.h"
  4. #ifdef HAVE_INTRIN_H
  5. # include <intrin.h>
  6. #endif
  7. #if defined(HAVE_EMMINTRIN_H) && \
  8. !(defined(__amd64) || defined(__amd64__) || defined(__x86_64__) || \
  9. defined(_M_X64) || defined(_M_AMD64))
  10. # include <emmintrin.h>
  11. # include <stdint.h>
  12. # ifndef _mm_set_epi64x
  13. # define _mm_set_epi64x(Q0, Q1) sodium__mm_set_epi64x((Q0), (Q1))
  14. static inline __m128i
  15. sodium__mm_set_epi64x(int64_t q1, int64_t q0)
  16. {
  17. union { int64_t as64; int32_t as32[2]; } x0, x1;
  18. x0.as64 = q0; x1.as64 = q1;
  19. return _mm_set_epi32(x1.as32[1], x1.as32[0], x0.as32[1], x0.as32[0]);
  20. }
  21. # endif
  22. # ifndef _mm_set1_epi64x
  23. # define _mm_set1_epi64x(Q) sodium__mm_set1_epi64x(Q)
  24. static inline __m128i
  25. sodium__mm_set1_epi64x(int64_t q)
  26. {
  27. return _mm_set_epi64x(q, q);
  28. }
  29. # endif
  30. # ifndef _mm_cvtsi64_si128
  31. # define _mm_cvtsi64_si128(Q) sodium__mm_cvtsi64_si128(Q)
  32. static inline __m128i
  33. sodium__mm_cvtsi64_si128(int64_t q)
  34. {
  35. union { int64_t as64; int32_t as32[2]; } x;
  36. x.as64 = q;
  37. return _mm_setr_epi32(x.as32[0], x.as32[1], 0, 0);
  38. }
  39. # endif
  40. #endif
  41. #endif