Пример #1
0
        static MipsDisassembler()
        {
            var cop1_s = new FpuDecoder(PrimitiveType.Real32,
                                        new InstrDecoder(Opcode.add_s, F4, F3, F2),
                                        new InstrDecoder(Opcode.sub_s, F4, F3, F2),
                                        new InstrDecoder(Opcode.mul_s, F4, F3, F2),
                                        new InstrDecoder(Opcode.div_s, F4, F3, F2),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.mov_s, F4, F3),
                                        new InstrDecoder(Opcode.neg_s, F4, F3),

                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),

                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),

                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),

                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),

                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),

                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.c_eq_s, c8, F3, F2),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),

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

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

                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.trunc_l_d, F4, F3),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),

                                        // fn 10
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),

                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),

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

                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),

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

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

            var cop1_w = new FpuDecoder(PrimitiveType.Int64,
                                        // fn 00
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),

                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),

                                        // fn 10
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),

                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),

                                        // fn 20
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),

                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),

                                        // fn 30
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),

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

            var cop1_l = new FpuDecoder(PrimitiveType.Int64,
                                        // fn 00
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),

                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),

                                        // fn 10
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),

                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),

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

                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),

                                        // fn 30
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),

                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal),
                                        new InstrDecoder(Opcode.illegal));

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

                new BcNDecoder(
                    new InstrDecoder(InstrClass.ConditionalTransfer | InstrClass.Delay, Opcode.bc1f, c18, j),
                    new InstrDecoder(InstrClass.ConditionalTransfer | InstrClass.Delay, Opcode.bc1t, c18, j)),
                new InstrDecoder(Opcode.illegal),
                new InstrDecoder(Opcode.illegal),
                new InstrDecoder(Opcode.illegal),
                new InstrDecoder(Opcode.illegal),
                new InstrDecoder(Opcode.illegal),
                new InstrDecoder(Opcode.illegal),
                new InstrDecoder(Opcode.illegal),

                cop1_s,
                cop1_d,
                new InstrDecoder(Opcode.illegal),
                new InstrDecoder(Opcode.illegal),
                cop1_w,
                cop1_l,
                new InstrDecoder(Opcode.illegal),
                new InstrDecoder(Opcode.illegal),

                new InstrDecoder(Opcode.illegal),
                new InstrDecoder(Opcode.illegal),
                new InstrDecoder(Opcode.illegal),
                new InstrDecoder(Opcode.illegal),
                new InstrDecoder(Opcode.illegal),
                new InstrDecoder(Opcode.illegal),
                new InstrDecoder(Opcode.illegal),
                new InstrDecoder(Opcode.illegal));

            var special2 = new SparseMaskDecoder(0, 0x3F, new Dictionary <uint, Decoder>
            {
                { 0x2, new Version6Decoder(
                      new InstrDecoder(Opcode.mul, R3, R1, R2),
                      new InstrDecoder(Opcode.illegal)) }
            });

            decoders = new Decoder[]
            {
                new SpecialDecoder(),
                new CondDecoder(),
                new InstrDecoder(Opcode.j, J),
                new InstrDecoder(Opcode.jal, J),
                new InstrDecoder(Opcode.beq, R1, R2, j),
                new InstrDecoder(Opcode.bne, R1, R2, j),
                new InstrDecoder(Opcode.blez, R1, j),
                new InstrDecoder(Opcode.bgtz, R1, j),

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

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

                    new InstrDecoder(Opcode.illegal),
                    new InstrDecoder(Opcode.illegal),
                    new InstrDecoder(Opcode.illegal),
                    new InstrDecoder(Opcode.illegal),
                    new InstrDecoder(Opcode.illegal),
                    new InstrDecoder(Opcode.illegal),
                    new InstrDecoder(Opcode.illegal),
                    new InstrDecoder(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 CoprocessorDecoder( // 12: COP2
                    new InstrDecoder(Opcode.illegal),
                    new InstrDecoder(Opcode.illegal),
                    new InstrDecoder(Opcode.illegal),
                    new InstrDecoder(Opcode.illegal),
                    new InstrDecoder(Opcode.illegal),
                    new InstrDecoder(Opcode.illegal),
                    new InstrDecoder(Opcode.illegal),
                    new InstrDecoder(Opcode.illegal),

                    new InstrDecoder(Opcode.illegal),
                    new InstrDecoder(Opcode.illegal),
                    new InstrDecoder(Opcode.illegal),
                    new InstrDecoder(Opcode.illegal),
                    new InstrDecoder(Opcode.illegal),
                    new InstrDecoder(Opcode.illegal),
                    new InstrDecoder(Opcode.illegal),
                    new InstrDecoder(Opcode.illegal),

                    new InstrDecoder(Opcode.illegal),
                    new InstrDecoder(Opcode.illegal),
                    new InstrDecoder(Opcode.illegal),
                    new InstrDecoder(Opcode.illegal),
                    new InstrDecoder(Opcode.illegal),
                    new InstrDecoder(Opcode.illegal),
                    new InstrDecoder(Opcode.illegal),
                    new InstrDecoder(Opcode.illegal),

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

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

                special2,
                null,
                null,
                new Special3Decoder(),

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

                new InstrDecoder(Opcode.lbu, R2, Eb),
                new InstrDecoder(Opcode.lhu, R2, Eh),
                new InstrDecoder(Opcode.lwr, R2, Ew),
                new A64Decoder(Opcode.lwu, R2, Ew),

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

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

                // 30
                new Version6Decoder(
                    new InstrDecoder(Opcode.ll, R2, Ew),
                    new InstrDecoder(Opcode.illegal)),
                new InstrDecoder(Opcode.lwc1, F2, Ew),
                null,
                new InstrDecoder(Opcode.pref, R2, Ew),

                new Version6Decoder(
                    new A64Decoder(Opcode.lld, R2, El),
                    new InstrDecoder(Opcode.illegal)),
                new InstrDecoder(Opcode.ldc1, F2, El),
                null,
                new A64Decoder(Opcode.ld, R2, El),

                new Version6Decoder(
                    new InstrDecoder(Opcode.sc, R2, Ew),
                    new InstrDecoder(Opcode.illegal)),
                new InstrDecoder(Opcode.swc1, F2, Ew),
                null,
                null,

                new Version6Decoder(
                    new A64Decoder(Opcode.scd, R2, El),
                    new InstrDecoder(Opcode.illegal)),
                new A64Decoder(Opcode.sdc1, F2, El),
                null,
                new A64Decoder(Opcode.sd, R2, El)
            };
        }
Пример #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 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")
            };
        }