8

64ビットレジスタの下位32ビットサブレジスタにBSWAPを使用する方法の答えを探していました。たとえば、 RAXレジスタ内にあり、単一の命令で0x0123456789abcdef変更したい(パフォーマンスのため)。0x01234567efcdab89

だから私は次のインライン関数を試しました:

#define BSWAP(T) {  \
    __asm__ __volatile__ (  \
            "bswap %k0" \
            : "=q" (T)  \
            : "q" (T)); \
}

その結果は でした0x00000000efcdab89。コンパイラがこのように動作する理由がわかりません。誰かが効率的な解決策を知っていますか?

4

2 に答える 2

5

ああ、はい、私は今問題を理解しています:

x86-64 プロセッサは、32 ビット操作 (%eax、%ebx など) を実行するときに、暗黙的に 32 ビット レジスタを 64 ビットにゼロ拡張します。これは、私が理解しているように、これらのレジスタに 32 ビットのセマンティクスを期待するレガシー コードとの互換性を維持するためです。

残念ながら、64 ビット レジスタの下位 32 ビットだけを処理する方法はありませんror一連のいくつかの指示を使用する必要があります...

于 2008-10-07T13:40:22.583 に答える
-1

gcc によって生成されたアセンブリ出力を確認してください! フラグを使用しgcc -sてコードをコンパイルし、asm 出力を生成します。

IIRC、x86-64 は、明示的に指示されていない場合、デフォルトで 32 ビット整数を使用するため、これが問題 (の一部) である可能性があります。

于 2008-10-07T02:10:29.200 に答える