2015-12-11 10 views
5

ソフトウェアでは128ビット整数をエミュレートする必要がありますか、または最近の平均的なデスクトッププロセッサではハードウェアサポートがありますか?最新のプロセッサに128ビット整数のハードウェアサポートはありますか?

+0

x86タグを追加したのは、これが最も一般的なデスクトップ命令セットだからです。主にARMを使用しているタブレットや携帯電話などを含めると、あなたの質問はより広範にアピールできます。私は、ARMが64ビット* 64ビットから128ビットの命令を持っているのを疑う。 –

答えて

4

x86-64の命令セットは、1つの命令(一方のオペランドと符号付き各々に対する符号なしimulためmul)を用いて128ビットを64ビット×64ビットを行うことができるので、私は、x86命令することをある程度までそれを主張setには128ビット整数のサポートが含まれています。

命令セットに64ビット* 64ビットから128ビットへの命令がない場合は、several instructions to emulate thisが必要です。

これは、x86-64ではほとんどの命令で128ビット×128ビットから128ビットの低位演算を実行できる理由です。例えばGCC

__int128 mul(__int128 a, __int128 b) { 
    return a*b; 
} 

は128ビット命令を1つの64ビット×64ビットを使用してこのアセンブリ

imulq %rdx, %rsi 
movq %rdi, %rax 
imulq %rdi, %rcx 
mulq %rdx 
addq %rsi, %rcx 
addq %rcx, %rdx 

を生成して、2つの64ビット×64ビット、64ビットを低下させます命令、および2つの64ビット加算があります。

+0

@Filip: 'adc' /' sbb'(桁上げ加算、借用減算)、div/idiv(128b/64b - > 64b配当、64b剰余)もあります。 128bの整数を加算/減算するには、2つの命令(データの移動をカウントしない)だけが必要です。 SSEベクトルでビット単位のブール値を実行できます。 –

+0

@PeterCordes、良い点。私は 'adc'を128ビットサポートとは考えていませんでしたが、私はあなたのポイントを見ています。いくつかの命令セットは「adc」(例えばSSE/AVX)を有していないので、それらは複数ワードの加算を行うためにより多くの命令を必要とする。 –

2

短い回答です:いいえ!

もっと詳しく説明すると、SSEレジスタは128ビット幅ですが、命令を128ビット整数として扱う命令は存在しません。せいぜい、これらのレジスタは2つの64ビット(符号なしの)整数として扱われます。加算/ ...のような演算は、これら2つの64ビット値を平行して加算し、オーバーフローを手作業で処理するが、単一の命令では処理できない。これは非常に複雑と「醜い」を得ることができます実装、ここを見て:

How can I add together two SSE registers

これは、64ビットの汎用レジスタとimplemention(」に比べて、おそらく疑問の利点を持つすべての基本的な操作のために行わなければなりませんエミュレーション ")。一方、このSSEアプローチの利点は、それが実装されると、わずかな変更だけで256ビット整数(AVX2)と512ビット整数(AVX-512)でも機能することです。

関連する問題