バッファのサイズがわからない場合は、ループなしでは実行できません。自分でループを作成しなくても、strlenのようなものを呼び出すとループが発生します。ここでも再帰をループとして数えています。
どのバイトを保持し、どのバイトをゼロに設定するかをどのようにして知ることができますか?これらのバイトが既知の位置にある場合は、ベクトル演算を使用して、一部のバイトをゼロにし、他のバイトをゼロにすることはできません。次の例では、次の最初の64バイトの偶数バイトのみをゼロにしますrawData
。
__m128i zeros = _mm_setzero_si128();
uint8_t mask[] = {8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0};
__m128i sse_mask = _mm_load_si128(mask);
_mm_maskmoveu_si128(zeros, sse_mask, &rawData[0]);
_mm_maskmoveu_si128(zeros, sse_mask, &rawData[16]);
_mm_maskmoveu_si128(zeros, sse_mask, &rawData[32]);
_mm_maskmoveu_si128(zeros, sse_mask, &rawData[48]);
の各バイトの上位ビットmask
が1の場合、の対応する値zeros
がにコピーされrawData
ます。これらのマスクされたコピーのシーケンスを使用して、一部のバイトをすばやく置き換え、他のバイトを置き換えることはできません。結果のマシンコードはSSE操作を使用するため、これは実際には非常に高速です。rawData
必須ではありませんが、 16バイトにアラインされている場合、SSE操作ははるかに高速に実行されます。
ARMをターゲットにしている場合は申し訳ありません。NEON組み込み関数は似ていますが、同一ではないと思います。