私は最近、int _mm_extract_epi8 (__m128i src, const int ndx)
「インデックスによって選択されたパックされた整数配列要素から整数バイトを抽出する」という参照によると、SSE組み込みを使用しています。これはまさに私が欲しいものです。
ただし、文字列データと明示的な長さのパック比較を実行し、インデックスを生成する_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 を使用します。