我最近一直在使用 SSE 内在函数int _mm_extract_epi8 (__m128i src, const int ndx)
,根据参考“从索引选择的压缩整数数组元素中提取一个整数字节”。这正是我想要的。
但是,我通过 a _mm_cmpestri
on a确定索引,该索引对_m128i
具有显式长度的字符串数据执行打包比较并生成索引。该索引的范围是 0..16,其中 0..15 表示有效索引,16 表示未找到索引。现在要在索引位置提取整数,我想执行以下操作:
const int index = _mm_cmpestri(...);
if (index >= 0 && index < 16) {
int intAtIndex = _mm_extract_epi8(..., index);
}
这给我们留下了 gcc (-O0) 编译器错误:
错误:选择器必须是 0..15 范围内的整数常量
解决此问题的一个讨厌的方法是switch
在索引上设置一个并_mm_extract_epi8
调用 0..15 范围内的每个索引。我的问题是是否有我看不到的更好/更好的方式。
更新:用-O3优化,没有编译错误;虽然仍然有 -O0 。