ASTAT

ASTAT( Arithmetic Status )はALU/MAC/シフターで行った演算の結果がどのような性質であったかを保存します。ASTATの値はもっぱら条件実行文が参照します。

高級言語からこのレジスタにアクセスすることはまずありません。

レジスタの構造

レジスタは9ビット長です。転送命令で16ビットレジスタに格納するときには右詰になります。リセット後の初期値は0です。

ASTATの構造

図1 レジスタの構造

以下にビット変化の概略を説明します。詳細については必ずISRとHRを参照してください。

AZ : ALU Zero
  • 1のとき、直前のALU演算結果が0であったことをあらわします
  • 0のとき、結果は非0でした
AN : ALU Negative
  • 1のとき、直前のALU演算結果が負であったことをあらわします
  • 0のとき、結果は非負でした
AV : ALU Overflow
  • 1のとき、直前のALU演算結果があふれたことを示あらわします。
  • 0のとき、結果はあふれませんでした。ただしENA AV_LATCH命令を実行すると、あふれが無いときにもAVが0に戻らなくなります。
AC : ALU Carry
  • 1のとき、加算命令の結果が桁上げを起こしたか、減算命令が桁下げを起こさなかったことをあらわします
  • 0のとき、加算命令の結果が桁上げを起こさなかったか、減算命令が桁下げを起こしたことをあらわします
AS : ALU Input Sign
  • 1のとき、絶対値命令で入力オペランドの値が負だったことをあらわします。
  • 0のとき、入力オペランドの値は正でした。
AQ : ALU Quotient
  • 除算命令が使います。符号無し除算を実行するときにはあらかじめ0に初期化します。
MV : Multiplier Overflow
  • 1のとき、直前のMAC命令でMRレジスタがあふれたことをあらわします。
  • 0のとき、あふれなかったことをあらわします。
SS : Shifter Input Sign
  • 拡張精度シフト命令で使用します。
SV : Shifter Overflow
  • 1のとき、直前のMAC命令でSRレジスタがあふれたことをあらわします。
  • 0のとき、あふれなかったことをあらわします。

API

C/C++言語用に以下のインターフェースが用意されています。宣言はsysreg.hで行われています。

// #include <sysreg.h>

sysreg_write(sysreg_ASTAT, 値)     // 値をASTATに代入します
変数 = sysreg_read(sysreg_ASTAT)   // ASTATの値を取得します

sysreg_bit_clr(sysreg_ASTAT, MASK) // MASKの"1"と対応するASTATのビットを1にします。
sysreg_bit_set(sysreg_ASTAT, MASK) // MASKの"1"と対応するASTATのビットを0にします。
sysreg_bit_tgl(sysreg_ASTAT, MASK) // MASKの"1"と対応するASTATのビットを反転します。

ビットマスクはdef219x.hで定義されています。以下にその部分を引用します。

// #include <def219x.h>

// Bit Positions
#define ASTAT_AZ_P     0                       // Bit  0: ALU result zero
#define ASTAT_AN_P     1                       // Bit  1: ALU result negative   
#define ASTAT_AV_P     2                       // Bit  2: ALU overflow   
#define ASTAT_AC_P     3                       // Bit  3: ALU carry   
#define ASTAT_AS_P     4                       // Bit  4: ALU X input sign (ABS ops)   
#define ASTAT_AQ_P     5                       // Bit  5: ALU quotient (DIV ops)   
#define ASTAT_MV_P     6                       // Bit  6: Multiplier overflow   
#define ASTAT_SS_P     7                       // Bit  7: Shifter input sign   
#define ASTAT_SV_P     8                       // Bit  8: Shifter overflow   

// Bit Masks
#define ASTAT_AZ       MK_BMSK_(ASTAT_AZ_P)    // ALU result zero
#define ASTAT_AN       MK_BMSK_(ASTAT_AN_P)    // ALU result negative   
#define ASTAT_AV       MK_BMSK_(ASTAT_AV_P)    // ALU overflow   
#define ASTAT_AC       MK_BMSK_(ASTAT_AC_P)    // ALU carry   
#define ASTAT_AS       MK_BMSK_(ASTAT_AS_P)    // ALU X input sign (ABS ops)   
#define ASTAT_AQ       MK_BMSK_(ASTAT_AQ_P)    // ALU quotient (DIV ops)   
#define ASTAT_MV       MK_BMSK_(ASTAT_MV_P)    // Multiplier overflow   
#define ASTAT_SS       MK_BMSK_(ASTAT_SS_P)    // Shifter input sign   
#define ASTAT_SV       MK_BMSK_(ASTAT_SV_P)    // Shifter overflow   

レイテンシ

ASTATのレイテンシは以下のとおりです。

命令 ASTAT=value; POP STS;
レイテンシ 2 1

レイテンシが1のとき、直後の命令からその値を使うことができます。レイテンシが2以上のとき、直後の命令でその値を参照しようとすると、古い値を参照します。なお、この表のレイテンシの数え方はHRとは異なっています。

このレジスタにはインターロック機構はついていません。

参照情報

項目 マニュアルのページ等
ビット割り当て HR A-9
ALU命令に対するASTAT変化の一覧表 HR 2-19
MAC命令に対するASTAT変化の一覧表 HR 2-32
シフター命令に対するASTAT変化の一覧表 HR 2-49
ロードレイテンシ HR A-5
2191空挺団 | プログラム | EZ-KIT | こぼれ話 | アーキテクチャー | 命令 | レジスタ | DSP掲示板 | FAQ |