竹下世界塔の計算機よもやま話

アクセスカウンタ

zoom RSS ぼくのかんがえたさいきょうCPU ALU 算術演算 論理演算

<<   作成日時 : 2015/11/07 00:59   >>

ブログ気持玉 0 / トラックバック 0 / コメント 0

追記:符号なし飽和演算

画像


 算術演算・論理演算を行うALUについて考える。RISCではレジスタを入力とし出力はレジスタに書かれるが、これは機械語命令になる前の動作について検討する。具体的な命令にするときには取捨選択してよい。

Ra: 入力1
Rb: 入力2 (即値の場合もある)
Rc: 演算の種類を設定する
Rd: 出力
Re: 拡張出力
Rf: 演算結果のフラグ

Ra,Rb,Rd,Reは任意のbit幅ですべて同じ。ここではMAXLENとする。
Rc,Rfはそれぞれ必要な分のbit幅。

以下、Rcで指定する演算について。

・算術演算(10種)
 算術演算は符号なし整数または2の補数を扱う。

ADD 加算
Ra + Rb → Rd
Re : バイト単位でのオーバーフローフラグ
Rf : NZVC

SUB 減算
Ra - Rb → Rd
Re : バイト単位でのオーバーフローフラグ
Rf : NZVC

SADDS 符号付き飽和演算
※飽和する位置の指定ができるようにする→命令フォーマットに含める
Ra + Rb → Rd
Re : オーバーフロー発生時 -1(all 1) その他 0
オーバーフロー発生時 011…11(正の最大値) → Rd
Rf : NZVC

SSUBS 符号付き飽和演算
※飽和する位置の指定ができるようにする→命令フォーマットに含める
Ra - Rb → Rd
Re : オーバーフロー発生時 -1(all 1) その他 0
オーバーフロー発生時 100…00(負の最大値) → Rd
Rf : NZVC

SADDU 符号なし飽和演算
※飽和する位置の指定ができるようにする→命令フォーマットに含める
Ra + Rb → Rd
Re : オーバーフロー発生時 -1(all 1) その他 0
オーバーフロー発生時 111…11(正の最大値) → Rd
Rf : NZVC

SSUBU 符号なし飽和演算
※飽和する位置の指定ができるようにする→命令フォーマットに含める
Ra - Rb → Rd
Re : オーバーフロー発生時 -1(all 1) その他 0
オーバーフロー発生時 0 → Rd
Rf : NZVC


※補足
・バイト単位でのオーバーフロー
LSB側から8,16,24,32,...のbit長同士で演算したとみなしてそれぞれのbit幅に対応するオーバーフローの発生の有無をしめす
・NZVC 演算結果のフラグ。Negative,Zero,oVerflow,Carry(Borrow)に対応。
・加減算のReについては、10進補正を設定することもできる。

・Shift and ADD命令 スケール演算で便利だが、LEA命令があればアドレス計算の方でできるだろう。


MULU 符号なし乗算
Ra × Rb → Re:Rc
Rf : 0Z0C
 C…Reが0でなければ1
 Z…Re:Rcが0のとき1

MUL 符号付き乗算
Ra × Rb → Re:Rc
Rf : NZVC
 V…負の最大値×負の最大値のとき1 演算結果 Re:Rcは0
 Z…Re:Rcが0のとき1
 N…Re:Rcの符号(Reの最上位ビット)
 C…Reがall 0またはall 1(Re=-1)でなければ1

DIVU 符号なし除算
Ra ÷ Rb → Rc
Ra mod Rb → Re
Rf : 0ZV0
 V…Rb=0のとき1 Rcはall 0

DIV 符号付き除算
Ra ÷ Rb → Rc
Ra mod Rb → Re
Rf : 0ZV0
 V…Rb=0のとき1 Rcはall 0 / 負の最大値を-1で割った時 1 Rcは all 1
Reは符号付き演算のときの剰余となるので定義しておく。(C言語 or FORTRAN流?)


・論理演算 (16種)
Rcで指定する16種類の論理演算。4種の基本論理演算に対し、Rbの反転と演算結果の反転を組み合わせる。

0000 AND Ra and Rb → Rc
0001 OR Ra or Rb → Rc
0010 XOR Ra xor Rb → Rc
0011 SELa Ra → Rc

0100 ANDN Ra and ~Rb → Rc
0101 ORN Ra or ~Rb → Rc
0110 All0 0…0 → Rc
0111 SELb Rb → Rc

1000 NAND ~(Ra and Rb) → Rc
1001 NOR ~(Ra or Rb) → Rc
1010 XNOR ~(Ra xor Rb) → Rc
1011 ~SELa ~Ra → Rc

1100 NANDN ~(Ra and ~Rb) → Rc
1101 NORN ~(Ra or ~Rb) → Rc
1110 All1 1…1 → Rc
1111 ~SELb ~Rb → Rc

これらの指定のうち、All0,All1,SELa,SELb,~SELa,~SELbについてはRbに即値0が指定できれば他の演算の組み合わせでも可能。

ReはRcの反転出力。
Rf : NZ00 符号とゼロ。

***シフト/ローテートにつづく***

テーマ

注目テーマ 一覧


月別リンク

ブログ気持玉

クリックして気持ちを伝えよう!
ログインしてクリックすれば、自分のブログへのリンクが付きます。
→ログインへ

トラックバック(0件)

タイトル (本文) ブログ名/日時

トラックバック用URL help


自分のブログにトラックバック記事作成(会員用) help

タイトル
本 文

コメント(0件)

内 容 ニックネーム/日時

コメントする help

ニックネーム
本 文




ぼくのかんがえたさいきょうCPU ALU 算術演算 論理演算 竹下世界塔の計算機よもやま話/BIGLOBEウェブリブログ
文字サイズ:       閉じる