2013年04月24日

QEMU(MIPS)のVR5432でローテート命令が使えない不具合

だいぶ昔にこのような記事を書いたのですが、その後の調査で理由がわかった(ことを、QEMU 1.1.2 の target-mips/ 以下を確認していて思い出した)ので追記します。


この記事を書いている時点の QEMU の git HEAD でも以前と同じで、以下のようなコードになっています。
(target-mips/translate.c)

        case OPC_SRL:
            switch ((ctx->opcode >> 21) & 0x1f) {
            case 1:
                /* rotr is decoded as srl on non-R2 CPUs */
                if (ctx->insn_flags & ISA_MIPS32R2) {
                    op1 = OPC_ROTR;
                }
                /* Fallthrough */
            case 0:
                gen_shift_imm(ctx, op1, rd, rt, sa);
                break;
整数ローテート命令は、MIPS32/MIPS64 Release 2 命令セット以前は存在しないので、このようになっています。ISA_MIPS32R2 は納得できるのですが、MIPS64 Release 2 は?と疑問に思いますが、実はこのフラグは、CPU_MIPS64R2 フラグの中にも含まれているので、MIPS64 Release 2 の CPU でも有効になります。

Release 2 命令セットをサポートしない CPU では、整数ローテート命令 ROR、DROR、DROR32、RORV、DRORV が来ても、エラーにはならずに、単に無視して、それぞれ SRL、DSRL、DSRL32、SRLV、DSRLV にデコードする形になっているのも少し疑問ですが、これもまあ、リーズナブルな実装だと思います。

問題は、VR5432 は MIPS IV 命令セットですが、ローテート命令などが独自に追加されているのに、ISA_MIPS32R2 フラグを持っていないので、ローテート命令が仕様通りに動作しないということです。

参考資料: NEC VR5432(TM) 64-Bit MIPS(R) RISC Microprocessor User's Manual, Preliminary (3.4 Rotate Instructions)
(Document No.U13751EU2V0UM00 (c) NEC Electronics Inc.)

というわけで、おそらく QEMU の不具合(あるいは直すべき制限)で確定なのですが、上記資料が現在は(おそらく)入手できないそうなので、どう報告したものかな…と思いつつ、これもずっと放置していたのでした(汗)

しかし、前回の記事もそうなのですが、拡張命令セットはあまり使われていないのでしょうか…。(hw/ 以下を grep しても "VR5432" がヒットしないので、もしかして QEMU の "VR5432" 自体が使われてないのかも…。そもそも、なぜ一般的な VR5500 ではなく、マイナーバージョンの VR5432 を QEMU に実装したのでしょうか。VR5500 の資料ならば、ちょっと検索すればすぐにヒットするのですが…。)

トラックバックURL

コメントする

名前
URL
 
  絵文字
 
 
記事検索
最新コメント
アクセスカウンター
  • 今日:
  • 昨日:
  • 累計:

QRコード
QRコード