命令セットアーキテクチャを考える5 (load/store系命令)
いよいよ命令の定義です。いくつかに分けて定義していきます。
まずはload/store系の命令から。
[Load/Store系命令]:4命令
load [b|hw|w|dw] Rs[+],{Rt|=offset},Rd
・RsとRtから計算したアドレスからbyte/half-word(2byte)/word(4byte)/double-word(8byte)のデータを読み込み、Rdの下位ビットに格納する。余った上位ビットは変更されない。
・condition code registerの内容は変化しない。
・offset付き命令の場合、Rtの代わりにoffset(10bit)を指定できる。offsetは符号付き2進数として扱われ、必要に応じて符号拡張が行われる。
・load/store/branch/jump命令におけるアドレス計算の場合では、offsetは4倍して計算される。byte/half/word/doubleによらず常に4倍される。
・アセンブラ言語ソースプログラムではアドレスオフセット値をそのまま記述する。アセンブラがoffset値を1/4する。
・increment modeの場合、load命令実行後にRsの値が1/2/4/8(byte/half-word/word/double-word)、fload命令実行後にRsの値が4/8/16(single/double/quad)増加する。Rt/offsetの値は変化しない。
・なお、decrement modeはない。
・アドレス計算後は、1/2/4/4バイト境界に合っている必要がある。合っていない場合の処理は、rounding mode registerの内容に従う。(double-wordの場合も4バイト境界で良い)
fload [sp|dp|qp] Rs[+],{Rt|=offset},FRd
・RsとRtから計算したアドレスから単精度(4byte)/倍精度(8byte)/4倍精度(16byte)のデータを読み込み、FRdの下位ビットに格納する。余った上位ビットは変更されない。
・4倍精度の場合、連続したふたつのFRに格納される。FRdのレジスタ番号は偶数でなくてはならない。
・increment modeの場合、fload命令実行後にRsの値が4/8/16(単精度/倍精度/4倍精度)増加する。Rt/offsetの値は変化しない。
・上記以外はload命令と同様である。
store [b|hw|w|dw] [-]Rs,{Rt|=offset},Rd
・Rdの下位ビットからbyte(1byte)/half-word(2byte)/word(4byte)/double-word(8byte)のデータを、RsとRtから計算したアドレスに格納する。
・decrement modeの場合、store命令ではRsの値から1/2/4/8(byte/half-word/word/double-word)、fstore命令ではRsの値から4/8/16(single/double/quad)減じてアドレス計算する。
・Rdがデータのコピー元であることに注意。
・上記以外はload命令と同様である。
fstore [sp|dp|qp] [-]Rs,{Rt|=offset},FRd
・FRdの下位ビットから単精度(4byte)/倍精度(8byte)のデータを、RsとRtから計算したアドレスに格納する。
・4倍精度モードの場合、連続したふたつのFRからデータを取り出して、メモリに格納する。FRdは偶数レジスタでなくてはならない。
・Rdがデータのコピー元であることに注意。
[擬似命令]
以下の擬似命令はアセンブラ言語プログラムに記述できるが、対応する個々のハードウェア命令は存在せず、アセンブラが別の命令語に置き換える。
dtfch Rs,Rt → load Rs,Rt,R0
・dtfch(data fetch)命令は、Rdとしてゼロレジスタを指定しているため実際にはデータを読み込まないので即時に完了するが、Rs,Rtで示されるアドレスを含むキャッシュラインをL1キャッシュに(もしなければ)読み込む処理が実行される(突き放し実行)。
・あらかじめメモリ上のデータをキャッシュに読み込みたい時に使用する。L1キャッシュの構成が命令キャッシュとデータキャッシュに分かれている場合、データキャッシュしかプリフェッチできない。
・命令キャッシュのプリフェッチには別の擬似命令を利用する。(別の記事に書く予定)
loadm [2|4|8|16] Rs[+],{Rt|=offset},Rd
storem [2|4|8|16] [-]Rs,{Rt|=offset},Rd
fldm [2|4|8|16] Rs[+],{Rt|=offset},FRd
fstm [2|4|8|16] [-]Rs,{Rt|=offset},FRd
・load/store/fload/fstore命令でロードまたはストアするレジスタ本数を指定する。(レジスタ内容は64bitすべてを使う)
・loadm/storem/fldm/fstm命令は、アセンブラで複数命令に展開される
・展開された命令中で、increment付きload/store命令を使用する。(終了時には元の値に戻っている)そのため、Rdから連続で指定されるレジスタ群が、Rs,Rtと重複する場合には予期しない結果となるため注意する必要がある。
push [w|dw] Rs,Rd → store [w|dw] [-]Rs,Rd
pop [w|dw] Rs,,Rd → load [w|dw] Rs[+],R0,Rd
# loadはincrementモード、storeはdecrementモードに変更した。
# あわせて、疑似命令としてpush/pop命令を追加した。(2018/04/17)
# push/pop疑似命令から、アドレス境界例外発生を防止するため、byte/half wordモードを削除した。(2018/04/21)
# decrementモードの記述方法をレジスタ記号の前にマイナス記号を付けるように変更した。(2018/04/21)
| 固定リンク
この記事へのコメントは終了しました。


コメント