先日、Redditで興味深い投稿を見かけました。
ARMプロセッサには、なんとJavaScript専用の命令が存在するというのです。
「RISC(縮小命令セット)」として知られるARMに、特定の言語向けの命令があるとは驚きではないでしょうか。
本記事では、この不思議な命令の背景について解説します。
そして、現代のARMアーキテクチャの実態にも迫ります。
fjcvtzsという命令
ARMにはfjcvtzsという命令があります。
これは「Floating-point Javascript Convert to Signed fixed-point, rounding toward Zero」の略称です。
浮動小数点数をJavaScriptの仕様に沿った形で符号付き整数に変換します。
JavaScriptの数値処理には独特の仕様があります。
そのため、通常の浮動小数点変換とは異なる丸め処理が必要となるのです。
この処理をソフトウェアで実装すると複数の命令が必要になります。
しかし、fjcvtzsを使えば一発で完了するわけです。
ARMは本当にRISCなのか
Redditのコメント欄では、ARMの複雑さについて活発な議論が展開されていました。
あるユーザーの指摘によれば、ARMは約2000もの命令を持っているとのこと。
その内容は非常に多岐にわたります。
暗号処理、複素数演算、DSP向けの算術命令、メモリコピー、ヒストグラム計算、テーブルルックアップ、行列演算、文字列比較など、様々な専用命令が用意されているのです。
では、ARMはRISCではないのでしょうか。
実際のところ、ARMは「RISCの原則」には従っています。
ロードストアアーキテクチャを採用しており、命令はハードウェアで直接効率的に実行されます。
豊富なレジスタプールと固定長の命令フォーマットを持つ点も特徴的です。
さらに、人間のアセンブラではなくコンパイラをターゲットに設計されています。
これらは典型的なRISCの特徴と言えるでしょう。
ただし、現代のARMは組み込み向けマイコンだけを対象としていません。
高性能なアプリケーションも視野に入れています。
そのため、重い処理を高速化する専用命令を次々と追加してきたのです。
ARM vs x86:どちらが複雑か
別のユーザーからは反論もありました。
命令数の多さと「アーキテクチャの複雑さ」は別物だという主張です。
ARMは固定長エンコーディングと規則的なフォーマットを維持しています。
一方、x86はどうでしょうか。
可変長命令、複雑なプレフィックス体系、レガシー由来の様々な癖を抱えています。
同じカウント方法を使えば、x86のほうがはるかに多くのバリエーションを持つことになるでしょう。
とはいえ、純粋な「操作の種類」で数えると話は変わります。
x86は命令エンコーディングの制約から、融合乗算命令でどのレジスタを出力先にするかで別々の命令が必要になったりします。
ARMではゼロレジスタの存在もあり、同じ命令で済むケースが多いのです。
進化するARMの実行モデル
かつて、ARMプロセッサの多くはインオーダー実行を採用していました。
トランジスタ数を抑えられるからです。
そして、組み込み用途には十分な性能を発揮できました。
しかし状況は大きく変わりました。
現在のフラッグシップスマートフォンやノートPCに搭載されるARMコアは、3〜4GHzで動作するアウトオブオーダー実行の怪物です。
クロックあたり8〜12命令を実行できるものもあります。
これはx86の最大8命令を上回る数字です。
さらにARMには独自の強みがあります。
算術演算に無料でシフトを組み合わせられるのです。
また、ロード・ストア命令にアドレスのインクリメントを含めることもできます。
x86では1つの命令で最大「演算+ロードまたはストア」となります。
オペランドを保持するために追加のムーブ命令が必要になることも珍しくありません。
JavaScript命令の意味するもの
fjcvtzsは、ARMの設計思想をよく表しています。
一見すると奇妙に見えるこの命令ですが、実装としては浮動小数点ユニットの配線をわずかに変更する程度だそうです。
JavaScriptエンジンが頻繁に実行する処理があります。
それをハードウェアレベルで高速化できるなら、追加する価値があるという判断でしょう。
現代のプロセッサ設計は、純粋なアーキテクチャ哲学よりも実用性を重視する傾向にあります。
RISCかCISCかという二分法は、もはやあまり意味を持たなくなっているのかもしれません。
まとめ
ARMプロセッサにJavaScript専用命令が存在するのは、現代のチップ設計が実用性を重視している証拠と言えます。
ARMは「RISC」の名前を持ちながらも、約2000もの命令を擁する複雑なアーキテクチャへと進化しました。
固定長命令という原則は守っています。
しかし同時に、暗号処理から行列演算まで、あらゆる重要なワークロードを高速化する専用命令を取り込んでいるのです。
プロセッサの世界では、ラベルよりも実際の性能と効率が物を言います。
fjcvtzsという一見奇妙な命令は、その象徴的な存在なのでしょう。
