"ARMv8 Instruction Set Overview"を見てメモ書き。

"ARMv8 Instruction Set Overview"のドキュメントはARMのサイトからダウンロードできます。ただし登録必要。 http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0406c/index.html
2
koba @tetsu_koba

"ARM Architecture Reference Manual ARMv7-A and ARMv7-R edition" 通称ARM ARM を見てる。ダウンロードするのに登録が必要。

2012-04-08 15:09:23
koba @tetsu_koba

23 November 2011のARM ARM issue CからThumbEE instruction setがdeprecatedになってる。なんでだろう?もしかしてARMv8では削除されているのかな。

2012-04-08 15:16:06
koba @tetsu_koba

ThumbEEモードではJavaのJITコンパイラが生成するのに便利な命令が使える。ロードするだけで自動でNullチェックするとか、配列indexの範囲チェックを一命令でおこなえるとか。DalvikVMのJITではまだ使ってなかった。

2012-04-08 15:19:12
koba @tetsu_koba

"ARMv8 Instruction Set Overview"もダウンロードして見てる。32bitモードのThumbEE に関しては言及無し。でも..

2012-04-08 15:48:23
koba @tetsu_koba

ARMv8の32bitモードではIT命令の使用が特定のパターン以外はdeprecatedになってる。要するに、IT命令とその次の一個のThumb命令でCPUからひとつの条件付き32bit命令として扱えるパターン以外はダメらしい。CPUの気持ちになればそうかもね。

2012-04-08 15:54:27
koba @tetsu_koba

CPUの命令セットのドキュメントを見るときは、そのCPUのエミュレータを作る気持ちで読むといいと思うんだ。

2012-04-08 16:03:55
koba @tetsu_koba

ARMv8の64bit命令。条件付きで実行できる命令が減っている。ARM命令のように全てのopcodeに条件bitの領域をとるのは無駄。効果のあるものだけ条件bitをつける。なるほど、これが32bitモードでのIT命令のdeprecateに関連するのね。

2012-04-08 16:24:03
koba @tetsu_koba

ARMv8が面白いので、もう少し見ていこう。

2012-04-08 16:35:47
Gary Wang @garywang

@tetsu_koba ARMv8の64bit命令。条件付きで実行できる命令が減っている。ARM命令のように全てのopcodeに条件bitの領域をとるのは無駄。効果のあるものだけ条件bitをつける。なるほど、これが32bitモードでのIT命令のdeprecateに関連するのね。

2012-04-08 16:36:14
koba @tetsu_koba

"ARMv8 ISA Overview"では32bitのARM命令はA32, 16/32bit混合のThumb2命令はT32と呼ばれている。ThumbEEについては何も書かれていない。あっさりと削除というのもあり得るな。実装が複雑で遅くなるのに世の中で使われている形跡がないから。

2012-04-08 16:57:39
koba @tetsu_koba

日が暮れる前に一回りジョギングしてきた。公園の桜は満開だった。河原の桜はまだこれから。

2012-04-08 18:26:48
koba @tetsu_koba

さて、 "ARMv8 Instruction Set Overview" を頭から見ていくか。

2012-04-08 20:06:28
koba @tetsu_koba

これはまだOverviewで、各命令のビットパターンまでは書いてない。まだ最終決定はしていないのかも。

2012-04-08 20:08:23
koba @tetsu_koba

AArch64: ARMv8での64bitの実行状態。 AArch32: ARMv8での32bitの実行状態。ほぼARMv7互換。追加されてる命令がある。

2012-04-08 20:12:09
koba @tetsu_koba

A64: AArch64状態で利用可能な命令セット。A32: 32bitのARM命令セット。T32: 16/32bit混合のThumb2命令セット。

2012-04-08 20:16:10
koba @tetsu_koba

A64 overview: A clean, fixed length instruction set. 32bit固定長。"clean" Thumb2の時は隙間に無理矢理詰め込んだから、すごく不規則なビットパターンだった。逆アセンブラを作るのは大変だった。A64はすっきり。

2012-04-08 20:22:04
koba @tetsu_koba

これは、AArch64モードとAArch32モードではデコーダが完全に切り替わるということだね。逆アセンブラを作ろうとしたら、まずどっちのモードが確認しなきゃ。

2012-04-08 20:24:24
koba @tetsu_koba

31個の64bitの汎用レジスタ。(0-30) 5bitのフィールドで表現され、31は特殊用途に使用する。

2012-04-08 20:29:39
koba @tetsu_koba

レジスタ31は大抵のケースでゼロレジスタとして機能する。読んだらゼロ。書いたら捨てられる。

2012-04-08 20:31:35
koba @tetsu_koba

load/storeのベースレジスタとしてレジスタ31が使われた場合と、一部の算術演算命令でレジスタ31はcurrent stack pointerを参照する。

2012-04-08 20:33:13
koba @tetsu_koba

MIPSにもゼロレジスタがあったけど、確かR0だったよね。A64だと31。でもアセンブラ表記では普通に#0と書けばいいんだろうね。

2012-04-08 20:35:14
koba @tetsu_koba

PC(Program Counter)は汎用レジスタに含まれない。PC相対のアドレッシングモードがあるので、これを使ってPCの値は取得できる。PCへの書き込みはジャンプ命令使え。

2012-04-08 20:38:58
koba @tetsu_koba

ARM命令だとR15がPCで、R15にmovするとブランチした。R15にaddすることでswitch文をシンプルに実装したりとか。Thumb2ではR15への書き込みはunpredictableだったはず。

2012-04-08 20:41:40
koba @tetsu_koba

パイプラインが深くなる今時のCPUの実装を考えたら、任意の時点でPCをレジスタとして読み書きを許すのはきついね。どの時点でPCの値がどうなっているかを全部仕様で明らかにしなきゃならない。それを守ることが実装の足かせになる。

2012-04-08 20:43:54