ARMを中心とした組み込み向けCPUの昔話

なんか、なつかしい話が語られていたので、まとめてみました。
ARM
7
ウチューじん・ささき @uchujin17

@pepepepePekoe SHは定数テーブルをPC参照の-128/+127で拾いにゆくのでサブルーチンの切り方に独特のコツがあったとか知りません(´・Д・`)

2015-04-23 11:50:08
ウチューじん・ささき @uchujin17

@pepepepePekoe MIPSの遅延分岐スロットだとか予測分岐命令だとか、ARMの定数オフセット+シフト演算命令だとか、Am29000のレジスタバンクだとか…固定長命令のRISCは変態アーキテクチャが多くて楽しかった(仕事でやるのは地獄だけど)。

2015-04-23 11:56:24
ウチューじん・ささき @uchujin17

@pepepepePekoe RISCアセンブラの究極はi860のVLIW命令かもしれません。さすがに自分で使った経験はないですが…。

2015-04-23 12:01:00
ウチューじん・ささき @uchujin17

日本人なら日本生まれの非ノイマン・パイプライン・アーキテクチャμPD7281を使うべき(´・Д・`)

2015-04-23 12:02:40
ウチューじん・ささき @uchujin17

@pepepepePekoe 90年代のRISCに比べれば、ARM Cortexは呆れるくらい普通のプロセッサですよ。可変長命令、2オペランド命令、定数オペランド、遅延スロットなしの条件分岐命令。ARMみたいにADDEQ R15,R1+16なんて変なことはやりません。

2015-04-23 12:11:32
ウチューじん・ささき @uchujin17

ゼロ・レジスタと3オペランド命令も流行ったんだよなー。MIPS,Sparc,PowerPCが備えていたはず。皮肉なことに21世紀まで生き延びたARM Cortexとx86はどちらも備えていない(笑)

2015-04-23 12:12:43
ウチューじん・ささき @uchujin17

R0は読んでも書いても常にゼロのレジスタ。3オペランドというのはA=B+Cのように演算対称と格納先を別に指定できる命令体型。こういったRISCでは例えばR1がゼロかどうかを判定するのにADD R0,R1,R0なんて命令を使った。CMP命令なんて無いのよ。

2015-04-23 12:14:50
ウチューじん・ささき @uchujin17

RISCアーキテクチャが意地みたいにして命令の種類を減らしたのは、固定長命令に占めるインストラクションビットの割合を減らし、より多くの修飾ビットを詰め込もうとしたため。ARMは2オペランドにした代わり全ての命令に条件ビットと8bitの定数修飾と4bitのシフト演算子を含めた。

2015-04-23 12:17:27
ウチューじん・ささき @uchujin17

もう一つの理由は命令種類を減らせば命令を直接演算回路に渡すハードワイヤード・アキュムレータの実装が容易になり、回路規模が小さくなって半導体上の占有面積が縮小し、安上がりになるうえ実行クロック上限も上がるメリットがあったこと。

2015-04-23 12:19:15
ウチューじん・ささき @uchujin17

命令は減らせばよいというわけでもなく、例えばARM6はやりすぎてメモリ読み書き命令が1種類だけ、オペランド修飾ビットも1ビットだけ(8bit/32bitの切り替え)にしてしまい、short型構造体を持つソースコードの実行効率が悪くなってしまった。

2015-04-23 12:21:57
ウチューじん・ささき @uchujin17

この反省からARM7では16bitメモリを扱うハーフワード命令が追加された。ARMというアーキテクチャは純粋RISCに近いところからスタートして現実の壁にぶつかり、次々と場当たり的な拡張を取り入れてきたところが面白いね。

2015-04-23 12:23:25
ウチューじん・ささき @uchujin17

ARM7Tで導入された16bit幅のTHUMB命令も凄まじく汚い代物で、リセットベクタや割り込みハンドラは32bitARMで書かなきゃならなかったし、ARM<=>THUMBの切り替えはジャンプのついでにはできる(奇数アドレスに飛ぶ!)けどサブルーチンコールではできなかった。

2015-04-23 12:24:46
ウチューじん・ささき @uchujin17

