2011-11-07 11 views
2

私は非常に困惑しています。CPUにSSEバグがありますか?

私は、Visual C++ 2008でこのコードを実行します。

__m128i a, b; 
a.m128i_u64[0] = 1; 
b.m128i_u64[0] = 0; 
a.m128i_u64[1] = 0; 
b.m128i_u64[1] = 0; 
printf("%d\n", _mm_testc_si128(a, b)); 

それは1を印刷します。それはabが同じ場合に限り1になるはずなので、私が期待するものとは逆です。

これはどのように可能ですか?私のCPUやVisual C++ 2008などにバグがありますか?

+0

あなたが使用しようとする命令はSSE4(!)です - あなたのCPUがそれをサポートしていますか? if yesの場合、 'printf'の前に' int res = _mm_testc_si128(a、b); 'を呼び出し、代わりに' printf'の 'res'を使うとどうなりますか? – Yahia

+0

@Yahia:はい、私のCPUはSSE4.2までサポートしています。一時変数を使用しても同じことが起こります。 – Mehrdad

答えて

5

私は多くのSSE4.1組み込み関数がVS2008で壊れていることを知っています。彼らはVS2010のためにそれらを修正しました。 VS2010(SPなし)では、AVX組み込み関数の一部が壊れています。彼らはVS2010 SP1のそれらを修正しました。

私は_mm_testc_si128の組み込み関数を使用したことがないので、VS2008で壊れている組み込み関数なのかどうかは分かりません。しかし、インライン/インサートの組み込みが壊れてしまった多くのケースがあります。

EDIT:私はVS2010 SP1でこれをテストし、それがまた1

を与え、それが1

を返すことが「必要がある」のように今、私はdocumentationを見ていること、それが見えます戻り値

bに設定されているすべてのビットがaに設定されている場合は1。そうでない場合は0

だから、この場合はバグだとは思わない。

+0

OMFG goddammit ...私は私の髪を引っ張っていたし、オンラインの代わりにVS 2008のためのローカルMSDNライブラリを使用していました、そして、aとbがビットワイズであれば、戻り値は '1です。そうでなければ0です。ありがとう。 +1([ここ](http://msdn.microsoft.com/de-de/library/bb513983(v = versus90).aspxを参照))。 – Mehrdad

+0

笑、彼らは本当に彼らのVS2008のドキュメントをborkedように見える...:P – Mysticial

関連する問題