[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: new MIPS cache ops and R4000/4400 with L2 cache



Izumi Tsutsui <tsutsui@ceres.dti.ne.jp> writes:
> ---
> /*
>  * Send a floating point exception signal to the current process.
>  */
> 	li	t0, 0xFFFFFF00
> 	and	a1, a1, t0
> ---
> のところが
> 
> pkgsrc の cross の as だと
> ---
>  a04:	3c08ffff	lui	$t0,0xffff
>  a08:	3508ff00	ori	$t0,$t0,0xff00
>  a0c:	00a82824	and	$a1,$a1,$t0
> ---
> 
> in-tree の native の as だと
> ---
>  a04:	2408ff00	li	$t0,-256
>  a08:	00a82824	and	$a1,$a1,$t0
> ---
> になってました。
> 
> これは
> ・native の as が吐くコードがおかしい
> ・コードは正しくて動かないのがおかしい
> のどちらなんでしょう?

-256 = 0xffffff00なので、コードそのものは(効率はともかくとして)正しいよ
うに思います。どちらのコード列でも、and命令を実行する時点の$t0には
0xffffff00が入っているはずです。

これで動作に違いがあるのだとすると、この部分のサイズが変わったことによっ
て命令やデータのアドレスがずれ、その結果タイミングに依存するバグが出たの
ではないでしょうか?

この仮説を確認するために、nativeでコンパイルする際にnopを入れて、サイズ
が変わらないようにしてみてください。

	サイズがcross == nativeだと問題なし
	サイズがcross != nativeだと問題発生

という結果になれば、タイミング依存のバグである可能性大です。

# 同様のバグは前に直したことがあります。そのときもアドレスが少しずれただ
# けで症状が出たり出なくなったりしました。

篠原