这取决于您可以假设您拥有的最低SSE支持级别.
一直回到SSE2你有_mm_extract_epi16(PEXTRW)可以用来从128位向量中提取任何16位元素.你需要调用它两次才能获得32位元素的两半.
在更新版本的SSE(SSE4.1及更高版本)中,您有_mm_extract_epi32(PEXTRD)可以在一条指令中提取32位元素.
或者,如果这不在性能关键循环中,您可以使用联合,例如
typedef union
{
__m128i v;
int32_t a[4];
} U32;
Run Code Online (Sandbox Code Playgroud)
_mm_extract_epi32
Run Code Online (Sandbox Code Playgroud)
提取内在函数确实是最好的选择,但如果你需要支持SSE2,我建议这样做:
inline int get_x(const __m128i& vec){return _mm_cvtsi128_si32 (vec);}
inline int get_y(const __m128i& vec){return _mm_cvtsi128_si32 (_mm_shuffle_epi32(vec,0x55));}
inline int get_z(const __m128i& vec){return _mm_cvtsi128_si32 (_mm_shuffle_epi32(vec,0xAA));}
inline int get_w(const __m128i& vec){return _mm_cvtsi128_si32 (_mm_shuffle_epi32(vec,0xFF));}
Run Code Online (Sandbox Code Playgroud)
我发现,如果你将向量reinterpret_cast/union转换为任何int [4]表示,编译器往往会将内容刷回内存(这可能不是那么糟糕)并将其作为int读回来,尽管我还没看过在程序集中查看最新版本的编译器是否生成了更好的代码.
| 归档时间: |
|
| 查看次数: |
4698 次 |
| 最近记录: |