2011-10-15 7 views
5

ほとんどのコンパイラは32ビット環境でどのように64ビットオペランド(long intなど)でオペレーションを実装しますか?言い換えれば、これらの操作を単一のステップで実装する方法があるのでしょうか、またはこれらの操作を実装するために複数のメモリ位置にアクセスする必要がありますか?32ビットアーキテクチャの64ビットオペランドでの操作?

+0

または複数のレジスタ –

答えて

5

これらは2つのレジスタを使用して64ビットの値を保持します。 1つは下位32ビット用で、もう1つは上位32ビット用です。 x86の場合

は、64ビットの加算/減算を使用して行われてキャリー-加算および減算-で-借りる説明書:

add %eax, (lower 32-bits of operand) 
adc %edx, (upper 32-bits of operand) 

64ビット乗算ははるかに複雑ですが、また、使用して行います32ビット乗算と32ビット加算加算命令の組み合わせ。 (2桁のlong乗算と同様の方法で)

ロードとストアでは、2つの32ビット値を2つのレジスタにロード/ストアする必要があります。

同様に、64ビットハードウェアで128ビットの整数を実装できます。 GCCはこれを拡張としてサポートしています。

+0

32ビット(x86)ハードウェアの128ビット整数はどうですか? –

+1

醜いです。この時点では、多精度算術とあまり変わらない。加えて、3つの 'adc'命令を連鎖させます。 (あなたのパイプラインを殺す可能性のあるキャリーフラグに依存していることを忘れないでください...)乗算のためには、16 x 32ビットの乗算と 'add'と' adc'の束を行う必要があります。私はこれをサポートするコンパイラについては知らない。 – Mysticial

関連する問題