Example #1
0
        static XtensaDisassembler()
        {
            b4const = new int[16]
            {
                -1, 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 16, 32, 64, 128, 256
            };

            b4constu = new int[16]
            {
                0x8000,
                0x10000,
                0x2,
                0x3,
                0x4,
                0x5,
                0x6,
                0x7,

                0x8,
                0xA,
                0xC,
                0x10,
                0x20,
                0x40,
                0x80,
                0x100,
            };

            var reserved = new OpRec(Opcodes.reserved, "");

            var oprecLSCX = new Op1Rec(
                new OpRec(Opcodes.lsx, "T,Rs,Rr"),
                null,
                reserved,
                reserved,

                null,
                null,
                reserved,
                reserved,

                reserved,
                reserved,
                reserved,
                reserved,

                reserved,
                reserved,
                reserved,
                reserved);

            var oprecLSC4 = new Op2Rec(
                new OpRec(Opcodes.l32e, "Rt,Rs,e"),
                reserved,
                reserved,
                reserved,

                new OpRec(Opcodes.s32e, "Rt,Rs,e"),
                reserved,
                reserved,
                reserved,

                reserved,
                reserved,
                reserved,
                reserved,

                reserved,
                reserved,
                reserved,
                reserved);

            var oprecFP0 = new Op2Rec(
                new OpRec(Opcodes.add_s, "Fr,Fs,Ft"),
                new OpRec(Opcodes.sub_s, "Fr,Fs,Ft"),
                new OpRec(Opcodes.mul_s, "Fr,Fs,Ft"),
                reserved,

                null,
                null,
                null,
                null,

                null,
                null,
                null,
                new OpRec(Opcodes.floor_s, "Rr,Fs,It"),

                null,
                null,
                null,
                null);

            var oprecFP1 = new Op2Rec(
                reserved,
                null,
                null,
                new OpRec(Opcodes.ueq_s, "Br,Fs,Ft"),

                null,
                null,
                null,
                null,

                new OpRec(Opcodes.moveqz_s, "Fr,Fs,Rt"),
                null,
                null,
                null,

                null,
                null,
                reserved,
                reserved);

            var oprecJR = new n_Rec(
                new OpRec(Opcodes.ret, ""),
                null,
                new OpRec(Opcodes.jx, "Rs"),
                reserved);

            var oprecCALLX = new n_Rec(
                new OpRec(Opcodes.callx0, "Rs"),
                new OpRec(Opcodes.callx4, "Rs"),
                new OpRec(Opcodes.callx8, "Rs"),
                new OpRec(Opcodes.callx12, "Rs"));

            var oprecSNM0 = new m_Rec(
                new OpRec(Opcodes.ill, ""),
                null,
                oprecJR,
                oprecCALLX);

            var oprecSYNC = new t_Rec(
                new OpRec(Opcodes.isync, ""),
                null,
                null,
                null,

                null,
                null,
                null,
                null,

                null,
                null,
                null,
                null,

                new OpRec(Opcodes.memw, ""),
                null,
                null,
                null);

            var oprecRFET = new s_Rec(
                new OpRec(Opcodes.rfe, ""),
                null,
                null,
                reserved,

                null,
                null,
                reserved,
                reserved,

                reserved,
                reserved,
                reserved,
                reserved,

                reserved,
                reserved,
                reserved,
                reserved);

            var oprecRFEI = new t_Rec(
                oprecRFET,
                new OpRec(Opcodes.rfi, "Is"),
                null,
                reserved,

                reserved,
                reserved,
                reserved,
                reserved,

                reserved,
                reserved,
                reserved,
                reserved,

                reserved,
                reserved,
                reserved,
                reserved);


            var oprecBZ = new m_Rec(
                new OpRec_bz(Opcodes.beqz),
                new OpRec_bz(Opcodes.bnez),
                new OpRec_bz(Opcodes.bltz),
                new OpRec_bz(Opcodes.bgez));

            var oprecBI0 = new m_Rec(
                new OpRec(Opcodes.beqi, "Rs,bs,j"),
                new OpRec(Opcodes.bnei, "Rs,bs,j"),
                new OpRec(Opcodes.blti, "Rs,bs,j"),
                new OpRec(Opcodes.bgei, "Rs,bs,j"));

            var oprecBI1 = new m_Rec(
                null,
                null,
                new OpRec(Opcodes.bltui, "Rs,bu,j"),
                new OpRec(Opcodes.bgeui, "Rs,bu,j"));

            var oprecSI = new n_Rec(
                new OpRec(Opcodes.j, "J"),
                oprecBZ,
                oprecBI0,
                oprecBI1);

            var oprecB = new r_Rec(
                new OpRec(Opcodes.bnone, "Rs,Rt,j"),
                new OpRec(Opcodes.beq, "Rs,Rt,j"),
                new OpRec(Opcodes.blt, "Rs,Rt,j"),
                new OpRec(Opcodes.bltu, "Rs,Rt,j"),

                new OpRec(Opcodes.ball, "Rs,Rt,j"),
                new OpRec(Opcodes.bbc, "Rs,Rt,j"),
                new OpRec_bbxi(Opcodes.bbci),
                new OpRec_bbxi(Opcodes.bbci),

                new OpRec(Opcodes.bany, "Rs,Rt,j"),
                new OpRec(Opcodes.bne, "Rs,Rt,j"),
                new OpRec(Opcodes.bge, "Rs,Rt,j"),
                new OpRec(Opcodes.bgeu, "Rs,Rt,j"),

                new OpRec(Opcodes.bnall, "Rs,Rt,j"),
                new OpRec(Opcodes.bbs, "Rs,Rt,j"),
                new OpRec_bbxi(Opcodes.bbsi),
                new OpRec_bbxi(Opcodes.bbsi));

            var oprecST0 = new r_Rec(
                oprecSNM0,
                null,
                oprecSYNC,
                oprecRFEI,

                new OpRec(Opcodes.@break, "Is,It"),
                null,
                new OpRec(Opcodes.rsil, "Rt,Is"),
                null,

                null,
                null,
                null,
                null,

                null,
                null,
                null,
                null);

            var oprecST1 = new r_Rec(
                new OpRec(Opcodes.ssr, "Rs"),
                new OpRec(Opcodes.ssl, "Rs"),
                new OpRec(Opcodes.ssa8l, "Rs"),
                null,

                new OpRec(Opcodes.ssai, "II"),
                reserved,
                null,
                null,

                null,
                reserved,
                reserved,
                reserved,

                reserved,
                reserved,
                new OpRec(Opcodes.nsa, "Rt,Rs"),
                new OpRec(Opcodes.nsau, "Rt,Rs"));

            var oprecST2 = new t_Rec(
                new OpRecMovi_n(),
                new OpRecMovi_n(),
                new OpRecMovi_n(),
                new OpRecMovi_n(),

                new OpRecMovi_n(),
                new OpRecMovi_n(),
                new OpRecMovi_n(),
                new OpRecMovi_n(),

                new OpRecBeqxx_n(Opcodes.beqz_n),
                new OpRecBeqxx_n(Opcodes.beqz_n),
                new OpRecBeqxx_n(Opcodes.beqz_n),
                new OpRecBeqxx_n(Opcodes.beqz_n),

                new OpRecBeqxx_n(Opcodes.bnez_n),
                new OpRecBeqxx_n(Opcodes.bnez_n),
                new OpRecBeqxx_n(Opcodes.bnez_n),
                new OpRecBeqxx_n(Opcodes.bnez_n));

            var oprecS3 = new t_Rec(
                new OpRec(Opcodes.ret_n, "", true),
                reserved,
                reserved,
                reserved,

                reserved,
                reserved,
                reserved,
                reserved,

                reserved,
                reserved,
                reserved,
                reserved,

                reserved,
                reserved,
                reserved,
                reserved);

            var oprecST3 = new r_Rec(
                new OpRec(Opcodes.mov_n, "Rt,Rs", true),
                reserved,
                reserved,
                reserved,

                reserved,
                reserved,
                reserved,
                reserved,

                reserved,
                reserved,
                reserved,
                reserved,

                reserved,
                reserved,
                reserved,
                oprecS3);

            var oprecRT0 = new s_Rec(
                new OpRec(Opcodes.neg, "Rr,Rt"),
                new OpRec(Opcodes.abs, "Rr,Rt"),
                reserved,
                reserved,

                reserved,
                reserved,
                reserved,
                reserved,

                reserved,
                reserved,
                reserved,
                reserved,

                reserved,
                reserved,
                reserved,
                reserved);

            var oprecRST0 = new Op2Rec(
                oprecST0,
                new OpRec(Opcodes.and, "Rr,Rs,Rt"),
                new OpRec(Opcodes.or, "Rr,Rs,Rt"),
                new OpRec(Opcodes.xor, "Rr,Rs,Rt"),

                oprecST1,
                null,
                oprecRT0,
                reserved,

                new OpRec(Opcodes.add, "Rr,Rs,Rt"),
                new OpRec(Opcodes.addx2, "Rr,Rs,Rt"),
                new OpRec(Opcodes.addx4, "Rr,Rs,Rt"),
                new OpRec(Opcodes.addx8, "Rr,Rs,Rt"),

                new OpRec(Opcodes.sub, "Rr,Rs,Rt"),
                new OpRec(Opcodes.subx2, "Rr,Rs,Rt"),
                new OpRec(Opcodes.subx4, "Rr,Rs,Rt"),
                new OpRec(Opcodes.subx8, "Rr,Rs,Rt"));

            var oprecIMP = new r_Rec(
                reserved,
                reserved,
                reserved,
                reserved,

                reserved,
                reserved,
                reserved,
                reserved,

                reserved,
                reserved,
                reserved,
                reserved,

                reserved,
                reserved,
                reserved,
                new OpRec(Opcodes.ldpte, ""));       //$TODO: doesn't appear to be documented

            var oprecRST1 = new Op2Rec(
                new OpRec(Opcodes.slli, "Rr,Rs,IS"),
                new OpRec(Opcodes.slli, "Rr,Rs,IS"),
                new OpRec(Opcodes.srai, "Rr,Rt,IR"),
                new OpRec(Opcodes.srai, "Rr,Rt,IR"),

                new OpRec(Opcodes.srli, "Rr,Rt,Is"),
                reserved,
                null,
                null,

                new OpRec(Opcodes.src, "Rr,Rs,Rt"),
                new OpRec(Opcodes.srl, "Rr,Rt"),
                new OpRec(Opcodes.sll, "Rr,Rs"),
                new OpRec(Opcodes.sra, "Rr,Rs"),

                new OpRec(Opcodes.mul16u, "Rr,Rs,Rt"),
                new OpRec(Opcodes.mul16s, "Rr,Rs,Rt"),
                reserved,
                oprecIMP);

            var oprecRST2 = new Op2Rec(
                new OpRec(Opcodes.andb, "Br,Bs,Bt"),
                new OpRec(Opcodes.andbc, "Br,Bs,Bt"),
                new OpRec(Opcodes.orb, "Br,Bs,Bt"),
                new OpRec(Opcodes.orbc, "Br,Bs,Bt"),

                new OpRec(Opcodes.xorb, "Br,Bs,Bt"),
                reserved,
                reserved,
                reserved,

                new OpRec(Opcodes.mull, "Rr,Rs,Rt"),
                reserved,
                null,
                null,

                new OpRec(Opcodes.quou, "Rr,Rs,Rt"),
                new OpRec(Opcodes.quos, "Rr,Rs,Rt"),
                new OpRec(Opcodes.remu, "Rr,Rs,Rt"),
                new OpRec(Opcodes.rems, "Rr,Rs,Rt"));

            var oprecRST3 = new Op2Rec(
                new OpRec(Opcodes.rsr, "Rt,S"),
                new OpRec(Opcodes.wsr, "Rt,S"),
                null,
                null,

                new OpRec(Opcodes.min, "Rr,Rs,Rt"),
                new OpRec(Opcodes.max, "Rr,Rs,Rt"),
                new OpRec(Opcodes.minu, "Rr,Rs,Rt"),
                new OpRec(Opcodes.maxu, "Rr,Rs,Rt"),

                new OpRec(Opcodes.moveqz, "Rr,Rs,Rt"),
                new OpRec(Opcodes.movnez, "Rr,Rs,Rt"),
                new OpRec(Opcodes.movltz, "Rr,Rs,Rt"),
                new OpRec(Opcodes.movgez, "Rr,Rs,Rt"),

                null,
                null,
                null,
                null);

            var oprecQRST = new Op1Rec(
                oprecRST0,
                oprecRST1,
                oprecRST2,
                oprecRST3,

                new ExtuiOpRec(),
                new ExtuiOpRec(),
                new OpRec(Opcodes.cust0, ""),
                new OpRec(Opcodes.cust1, ""),

                oprecLSCX,
                oprecLSC4,
                oprecFP0,
                oprecFP1,

                new OpRec(Opcodes.reserved, ""),
                new OpRec(Opcodes.reserved, ""),
                new OpRec(Opcodes.reserved, ""),
                new OpRec(Opcodes.reserved, ""));

            var oprecLSAI = new r_Rec(
                new OpRec(Opcodes.l8ui, "Rt,Rs,80"),
                new OpRec(Opcodes.l16ui, "Rt,Rs,81"),
                new OpRec(Opcodes.l32i, "Rt,Rs,82"),
                reserved,

                new OpRec(Opcodes.s8i, "Rt,Rs,80"),
                new OpRec(Opcodes.s16i, "Rt,Rs,81"),
                new OpRec(Opcodes.s32i, "Rt,Rs,82"),
                null,

                null,
                new OpRec(Opcodes.l16si, "Rt,Rs,81"),
                new OpRec(Opcodes.movi, "Rt,i"),
                null,

                new OpRec(Opcodes.addi, "Rt,Rs,m0"),
                new OpRec(Opcodes.addmi, "Rt,Rs,m8"),
                null,
                new OpRec(Opcodes.s32ri, "Rt,Rs,82"));

            var oprecLSCI = new r_Rec(
                reserved,
                reserved,
                reserved,
                reserved,

                new OpRec(Opcodes.ssi, "Ft,Rs,82"),
                reserved,
                reserved,
                reserved,

                new OpRec(Opcodes.lsiu, "Ft,Rs,82"),
                reserved,
                reserved,
                reserved,

                reserved,
                reserved,
                reserved,
                reserved);

            var oprecMACID = new Op1Rec(
                reserved,
                reserved,
                reserved,
                reserved,

                reserved,
                reserved,
                reserved,
                reserved,

                null,
                null,
                null,
                null,

                reserved,
                reserved,
                reserved,
                reserved);
            var oprecMACDD = new Op1Rec(
                reserved,
                reserved,
                reserved,
                reserved,

                null,
                null,
                null,
                null,

                null,
                null,
                null,
                null,

                null,
                null,
                null,
                null);

            var oprecMACC = new Op1Rec(
                reserved,
                reserved,
                reserved,
                reserved,

                reserved,
                reserved,
                reserved,
                reserved,

                reserved,
                reserved,
                reserved,
                reserved,

                reserved,
                reserved,
                reserved,
                reserved);

            var oprecMAC16 = new Op2Rec(
                oprecMACID,
                null,
                oprecMACDD,
                null,

                null,
                null,
                null,
                null,

                null,
                oprecMACC,
                reserved,
                reserved,

                reserved,
                reserved,
                reserved,
                reserved);

            var oprecCALLN = new n_Rec(
                new OpRec(Opcodes.call0, "c"),
                new OpRec(Opcodes.call4, "c"),
                new OpRec(Opcodes.call8, "c"),
                new OpRec(Opcodes.call12, "c"));

            oprecs = new OpRecBase[]
            {
                oprecQRST,
                new OpRec(Opcodes.l32r, "Rt,p"),
                oprecLSAI,
                oprecLSCI,

                oprecMAC16,
                oprecCALLN,
                oprecSI,
                oprecB,

                new OpRec(Opcodes.l32i_n, "Rt,Rs,42", true),
                new OpRec(Opcodes.s32i_n, "Rt,Rs,42", true),
                new OpRec(Opcodes.add_n, "Rr,Rs,Rt", true),
                new OpRec(Opcodes.addi_n, "Rr,Rs,a", true),

                oprecST2,
                oprecST3,
                reserved,
                reserved,
            };
        }
