| DIVX 算術演算命令 <<L1R>>,<<L1>>,<<L2>> |
【ニモニックとオペランド】
【機能】
Divide unsigned with extended precision
多倍長符号なし除算
【オプション】
なし
【命令フォーマットと表記法】
【解説】
上位32ビットがextに、下位32ビットがdestに保持されている値(被除数)をsrcに保持されている値(除数)で除算します。商はdestに、剰余はextに格納されます。
演算は符号なしで行われます。src、dest、extのサイズは32ビットに固定です。
destとextに同じレジスタを指定すると、dest値(商)が設定されます。
DIVX命令は被除数が多倍長の場合には使用できますが、除数が多倍長の場合には使用できません。この場合には、シフトや減算を繰り返して除算を行わなければなりません。それには多倍長のシフト演算が必要となります。これを実現するためには、X_flagを通してローテートするシフト命令(SHXRとSHXL)を使用します。
ADDXやSUBXとは違い、MULXとDIVXでは、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に格納されます。