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/ 以下を確認していて思い出した)ので追記します。