Esempio n. 1
0
        static MipsDisassembler()
        {
            var cop1_s = new FpuOpRec(PrimitiveType.Real32,
                                      new AOpRec(Opcode.add_s, "F4,F3,F2"),
                                      new AOpRec(Opcode.sub_s, "F4,F3,F2"),
                                      new AOpRec(Opcode.mul_s, "F4,F3,F2"),
                                      new AOpRec(Opcode.div_s, "F4,F3,F2"),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.mov_s, "F4,F3"),
                                      new AOpRec(Opcode.neg_s, "F4,F3"),

                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),

                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),

                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),

                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),

                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),

                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.c_eq_s, "c8,F3,F2"),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),

                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.c_lt_s, "c8,F3,F2"),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.c_le_s, "c8,F3,F2"),
                                      new AOpRec(Opcode.illegal, ""));

            var cop1_d = new FpuOpRec(PrimitiveType.Real64,
                                      // fn 00
                                      new AOpRec(Opcode.add_d, "F4,F3,F2"),
                                      new AOpRec(Opcode.sub_d, "F4,F3,F2"),
                                      new AOpRec(Opcode.mul_d, "F4,F3,F2"),
                                      new AOpRec(Opcode.div_d, "F4,F3,F2"),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.mov_d, "F4,F3"),
                                      new AOpRec(Opcode.neg_d, "F4,F3"),

                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.trunc_l_d, "F4,F3"),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),

                                      // fn 10
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),

                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),

                                      // fn 20
                                      new AOpRec(Opcode.cvt_s_d, "F4,F3"),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.cvt_w_d, "F4,F3"),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),

                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),

                                      // fn 30
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.c_eq_d, "c8,F3,F2"),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),

                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.c_lt_d, "c8,F3,F2"),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.c_le_d, "c8,F3,F2"),
                                      new AOpRec(Opcode.illegal, ""));

            var cop1_w = new FpuOpRec(PrimitiveType.Int64,
                                      // fn 00
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),

                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),

                                      // fn 10
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),

                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),

                                      // fn 20
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),

                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),

                                      // fn 30
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),

                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.c_lt_d, "c8,F3,F2"),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""));

            var cop1_l = new FpuOpRec(PrimitiveType.Int64,
                                      // fn 00
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),

                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),

                                      // fn 10
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),

                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),

                                      // fn 20
                                      new AOpRec(Opcode.cvt_s_l, "F4,F3"),
                                      new AOpRec(Opcode.cvt_d_l, "F4,F3"),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),

                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),

                                      // fn 30
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),

                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""));

            var cop0_C0_decoder = new SparseMaskDecoder(0, 0x3F, new Dictionary <uint, OpRec>
            {
                { 0x01, new AOpRec(Opcode.tlbr, "") },
                { 0x02, new AOpRec(Opcode.tlbwi, "") },
                { 0x06, new AOpRec(Opcode.tlbwr, "") },
                { 0x08, new AOpRec(Opcode.tlbp, "") },
                { 0x18, new AOpRec(Opcode.eret, "") },
                { 0x20, new AOpRec(Opcode.wait, "") },
            });
            var cop1 = new CoprocessorOpRec(
                new AOpRec(Opcode.mfc1, "R2,F3"),
                new A64OpRec(Opcode.dmfc1, "R2,F3"),
                new AOpRec(Opcode.cfc1, "R2,f3"),
                new AOpRec(Opcode.illegal, ""),
                new AOpRec(Opcode.mtc1, "R2,F3"),
                new A64OpRec(Opcode.dmtc1, "R2,F3"),
                new AOpRec(Opcode.ctc1, "R2,f3"),
                new AOpRec(Opcode.illegal, ""),

                new BcNRec(Opcode.bc1f, Opcode.bc1t),
                new AOpRec(Opcode.illegal, ""),
                new AOpRec(Opcode.illegal, ""),
                new AOpRec(Opcode.illegal, ""),
                new AOpRec(Opcode.illegal, ""),
                new AOpRec(Opcode.illegal, ""),
                new AOpRec(Opcode.illegal, ""),
                new AOpRec(Opcode.illegal, ""),

                cop1_s,
                cop1_d,
                new AOpRec(Opcode.illegal, ""),
                new AOpRec(Opcode.illegal, ""),
                cop1_w,
                cop1_l,
                new AOpRec(Opcode.illegal, ""),
                new AOpRec(Opcode.illegal, ""),

                new AOpRec(Opcode.illegal, ""),
                new AOpRec(Opcode.illegal, ""),
                new AOpRec(Opcode.illegal, ""),
                new AOpRec(Opcode.illegal, ""),
                new AOpRec(Opcode.illegal, ""),
                new AOpRec(Opcode.illegal, ""),
                new AOpRec(Opcode.illegal, ""),
                new AOpRec(Opcode.illegal, ""));

            var special2 = new SparseMaskDecoder(0, 0x3F, new Dictionary <uint, OpRec>
            {
                { 0x2, new Version6OpRec(
                      new AOpRec(Opcode.mul, "R3,R1,R2"),
                      new AOpRec(Opcode.illegal, "")) }
            });

            opRecs = new OpRec[]
            {
                new SpecialOpRec(),
                new CondOpRec(),
                new AOpRec(Opcode.j, "J"),
                new AOpRec(Opcode.jal, "J"),
                new AOpRec(Opcode.beq, "R1,R2,j"),
                new AOpRec(Opcode.bne, "R1,R2,j"),
                new AOpRec(Opcode.blez, "R1,j"),
                new AOpRec(Opcode.bgtz, "R1,j"),

                new AOpRec(Opcode.addi, "R2,R1,I"),
                new AOpRec(Opcode.addiu, "R2,R1,I"),
                new AOpRec(Opcode.slti, "R2,R1,I"),
                new AOpRec(Opcode.sltiu, "R2,R1,I"),

                new AOpRec(Opcode.andi, "R2,R1,U"),
                new AOpRec(Opcode.ori, "R2,R1,U"),
                new AOpRec(Opcode.xori, "R2,R1,U"),
                new AOpRec(Opcode.lui, "R2,i"),
                // 10
                new CoprocessorOpRec(
                    new AOpRec(Opcode.mfc0, "R2,R3"),
                    new AOpRec(Opcode.dmfc0, "R2,R3"),
                    new AOpRec(Opcode.illegal, ""),
                    new AOpRec(Opcode.illegal, ""),
                    new AOpRec(Opcode.mtc0, "R2,R3"),
                    new AOpRec(Opcode.dmtc0, "R2,R3"),
                    new AOpRec(Opcode.illegal, ""),
                    new AOpRec(Opcode.illegal, ""),

                    new AOpRec(Opcode.illegal, ""),
                    new AOpRec(Opcode.illegal, ""),
                    new AOpRec(Opcode.illegal, ""),
                    new AOpRec(Opcode.illegal, ""),
                    new AOpRec(Opcode.illegal, ""),
                    new AOpRec(Opcode.illegal, ""),
                    new AOpRec(Opcode.illegal, ""),
                    new AOpRec(Opcode.illegal, ""),

                    cop0_C0_decoder,
                    cop0_C0_decoder,
                    cop0_C0_decoder,
                    cop0_C0_decoder,
                    cop0_C0_decoder,
                    cop0_C0_decoder,
                    cop0_C0_decoder,
                    cop0_C0_decoder,

                    cop0_C0_decoder,
                    cop0_C0_decoder,
                    cop0_C0_decoder,
                    cop0_C0_decoder,
                    cop0_C0_decoder,
                    cop0_C0_decoder,
                    cop0_C0_decoder,
                    cop0_C0_decoder),
                // 11: COP1 encodings
                cop1,

                new CoprocessorOpRec( // 12: COP2
                    new AOpRec(Opcode.illegal, ""),
                    new AOpRec(Opcode.illegal, ""),
                    new AOpRec(Opcode.illegal, ""),
                    new AOpRec(Opcode.illegal, ""),
                    new AOpRec(Opcode.illegal, ""),
                    new AOpRec(Opcode.illegal, ""),
                    new AOpRec(Opcode.illegal, ""),
                    new AOpRec(Opcode.illegal, ""),

                    new AOpRec(Opcode.illegal, ""),
                    new AOpRec(Opcode.illegal, ""),
                    new AOpRec(Opcode.illegal, ""),
                    new AOpRec(Opcode.illegal, ""),
                    new AOpRec(Opcode.illegal, ""),
                    new AOpRec(Opcode.illegal, ""),
                    new AOpRec(Opcode.illegal, ""),
                    new AOpRec(Opcode.illegal, ""),

                    new AOpRec(Opcode.illegal, ""),
                    new AOpRec(Opcode.illegal, ""),
                    new AOpRec(Opcode.illegal, ""),
                    new AOpRec(Opcode.illegal, ""),
                    new AOpRec(Opcode.illegal, ""),
                    new AOpRec(Opcode.illegal, ""),
                    new AOpRec(Opcode.illegal, ""),
                    new AOpRec(Opcode.illegal, ""),

                    new AOpRec(Opcode.illegal, ""),
                    new AOpRec(Opcode.illegal, ""),
                    new AOpRec(Opcode.illegal, ""),
                    new AOpRec(Opcode.illegal, ""),
                    new AOpRec(Opcode.illegal, ""),
                    new AOpRec(Opcode.illegal, ""),
                    new AOpRec(Opcode.illegal, ""),
                    new AOpRec(Opcode.illegal, "")),
                null,   // COP1X
                new AOpRec(Opcode.beql, "R1,R2,j"),
                new AOpRec(Opcode.bnel, "R1,R2,j"),
                new AOpRec(Opcode.blezl, "R1,j"),
                new AOpRec(Opcode.bgtzl, "R1,j"),

                new A64OpRec(Opcode.daddi, "R2,R1,I"),
                new A64OpRec(Opcode.daddiu, "R2,R1,I"),
                new A64OpRec(Opcode.ldl, "R2,El"),
                new A64OpRec(Opcode.ldr, "R2,El"),

                special2,
                null,
                null,
                new Special3OpRec(),

                // 20
                new AOpRec(Opcode.lb, "R2,EB"),
                new AOpRec(Opcode.lh, "R2,EH"),
                new AOpRec(Opcode.lwl, "R2,Ew"),
                new AOpRec(Opcode.lw, "R2,Ew"),

                new AOpRec(Opcode.lbu, "R2,Eb"),
                new AOpRec(Opcode.lhu, "R2,Eh"),
                new AOpRec(Opcode.lwr, "R2,Ew"),
                new A64OpRec(Opcode.lwu, "R2,Ew"),

                new AOpRec(Opcode.sb, "R2,Eb"),
                new AOpRec(Opcode.sh, "R2,Eh"),
                new AOpRec(Opcode.swl, "R2,Ew"),
                new AOpRec(Opcode.sw, "R2,Ew"),

                new AOpRec(Opcode.sdl, "R2,Ew"),
                new AOpRec(Opcode.sdr, "R2,Ew"),
                new AOpRec(Opcode.swr, "R2,Ew"),
                null,

                // 30
                new Version6OpRec(
                    new AOpRec(Opcode.ll, "R2,Ew"),
                    new AOpRec(Opcode.illegal, "")),
                new AOpRec(Opcode.lwc1, "F2,Ew"),
                null,
                new AOpRec(Opcode.pref, "R2,Ew"),

                new Version6OpRec(
                    new A64OpRec(Opcode.lld, "R2,El"),
                    new AOpRec(Opcode.illegal, "")),
                new AOpRec(Opcode.ldc1, "F2,El"),
                null,
                new A64OpRec(Opcode.ld, "R2,El"),

                new Version6OpRec(
                    new AOpRec(Opcode.sc, "R2,Ew"),
                    new AOpRec(Opcode.illegal, "")),
                new AOpRec(Opcode.swc1, "F2,Ew"),
                null,
                null,

                new Version6OpRec(
                    new A64OpRec(Opcode.scd, "R2,El"),
                    new AOpRec(Opcode.illegal, "")),
                new A64OpRec(Opcode.sdc1, "F2,El"),
                null,
                new A64OpRec(Opcode.sd, "R2,El")
            };
        }
