NXP JN516X (TWELITE) をプログラミングする(Multiply and Division)

SDKのライブラリが未定義命令を使っているみたいで64bit幅の型(uint64/double型など)で乗除算を実行すると停止(例外?)してしまうので64bit対応のための乗除算(一部のみ)を作ってみた。

乗算は昔よく使った筆算アルゴリズムを思い出し数十年ぶりに使ってみた。除算はオリジナルのアルゴリズムだ。最初は全てアセンブラでと思ったがドキュメントがない状況で手探りで作るしかなく乗算が完成したところで力尽きてしまった...orz

でも、さすがに除算を力任せアルゴリズム(64bit値から何回引けるか)で計算する気にはなれなかったので最大64回のシフトと加減算のみで実行できるアルゴリズムを考えてみた。これならそこそこ早いほうだと思う。

ちなみに同様なアルゴリズムで乗算も可能だ。ブースのアルゴリズムよりひねりが足りないがよりシンプルに書けるはずだし筆算アルゴリズムよりも高速になるデータパターンもあると思うので興味のある人は考えてみて。要点はループ回数を最小化することに尽きる。

【修正履歴】
2022-05-04
divu64u64()がまだバグってたので再修正。

2022-05-03
divu64u64()がまだバグってたので修正。

2022-04-28
divu64u64()が凄まじくバグッてた。というか必要なコードを入れたつもりで入れるのをすっかり忘れてた。(-_-;)

【ライブラリ】
最上位のビット(1)位置を返すSystem::lastBit()を使っていることに注意。JN516x(OpenRISC)固有の命令により実装されている。

【プロジェクトのダウンロード】
NXP JN516X (TWELITE) をプログラミングする(Eclipse-CDT+MWSTAGE)

【関連投稿】
NXP JN516X (TWELITE) をプログラミングする(開発環境の構築)
NXP JN516X (TWELITE) をプログラミングする(メイン・ルーチン)
NXP JN516X (TWELITE) をプログラミングする(TICKTIMER)
NXP JN516X (TWELITE) をプログラミングする(UART)
NXP JN516X (TWELITE) をプログラミングする(SYSTEM)
NXP JN516X (TWELITE) をプログラミングする(GPIO)
NXP JN516X (TWELITE) をプログラミングする(TIMER)
NXP JN516X (TWELITE) をプログラミングする(ALARM)
NXP JN516X (TWELITE) をプログラミングする(WAKETIMER)
NXP JN516X (TWELITE) をプログラミングする(WATCHDOG)
NXP JN516X (TWELITE) をプログラミングする(I2C)
NXP JN516X (TWELITE) をプログラミングする(SPI)
NXP JN516X (TWELITE) をプログラミングする(ADC)
NXP JN516X (TWELITE) をプログラミングする(COMPARATOR)
NXP JN516X (TWELITE) をプログラミングする(CLOCK)
NXP JN516X (TWELITE) をプログラミングする(BROWNOUT)
NXP JN516X (TWELITE) をプログラミングする(PULSCOUNTER)
NXP JN516X (TWELITE) をプログラミングする(INFRARED)
NXP JN516X (TWELITE) をプログラミングする(RANDOM-GENERATOR)
NXP JN516X (TWELITE) をプログラミングする(FLASH)
NXP JN516X (TWELITE) をプログラミングする(EEPROM)
NXP JN516X (TWELITE) をプログラミングする(WPAN)
NXP JN516X (TWELITE) をプログラミングする(Eclipse-CDT+MWSTAGE)
NXP JN516X (TWELITE) をプログラミングする(乗算と除算)
NXP JN516X (TWELITE) をプログラミングする(マルチタスク)
NXP JN516X (TWELITE) をプログラミングする(フラッシュ・プログラマー)
NXP JN516X (TWELITE) をプログラミングする(OTA UPDATE)
NXP JN516X (TWELITE) をプログラミングする(TWELITE CUE/MC3630)
NXP JN516X (TWELITE) をプログラミングする(LED)
NXP JN516X (TWELITE) をプログラミングする(AES)
NXP JN516X (TWELITE) をプログラミングする(Downloads)