[Subject Prev][Subject Next][Thread Prev][Thread Next][Subject Index][Thread Index]
[OSASK 2235] Re: gg00b003.
こんにちは、川合です。
Myurika さんは 2001/09/29 22:53:21 の「[OSASK 2233] Re: gg00b003
」で書きました:
> ええと、ありがとうございました。でも、多分これは使わないです。
> lib_imuldiv()は現状の問題点を解決するのに恐らく最適で、アセンブラを解
>さない私にはありがたいものなのですが、すぐに詰まってしまうんですよ。
残念ですが、なるほど、納得しました。おっしゃる通りです。
> これらの問題を解決するには、これらの関数ではうまくいかないのですね。
> できれば、64bitか96bitでの四則演算や剰余あたりが供給されればとてもうれ
>しいのですが…(笑)。
アセンブラではキャリーフラグという概念があるので、多倍長処理は
かなり簡単です。しかしC言語にはキャリーを扱う手段がないので、簡
単に記述する方法はありません。
残念ですが、これは今のところC言語の限界だと思って諦めた方が賢
明なのかもしれません。
可読性の観点では、C++で64bit整数型や96bit整数型を作るのが一番
いいでしょう。
いや、実は、lcc-win32には64bit整数のサポートがあるようなんです
が・・・。しまった、これは言ってはいけなかったかも(笑)。
> どうもこの関数群は用途が限定され過ぎていて、融通が利きにくいのも残念な
>ところです。
> 特にlib_idivは、 a = lib_idiv( b , c , &d ); が a = b / c; d = b % d;
>で実現できてしまいます。確かにサイズは小さくなるかもしれませんが、可読性
>は大分落ちてしまいます。
可読性が落ちるという意見には大賛成です。可読性の観点ではお勧め
できません。
lib_idiv()が好ましいのは、商と余りを同時に求められることです。
そもそもほとんどのCPUでは整数除算命令は商と余りを同時に求めます
。しかしCの演算子はこれに配慮していないため、商と余りを求める時
は2回のIDIV命令を実行することになります(最適化が優秀ならこれは
回避しているかもしれません)。IDIVはかなり処理時間のかかる命令で
Pentiumで46クロックを要します(ちなみに、このIDIV命令は64bitを32
bitで割ります)。
要するに、可読性よりもサイズや速度を優先する時にだけlib_idiv()
の使用をお勧めするということです。
lib_imul()も同様です。整数乗算命令は、結果を2倍のbit幅で算出す
るのにそれの上位値を無条件に捨ててしまうのはもったいない場合もあ
るだろうという観点で用意されています。非常にアセンブラ的な観点で
用意されているわけです。
ですから、そういう場合の時だけ使っていただければ充分です。どれ
も、10バイトかそこらの関数でしかありませんから。
> もちろん、最後の清書の段階で使う分には問題はないと思いますが、あんまり
>好きなやり方ではないです。
>
> わざわざ作っていただいたのに、申し訳ありません。
いえいえ、そんなに気にしないでください。清書で使わなくていいで
す。もしソースの改変を許していただければ、僕が勝手に書き換えます
から。
っていうか、あれくらいならASKAですぐに書けそうですね。じゃあ、
書きますか(笑)。
それでは。
--
川合 秀実(KAWAI Hidemi)
川合堂社長 / OSASK計画総指揮 / カーネル開発班
E-mail:kawai !Atmark! imasy.org
Homepage http://www.imasy.org/~kawai/