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

コメントする

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

QRコード
QRコード