Example #2
0
        static XtensaDisassembler()
        {
            b4const = new int[16]
            {
                -1, 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 16, 32, 64, 128, 256
            };

            b4constu = new int[16]
            {
                0x8000,
                0x10000,
                0x2,
                0x3,
                0x4,
                0x5,
                0x6,
                0x7,

                0x8,
                0xA,
                0xC,
                0x10,
                0x20,
                0x40,
                0x80,
                0x100,
            };

            var reserved = new InstrDecoder(Mnemonic.reserved, "");

            var decoderLSCX = new Op1Decoder(
                new InstrDecoder(Mnemonic.lsx, "T,Rs,Rr"),
                null,
                reserved,
                reserved,

                null,
                null,
                reserved,
                reserved,

                reserved,
                reserved,
                reserved,
                reserved,

                reserved,
                reserved,
                reserved,
                reserved);

            var decoderLSC4 = new Op2Decoder(
                new InstrDecoder(Mnemonic.l32e, "Rt,Rs,e"),
                reserved,
                reserved,
                reserved,

                new InstrDecoder(Mnemonic.s32e, "Rt,Rs,e"),
                reserved,
                reserved,
                reserved,

                reserved,
                reserved,
                reserved,
                reserved,

                reserved,
                reserved,
                reserved,
                reserved);

            var decoderFP0 = new Op2Decoder(
                new InstrDecoder(Mnemonic.add_s, "Fr,Fs,Ft"),
                new InstrDecoder(Mnemonic.sub_s, "Fr,Fs,Ft"),
                new InstrDecoder(Mnemonic.mul_s, "Fr,Fs,Ft"),
                reserved,

                null,
                null,
                null,
                null,

                null,
                null,
                null,
                new InstrDecoder(Mnemonic.floor_s, "Rr,Fs,It"),

                null,
                null,
                null,
                null);

            var decoderFP1 = new Op2Decoder(
                reserved,
                null,
                null,
                new InstrDecoder(Mnemonic.ueq_s, "Br,Fs,Ft"),

                null,
                null,
                null,
                null,

                new InstrDecoder(Mnemonic.moveqz_s, "Fr,Fs,Rt"),
                null,
                null,
                null,

                null,
                null,
                reserved,
                reserved);

            var decoderJR = new n_Rec(
                new InstrDecoder(Mnemonic.ret, ""),
                null,
                new InstrDecoder(Mnemonic.jx, "Rs"),
                reserved);

            var decoderCALLX = new n_Rec(
                new InstrDecoder(Mnemonic.callx0, "Rs"),
                new InstrDecoder(Mnemonic.callx4, "Rs"),
                new InstrDecoder(Mnemonic.callx8, "Rs"),
                new InstrDecoder(Mnemonic.callx12, "Rs"));

            var decoderSNM0 = new m_Rec(
                new InstrDecoder(Mnemonic.ill, InstrClass.Invalid | InstrClass.Zero, ""),
                null,
                decoderJR,
                decoderCALLX);

            var decoderSYNC = new t_Rec(
                new InstrDecoder(Mnemonic.isync, ""),
                null,
                null,
                null,

                null,
                null,
                null,
                null,

                null,
                null,
                null,
                null,

                new InstrDecoder(Mnemonic.memw, ""),
                null,
                null,
                null);

            var decoderRFET = new s_Rec(
                new InstrDecoder(Mnemonic.rfe, ""),
                null,
                null,
                reserved,

                null,
                null,
                reserved,
                reserved,

                reserved,
                reserved,
                reserved,
                reserved,

                reserved,
                reserved,
                reserved,
                reserved);

            var decoderRFEI = new t_Rec(
                decoderRFET,
                new InstrDecoder(Mnemonic.rfi, "Is"),
                null,
                reserved,

                reserved,
                reserved,
                reserved,
                reserved,

                reserved,
                reserved,
                reserved,
                reserved,

                reserved,
                reserved,
                reserved,
                reserved);


            var decoderBZ = new m_Rec(
                new bz_Decoder(Mnemonic.beqz),
                new bz_Decoder(Mnemonic.bnez),
                new bz_Decoder(Mnemonic.bltz),
                new bz_Decoder(Mnemonic.bgez));

            var decoderBI0 = new m_Rec(
                new InstrDecoder(Mnemonic.beqi, "Rs,bs,j"),
                new InstrDecoder(Mnemonic.bnei, "Rs,bs,j"),
                new InstrDecoder(Mnemonic.blti, "Rs,bs,j"),
                new InstrDecoder(Mnemonic.bgei, "Rs,bs,j"));

            var decoderBI1 = new m_Rec(
                null,
                null,
                new InstrDecoder(Mnemonic.bltui, "Rs,bu,j"),
                new InstrDecoder(Mnemonic.bgeui, "Rs,bu,j"));

            var decoderSI = new n_Rec(
                new InstrDecoder(Mnemonic.j, "J"),
                decoderBZ,
                decoderBI0,
                decoderBI1);

            var decoderB = new r_Rec(
                new InstrDecoder(Mnemonic.bnone, "Rs,Rt,j"),
                new InstrDecoder(Mnemonic.beq, "Rs,Rt,j"),
                new InstrDecoder(Mnemonic.blt, "Rs,Rt,j"),
                new InstrDecoder(Mnemonic.bltu, "Rs,Rt,j"),

                new InstrDecoder(Mnemonic.ball, "Rs,Rt,j"),
                new InstrDecoder(Mnemonic.bbc, "Rs,Rt,j"),
                new bbxi_Decoder(Mnemonic.bbci),
                new bbxi_Decoder(Mnemonic.bbci),

                new InstrDecoder(Mnemonic.bany, "Rs,Rt,j"),
                new InstrDecoder(Mnemonic.bne, "Rs,Rt,j"),
                new InstrDecoder(Mnemonic.bge, "Rs,Rt,j"),
                new InstrDecoder(Mnemonic.bgeu, "Rs,Rt,j"),

                new InstrDecoder(Mnemonic.bnall, "Rs,Rt,j"),
                new InstrDecoder(Mnemonic.bbs, "Rs,Rt,j"),
                new bbxi_Decoder(Mnemonic.bbsi),
                new bbxi_Decoder(Mnemonic.bbsi));

            var decoderST0 = new r_Rec(
                decoderSNM0,
                null,
                decoderSYNC,
                decoderRFEI,

                new InstrDecoder(Mnemonic.@break, "Is,It"),
                null,
                new InstrDecoder(Mnemonic.rsil, "Rt,Is"),
                null,

                null,
                null,
                null,
                null,

                null,
                null,
                null,
                null);

            var decoderST1 = new r_Rec(
                new InstrDecoder(Mnemonic.ssr, "Rs"),
                new InstrDecoder(Mnemonic.ssl, "Rs"),
                new InstrDecoder(Mnemonic.ssa8l, "Rs"),
                null,

                new InstrDecoder(Mnemonic.ssai, "II"),
                reserved,
                null,
                null,

                null,
                reserved,
                reserved,
                reserved,

                reserved,
                reserved,
                new InstrDecoder(Mnemonic.nsa, "Rt,Rs"),
                new InstrDecoder(Mnemonic.nsau, "Rt,Rs"));

            var decoderST2 = new t_Rec(
                new Movi_nDecoder(),
                new Movi_nDecoder(),
                new Movi_nDecoder(),
                new Movi_nDecoder(),

                new Movi_nDecoder(),
                new Movi_nDecoder(),
                new Movi_nDecoder(),
                new Movi_nDecoder(),

                new Beqxx_n_Decoder(Mnemonic.beqz_n),
                new Beqxx_n_Decoder(Mnemonic.beqz_n),
                new Beqxx_n_Decoder(Mnemonic.beqz_n),
                new Beqxx_n_Decoder(Mnemonic.beqz_n),

                new Beqxx_n_Decoder(Mnemonic.bnez_n),
                new Beqxx_n_Decoder(Mnemonic.bnez_n),
                new Beqxx_n_Decoder(Mnemonic.bnez_n),
                new Beqxx_n_Decoder(Mnemonic.bnez_n));

            var decoderS3 = new t_Rec(
                new InstrDecoder(Mnemonic.ret_n, "", true),
                reserved,
                reserved,
                reserved,

                reserved,
                reserved,
                reserved,
                reserved,

                reserved,
                reserved,
                reserved,
                reserved,

                reserved,
                reserved,
                reserved,
                reserved);

            var decoderST3 = new r_Rec(
                new InstrDecoder(Mnemonic.mov_n, "Rt,Rs", true),
                reserved,
                reserved,
                reserved,

                reserved,
                reserved,
                reserved,
                reserved,

                reserved,
                reserved,
                reserved,
                reserved,

                reserved,
                reserved,
                reserved,
                decoderS3);

            var decoderRT0 = new s_Rec(
                new InstrDecoder(Mnemonic.neg, "Rr,Rt"),
                new InstrDecoder(Mnemonic.abs, "Rr,Rt"),
                reserved,
                reserved,

                reserved,
                reserved,
                reserved,
                reserved,

                reserved,
                reserved,
                reserved,
                reserved,

                reserved,
                reserved,
                reserved,
                reserved);

            var decoderRST0 = new Op2Decoder(
                decoderST0,
                new InstrDecoder(Mnemonic.and, "Rr,Rs,Rt"),
                new InstrDecoder(Mnemonic.or, "Rr,Rs,Rt"),
                new InstrDecoder(Mnemonic.xor, "Rr,Rs,Rt"),

                decoderST1,
                null,
                decoderRT0,
                reserved,

                new InstrDecoder(Mnemonic.add, "Rr,Rs,Rt"),
                new InstrDecoder(Mnemonic.addx2, "Rr,Rs,Rt"),
                new InstrDecoder(Mnemonic.addx4, "Rr,Rs,Rt"),
                new InstrDecoder(Mnemonic.addx8, "Rr,Rs,Rt"),

                new InstrDecoder(Mnemonic.sub, "Rr,Rs,Rt"),
                new InstrDecoder(Mnemonic.subx2, "Rr,Rs,Rt"),
                new InstrDecoder(Mnemonic.subx4, "Rr,Rs,Rt"),
                new InstrDecoder(Mnemonic.subx8, "Rr,Rs,Rt"));

            var decoderIMP = new r_Rec(
                reserved,
                reserved,
                reserved,
                reserved,

                reserved,
                reserved,
                reserved,
                reserved,

                reserved,
                reserved,
                reserved,
                reserved,

                reserved,
                reserved,
                reserved,
                new InstrDecoder(Mnemonic.ldpte, ""));       //$TODO: doesn't appear to be documented

            var decoderRST1 = new Op2Decoder(
                new InstrDecoder(Mnemonic.slli, "Rr,Rs,IS"),
                new InstrDecoder(Mnemonic.slli, "Rr,Rs,IS"),
                new InstrDecoder(Mnemonic.srai, "Rr,Rt,IR"),
                new InstrDecoder(Mnemonic.srai, "Rr,Rt,IR"),

                new InstrDecoder(Mnemonic.srli, "Rr,Rt,Is"),
                reserved,
                null,
                null,

                new InstrDecoder(Mnemonic.src, "Rr,Rs,Rt"),
                new InstrDecoder(Mnemonic.srl, "Rr,Rt"),
                new InstrDecoder(Mnemonic.sll, "Rr,Rs"),
                new InstrDecoder(Mnemonic.sra, "Rr,Rs"),

                new InstrDecoder(Mnemonic.mul16u, "Rr,Rs,Rt"),
                new InstrDecoder(Mnemonic.mul16s, "Rr,Rs,Rt"),
                reserved,
                decoderIMP);

            var decoderRST2 = new Op2Decoder(
                new InstrDecoder(Mnemonic.andb, "Br,Bs,Bt"),
                new InstrDecoder(Mnemonic.andbc, "Br,Bs,Bt"),
                new InstrDecoder(Mnemonic.orb, "Br,Bs,Bt"),
                new InstrDecoder(Mnemonic.orbc, "Br,Bs,Bt"),

                new InstrDecoder(Mnemonic.xorb, "Br,Bs,Bt"),
                reserved,
                reserved,
                reserved,

                new InstrDecoder(Mnemonic.mull, "Rr,Rs,Rt"),
                reserved,
                null,
                null,

                new InstrDecoder(Mnemonic.quou, "Rr,Rs,Rt"),
                new InstrDecoder(Mnemonic.quos, "Rr,Rs,Rt"),
                new InstrDecoder(Mnemonic.remu, "Rr,Rs,Rt"),
                new InstrDecoder(Mnemonic.rems, "Rr,Rs,Rt"));

            var decoderRST3 = new Op2Decoder(
                new InstrDecoder(Mnemonic.rsr, "Rt,S"),
                new InstrDecoder(Mnemonic.wsr, "Rt,S"),
                null,
                null,

                new InstrDecoder(Mnemonic.min, "Rr,Rs,Rt"),
                new InstrDecoder(Mnemonic.max, "Rr,Rs,Rt"),
                new InstrDecoder(Mnemonic.minu, "Rr,Rs,Rt"),
                new InstrDecoder(Mnemonic.maxu, "Rr,Rs,Rt"),

                new InstrDecoder(Mnemonic.moveqz, "Rr,Rs,Rt"),
                new InstrDecoder(Mnemonic.movnez, "Rr,Rs,Rt"),
                new InstrDecoder(Mnemonic.movltz, "Rr,Rs,Rt"),
                new InstrDecoder(Mnemonic.movgez, "Rr,Rs,Rt"),

                null,
                null,
                null,
                null);

            var decoderQRST = new Op1Decoder(
                decoderRST0,
                decoderRST1,
                decoderRST2,
                decoderRST3,

                new ExtuiDecoder(),
                new ExtuiDecoder(),
                new InstrDecoder(Mnemonic.cust0, ""),
                new InstrDecoder(Mnemonic.cust1, ""),

                decoderLSCX,
                decoderLSC4,
                decoderFP0,
                decoderFP1,

                new InstrDecoder(Mnemonic.reserved, ""),
                new InstrDecoder(Mnemonic.reserved, ""),
                new InstrDecoder(Mnemonic.reserved, ""),
                new InstrDecoder(Mnemonic.reserved, ""));

            var decoderLSAI = new r_Rec(
                new InstrDecoder(Mnemonic.l8ui, "Rt,Rs,80"),
                new InstrDecoder(Mnemonic.l16ui, "Rt,Rs,81"),
                new InstrDecoder(Mnemonic.l32i, "Rt,Rs,82"),
                reserved,

                new InstrDecoder(Mnemonic.s8i, "Rt,Rs,80"),
                new InstrDecoder(Mnemonic.s16i, "Rt,Rs,81"),
                new InstrDecoder(Mnemonic.s32i, "Rt,Rs,82"),
                null,

                null,
                new InstrDecoder(Mnemonic.l16si, "Rt,Rs,81"),
                new InstrDecoder(Mnemonic.movi, "Rt,i"),
                null,

                new InstrDecoder(Mnemonic.addi, "Rt,Rs,m0"),
                new InstrDecoder(Mnemonic.addmi, "Rt,Rs,m8"),
                null,
                new InstrDecoder(Mnemonic.s32ri, "Rt,Rs,82"));

            var decoderLSCI = new r_Rec(
                reserved,
                reserved,
                reserved,
                reserved,

                new InstrDecoder(Mnemonic.ssi, "Ft,Rs,82"),
                reserved,
                reserved,
                reserved,

                new InstrDecoder(Mnemonic.lsiu, "Ft,Rs,82"),
                reserved,
                reserved,
                reserved,

                reserved,
                reserved,
                reserved,
                reserved);

            var decoderMACID = new Op1Decoder(
                reserved,
                reserved,
                reserved,
                reserved,

                reserved,
                reserved,
                reserved,
                reserved,

                null,
                null,
                null,
                null,

                reserved,
                reserved,
                reserved,
                reserved);
            var decoderMACDD = new Op1Decoder(
                reserved,
                reserved,
                reserved,
                reserved,

                null,
                null,
                null,
                null,

                null,
                null,
                null,
                null,

                null,
                null,
                null,
                null);

            var decoderMACC = new Op1Decoder(
                reserved,
                reserved,
                reserved,
                reserved,

                reserved,
                reserved,
                reserved,
                reserved,

                reserved,
                reserved,
                reserved,
                reserved,

                reserved,
                reserved,
                reserved,
                reserved);

            var decoderMAC16 = new Op2Decoder(
                decoderMACID,
                null,
                decoderMACDD,
                null,

                null,
                null,
                null,
                null,

                null,
                decoderMACC,
                reserved,
                reserved,

                reserved,
                reserved,
                reserved,
                reserved);

            var decoderCALLN = new n_Rec(
                new InstrDecoder(Mnemonic.call0, "c"),
                new InstrDecoder(Mnemonic.call4, "c"),
                new InstrDecoder(Mnemonic.call8, "c"),
                new InstrDecoder(Mnemonic.call12, "c"));

            deocders = new Decoder[]
            {
                decoderQRST,
                new InstrDecoder(Mnemonic.l32r, "Rt,p"),
                decoderLSAI,
                decoderLSCI,

                decoderMAC16,
                decoderCALLN,
                decoderSI,
                decoderB,

                new InstrDecoder(Mnemonic.l32i_n, "Rt,Rs,42", true),
                new InstrDecoder(Mnemonic.s32i_n, "Rt,Rs,42", true),
                new InstrDecoder(Mnemonic.add_n, "Rr,Rs,Rt", true),
                new InstrDecoder(Mnemonic.addi_n, "Rr,Rs,a", true),

                decoderST2,
                decoderST3,
                reserved,
                reserved,
            };
        }