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

アクセスカウンタ

zoom RSS キャリーフラグについて調査

<<   作成日時 : 2011/11/30 03:31   >>

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

 マイクロプロセッサで扱うデータ幅が8→16→32→64bit、と増えてきたのでキャリーフラグの扱いについて調べてみた。

 キャリーフラグとは符号なし加算命令で桁あふれが生じた時に立つフラグであり、この桁あふれ分を上位桁に渡すことによりレジスタ幅を超えた桁の扱いが可能となる。

例:A2:A1で表現される値とB2:B1で表現される値を加算した結果をD2:D1に保存する
ADD A1,B1,D1 # D1=A1+B1、桁上がりが発生した場合C=1
ADDC A2,B2,D2 # D2=A2+B2+C

 減算の場合はボローと呼ぶ。おなじキャリーフラグが使われる。

例:A2:A1で表現される値からB2:B1で表現される値を減算した結果をD2:D1に保存する
SUB A1,B1,D1 # D1=A1-B1、桁借りが発生した場合C=1
SUBC A2,B2,D2 # D2=A2-B2-C

 キャリーフラグは加算器内部の桁上がりで使われるので、キャリーの状態を得るためのハードウェア上のコストはほとんどかからない。

 大抵のマイクロプロセッサではCCR(ConditionCodeRegister)に演算後のゼロ(Z)、マイナス(N)、オーバーフロー(V)、キャリー(C)等の状態が保存される。先程のADDC/SUBC命令はこのCCRを参照する。
が、どうもCCRがなさそうなプロセッサがあったなあと思って調べてみた。32bitアーキのMIPS IではCCRがない。符号なし加算/減算の結果と元の値を比較することによりキャリー/ボローの発生を汎用レジスタに1 or 0でセットする。
64bitアーキのAlphaでも同様でキャリーフラグはない。64bitでVLIWのIA-64もない。

 実装が簡単なのになぜ省かれているのか?考えてみた。
 CCRが存在すると、CCRに関する依存関係が発生する。これはパイプラインで実行するときに都合が悪い。CCR書き込みが発生する複数の演算命令が混在するとき、CCRへの書き込みが完了するまでそれを参照する命令が待ち合わせることになる。
が、MIPS等は汎用レジスタをCCRの代わりにすることにより、依存関係を解消できる。その代わり汎用レジスタを1つ消費するが、31個もあるので問題ない。
また、扱えるサイズが32bit(Alpha/IA-64は64bit)もあるのでほとんどの場合桁あふれなど考えなくても充分と判断したのだろう。
 ついでながら、キャリーフラグは加減算以外では遊んでるので、シフト命令ではみ出したビットを保存したりと別の用途で使われることがある。

おまけ:符号なし加減算でキャリー/ボローを判断するには
加算の場合 A+B=Dで、D<AまたはD<Bのときキャリー発生
減算の場合 A-B=Dで、A<Bの場合ボロー発生

参考資料:
MIPS IV Instruction Set
64ビットRISC Alpha AXPアーキテクチャ概要【AA】

追記:
 最近のCCRを持つプロセッサは内部でCCRの複製を持ち依存関係をなくしているはず(レジスタリネーミングと似た扱い)。明示的にCCRを読み書きする命令があるときにはパイプラインをフラッシュし、直前のCCRの状態を確定してからアクセスする。

テーマ

注目テーマ 一覧


月別リンク

ブログ気持玉

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

トラックバック(1件)

タイトル (本文) ブログ名/日時
ボロー(桁借り)の扱い
 キャリーフラグについて調査の続き。 ...続きを見る
竹下世界塔の計算機よもやま話
2014/04/12 00:21

トラックバック用URL help


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

タイトル
本 文

コメント(0件)

内 容 ニックネーム/日時

コメントする help

ニックネーム
本 文




キャリーフラグについて調査 竹下世界塔の計算機よもやま話/BIGLOBEウェブリブログ
文字サイズ:       閉じる