(toppers-users 2595) Sh4 FPUの使用方法を教えて下さいその2。
EIKO SOKKI MATSUMOTO-F
eikomf @ peace.ocn.ne.jp
2007年 4月 9日 (月) 11:41:45 JST
関と申します。
尾形様、もなか様、酒匂様、回答をいただき誠にありがとうございました。
こちらでアドバイスにしたがって、新しく開発環境を作ってみました。
開発環境の構築に時間がかかってしまい、皆様にお礼を述べるのが遅れてしまいました。
開発環境は、Cygwin(1.5.24-2)上に、
binutils-2.16.1.tar.gz
gcc-core-3.4.6.tar.gz
newlib-1.14.0.tar.gz
これらのファイルをダウンロードして構築しました。
binutilsの構築とインストール
/usr/src/binuitls-2.16.1で次のコマンドを実行します。
$ ../binutils-2.16.1/configure --target=sh-hitachi-elf --prefix=/usr/local
$ make
$ make install
gccの構築とインストール
$ ../gcc-3.4.6/configure --target=sh-hitachi-elf --prefix=/usr/local \
> --disable-nls --enable-languages=c --with-newlib \
$ make
$ make install
newlibの構築とインストール
$
../newlib-1.14.0/configure --target=sh-hitachi-elf --prefix=/usr/local --disable-nls
$ make
$ make install
構築の途中ではエラーが発生しなかった(と思う)ので、
jsp-1.4.2をインストールして、これもエラーはでなくなしました。
次にPartner(京都マイクロコンピュータのデバッガ)でプログラムを走らせましたところ次の部分で永久ループに
なっていました。
__kernel_print_banner+22()
:
static void
convert(unsigned _intptr_ val, unsigned int radix, const char *radchar,
int width, int minus, int padzero, void (*putc)(char))
{
char buf[CONVERT_BUFLEN];
int i, j;
i = 0;
do { ----------------ここでループしている
buf[i++] = radchar[val % radix];
val /= radix;
} while (val != 0);
:
:
:
この関数が呼ばれている。(浮動少数点の計算が行われている)
___udivsi3_i4:
0000A9C4 E101 MOV #h'1,r1
0000A9C6 3516 CMP/HI r1,r5
0000A9C8 8B0E BF h'0A9E8
0000A9CA 4105 ROTR r1
0000A9CC 241A XOR r1,r4
0000A9CE 445A LDS r4,fpul
0000A9D0 C706 MOVA @(h'0A9EC,pc),r0
0000A9D2 F409 FMOV.S @r0+,fr4
0000A9D4 F508 FMOV.S @r0,fr5
0000A9D6 F02D FLOAT fpul,fr0
0000A9D8 251A XOR r1,r5
0000A9DA 455A LDS r5,fpul
0000A9DC F22D FLOAT fpul,fr2
0000A9DE F040 FADD fr4,fr0
0000A9E0 F240 FADD fr4,fr2
0000A9E2 F023 FDIV fr2,fr0
0000A9E4 000B RTS
0000A9E6 F03D FTRC fr0,fpul
0000A9E8 000B RTS
On 2007/04/04, at 14:02, Naohide Ogata wrote:
> gccの場合、「-m4」を指定すると整数の除算も浮動小数点で行うコードを出力
> します。こちらでは、 jsp/config/sh3/cpu_support.Sのレジスタ保存、復帰の
> 部分にfpscr、fpul、fr0〜fr15の保存、復帰を追加して使用しています。
ここで質問ですが、jsp/config/sh3/cpu_support.Sのレジスタの保存、復帰の部分
とありますが、 cpu_support.S には、次の4箇所の部分があります。
この全ての部分で浮動少数点レジスタ関係の保存、復帰を行えば良いのでしょうか?
----cpu_support.S--------------
/* Exception 100 vector 部 */
/* タスクディスパッチャ部 */
/* 割り込みハンドラ/CPU例外ハンドラ出口処理部 */
/* タスク起動処理部 */
/* Exception 600 vector 部 */
以上
お手数かとは思いますが、なにとぞよろしくお願い致します。