[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だと問題発生
という結果になれば、タイミング依存のバグである可能性大です。
# 同様のバグは前に直したことがあります。そのときもアドレスが少しずれただ
# けで症状が出たり出なくなったりしました。
篠原