読者です 読者をやめる 読者になる 読者になる

高水準命令と割込み

RISC 教をあざわらうかのように、これでもか、という感じの命令が AVX で追加されているわけですが、そういった複雑な命令について
TRON チップに、memcpy のような操作を 1 命令で実行する命令があることから「そんな命令があるのにリアルタイム性があるわけがない」といった非難を目にすることがあるわけですが、そういった命令でもうまく仕様を決めれば不可分でなくすることができる、という話
ハンドブックに「実行中に外部割込みを受け付けたときには、レジスタの内容が処理が完了した点まで更新されます。」とあるわけですが、その実装を考えてみます
SMOV 命令を例に説明します。SMOV 命令は暗黙のレジスタオペランド R0 R1 R2 R3 と、オプション /F /B /ee を取ります
意味は、C の標準関数 memcpy で説明すると memcpy(R1, R0, R2) の意味になります。オプションは転送方向のインクリメント/デクリメント、文字列終端のゼロの検出で中断するかどうか、といった設定になりますが、ここではオプションについては省略します
プロセッサの動作をプログラミング言語風に記述してみます

memcpy r1 r0 r2
  if r2 == 0 then return fi

  *r1 = *r0
  ++r1; ++r0; --r2
  # ここで割込みを受け付けることができる
  memcpy r1 r0 r2

普通 memcpy はループで書くわけですが、再帰で書いてみました。このような動作であれば、割込みを受け付けて動作を中断したとしても、実行中のアドレスを保存しておけば、そこに戻るだけで再開できるわけです