1. ホーム
  2. assembly

[解決済み] 64ビットマシンでのQWORDのサイズは?

2022-03-06 01:55:24

質問

現在、上記の質問に対する答えを探しています。64ビットマシンでは、ワードサイズは64ビットで、QWORD(4 * ワード)は256ビットの大きさであることを示唆しています。

しかし一方で、次のような資料も見つけました。 これ 128ビット(32ビットは64ビット、64ビットはこの2倍)とする説と、64ビットとする説があります。しかし、最後のものは、マイクロソフトがワードのサイズを16ビットと定義することで皆を混乱させ、問題を悪化させていることと何らかの関係があります。

もしかしたら、どなたか私の混乱を解決し、このトピックについてご教示いただけるかもしれません。

どのように解決するのですか?

x86の用語/ドキュメントでは、quot;word"は16ビットです。 なぜなら、x86は16ビットの8086から発展したものだからです。 拡張機能が追加されるたびにこの用語の意味を変えていては、混乱を招くだけです。 cwd (符号拡張でワードをドワードに)用語はISAに焼き付けられた。

  • x86ワード=2バイト
  • x86 dword = 4バイト(ダブルワード)
  • x86 qword = 8 バイト (クワッドワード)
  • x86ダブルクアッドまたはxmmword = 16バイト、例. movdqa xmm0, [rdi] .
    また cqo ニーモニック 、オクトワード。 (RAXをRDX:RAXに符号拡張したもの。 idiv )

そして、次のような楽しい命令があります。 punpcklqdq : 2つのqwordをシャッフルしてdqwordにする、あるいは pclmulqdq は、q ワードのキャリーレス乗算で、dq フル結果を生成します。 しかし、それ以上のSIMDニーモニックはAVXになりがちです。 vextracti128 または AVX512 (オプションで要素ごとのマスキングが可能) vextractf64x4 を使用して、ZMM レジスタの上位 256 ビットを抽出します。

x86 は奇妙で、すべてが 2 の累乗ではないのです。 また、プロテクトモードでの 48 ビット seg:off 16:32 遠距離ポインターもあります。 (基本的に使わず、32ビットオフセット部分のみ)。


他のほとんどの64ビットISAは32ビットISAから発展したものです。 (AArch64、MIPS64、PowerPC64など)、あるいは最初から64ビットだった(Alpha)。 ということは、quot;word"は32ビットを意味するわけですね。

  • 32ビットワード=4バイト
  • dword = 8バイト(ダブルワード)、例:MIPS daddu は64ビット整数加算
  • qword = 16バイト(クワッドワード)、サポートされている場合。

マシン語" と、アーキテクチャにラベルを貼ること。

マシン語という概念について は、x86には当てはまりません。 マシンコードのフォーマットがバイトストリームであり、複数のオペランドサイズを同等にサポートし、アラインされていないロード/ストアで自然アラインのものをほとんど気にせず、通常のキャッシュ可能なメモリのキャッシュライン境界のみを気にします。

ワードオリエンテッドなRISCであっても、レジスタやキャッシュアクセスのサイズは、命令幅やドキュメントでワードとして使用されているものと異なる場合があります。

ワードサイズという概念は、一般的に過大評価されています。 x86に限ったことではありません。 64ビットのRISC ISAでも、32ビットや64ビットのアライメント付きメモリを同等の効率でロード/ストアできますから、自分がやっていることに最も役立つ方を選んでください。 最大効率のサイズが1つしかない場合(たとえば、いくつかの32ビットRISCでは32ビット)には、それをワードサイズと呼ぶと便利です。


私が聞いたことのあるどの64ビットマシンでも、quot;word"は64ビットを意味しないんです。 DECのAlpha AXPでさえ、積極的に64ビットになるように一から設計されたのに、32ビットの命令語を使用しています。 IRCのマニュアルではワードを32ビットと呼んでいます。

存在 有能 64ビットを1つの命令で整数レジスタにロードしても、それはワードサイズにはなりません。 BitnessとWord Sizeは、技術的に難しい意味はありません。 ほとんどのCPUは、内部で複数の異なるサイズを持っています。 (例:64 バイト Haswell以降のIntelのL2キャッシュとL1dキャッシュ間のバス、および32バイトのSIMDロード/ストア)。

つまり、CPUベンダーのドキュメント作成者が、自社のISAにおいて"word"(ひいてはdword / qword)をどのように意味づけるかは、基本的にそのベンダー次第なのです。


面白いことに、SPARC64ではワード/ダブルワードではなく、"ショートワード"(32ビット)対"ロングワード"(64ビット)について述べています。 64ビットのSPARCのドキュメントでは、修飾語なしの"word"だけに意味があるのかどうかは分かりませんが。