[Subject Prev][Subject Next][Thread Prev][Thread Next][Subject Index][Thread Index]
[OSASK 2232] gg00b003.
こんにちは、川合です。
MOSload支援のためにいくつかの関数を作ったので、gg00b003に入れ
ておきました。gg00b003はベータリリースしておきます。
作った関数は、以下の3つです。
const int lib_imul(signed int a, signed int b, int *h);
const int lib_idiv(signed int a, signed int b, int *r);
const int lib_imuldiv(signed int a, signed int b, signed int c, int *r);
・lib_imul(a, b, h)
aとbの積を計算し、下位32bitを返します。上位32bitは*hに格納しま
す。
・lib_idiv(a, b, r)
a/bを計算し、商を返します。そしてその余りが*rに格納されます。
・lib_imuldiv(a, b, c, r)
aとbの積を64bitの符号付き整数精度で求め、それをcで割ります。関
数はこの時の商を返し、余りが*rに格納されます。なお、商がsigned i
ntで表現できる値でないと例外0(除算例外)が発生するので注意して
ください。
どの関数もポインタを必要としていますが、これは不要な場合でもNU
LLにしてはいけません。適当な変数を用意してそこへのポインタを与え
てください。
---
これらの関数をどのように使えばいいかというと、MyurikaさんのMOS
load01の改良を例にして説明します。MOSload01は、一個所だけFPU計算
を必要としている部分があり、それは、
i = (double)( maxCount - counter ) * 1000000 / maxCount;
となっています。これを
i = lib_imuldiv(maxCount - counter, 1000000, maxCount, &i);
と置き換えれば、FPU無しでも実行できるようになりますし、しかもバ
イナリーがコンパクトになります(いつも、こればっかりですね・・・
笑)。・・・この例では、iはlib_imuldiv()によって書き込まれたあと
代入によって上書きされます(余りに興味はないので)。
text[17]〜text[24]の計算の部分を以下のようにすれば、さらにコン
パクトになります(笑)。
if ( i > 999999 ) {
i -= 1000000;
text[17] = '1';
} else
text[17] = ' ';
if ( i > 99999 )
text[18] = '0' + lib_idiv(i, 100000, &i);
else
text[18] = ' ';
text[19] = '0' + lib_idiv(i, 10000, &i);
text[21] = '0' + lib_idiv(i, 1000, &i);
text[22] = '0' + lib_idiv(i, 100, &i);
text[23] = '0' + lib_idiv(i, 10, &i);
text[24] = '0' + i;
ということで、これが気に入ったら使ってみてください(笑)。
それでは。
--
川合 秀実(KAWAI Hidemi)
川合堂社長 / OSASK計画総指揮 / カーネル開発班
E-mail:kawai !Atmark! imasy.org
Homepage http://www.imasy.org/~kawai/