2 つのレジスタの上位ワードと下位ワードを別のレジスタにインターリーブする単一のSSE 命令はありますか? 例えば:
r[63-0] = a[64-127]
r[64-127] = b[63-0]
2 つのレジスタの上位ワードと下位ワードを別のレジスタにインターリーブする単一のSSE 命令はありますか? 例えば:
r[63-0] = a[64-127]
r[64-127] = b[63-0]
いいえ、2 つのソースと個別の宛先を持つ SSE シャッフルは存在しないためです。r
ただし、が と同じ場合は、 を使用して実行できa
ますshufpd
。の値を保持する必要がある場合a
:
movapd r, a
shufpd r, b, 1
最近の µarches では、これmovapd
は解放されて rename[*] で処理されるため、実行コアの観点からは、これは事実上「単一の命令」です。
AVX が利用可能な場合は、使用できますvshufpd
。
[*] この名前変更機能を飽和状態にすることができます。その場合、追加の reg-reg 移動は通常のポート 0|1|5 操作のように動作します。幸いなことに、実際のコードではほとんどの場合、これらのポートの 1 つにバブルがいくつかあるため、移動は依然として「無料」である傾向があります。