第二部 トロン仕様チップ命令詳細第四章 算術演算命令
DIVX
算術演算命令 <<L1R>>,<<L1>>,<<L2>>

【ニモニックとオペランド】

DIVX src, dest, ext

【機能】

Divide unsigned with extended precision
多倍長符号なし除算

【オプション】

なし

【命令フォーマットと表記法】

【解説】

 上位32ビットがextに、下位32ビットがdestに保持されている値(被除数)をsrcに保持されている値(除数)で除算します。商はdestに、剰余はextに格納されます。
 演算は符号なしで行われます。srcdest、extのサイズは32ビットに固定です。
 destとextに同じレジスタを指定すると、dest値(商)が設定されます。
 DIVX命令は被除数が多倍長の場合には使用できますが、除数が多倍長の場合には使用できません。この場合には、シフトや減算を繰り返して除算を行わなければなりません。それには多倍長のシフト演算が必要となります。これを実現するためには、X_flagを通してローテートするシフト命令(SHXRSHXL)を使用します。
 ADDXSUBXとは違い、MULXDIVXでは、dest = 0のときZ_flagは、命令実行前のZ_flagの値を累積しません。
 オーバフローが発生しても、destは変化しません。
 src = 0のときには、ゼロ除算トラップ (ZDT)が発生しますが、destとextの値は変化しません。

【フラグ変化】



(1) (2)、(3)以外の除算
(2) オーバーフローが発生した場合
(2) ゼロ除算

【発生EIT】

RIE  src [Gen/ru], dest [Gen/mu]のアドレッシングモード違反
RIE s = 1
ZDT src = 0
 

【使用例】



 フレームポインタ(FP,R14)の値を16ビット長の数値−D'12に加算し、その結果を4バイトのメモリ参照のアドレスとして使用します。汎用レジスタR1とR0を連結して得られた64ビットの値(被除数)をメモリ参照で得られた値(除数)で除算します。商はR0に、剰余はR1に格納されます。