大きなデータ型 (Double/Float) は、算術演算用のレジスタにどのようにロードされますか? レジスタはワードサイズ以上のデータを保持できますか? 結果を 3 番目のレジスタにロードするために 2 つのレジスタしか追加できない場合、1 つのレジスタより大きいデータ型はどうなりますか?
2 に答える
たとえば、SPARCv8 ABI では、64 ビット double が 2 つの 32 ビット レジスタにロードされ、FP 操作は 2 つのレジスタで同時に動作します。fsqrtd %f10, %f8
%f10:%f11 の値を取得し、ルート化された結果を %f8:%f9 に書き込みます。x86_32 では、32x32->64 の乗算を実行すると、結果が edx:eax (など) にある場合に、同様のことがわかります。実際には、結果が dx:ax に送られる 286 モードでの 16x16->32 乗算でも同じです。
まず、CPU は通常、整数と浮動小数点数用に別々のレジスタ ファイルを持っています。
80 年代にいくつかの CPU が統一されたレジスタ空間を使用しようとしましたが、それが帯域幅のボトルネックであることがわかりました。浮動小数点演算はほとんどの場合マルチサイクルであり、常にかなりの量の整数ベースのフロー制御が混在しているため、別々のレジスタ空間に同時にアクセスする方が効率的です。
第 2 に、一部のアーキテクチャでは、浮動小数点レジスタ ファイルはすべて 80 ビットの拡張浮動小数点 (C では "long double") です。double と float はロード時にその形式に拡張され、拡張された形式は格納時に丸められて切り捨てられます。
整数演算の場合、これはアーキテクチャに依存します。64 ビットは x86 の後付けであるため、8 ビット (AL および AH)、16 ビット (AX)、32 ビット (EAX)、および 64 ビット (RAX) をすべて同じ物理レジスターにオーバーレイします。 、それぞれ異なるアドレッシング モードでアクセスされます。一方、一部の RISC アーキテクチャでは、MOST 操作でレジスタ内の数値を 64 ビットとして扱い、ロードとストアのワード サイズのみを考慮します。