これも後のARM9Eでは改良されるんだけど、しばらくの間はインターワーク(Interwork)と称するARM<=>THUMB間の中継を司るジャンプテーブルを使わなければならなかった。でも16bit固定長命令によるコスト削減効果はコードの汚さを上回って普及したのだ。

2015-04-23 12:26:11
ウチューじん・ささき @uchujin17

THUMBモードでコンパイルすると1命令あたりの占有メモリは半分になるけど1命令あたりの機能も減るので、占有メモリ量は32bit ARMコードとそんなに変わらない。しかし価格削減のためメモリバスを16bit幅にしたシステム上では実効MIPS数が2倍弱になる。

2015-04-23 12:28:32
ウチューじん・ささき @uchujin17

これは特に命令キャッシュを持たないARM7Tにおいて決定的な性能差となった。ちょうどそれまで組み込みシステムに多用されていた16bitの8051が性能限界に直面していたため、ARM7Tは安くて速くて旨い牛丼的なプロセッサとして普及した。

2015-04-23 12:31:04
ウチューじん・ささき @uchujin17

ARMは回路規模が小さく論理回路としてのソフト売り(IP売り)でも他のアーキテクチャより先行し、特に台湾系ファブレスLSIメーカーによるASSP SoCのコアとして重宝された。

2015-04-23 12:32:59
ウチューじん・ささき @uchujin17

@pepepepePekoe ARM6は3DOとApple Newtonで華麗なデビューを飾って大ゴケしました(笑)。でも組み込み制御用のARM7TDMIになって隙間風的に普及し、気が付いたらx86に並ぶ2大アーキテクチャを張るようになっていました。

2015-04-23 12:34:22
ウチューじん・ささき @uchujin17

スマートフォンの祖先であるPDAはApple NewtonがコケたあとにPalmPilotが一世を風靡した。PalmのCPUはモトローラ(Freescale)のColdFire、68000の簡略型。

2015-04-23 12:36:10
ウチューじん・ささき @uchujin17

ColdFireも一時期は流行し、ColdFire上でLinuxを動かすためにuC-Linuxなんてプロジェクトができたりもした。でも長続きはせず、Palm社はTungstenと称する次世代PalmにARM(TI OMAP)を採用した。

2015-04-23 12:38:41
ウチューじん・ささき @uchujin17

Freescaleはだいぶ長いことColdFire/DragonBallのサポートを続けてきたけれど、長いものには巻かれろ式にi.MXシリーズでARM陣営になびき、後にはKinetisシリーズでARM-Cortexも採用した。

2015-04-23 12:42:37
ウチューじん・ささき @uchujin17

ARM以外のRISCアーキテクチャはHP PA-RISCの血を引くintel ItaniumとMIPSが細々と生き残っている程度かなぁ。SPARCは富士通の「京」スーパーコンピューターで花道を飾ったけど、商用プロセッサとしては後が無い。

2015-04-23 12:48:15
ウチューじん・ささき @uchujin17

PowerPCはとうの昔にAppleから見捨てられ、PlayStationのCellで脚光を浴びたけれども長続きしなかった。PS4はAmdのx86に日和ったんだね。

2015-04-23 12:49:23
ウチューじん・ささき @uchujin17

ARM CortexはApple(Aシリーズ)・Qualcomm(Snapdragon)の2大巨頭とインド・中国で猛威を振るうMediatekのコアなので携帯系では無敵に強い。

2015-04-23 12:54:29
ウチューじん・ささき @uchujin17

intelもMIPSもGoogleにかけあってAndroidのx86/MIPSサポートを公約させたけど、ほとんど「言ってみただけ」に近い。ノウハウとライブラリと対応チップの充実したARM Cortexをわざわざ捨ててintelやMIPSを採用する物好きは多くない。

2015-04-23 12:55:26
ウチューじん・ささき @uchujin17

とはいえ、かつて無敵を誇ったintel x86+Microsoft Windowsん「Wintel連合」が斜陽を迎えているように、ARM Cortexの天下も未来永劫続くわけはないんだけどね(´・Д・`)

2015-04-23 12:57:28