なぜビットマスクを使用しているのですか? これらすべてのイベントを 1 つの STTNI 命令でチェックし、返されたインデックスを使用して、返されたイベント (存在する場合) を処理するほうがよいのではないでしょうか?
(編集)もっと役に立てるようにしましょう...
(8ビット文字のヌル終了文字列を使用していると仮定します。そうでない場合はお知らせください。)
区切り文字、改行、引用符、およびエスケープを単一のレジスタに (null で終了する文字列として) 配置し、各値を使用するPCMPISTRMの代わりに PCMPISTRI を使用する方がよいと思います。示す必要があるコントロール ワードの場合: 符号なしバイト、Equal Any、Positive Polarity、Least。(確かに私はそれを正しく理解しました。)
次に、JA を使用して、4 つの特殊文字のいずれかにヒットしたかどうか、または文字列の末尾に到達したかどうかを同時に確認できます。その場合は、ループをエスケープして対処してください。そうでない場合は、ECX を xmm2/m128 ポインターに追加し、PCMPISTRI に戻ります。
「ヒット」を処理するためのコードの最初の指示は、ECX を xmm2/m128 ポインターに追加し、次にそれぞれの可能性を順番に処理することです。可能性が高いものから順に並べることをお勧めします。
したがって、asm は次のようになります。
XOR ECX, ECX
TAG1:
ADD EAX, ECX
PCMPISTRI XMM1, [EAX], 0x0 ; also writes ECX = index
JA TAG1
ADD EAX, ECX
CMP BYTE PTR[EAX], "delimiter"
JE "handle delimiter"
CMP BYTE PTR[EAX], "newline"
JE "handle newline"
CMP BYTE PTR[EAX], "quotation"
JE "handle quotation"
CMP BYTE PTR[EAX], "escape"
JE "handle escape"
CMP BYTE PTR[EAX], "end of string"
JE "handle end of string"
区切り文字をテストするための最適な順序を決めるのはあなたにお任せします。:)
命令を開発していたとき、組み込み関数を使用して上記の asm コードをコンパイラに生成させることができました。命令の作業を行ってからしばらく経ちましたが、平均的なコンパイラがうまく機能するかどうかはわかりません. (どのような結果が得られるかを聞くのは興味深いことです。)
ところで、命令のマスク バージョンにはあらゆる種類の用途がありますが、命令の「I」バージョンがオフセットを計算するため、何かの最初または最後を見つけるのに最適な選択ではありません。マスク バージョンは、他のよりエキゾチックなものの中で特定のアイテムを数えたり、処理したりするのに適しています。今、私はそれらを使って DNA 文字列の A、CG、T を数えています。