2017-07-08 6 views
4

一部の組み込み関数では、接尾辞x_mm256_set1_epi64xのように使用します。それの意味はなんですか?参考のために、_mm256_set1_epi32にはこの接尾辞が付いていません。"_mm256_set1_epi64x"のような組み込み関数の接尾辞 "x"の意味

+0

I * think * "x"は、64ビットターゲットでのみ使用できる組み込み関数(および対応する命令)を意味します。しかし、私はそれを確信していません。私は何の証明もできません。それは私が数回気づいたパターンです。あなたがここで尋ねるもう1つの質問は、本当に話題にはなりません。私たちは外部のリソースに対する要求をしません。 –

+0

@CodyGray、ロードマップのリクエストを削除しました。 –

+3

本来、「歴史的な」変種とそれに続くより有用な変種の2種類があります。 '_mm_set1_epi64'は' __m64'パラメータをとり、 '_mm_set1_epi64x'は' int64_t'をとります。 –

答えて

3

TL:DR: MMX-> SSE2変換組み込み関数は、-x_mm_set/set1_epi64の名前をとっています。

これは、現在の関数名、知られている歴史、そしていくつかのコンパイラの動作に基づいて、すべての当て推量です:

最初のIntel SIMD組み込み関数は、MMXのためでした。 __m64は、SSE2 __m128iおよびAVX2 __m256iのMMXに相当します。当時は64ビットのx86 CPUはなかったため、最も幅広いsetの組み込み関数は__m64 _mm_set_pi32 (int e1, int e0)でした。固有ファインダによれば、依然としてmovq mm0, raxの固有値は存在しない。 int64_tから__m64にキャストしてください。 (私が最後の1年ほど前に実験したが、gccやclang(どちらが忘れているか)はMMX asmを最適化するうえで貧弱な仕事でしたが、新しいプロジェクトのためにMMXを避けるもう一つの理由です。 SSE2が導入されたのはin 2001で、まだAMD64/x86-64はリリースされておらず、数年前からIntelによってサポートされていませんでした。 (当時、彼らはIA-64/Itaniumが将来x86となることを望んでいた)。私は古いマニュアルをチェックしていませんが、
__m128i _mm_set1_epi64 (__m64 a)が利用可能だったと思います。
__m128i _mm_set1_epi64x (__int64 a)おそらくそうではありませんでした。 (__int64<stdint.h>からint64_tではないことに注意してください。しかし、それは、64ビット整数型で、何も心配することはありません。)拡張(?)パックド整数のため

epiスタンド。 piの代わりにepiを指定すると、それはSSE組み込み関数であり、MMX組み込み関数ではありません。ある要素幅から別の要素幅に変換する組み込み関数の場合、インライン展開では、(少なくとも見たものに対して)その動作を明確に識別できる場合は、ソース幅を使用します。例えば_mm_packs_epi32packssdw)または_mm_unpackhi_epi16punpckhwd)である。ありますのでPMOVZXは、両方の数字を必要と_mm_cvtepu8_epi32pmovzxbd)、_mm_cvtepu8_epi64pmovzxbqなど


コンパイラは、32ビットモードでのコースのサポート、64ビットの整数でなかったので、Intelが含まれることが理にかなっているだろうただし、IIRC、コンパイラでは、64xの組み込み関数は、64ビットコードをコンパイルするときにのみ使用できます。64xは、スカラー64ビット整数との変換にのみ関連しています。 xのバージョン_mm_add_epi64などです。

これは、コンパイラによっては_mm256_set1_epi64xの場合はまだ存在するかもしれませんが、どちらの方法でも64xの理由が説明されていますが、32xではありません。

(申し訳ありませんが、私は怠け者だと-m32と現在のコンパイラをチェックするためにGodboltで一緒に実験を入れていない。あなたが__m64int64_tをキャストし、固有_mm_setを使用してから取得したASMの種類を見るのは興味深いかもしれません32ビットコードで)

関連する問題