Edited at

x86の浮動小数計算とSIMD命令の変遷

More than 3 years have passed since last update.


8087(1980)

浮動小数点演算ユニット(FPU)。

精度は80bit、スタック型のレジスタが8本。


80486(1989)

FPUがCPUに内蔵化された。


MMX Pentium(1997)

FPUレジスタ80bit×8のうち64bitを使ってmmレジスタとし、8bit×8~32bit×2の整数SIMD計算が可能(MMX)。

わざわざレジスタを共用にしたのは、コンテキストスイッチ時のレジスタ退避の仕組みに変更点がなく、OSの対応を待つ必要がなかったため。


Pentium Ⅲ(1999)

128bitのxmmレジスタを8本新設、32bit×1、32bit×4の浮動小数点演算が可能(SSE)。


Pentium 4(2000)

xmmレジスタで64bit×1、64bit×2の浮動小数点演算に加え、8bit×16~64bit×2の整数演算も可能(SSE2)。

以降、機能拡張が続いたが、レジスタ幅などの変更はなし。


Sandy Bridge(2011)

xmmレジスタを16本に増やし、さらに256bitに伸ばしてymmレジスタとした(下位128bitはxmmレジスタと共用)。

32bit×8、64bit×4の浮動小数点演算が可能になった(Intel AVX)。


Haswell(2013)

ymmレジスタで8bit×32~64bit×4の整数演算が可能に(Intel AVX2)。


内容別


80bit浮動小数演算、超越関数(sin,cos,exp,log)計算

x87命令(実際にはSSE以降でソフトウェア的に計算した方が速い)


64bit・32bit浮動小数演算

SSEで4並列(32bit)

SSE2で2並列(64bit)

AVXで4並列(64bit)、8並列(32bit)

逆数命令、逆数平方根命令は64bitでは使用できない


64bit~8bit整数演算

MMXで2並列(32bit)~8並列(8bit)

SSE2で2並列(64bit)~16並列(8bit)

AVX2で4並列(64bit)~32並列(8bit)

一部不可能な命令あり