"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

スタックポインタは31個の汎用レジスタの中に含まれているのか?

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

The procedure call link register (LR) はレジスタ30。

2012-04-08 20:48:55
koba @tetsu_koba

LDM, STM, PUSH, POPのような複数のレジスタをロードストアする命令は無い。ただし連続しないレジスタペアのロードスストアは可能。-> 2つまとめてならできるということか。

2012-04-08 20:55:30
koba @tetsu_koba

ほとんどのロードストアでUnaligned addresses可能。 レジスタペアやfloat, SIMDレジスタを含む。

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

exclusive and ordered accessesのロードストアはalinged adressのみ。

2012-04-08 20:59:03
koba @tetsu_koba

条件付きの命令は減った。条件付きブランチとhandful of data processing命令のみ。Thumb2のIT命令に相当するものは無い。

2012-04-08 21:02:25
koba @tetsu_koba

ARM命令のアドレシングモードにあったrotated 8-bit immediate はもっとわかりやすいものに置き換えられた。:)

2012-04-08 21:05:35
koba @tetsu_koba

CPSRをひとつのレジスタとしてアクセスする命令はなくなった。その代わりそれぞれのプロセッサ状態を更新する新しいシステム命令が導入された。

2012-04-08 21:09:12
おっさん @kmt_t

@tetsu_koba さん、条件付命令なくなったと聞いてたんですが残ってるんですか。分岐命令は当たり前として最悪move命令だけでも条件付実行できればなんとかなりそうですけど。

2012-04-08 21:10:52
koba @tetsu_koba

“coprocessor”という概念は削除された。--> ARMv7まではMMUやTLB, Cacheなどはコプロセッサに対する操作だった。

2012-04-08 21:11:23
koba @tetsu_koba

@kmt_t そんな感じ。パイプラインの乱れを防ぐのに有用なものは残っているんじゃないかな。

2012-04-08 21:13:49
koba @tetsu_koba

A64のほとんどの整数命令は32bit演算と64bit演算の2つの形式を持つ。

2012-04-08 21:18:20
koba @tetsu_koba

32bit演算の場合: ソースレジスタの上位32bitは無視される。デスティネーションレジスタの上位32bitはゼロクリアされる。コンディションbitは下位32bitの結果を反映する。

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

AArch64のメモリ変換システムは49bitの仮想アドレスをサポートする。(変換テーブルあたり48bit) --> ?? 残りの1bitは?

2012-04-08 21:24:32
koba @tetsu_koba

仮想アドレスは49bitから符号拡張されて64bitポインタに格納される。オプションとして64bitの中の上位8bitはタグとして扱うことを選択できる。ロードストア命令と間接ブランチ命令では無視される。

2012-04-08 21:31:41
koba @tetsu_koba

49bitの仮想アドレスの最上位ビットはカーネル空間とユーザー空間の区別に使うと便利なのかな?

2012-04-08 21:32:57
koba @tetsu_koba

符号付き/無し/32bit/64bitの割り算命令がある。剰余算は無い。“divide by zero”に対するハードウェアのチェックは無い。しかし長いレイテンシの後で0割りの結果は0が書き込まれる。--> 例外は発生しないということかな。

2012-04-08 21:44:27
koba @tetsu_koba

全ての浮動小数点のmultiply-addとmultiply-subtract命令は“fused”(飽和演算)

2012-04-08 21:51:14
koba @tetsu_koba

アセンブラ表記。整数演算でレジスタをWnと書くと32bit演算、Xnと書くと64bit演算。(0<=n<31)

2012-04-08 21:54:24
tnak @_tnak_

@tetsu_koba FMA/FMSのFって丸めを1回しか行わないって意味らしいですよ

2012-04-08 21:57:48
koba @tetsu_koba

ゼロレジスタとしてのレジスタ31の表記。32bit: WZR, 64bit: XZR。スタックポインタとしてのレジスタ31の表記。32bit: WSP, 64bit: SP。W31やX31は無い。

2012-04-08 22:01:10
koba @tetsu_koba

これだとスタックポインタは汎用レジスタじゃないようだ。スタックポインタに初期値をセットするための特殊命令があるのかな?

2012-04-08 22:03:27
koba @tetsu_koba

レジスタの無条件ブランチで、BR XmとRET {Xm}が区別されている。CPUにサブルーチンからの戻りかどうかのヒントを付ける。分岐予測のためのものかな。RETはレジスタ省略するとX30が使われる。

2012-04-08 22:15:00
koba @tetsu_koba

オフセットを加算する前のスタックポインタの値は16byteアラインでなければならない。そうでないとstack alignment exception が生成される。

2012-04-08 22:19:26
koba @tetsu_koba

LDNP, STNP: Load-Store Non-temporal Pair 2つのレジスタのロードストアを"non-temporal”のヒント付きで行う。このあと再び同じところをアクセスする可能性は低いという意味。キャッシュシステムはこのヒントで処理を変える。

2012-04-08 22:26:54