• Pentium
  • MMX Pentium
  • Pentium 2
  • Pentium 3
  • Pentium 4
  • K6
  • K6-2
  • Athlon
  • Athlon XP

突然ですが、このリストは皆さんご存知の32ビットCPUの仲間たちですね。色々な技術がてんこ盛りのことだと思いますが、ベースとなるものはx86。特殊命令を除けば、すべて互換性があります。

ところで、VC++やABなどのネイティブコンパイラは浮動少数演算を行うときにFPUという特別なレジスタを利用することになるんですが…。このFPUというものはx86系のCPU、即ち上記リストで示したようなCPUであれば搭載している機構なんです。とすると、FPUに対応するネイティブコードを生成してやれば、ほとんどの32ビットCPUで演算可能になってくるんですね。そういう意味で、昨今までのネイティブコンパイラはFPUを使いまくっておったんだと思います。

しかし、時代は64ビットCPUの世界へと塗り替えられていきます。

  • Pentium 4 (6xx)
  • Athlon 64
  • Opteron

これらは登場して間もない64ビットCPUです(以下AMD64)。もちろん、AMD64もx86と同様にFPUレジスタは積んでいますし、それだけで十分に実数演算を行うことができます。しかし、よ〜く考えてみると、このFPUレジスタってやつはちょっと使いづらいんです。スタックベースだし、128ビットは使えないし(80ビットまで)、本数も8本だし…。まぁ、通常の用途であれば、こんなもんで事足りるんだと思います。

しかし、64ビットCPUは、64ビット演算をフルに行いながらそのポテンシャルを引き出していかなければ意味がありません。せっかく、汎用レジスタが64ビットになったんだから、double型演算なんてのもお手の物であってほしいものです。rdx:raxとレジスタを連結させ、128ビット整数型/128ビット浮動小数型なんてのも使いたいもんです。

そこで登場するのがSSE2です。SSE2は今現在リリースされている64ビットCPUすべてが対応しているハズです。っつーことは、64ビットネイティブコードからはFPUなんか使わなくても、SSE2に対応するコードを吐けば、AMD64上の話では互換性は十分に保てるということになります。

SSE2では、XMM0〜XMM15という16本の128ビットレジスタを利用できます。しかも、スタックベースではないんで、通常の汎用レジスタ感覚で利用することができます。しかもしかも、32ビット値を4つ同時に、64ビット値であれば2つ同時に扱うことができてしまいます。

いいことづくめで互換性もあるSSE2なんで、AMD64対応のネイティブコード、実数演算はこれで決まりですね。

こんな発見をしつつ、64コンパイラの開発は進みます・・・・・