CP_SetDivImm*

構文

#include <nitro/cp.h>

void CP_SetDivImm32_32( u32 numer, u32 denom );
void CP_SetDivImm64_32( u64 numer, u32 denom );
void CP_SetDivImm64_64( u64 numer, u64 denom );

引数

numer numerator。分数の分子という意味で、ここでは除算の被除数を表します。
denom denominator。分数の分母という意味で、ここでは除算の除数を表します。

返り値

なし。

説明

除算のパラメータを設定します。
除算モードの設定は行わず、被除数、除数をそれぞれのレジスタに格納するのみです。

除算モードは以下の3つがあります。

除算モード 計算 結果 計算サイクル CPUサイクル換算
CP_DIV_32_32BIT_MODE 32ビット 割る 32ビット 商32ビット、余り32ビット 18サイクル 36サイクル
CP_DIV_64_32BIT_MODE 64ビット 割る 32ビット 商64ビット、余り32ビット 34サイクル 68サイクル
CP_DIV_64_64BIT_MODE 64ビット 割る 64ビット 商64ビット、余り64ビット 34サイクル 68サイクル

(注意)
除算器は割り込み内で値が上書きされることがあります。除算パラメータを設定して除算を行っている最中に割り込みが発生し除算器が使用された場合に、元の演算結果が破壊されてしまいます。従って割り込み内で除算器を使用する場合にはCP_SaveContext(), CP_RestoreContext() を用いて除算器の状態を退避・復元する必要があります。
スレッド切り替え時には、除算器の状態も自動的に保存・復元されます。


 除算器の状態を復元する

intr_func( void )
{
 CPContext context;
 
 CP_SaveContext( &context );
 CP_SetDiv32_32( 1000, 5 );
 CP_WaitDiv();
 result = CP_GetDivResult();
 CP_RestoreContext( &context );
}

内部動作

IOレジスタの、DIV_NUMER(0x4000290)、DIV_DENOM(0x4000298) に値を格納します。

参照

CP_SetDiv*, CP_IsDivBusy, CP_WaitDiv, CP_GetDivResult*, CP_GetDivRemainder*

履歴

2006/08/09 割り込み内での使用に関する注意を追加
2004/11/02 内部動作のIOレジスタアドレスを修正
2004/01/09 内容を追加
2003/12/01 初版