tôi sẽ đề nghị sử dụng một chút phiên bản khác nhau:
static const __m128i magicInt = _mm_set1_epi16(0x4B00);
static const __m128 magicFloat = _mm_set1_ps(8388608.0f);
__m128i xlo = _mm_unpacklo_epi16(x, magicInt);
__m128i xhi = _mm_unpackhi_epi16(x, magicInt);
__m128 ylo = _mm_sub_ps(_mm_castsi128_ps(xlo), magicFloat);
__m128 yhi = _mm_sub_ps(_mm_castsi128_ps(xhi), magicFloat);
On mức lắp ráp khác biệt duy nhất từ phiên bản Paul R là sử dụng _mm_sub_ps (hướng dẫn SUBPS) thay vì _mm_cvtepi32_ps (hướng dẫn CVTDQ2PS). _mm_sub_ps không bao giờ chậm hơn _mm_cvtepi32_ps và thực sự nhanh hơn trên các CPU cũ và trên CPU công suất thấp (đọc: Intel Atom và AMD Bobcat)
Nguồn
2012-02-07 00:32:44
cảm ơn .. công việc này – krishnaraj
đó là những gì tôi sẽ làm với ngoại trừ việc tôi ' d sử dụng một _mm_setzero_si128(), thay vì hai _mm_set1_epi16. – Magnus
@Magnus: Tôi nghĩ bạn sẽ thấy rằng mã được tạo ra giống nhau, ít nhất là với các trình biên dịch tốt nhất. –