2012-01-30 8 views

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.

+0

Huh? https://www.google.com/search?q=_mm_set_pi64 – Mehrdad

+0

Hãy xem 'mmintrin.h' –

+0

http://pastebin.com/4bwAbbLZ? – Mehrdad