2013年04月24日
QEMU(MIPS)のVR5432でローテート命令が使えない不具合
この記事を書いている時点の QEMU の git HEAD でも以前と同じで、以下のようなコードになっています。
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 の資料ならば、ちょっと検索すればすぐにヒットするのですが…。)
(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 の資料ならば、ちょっと検索すればすぐにヒットするのですが…。)