Esempio n. 2
0
        static MipsDisassembler()
        {
            var cop1_s = new FpuOpRec(PrimitiveType.Real32,
                                      new AOpRec(Opcode.add_s, "F4,F3,F2"),
                                      new AOpRec(Opcode.sub_s, "F4,F3,F2"),
                                      new AOpRec(Opcode.mul_s, "F4,F3,F2"),
                                      new AOpRec(Opcode.div_s, "F4,F3,F2"),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.mov_s, "F4,F3"),
                                      new AOpRec(Opcode.neg_s, "F4,F3"),

                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),

                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),

                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),

                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),

                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),

                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.c_eq_s, "c8,F3,F2"),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),

                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.c_lt_s, "c8,F3,F2"),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.c_le_s, "c8,F3,F2"),
                                      new AOpRec(Opcode.illegal, ""));

            var cop1_d = new FpuOpRec(PrimitiveType.Real64,
                                      // fn 00
                                      new AOpRec(Opcode.add_d, "F4,F3,F2"),
                                      new AOpRec(Opcode.sub_d, "F4,F3,F2"),
                                      new AOpRec(Opcode.mul_d, "F4,F3,F2"),
                                      new AOpRec(Opcode.div_d, "F4,F3,F2"),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.mov_d, "F4,F3"),
                                      new AOpRec(Opcode.neg_d, "F4,F3"),

                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.trunc_l_d, "F4,F3"),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),

                                      // fn 10
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),

                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),

                                      // fn 20
                                      new AOpRec(Opcode.cvt_s_d, "F4,F3"),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.cvt_w_d, "F4,F3"),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),

                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),

                                      // fn 30
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.c_eq_d, "c8,F3,F2"),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),

                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.c_lt_d, "c8,F3,F2"),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.c_le_d, "c8,F3,F2"),
                                      new AOpRec(Opcode.illegal, ""));

            var cop1_w = new FpuOpRec(PrimitiveType.Int64,
                                      // fn 00
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),

                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),

                                      // fn 10
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),

                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),

                                      // fn 20
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),

                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),

                                      // fn 30
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),

                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.c_lt_d, "c8,F3,F2"),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""));

            var cop1_l = new FpuOpRec(PrimitiveType.Int64,
                                      // fn 00
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),

                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),

                                      // fn 10
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),

                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),

                                      // fn 20
                                      new AOpRec(Opcode.cvt_s_l, "F4,F3"),
                                      new AOpRec(Opcode.cvt_d_l, "F4,F3"),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),

                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),

                                      // fn 30
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),

                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""),
                                      new AOpRec(Opcode.illegal, ""));

            var cop1 = new CoprocessorOpRec(
                new AOpRec(Opcode.mfc1, "R2,F3"),
                new A64OpRec(Opcode.dmfc1, "R2,F3"),
                new AOpRec(Opcode.cfc1, "R2,f3"),
                new AOpRec(Opcode.illegal, ""),
                new AOpRec(Opcode.mtc1, "R2,F3"),
                new A64OpRec(Opcode.dmtc1, "R2,F3"),
                new AOpRec(Opcode.ctc1, "R2,f3"),
                new AOpRec(Opcode.illegal, ""),

                new BcNRec(Opcode.bc1f, Opcode.bc1t),
                new AOpRec(Opcode.illegal, ""),
                new AOpRec(Opcode.illegal, ""),
                new AOpRec(Opcode.illegal, ""),
                new AOpRec(Opcode.illegal, ""),
                new AOpRec(Opcode.illegal, ""),
                new AOpRec(Opcode.illegal, ""),
                new AOpRec(Opcode.illegal, ""),

                cop1_s,
                cop1_d,
                new AOpRec(Opcode.illegal, ""),
                new AOpRec(Opcode.illegal, ""),
                cop1_w,
                cop1_l,
                new AOpRec(Opcode.illegal, ""),
                new AOpRec(Opcode.illegal, ""),

                new AOpRec(Opcode.illegal, ""),
                new AOpRec(Opcode.illegal, ""),
                new AOpRec(Opcode.illegal, ""),
                new AOpRec(Opcode.illegal, ""),
                new AOpRec(Opcode.illegal, ""),
                new AOpRec(Opcode.illegal, ""),
                new AOpRec(Opcode.illegal, ""),
                new AOpRec(Opcode.illegal, ""));

            opRecs = new OpRec[]
            {
                new SpecialOpRec(),
                new CondOpRec(),
                new AOpRec(Opcode.j, "J"),
                new AOpRec(Opcode.jal, "J"),
                new AOpRec(Opcode.beq, "R1,R2,j"),
                new AOpRec(Opcode.bne, "R1,R2,j"),
                new AOpRec(Opcode.blez, "R1,j"),
                new AOpRec(Opcode.bgtz, "R1,j"),

                new AOpRec(Opcode.addi, "R2,R1,I"),
                new AOpRec(Opcode.addiu, "R2,R1,I"),
                new AOpRec(Opcode.slti, "R2,R1,I"),
                new AOpRec(Opcode.sltiu, "R2,R1,I"),

                new AOpRec(Opcode.andi, "R2,R1,U"),
                new AOpRec(Opcode.ori, "R2,R1,U"),
                new AOpRec(Opcode.xori, "R2,R1,U"),
                new AOpRec(Opcode.lui, "R2,i"),
                // 10
                new CoprocessorOpRec(
                    new AOpRec(Opcode.mfc0, "R2,R3"),
                    new AOpRec(Opcode.illegal, ""),
                    new AOpRec(Opcode.illegal, ""),
                    new AOpRec(Opcode.illegal, ""),
                    new AOpRec(Opcode.mtc0, "R2,R3"),
                    new AOpRec(Opcode.illegal, ""),
                    new AOpRec(Opcode.illegal, ""),
                    new AOpRec(Opcode.illegal, ""),

                    new AOpRec(Opcode.illegal, ""),
                    new AOpRec(Opcode.illegal, ""),
                    new AOpRec(Opcode.illegal, ""),
                    new AOpRec(Opcode.illegal, ""),
                    new AOpRec(Opcode.illegal, ""),
                    new AOpRec(Opcode.illegal, ""),
                    new AOpRec(Opcode.illegal, ""),
                    new AOpRec(Opcode.illegal, ""),

                    new AOpRec(Opcode.illegal, ""),
                    new AOpRec(Opcode.illegal, ""),
                    new AOpRec(Opcode.illegal, ""),
                    new AOpRec(Opcode.illegal, ""),
                    new AOpRec(Opcode.illegal, ""),
                    new AOpRec(Opcode.illegal, ""),
                    new AOpRec(Opcode.illegal, ""),
                    new AOpRec(Opcode.illegal, ""),

                    new AOpRec(Opcode.illegal, ""),
                    new AOpRec(Opcode.illegal, ""),
                    new AOpRec(Opcode.illegal, ""),
                    new AOpRec(Opcode.illegal, ""),
                    new AOpRec(Opcode.illegal, ""),
                    new AOpRec(Opcode.illegal, ""),
                    new AOpRec(Opcode.illegal, ""),
                    new AOpRec(Opcode.illegal, "")),
                // 11: COP1 encodings
                cop1,

                new CoprocessorOpRec(
                    new AOpRec(Opcode.illegal, ""),
                    new AOpRec(Opcode.illegal, ""),
                    new AOpRec(Opcode.illegal, ""),
                    new AOpRec(Opcode.illegal, ""),
                    new AOpRec(Opcode.illegal, ""),
                    new AOpRec(Opcode.illegal, ""),
                    new AOpRec(Opcode.illegal, ""),
                    new AOpRec(Opcode.illegal, ""),

                    new AOpRec(Opcode.illegal, ""),
                    new AOpRec(Opcode.illegal, ""),
                    new AOpRec(Opcode.illegal, ""),
                    new AOpRec(Opcode.illegal, ""),
                    new AOpRec(Opcode.illegal, ""),
                    new AOpRec(Opcode.illegal, ""),
                    new AOpRec(Opcode.illegal, ""),
                    new AOpRec(Opcode.illegal, ""),

                    new AOpRec(Opcode.illegal, ""),
                    new AOpRec(Opcode.illegal, ""),
                    new AOpRec(Opcode.illegal, ""),
                    new AOpRec(Opcode.illegal, ""),
                    new AOpRec(Opcode.illegal, ""),
                    new AOpRec(Opcode.illegal, ""),
                    new AOpRec(Opcode.illegal, ""),
                    new AOpRec(Opcode.illegal, ""),

                    new AOpRec(Opcode.illegal, ""),
                    new AOpRec(Opcode.illegal, ""),
                    new AOpRec(Opcode.illegal, ""),
                    new AOpRec(Opcode.illegal, ""),
                    new AOpRec(Opcode.illegal, ""),
                    new AOpRec(Opcode.illegal, ""),
                    new AOpRec(Opcode.illegal, ""),
                    new AOpRec(Opcode.illegal, "")),
                null,
                new AOpRec(Opcode.beql, "R1,R2,j"),
                new AOpRec(Opcode.bnel, "R1,R2,j"),
                new AOpRec(Opcode.blezl, "R1,j"),
                new AOpRec(Opcode.bgtzl, "R1,j"),

                new A64OpRec(Opcode.daddi, "R2,R1,I"),
                new A64OpRec(Opcode.daddiu, "R2,R1,I"),
                new A64OpRec(Opcode.ldl, "R2,El"),
                new A64OpRec(Opcode.ldr, "R2,El"),
                null,
                null,
                null,
                new Special3OpRec(),

                // 20
                new AOpRec(Opcode.lb, "R2,EB"),
                new AOpRec(Opcode.lh, "R2,EH"),
                new AOpRec(Opcode.lwl, "R2,Ew"),
                new AOpRec(Opcode.lw, "R2,Ew"),

                new AOpRec(Opcode.lbu, "R2,Eb"),
                new AOpRec(Opcode.lhu, "R2,Eh"),
                new AOpRec(Opcode.lwr, "R2,Ew"),
                new A64OpRec(Opcode.lwu, "R2,Ew"),

                new AOpRec(Opcode.sb, "R2,Eb"),
                new AOpRec(Opcode.sh, "R2,Eh"),
                new AOpRec(Opcode.swl, "R2,Ew"),
                new AOpRec(Opcode.sw, "R2,Ew"),

                new AOpRec(Opcode.sdl, "R2,Ew"),
                new AOpRec(Opcode.sdr, "R2,Ew"),
                new AOpRec(Opcode.swr, "R2,Ew"),
                null,

                // 30
                new Version6OpRec(
                    new AOpRec(Opcode.ll, "R2,Ew"),
                    new AOpRec(Opcode.illegal, "")),
                new AOpRec(Opcode.lwc1, "F2,Ew"),
                null,
                new AOpRec(Opcode.pref, "R2,Ew"),

                new Version6OpRec(
                    new A64OpRec(Opcode.lld, "R2,El"),
                    new AOpRec(Opcode.illegal, "")),
                new AOpRec(Opcode.ldc1, "F2,El"),
                null,
                new A64OpRec(Opcode.ld, "R2,El"),

                new Version6OpRec(
                    new AOpRec(Opcode.sc, "R2,Ew"),
                    new AOpRec(Opcode.illegal, "")),
                new AOpRec(Opcode.swc1, "F2,Ew"),
                null,
                null,

                new Version6OpRec(
                    new A64OpRec(Opcode.scd, "R2,El"),
                    new AOpRec(Opcode.illegal, "")),
                new A64OpRec(Opcode.sdc1, "F2,El"),
                null,
                new Version6OpRec(
                    new A64OpRec(Opcode.sd, "R2,El"),
                    new AOpRec(Opcode.illegal, ""))
            };
        }