インテルのSSE組み込み関数を使用してプロセッサのフラグ・レジスタをチェックすることが可能かどうか疑問に思っていましたか?例えばSSEインライン・チェック・ゼロ・フラグ
:
int idx = _mm_cmpistri(mmrange, mmstr, 0x14);
int zero = _mm_cmpistrz(mmrange, mmstr, 0x14);
この例では、コンパイラは、単一の命令(pcmpistri
)にこれら二つの組み込み関数を最適化することができ、フラグがジャンプ命令(jz
)によって登録確認。
しかし、次の例にコンパイラが適切にコードを最適化するために管理していない:ここ
__m128i mmmask = _mm_cmpistrm(mmoldchar, mmstr, 0x40);
int zero = _mm_cmpistrz(mmoldchar, mmstr, 0x40);
は、コンパイラはpcmpistrm
とpcmpistri
命令を生成します。しかし、私の意見では、pcmpistrm
はpcmistri
と同じ方法でプロセッサのフラグレジスタにフラグを設定するので、2番目の命令は冗長です。
私の質問に戻るには、フラグレジスタを直接読み込む方法と、pcmpistrm
命令だけを生成するようにコンパイラに指示する方法がありますか?
どのコンパイラでどのオプションを使用できますか?これは、コンパイラがCSEを成功させることの問題であるように思われる。 ISAマニュアルには、[PCMPISTRI](http://www.felixcloutier.com/x86/PCMPISTRI.html)と[PCMPISTRM](http://www.felixcloutier.com/x86)の両方の組み込み関数の1つとして '_mm_cmpistrz'がリストされています/PCMPISTRM.html)、インテルによれば、コンパイラは '_mm_cmpistrz'のいずれかの命令を発行することができます。 –
また、これをコンパイルする関数にラップすることができるので、人々はhttp://gcc.godbolt.org/にコピーできますか?または、Godboltのsource + asm出力にリンクしてください。 –
@Peter Cordesすべての最適化を有効にしてMSVCコンパイラを使用します(/ O2) – Philinator