[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/