質問

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

だから、次のインライン関数を試してみました:

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

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

役に立ちましたか?

解決

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

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

したがって、64ビットレジスタの下位32ビットだけで ror を実行する方法はありません。一連のいくつかの指示を使用する必要があります...

他のヒント

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top