SH-2A、SH2A-FPU
3.7 命令による例外 .1 命令による例外の種類
例外処理を起動する命令には、表
3.8
に示すように、トラップ命令、スロット不当命令、一般不当 命令、整数除算例外、FPU例外があります。表
3.8 命令による例外の種類
種類 要因となる命令 備考
トラップ命令 TRAPA
スロット不当命令 遅延分岐命令直後(遅延スロット)に配置さ れた未定義コード(含FPUモジュールスタ ンバイ時もしくはFPU非搭載品における FPU命令およびFPUに関するCPU命令お よびレジスタバンク非搭載品のレジスタバ ンク関連命令)、PCを書き換える命令、32 ビット命令、RESBANK命令、DIVS命令ま たはDIVU命令
遅延分岐命令 : JMP、JSR、BRA、BSR、
RTS、RTE、BF/S、BT/S、BSRF、BRAF レジスタバンク関連命令: RESBANK、
LDBANK、STBANK
PCを書き換える命令 : JMP、JSR、BRA、
BSR、RTS、RTE、BT、BF、TRAPA、
BF/S、BT/S、BSRF、BRAF、JSR/N、RTV/N 32ビット命令 : BAND.B、BANDNOT.B、
BCLR.B、BLD.B、BLDNOT.B、BOR.B、
BORNOT.B、BSET.B、BST.B、BXOR.B、
FMOV.S@disp12、FMOV.D@disp12、
MOV.B@disp12、MOV.W@disp12、
MOV.L@disp12、MOVI20、MOVI20S、
MOVU.B、MOVU.W
3.
例外処理Rev.4.00 2011.02.22 3-10 R01US0031JJ0400
SH-2A、SH2A-FPU
種類 要因となる命令 備考
一般不当命令 遅延スロット以外にある未定義コード(含 FPUモジュールスタンバイ時もしくはFPU 非搭載品におけるFPU命令およびFPUに関 するCPU命令およびレジスタバンク非搭載 品のレジスタバンク関連命令)
ゼロ除算 DIVU、DIVS 整数除算例外
負の最大値÷(-1) DIVS FPU例外 IEEE754規格で定義された無効演算例外ま
たはゼロによる除算例外を引き起こす命 令、オーバフロー、アンダフローおよび不正 確例外を引き起こす可能性のある命令
FADD、FSUB、FMUL、FDIV、FMAC、
FCMP/EQ、FCMP/GT、FLOAT、FTRC、
FCNVDS、FCNVSD、FSQRT
3.7.2 トラップ命令
TRAPA
命令を実行すると、トラップ命令例外処理が開始されます。このとき、CPU
は次のように動作します。
(
1
)TRAPA
命令で指定したベクタ番号に対応する例外サービスルーチン開始アドレスを、例外処理ベクタテーブルから取り出します。
(
2
) ステータスレジスタ(SR
)をスタックに退避します。(
3
) プログラムカウンタ(PC
)をスタックに退避します。退避するPC
の値は、TRAPA
命令で次 命令の先頭アドレスです。(
4
) 例外処理ベクタテーブルから取り出したアドレスへジャンプして、プログラムの実行を開始 します。このときのジャンプは遅延分岐ではありません。3.7.3 スロット不当命令
遅延分岐命令の直後に配置された命令のことを「遅延スロットに配置された命令」とよびます。遅 延スロットに配置された命令が未定義コードのとき、この未定義コードがデコードされるとスロット 不当命令例外処理が開始されます。また、遅延スロットに配置された命令が
PC
を書き換える命令の ときも、このPC
を書き換える命令がデコードされるとスロット不当命令例外処理が開始されます。さらに、FPU非搭載製品および
FPU
搭載製品でFPU
をモジュールスタンバイ状態にしたときは、浮 動小数点命令およびFPU
に関するCPU
命令は未定義コードとして扱われ、遅延スロットに配置され た場合、この命令がデコードされるとスロット不当命令例外処理が開始されます。また、レジスタバンク非搭載品のレジスタバンク関連命令も未定義コードとして扱われ、遅延スロ ットに配置された場合、この命令がデコードされるとスロット不当命令例外処理が開始されます。
さらに、遅延スロットに配置された命令が
32
ビット命令、RESBANK
命令、DIVS
命令およびDIVU
命令のときも、この命令がデコードされるとスロット不当命令例外処理が開始されます。スロット不当命令例外処理のとき、CPUは次のように動作します。
(1) 例外サービスルーチン開始アドレスを例外処理ベクタテーブルから取り出します。
(2) ステータスレジスタ(SR)をスタックに退避します。
(3) プログラムカウンタ(PC)をスタックに退避します。退避するPCの値は、未定義コード、
PCを書き換える命令、32ビット命令、RESBANK命令、DIVS命令、またはDIVU命令の直前
にある遅延分岐命令の飛び先アドレスです。(4) 例外処理ベクタテーブルから取り出したアドレスへジャンプして、プログラムの実行を開始 します。このときのジャンプは遅延分岐ではありません。
3.
例外処理Rev.4.00 2011.02.22 3-11 R01US0031JJ0400 SH-2A、SH2A-FPU
3.7.4 一般不当命令
遅延分岐命令の直後(遅延スロット)以外に配置された未定義コードをデコードすると、一般不当 命令例外処理が開始されます。また、
FPU
非搭載製品およびFPU
搭載製品でFPU
をモジュールスタ ンバイ状態にしたときは、浮動小数点命令およびFPU
に関するCPU
命令は未定義コードとして扱わ れ、遅延分岐命令の直後(遅延スロット)以外に配置された場合、この命令がデコードされると一般 不当命令例外処理が開始されます。また、レジスタバンク非搭載品のレジスタバンク関連命令も未定義コードとして扱われ、遅延分岐 命令の直後(遅延スロット)以外に配置された場合、この命令がデコードされると一般不当命令例外 処理が開始されます。
一般不当命令例外処理時、
CPU
はスロット不当命令例外処理と同じ手順で動作します。ただし、退避する
PC
の値は、スロット不当命令例外処理と異なり、この未定義コードの先頭アドレスになり ます。3.7.5 整数除算例外
整数除算命令がゼロによる除算を実行した場合、または整数除算の結果がオーバフローしたとき、
整数除算例外が発生します。ゼロによる除算例外の要因となる命令は、DIVUと
DIVS
です。オーバ フロー例外の要因となる命令はDIVS
のみで、負の最大値を-1で除算する場合にのみ発生します。整 数除算例外が発生するとCPU
は次のように動作します。(1) 発生した整数除算例外に対応する例外サービスルーチン開始アドレスを、例外処理ベクタテ ーブルから取り出します。
(2) ステータスレジスタ(SR)をスタックに退避します。
(3) プログラムカウンタ(PC)をスタックに退避します。退避するPCの値は、例外を発生した整 数除算命令の先頭アドレスです。
(4) 例外処理ベクタテーブルから取り出したアドレスへジャンプして、プログラムの実行を開始 します。このときのジャンプは遅延分岐ではありません。
3.7.6 FPU 例外
浮動小数点ステータスレジスタ(
FPSCR
)のFPU
例外イネーブルフィールド(Enable
)中のV
、Z
、O
、U
またはI
ビットがセットされているとき、FPU
例外処理が発生します。これは浮動小数点演算命令が
IEEE754
規格で定義された無効演算例外、ゼロによる除算例外、オーバフロー(可能性のある命令)、アンダフロー(可能性のある命令)および不正確例外(可能性のある命令)を引き起こした ことを示します。
FPU
例外処理の発生要因となる浮動小数点演算命令には以下があります。FADD
、FSUB
、FMUL
、FDIV
、FMAC
、FCMP/EQ
、FCMP/GT
、FLOAT
、FTRC
、FCNVDS
、FCNVSD
、FSQRT
該当する
FPU
例外イネーブルビット(Enable
)がセットされているときのみ、FPU
例外処理が発 生します。FPU
が浮動小数点演算による例外要因を検出すると、FPU
の動作は中断されてCPU
にFPU
例外処理の発生を通知します。CPU
は例外処理を開始すると次のように動作します。(
1
) 発生したFPU
例外処理に対応する例外サービスルーチン開始アドレスを例外処理ベクタテー ブルから取り出します。(
2
) ステータスレジスタ(SR
)をスタックに退避します。(
3
) プログラムカウンタ(PC
)をスタックに退避します。退避するPC
の値は最後に実行した命令 の次の命令の先頭アドレスです。(
4
) 例外処理ベクタテーブルから取り出したアドレスへジャンプして、プログラムの実行を開始 します。このときのジャンプは遅延分岐ではありません。FPSCR
の例外フラグフィールド(Flag
)は、FPU
例外処理が受け付けられたか否かにかかわらず常3.
例外処理Rev.4.00 2011.02.22 3-12 R01US0031JJ0400
SH-2A、SH2A-FPU
に更新され、ユーザが明示的に命令でクリアするまでセットされたままです。
FPSCRの要因フィール
ド(Cause)は浮動小数点演算命令が実行されるごとに変化します。また、FPSCRレジスタのFPU例外イネーブルフィールド(Enable)中のVビットがセットされ、か つFPSCRのQISビットがセットされているとき、