2010年11月25日
QEMU(MIPS)の、整数ローテート命令の謎実装
QEMU(MIPS)の整数ローテート命令(ROR、DROR、DROR32、RORV、DRORV)の実装に、よくわからない点がありました。
以前も整数積和演算系命令に不具合があったわけですが、どうもQEMU(MIPS)は、VR5432から増えた命令周りがあまりテストされていないような印象です。
記事執筆時のQEMUのgitレポジトリのHEAD(2010-11-18 20:30:12)では、以下のように、MIPS32R2以外のCPUでは、RORやRORVなどを、SRLやSRLV(ローテートではなくシフト)として解釈するという謎の実装になっています。
なぜこのような実装になっているのでしょうか?
ちょっと理由がわかりませんでした。
target-mips/translate.c
static void decode_opc (CPUState *env, DisasContext *ctx, int *is_branch) { ... switch (op) { case OPC_SPECIAL: op1 = MASK_SPECIAL(ctx->opcode); switch (op1) { ... case OPC_SRL: switch ((ctx->opcode >> 21) & 0x1f) { case 1: /* rotr is decoded as srl on non-R2 CPUs */ if (env->insn_flags & ISA_MIPS32R2) { op1 = OPC_ROTR; } /* Fallthrough */ case 0: gen_shift_imm(env, ctx, op1, rd, rt, sa); break; ... case OPC_SRLV: switch ((ctx->opcode >> 6) & 0x1f) { case 1: /* rotrv is decoded as srlv on non-R2 CPUs */ if (env->insn_flags & ISA_MIPS32R2) { op1 = OPC_ROTRV; } /* Fallthrough */ case 0: gen_shift(env, ctx, op1, rd, rs, rt); break; ...
トラックバックURL
トラックバック一覧
1. QEMU(MIPS)のVR5432でローテート命令が使えない不具合 [ KMC Staff Blog ] 2013年04月24日 19:13
だいぶ昔にこのような記事を書いたのですが、その後の調査で理由がわかった(ことを、QEMU 1.1.2 の target-mips/ 以下を確認していて思い出した)ので追記します。