Cách thích hợp để chuyển đổi giá trị __int64
thành giá trị __m64
để sử dụng với SSE là gì?Cách chuyển đổi 'dài dài' (hoặc __int64) thành __m64
6
A
Trả lời
6
Với gcc bạn chỉ có thể sử dụng _mm_set_pi64x
:
#include <mmintrin.h>
__int64 i = 0x123456LL;
__m64 v = _mm_set_pi64x(i);
Lưu ý rằng không phải tất cả các trình biên dịch có _mm_set_pi64x
quy định tại mmintrin.h
. Đối với gcc, định dạng này được xác định như sau:
extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
_mm_set_pi64x (long long __i)
{
return (__m64) __i;
}
cho thấy bạn có thể chỉ sử dụng dàn diễn viên nếu muốn, ví dụ:
__int64 i = 0x123456LL;
__m64 v = (__m64)i;
Không đó, nếu bạn đang mắc kẹt với một trình biên dịch quá kén chọn như Visual C/C++, như một phương sách cuối cùng bạn chỉ có thể sử dụng một sự kết hợp và thực hiện của riêng bạn nội tại:
#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
Lưu ý rằng nói đúng là UB này, vì chúng ta đang viết cho một biến thể của một liên minh và đọc từ một biến thể khác, nhưng nó sẽ hoạt động trong trường hợp này.
Huh? https://www.google.com/search?q=_mm_set_pi64 – Mehrdad
Hãy xem 'mmintrin.h' –
http://pastebin.com/4bwAbbLZ? – Mehrdad