Vorrei suggerire di usare un po ' versione diversa:
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);
Sul livello di assieme l'unica differenza dalla versione Paul R è l'utilizzo di _mm_sub_ps (istruzione SUBPS) anziché _mm_cvtepi32_ps (istruzione CVTDQ2PS). _mm_sub_ps non è mai più lento di _mm_cvtepi32_ps, ed è effettivamente più veloce su vecchie CPU e su CPU a bassa potenza (leggi: Intel Atom e AMD Bobcat)
fonte
2012-02-07 00:32:44
grazie .. questo funziona – krishnaraj
questo è quello che farei anch'io con l'eccezione che io ' d usa uno _mm_setzero_si128(), invece di due _mm_set1_epi16. – Magnus
@Magnus: Penso che troverete che il codice generato è lo stesso in entrambi i casi, almeno con i compilatori più decenti. –