Index: src/trusted/validator_mips/gen/decode.cc |
diff --git a/src/trusted/validator_mips/gen/decode.cc b/src/trusted/validator_mips/gen/decode.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..dd45a08159b3bdc81aca5a83fef3be090a84df1a |
--- /dev/null |
+++ b/src/trusted/validator_mips/gen/decode.cc |
@@ -0,0 +1,1305 @@ |
+/* |
+ * DO NOT EDIT: GENERATED CODE |
+ */ |
+#include <stdio.h> |
+#include "native_client/src/trusted/validator_mips/decode.h" |
+ |
+namespace nacl_mips_dec { |
+ |
+/* |
+ * This beast holds a bunch of pre-created ClassDecoder instances, which |
+ * we create in init_decode(). Because ClassDecoders are stateless, we |
+ * can freely reuse them -- even across threads -- and avoid allocating |
+ * in the inner decoder loop. |
+ */ |
+struct DecoderState { |
+ const Load _Load_instance; |
+ const JalImm _JalImm_instance; |
+ const FPLoadStore _FPLoadStore_instance; |
+ const Arithm2 _Arithm2_instance; |
+ const Arithm3 _Arithm3_instance; |
+ const Forbidden _Forbidden_instance; |
+ const Safe _Safe_instance; |
+ const BranchAndLink _BranchAndLink_instance; |
+ const JalReg _JalReg_instance; |
+ const NaClHalt _NaClHalt_instance; |
+ const StoreConditional _StoreConditional_instance; |
+ const Branch _Branch_instance; |
+ const JmpImm _JmpImm_instance; |
+ const JmpReg _JmpReg_instance; |
+ const Store _Store_instance; |
+ const ExtIns _ExtIns_instance; |
+ DecoderState() : |
+ _Load_instance() |
+ ,_JalImm_instance() |
+ ,_FPLoadStore_instance() |
+ ,_Arithm2_instance() |
+ ,_Arithm3_instance() |
+ ,_Forbidden_instance() |
+ ,_Safe_instance() |
+ ,_BranchAndLink_instance() |
+ ,_JalReg_instance() |
+ ,_NaClHalt_instance() |
+ ,_StoreConditional_instance() |
+ ,_Branch_instance() |
+ ,_JmpImm_instance() |
+ ,_JmpReg_instance() |
+ ,_Store_instance() |
+ ,_ExtIns_instance() |
+ {} |
+}; |
+ |
+/* |
+ * Prototypes for static table-matching functions. |
+ */ |
+static inline const ClassDecoder &decode_MIPS32(const Instruction insn, const DecoderState *state); |
+static inline const ClassDecoder &decode_special(const Instruction insn, const DecoderState *state); |
+static inline const ClassDecoder &decode_regimm(const Instruction insn, const DecoderState *state); |
+static inline const ClassDecoder &decode_special2(const Instruction insn, const DecoderState *state); |
+static inline const ClassDecoder &decode_special3(const Instruction insn, const DecoderState *state); |
+static inline const ClassDecoder &decode_movci(const Instruction insn, const DecoderState *state); |
+static inline const ClassDecoder &decode_srl(const Instruction insn, const DecoderState *state); |
+static inline const ClassDecoder &decode_srlv(const Instruction insn, const DecoderState *state); |
+static inline const ClassDecoder &decode_bshfl(const Instruction insn, const DecoderState *state); |
+static inline const ClassDecoder &decode_cop0(const Instruction insn, const DecoderState *state); |
+static inline const ClassDecoder &decode_c0(const Instruction insn, const DecoderState *state); |
+static inline const ClassDecoder &decode_cop1(const Instruction insn, const DecoderState *state); |
+static inline const ClassDecoder &decode_c1(const Instruction insn, const DecoderState *state); |
+static inline const ClassDecoder &decode_movcf(const Instruction insn, const DecoderState *state); |
+static inline const ClassDecoder &decode_cop2(const Instruction insn, const DecoderState *state); |
+static inline const ClassDecoder &decode_cop1x(const Instruction insn, const DecoderState *state); |
+static inline const ClassDecoder &decode_branch_1(const Instruction insn, const DecoderState *state); |
+static inline const ClassDecoder &decode_arithm2_1(const Instruction insn, const DecoderState *state); |
+static inline const ClassDecoder &decode_arithm3_1(const Instruction insn, const DecoderState *state); |
+static inline const ClassDecoder &decode_arithm3_2(const Instruction insn, const DecoderState *state); |
+static inline const ClassDecoder &decode_jr(const Instruction insn, const DecoderState *state); |
+static inline const ClassDecoder &decode_jalr(const Instruction insn, const DecoderState *state); |
+static inline const ClassDecoder &decode_sync(const Instruction insn, const DecoderState *state); |
+static inline const ClassDecoder &decode_mfhi(const Instruction insn, const DecoderState *state); |
+static inline const ClassDecoder &decode_mthi(const Instruction insn, const DecoderState *state); |
+static inline const ClassDecoder &decode_mult(const Instruction insn, const DecoderState *state); |
+static inline const ClassDecoder &decode_arithm3_3(const Instruction insn, const DecoderState *state); |
+static inline const ClassDecoder &decode_mfmc0(const Instruction insn, const DecoderState *state); |
+static inline const ClassDecoder &decode_mfc1(const Instruction insn, const DecoderState *state); |
+static inline const ClassDecoder &decode_mtc1(const Instruction insn, const DecoderState *state); |
+static inline const ClassDecoder &decode_bc1(const Instruction insn, const DecoderState *state); |
+static inline const ClassDecoder &decode_fp(const Instruction insn, const DecoderState *state); |
+static inline const ClassDecoder &decode_bc2(const Instruction insn, const DecoderState *state); |
+static inline const ClassDecoder &decode_c_cond_fmt(const Instruction insn, const DecoderState *state); |
+ |
+/* |
+ * Table-matching function implementations. |
+ */ |
+ |
+/* |
+ * Implementation of table MIPS32. |
+ * Specified by: See Table A.2. |
+ */ |
+static inline const ClassDecoder &decode_MIPS32(const Instruction insn, const DecoderState *state) { |
+ if (((insn & 0xFC000000) == 0x00000000)) { |
+ return decode_special(insn, state); |
+ } |
+ |
+ if (((insn & 0xFC000000) == 0x04000000)) { |
+ return decode_regimm(insn, state); |
+ } |
+ |
+ if (((insn & 0xFC000000) == 0x08000000)) { |
+ return state->_JmpImm_instance; |
+ } |
+ |
+ if (((insn & 0xFC000000) == 0x0C000000)) { |
+ return state->_JalImm_instance; |
+ } |
+ |
+ if (((insn & 0xFC000000) == 0x38000000)) { |
+ return state->_Arithm2_instance; |
+ } |
+ |
+ if (((insn & 0xFC000000) == 0x3C000000)) { |
+ return decode_arithm2_1(insn, state); |
+ } |
+ |
+ if (((insn & 0xFC000000) == 0x40000000)) { |
+ return decode_cop0(insn, state); |
+ } |
+ |
+ if (((insn & 0xFC000000) == 0x44000000)) { |
+ return decode_cop1(insn, state); |
+ } |
+ |
+ if (((insn & 0xFC000000) == 0x48000000)) { |
+ return decode_cop2(insn, state); |
+ } |
+ |
+ if (((insn & 0xFC000000) == 0x4C000000)) { |
+ return decode_cop1x(insn, state); |
+ } |
+ |
+ if (((insn & 0xFC000000) == 0x70000000)) { |
+ return decode_special2(insn, state); |
+ } |
+ |
+ if (((insn & 0xFC000000) == 0x74000000)) { |
+ return state->_Forbidden_instance; |
+ } |
+ |
+ if (((insn & 0xFC000000) == 0x78000000)) { |
+ return state->_Forbidden_instance; |
+ } |
+ |
+ if (((insn & 0xFC000000) == 0x7C000000)) { |
+ return decode_special3(insn, state); |
+ } |
+ |
+ if (((insn & 0xFC000000) == 0x98000000)) { |
+ return state->_Load_instance; |
+ } |
+ |
+ if (((insn & 0xFC000000) == 0xB8000000)) { |
+ return state->_Store_instance; |
+ } |
+ |
+ if (((insn & 0xFC000000) == 0xC0000000)) { |
+ return state->_Load_instance; |
+ } |
+ |
+ if (((insn & 0xFC000000) == 0xE0000000)) { |
+ return state->_StoreConditional_instance; |
+ } |
+ |
+ if (((insn & 0xDC000000) == 0x9C000000)) { |
+ return state->_Forbidden_instance; |
+ } |
+ |
+ if (((insn & 0xDC000000) == 0xD0000000)) { |
+ return state->_Forbidden_instance; |
+ } |
+ |
+ if (((insn & 0xF8000000) == 0x30000000)) { |
+ return state->_Arithm2_instance; |
+ } |
+ |
+ if (((insn & 0xF8000000) == 0x90000000)) { |
+ return state->_Load_instance; |
+ } |
+ |
+ if (((insn & 0xF8000000) == 0xB0000000)) { |
+ return state->_Forbidden_instance; |
+ } |
+ |
+ if (((insn & 0xB8000000) == 0x10000000)) { |
+ return state->_Branch_instance; |
+ } |
+ |
+ if (((insn & 0xB8000000) == 0x18000000)) { |
+ return decode_branch_1(insn, state); |
+ } |
+ |
+ if (((insn & 0xCC000000) == 0xC4000000)) { |
+ return state->_FPLoadStore_instance; |
+ } |
+ |
+ if (((insn & 0xCC000000) == 0xC8000000)) { |
+ return state->_FPLoadStore_instance; |
+ } |
+ |
+ if (((insn & 0xCC000000) == 0xCC000000)) { |
+ return state->_Forbidden_instance; |
+ } |
+ |
+ if (((insn & 0xF0000000) == 0x20000000)) { |
+ return state->_Arithm2_instance; |
+ } |
+ |
+ if (((insn & 0xF0000000) == 0x60000000)) { |
+ return state->_Forbidden_instance; |
+ } |
+ |
+ if (((insn & 0xF0000000) == 0x80000000)) { |
+ return state->_Load_instance; |
+ } |
+ |
+ if (((insn & 0xF0000000) == 0xA0000000)) { |
+ return state->_Store_instance; |
+ } |
+ |
+ // Catch any attempt to fall through... |
+ fprintf(stderr, "TABLE IS INCOMPLETE: MIPS32 could not parse %08X",insn.Bits(31,0)); |
+ return state->_Forbidden_instance; |
+} |
+ |
+/* |
+ * Implementation of table special. |
+ * Specified by: See Table A.3. |
+ */ |
+static inline const ClassDecoder &decode_special(const Instruction insn, const DecoderState *state) { |
+ if (((insn & 0x0000003F) == 0x00000000)) { |
+ return decode_arithm3_1(insn, state); |
+ } |
+ |
+ if (((insn & 0x0000003F) == 0x00000001)) { |
+ return decode_movci(insn, state); |
+ } |
+ |
+ if (((insn & 0x0000003F) == 0x00000002)) { |
+ return decode_srl(insn, state); |
+ } |
+ |
+ if (((insn & 0x0000003F) == 0x00000003)) { |
+ return decode_arithm3_1(insn, state); |
+ } |
+ |
+ if (((insn & 0x0000003F) == 0x00000004)) { |
+ return decode_arithm3_2(insn, state); |
+ } |
+ |
+ if (((insn & 0x0000003F) == 0x00000006)) { |
+ return decode_srlv(insn, state); |
+ } |
+ |
+ if (((insn & 0x0000003F) == 0x00000007)) { |
+ return decode_arithm3_2(insn, state); |
+ } |
+ |
+ if (((insn & 0x0000003F) == 0x00000008)) { |
+ return decode_jr(insn, state); |
+ } |
+ |
+ if (((insn & 0x0000003F) == 0x00000009)) { |
+ return decode_jalr(insn, state); |
+ } |
+ |
+ if (((insn & 0x0000003F) == 0x0000000F)) { |
+ return decode_sync(insn, state); |
+ } |
+ |
+ if (((insn & 0x00000037) == 0x00000005)) { |
+ return state->_Forbidden_instance; |
+ } |
+ |
+ if (((insn & 0x0000003D) == 0x0000000C)) { |
+ return state->_Forbidden_instance; |
+ } |
+ |
+ if (((insn & 0x0000003D) == 0x00000010)) { |
+ return decode_mfhi(insn, state); |
+ } |
+ |
+ if (((insn & 0x0000003D) == 0x00000011)) { |
+ return decode_mthi(insn, state); |
+ } |
+ |
+ if (((insn & 0x0000003E) == 0x0000000A)) { |
+ return decode_arithm3_2(insn, state); |
+ } |
+ |
+ if (((insn & 0x0000003E) == 0x0000002A)) { |
+ return decode_arithm3_3(insn, state); |
+ } |
+ |
+ if (((insn & 0x0000003E) == 0x0000003C)) { |
+ return state->_Forbidden_instance; |
+ } |
+ |
+ if (((insn & 0x0000002E) == 0x0000002E)) { |
+ return state->_Forbidden_instance; |
+ } |
+ |
+ if (((insn & 0x0000003A) == 0x00000028)) { |
+ return state->_Forbidden_instance; |
+ } |
+ |
+ if (((insn & 0x0000003C) == 0x00000018)) { |
+ return decode_mult(insn, state); |
+ } |
+ |
+ if (((insn & 0x0000003C) == 0x00000038)) { |
+ return state->_Forbidden_instance; |
+ } |
+ |
+ if (((insn & 0x00000034) == 0x00000014)) { |
+ return state->_Forbidden_instance; |
+ } |
+ |
+ if (((insn & 0x00000038) == 0x00000020)) { |
+ return decode_arithm3_3(insn, state); |
+ } |
+ |
+ if (((insn & 0x00000038) == 0x00000030)) { |
+ return state->_Forbidden_instance; |
+ } |
+ |
+ // Catch any attempt to fall through... |
+ fprintf(stderr, "TABLE IS INCOMPLETE: special could not parse %08X",insn.Bits(31,0)); |
+ return state->_Forbidden_instance; |
+} |
+ |
+/* |
+ * Implementation of table regimm. |
+ * Specified by: See Table A.4. |
+ */ |
+static inline const ClassDecoder &decode_regimm(const Instruction insn, const DecoderState *state) { |
+ if (((insn & 0x001C0000) == 0x00000000)) { |
+ return state->_Branch_instance; |
+ } |
+ |
+ if (((insn & 0x001C0000) == 0x00100000)) { |
+ return state->_BranchAndLink_instance; |
+ } |
+ |
+ if (((insn & 0x000C0000) == 0x00080000)) { |
+ return state->_Forbidden_instance; |
+ } |
+ |
+ if (((insn & 0x00040000) == 0x00040000)) { |
+ return state->_Forbidden_instance; |
+ } |
+ |
+ // Catch any attempt to fall through... |
+ fprintf(stderr, "TABLE IS INCOMPLETE: regimm could not parse %08X",insn.Bits(31,0)); |
+ return state->_Forbidden_instance; |
+} |
+ |
+/* |
+ * Implementation of table special2. |
+ * Specified by: See Table A.5. |
+ */ |
+static inline const ClassDecoder &decode_special2(const Instruction insn, const DecoderState *state) { |
+ if (((insn & 0x0000003F) == 0x00000002)) { |
+ return decode_arithm3_2(insn, state); |
+ } |
+ |
+ if (((insn & 0x0000003F) == 0x0000003F)) { |
+ return state->_Forbidden_instance; |
+ } |
+ |
+ if (((insn & 0x0000001F) == 0x0000001E)) { |
+ return state->_Forbidden_instance; |
+ } |
+ |
+ if (((insn & 0x0000002F) == 0x0000000F)) { |
+ return state->_Forbidden_instance; |
+ } |
+ |
+ if (((insn & 0x00000037) == 0x00000006)) { |
+ return state->_Forbidden_instance; |
+ } |
+ |
+ if (((insn & 0x0000003B) == 0x00000003)) { |
+ return state->_Forbidden_instance; |
+ } |
+ |
+ if (((insn & 0x0000003E) == 0x00000020)) { |
+ return decode_arithm3_2(insn, state); |
+ } |
+ |
+ if (((insn & 0x0000003E) == 0x0000002E)) { |
+ return state->_Forbidden_instance; |
+ } |
+ |
+ if (((insn & 0x0000003E) == 0x0000003C)) { |
+ return state->_Forbidden_instance; |
+ } |
+ |
+ if (((insn & 0x0000002E) == 0x0000000C)) { |
+ return state->_Forbidden_instance; |
+ } |
+ |
+ if (((insn & 0x00000036) == 0x00000024)) { |
+ return state->_Forbidden_instance; |
+ } |
+ |
+ if (((insn & 0x0000003A) == 0x00000000)) { |
+ return decode_mult(insn, state); |
+ } |
+ |
+ if (((insn & 0x0000003A) == 0x00000022)) { |
+ return state->_Forbidden_instance; |
+ } |
+ |
+ if (((insn & 0x0000000C) == 0x00000008)) { |
+ return state->_Forbidden_instance; |
+ } |
+ |
+ if (((insn & 0x00000018) == 0x00000010)) { |
+ return state->_Forbidden_instance; |
+ } |
+ |
+ // Catch any attempt to fall through... |
+ fprintf(stderr, "TABLE IS INCOMPLETE: special2 could not parse %08X",insn.Bits(31,0)); |
+ return state->_Forbidden_instance; |
+} |
+ |
+/* |
+ * Implementation of table special3. |
+ * Specified by: See Table A.6. |
+ */ |
+static inline const ClassDecoder &decode_special3(const Instruction insn, const DecoderState *state) { |
+ if (((insn & 0x0000003F) == 0x00000020)) { |
+ return decode_bshfl(insn, state); |
+ } |
+ |
+ if (((insn & 0x0000003F) == 0x0000003F)) { |
+ return state->_Forbidden_instance; |
+ } |
+ |
+ if (((insn & 0x0000002F) == 0x0000002E)) { |
+ return state->_Forbidden_instance; |
+ } |
+ |
+ if (((insn & 0x00000037) == 0x00000027)) { |
+ return state->_Forbidden_instance; |
+ } |
+ |
+ if (((insn & 0x0000003B) == 0x00000000)) { |
+ return state->_ExtIns_instance; |
+ } |
+ |
+ if (((insn & 0x0000003D) == 0x00000021)) { |
+ return state->_Forbidden_instance; |
+ } |
+ |
+ if (((insn & 0x0000003E) == 0x0000003C)) { |
+ return state->_Forbidden_instance; |
+ } |
+ |
+ if (((insn & 0x0000001B) == 0x00000002)) { |
+ return state->_Forbidden_instance; |
+ } |
+ |
+ if (((insn & 0x00000036) == 0x00000024)) { |
+ return state->_Forbidden_instance; |
+ } |
+ |
+ if (((insn & 0x00000039) == 0x00000001)) { |
+ return state->_Forbidden_instance; |
+ } |
+ |
+ if (((insn & 0x0000002C) == 0x00000028)) { |
+ return state->_Forbidden_instance; |
+ } |
+ |
+ if (((insn & 0x00000018) == 0x00000010)) { |
+ return state->_Forbidden_instance; |
+ } |
+ |
+ if (((insn & 0x00000028) == 0x00000008)) { |
+ return state->_Forbidden_instance; |
+ } |
+ |
+ // Catch any attempt to fall through... |
+ fprintf(stderr, "TABLE IS INCOMPLETE: special3 could not parse %08X",insn.Bits(31,0)); |
+ return state->_Forbidden_instance; |
+} |
+ |
+/* |
+ * Implementation of table movci. |
+ * Specified by: See Table A.7. |
+ */ |
+static inline const ClassDecoder &decode_movci(const Instruction insn, const DecoderState *state) { |
+ if (((insn & 0x00020000) == 0x00000000) && ((insn & 0x000007C0) == 0x00000000)) { |
+ return state->_Arithm3_instance; |
+ } |
+ |
+ if (((insn & 0x00020000) == 0x00020000) && ((insn & 0x000007C0) == 0x00000000)) { |
+ return state->_Forbidden_instance; |
+ } |
+ |
+ if ((true) && ((insn & 0x000007C0) != 0x00000000)) { |
+ return state->_Forbidden_instance; |
+ } |
+ |
+ // Catch any attempt to fall through... |
+ fprintf(stderr, "TABLE IS INCOMPLETE: movci could not parse %08X",insn.Bits(31,0)); |
+ return state->_Forbidden_instance; |
+} |
+ |
+/* |
+ * Implementation of table srl. |
+ * Specified by: See Table A.8. |
+ */ |
+static inline const ClassDecoder &decode_srl(const Instruction insn, const DecoderState *state) { |
+ if (((insn & 0x03C00000) != 0x00000000)) { |
+ return state->_Forbidden_instance; |
+ } |
+ |
+ if (((insn & 0x03C00000) == 0x00000000)) { |
+ return state->_Arithm3_instance; |
+ } |
+ |
+ // Catch any attempt to fall through... |
+ fprintf(stderr, "TABLE IS INCOMPLETE: srl could not parse %08X",insn.Bits(31,0)); |
+ return state->_Forbidden_instance; |
+} |
+ |
+/* |
+ * Implementation of table srlv. |
+ * Specified by: See Table A.9. |
+ */ |
+static inline const ClassDecoder &decode_srlv(const Instruction insn, const DecoderState *state) { |
+ if (((insn & 0x00000780) != 0x00000000)) { |
+ return state->_Forbidden_instance; |
+ } |
+ |
+ if (((insn & 0x00000780) == 0x00000000)) { |
+ return state->_Arithm3_instance; |
+ } |
+ |
+ // Catch any attempt to fall through... |
+ fprintf(stderr, "TABLE IS INCOMPLETE: srlv could not parse %08X",insn.Bits(31,0)); |
+ return state->_Forbidden_instance; |
+} |
+ |
+/* |
+ * Implementation of table bshfl. |
+ * Specified by: See Table A.10. |
+ */ |
+static inline const ClassDecoder &decode_bshfl(const Instruction insn, const DecoderState *state) { |
+ if (((insn & 0x000007C0) == 0x00000080)) { |
+ return decode_arithm3_1(insn, state); |
+ } |
+ |
+ if (((insn & 0x000007C0) == 0x000005C0)) { |
+ return state->_Forbidden_instance; |
+ } |
+ |
+ if (((insn & 0x000003C0) == 0x000003C0)) { |
+ return state->_Forbidden_instance; |
+ } |
+ |
+ if (((insn & 0x000005C0) == 0x00000180)) { |
+ return state->_Forbidden_instance; |
+ } |
+ |
+ if (((insn & 0x000005C0) == 0x00000400)) { |
+ return decode_arithm3_1(insn, state); |
+ } |
+ |
+ if (((insn & 0x000006C0) == 0x000000C0)) { |
+ return state->_Forbidden_instance; |
+ } |
+ |
+ if (((insn & 0x00000780) == 0x00000500)) { |
+ return state->_Forbidden_instance; |
+ } |
+ |
+ if (((insn & 0x00000380) == 0x00000300)) { |
+ return state->_Forbidden_instance; |
+ } |
+ |
+ if (((insn & 0x000004C0) == 0x00000480)) { |
+ return state->_Forbidden_instance; |
+ } |
+ |
+ if (((insn & 0x00000540) == 0x00000440)) { |
+ return state->_Forbidden_instance; |
+ } |
+ |
+ if (((insn & 0x00000680) == 0x00000000)) { |
+ return state->_Forbidden_instance; |
+ } |
+ |
+ if (((insn & 0x00000700) == 0x00000200)) { |
+ return state->_Forbidden_instance; |
+ } |
+ |
+ // Catch any attempt to fall through... |
+ fprintf(stderr, "TABLE IS INCOMPLETE: bshfl could not parse %08X",insn.Bits(31,0)); |
+ return state->_Forbidden_instance; |
+} |
+ |
+/* |
+ * Implementation of table cop0. |
+ * Specified by: See Table A.11. |
+ */ |
+static inline const ClassDecoder &decode_cop0(const Instruction insn, const DecoderState *state) { |
+ if (((insn & 0x03E00000) == 0x01600000)) { |
+ return decode_mfmc0(insn, state); |
+ } |
+ |
+ if (((insn & 0x03E00000) == 0x02000000)) { |
+ return decode_c0(insn, state); |
+ } |
+ |
+ if (((insn & 0x03E00000) == 0x02E00000)) { |
+ return state->_Forbidden_instance; |
+ } |
+ |
+ if (((insn & 0x03E00000) == 0x03C00000)) { |
+ return state->_Forbidden_instance; |
+ } |
+ |
+ if (((insn & 0x01E00000) == 0x01E00000)) { |
+ return state->_Forbidden_instance; |
+ } |
+ |
+ if (((insn & 0x03600000) == 0x01400000)) { |
+ return state->_Forbidden_instance; |
+ } |
+ |
+ if (((insn & 0x03600000) == 0x02400000)) { |
+ return state->_Forbidden_instance; |
+ } |
+ |
+ if (((insn & 0x03A00000) == 0x02200000)) { |
+ return state->_Forbidden_instance; |
+ } |
+ |
+ if (((insn & 0x02C00000) == 0x02800000)) { |
+ return state->_Forbidden_instance; |
+ } |
+ |
+ if (((insn & 0x03400000) == 0x01000000)) { |
+ return state->_Forbidden_instance; |
+ } |
+ |
+ if (((insn & 0x03800000) == 0x03000000)) { |
+ return state->_Forbidden_instance; |
+ } |
+ |
+ if (((insn & 0x03000000) == 0x00000000)) { |
+ return state->_Forbidden_instance; |
+ } |
+ |
+ // Catch any attempt to fall through... |
+ fprintf(stderr, "TABLE IS INCOMPLETE: cop0 could not parse %08X",insn.Bits(31,0)); |
+ return state->_Forbidden_instance; |
+} |
+ |
+/* |
+ * Implementation of table c0. |
+ * Specified by: See Table A.12. |
+ */ |
+static inline const ClassDecoder &decode_c0(const Instruction insn, const DecoderState *state) { |
+ if ((true)) { |
+ return state->_Forbidden_instance; |
+ } |
+ |
+ // Catch any attempt to fall through... |
+ fprintf(stderr, "TABLE IS INCOMPLETE: c0 could not parse %08X",insn.Bits(31,0)); |
+ return state->_Forbidden_instance; |
+} |
+ |
+/* |
+ * Implementation of table cop1. |
+ * Specified by: See Table A.13. |
+ */ |
+static inline const ClassDecoder &decode_cop1(const Instruction insn, const DecoderState *state) { |
+ if (((insn & 0x03E00000) == 0x00000000)) { |
+ return decode_mfc1(insn, state); |
+ } |
+ |
+ if (((insn & 0x03E00000) == 0x00600000)) { |
+ return decode_mfc1(insn, state); |
+ } |
+ |
+ if (((insn & 0x03E00000) == 0x00800000)) { |
+ return decode_mtc1(insn, state); |
+ } |
+ |
+ if (((insn & 0x03E00000) == 0x00E00000)) { |
+ return decode_mtc1(insn, state); |
+ } |
+ |
+ if (((insn & 0x03E00000) == 0x01000000)) { |
+ return decode_bc1(insn, state); |
+ } |
+ |
+ if (((insn & 0x03E00000) == 0x01E00000)) { |
+ return state->_Forbidden_instance; |
+ } |
+ |
+ if (((insn & 0x03600000) == 0x00200000)) { |
+ return state->_Forbidden_instance; |
+ } |
+ |
+ if (((insn & 0x03A00000) == 0x01200000)) { |
+ return state->_Forbidden_instance; |
+ } |
+ |
+ if (((insn & 0x03C00000) == 0x01800000)) { |
+ return state->_Forbidden_instance; |
+ } |
+ |
+ if (((insn & 0x03C00000) == 0x02400000)) { |
+ return state->_Forbidden_instance; |
+ } |
+ |
+ if (((insn & 0x03C00000) == 0x03800000)) { |
+ return decode_c1(insn, state); |
+ } |
+ |
+ if (((insn & 0x02600000) == 0x00400000)) { |
+ return state->_Forbidden_instance; |
+ } |
+ |
+ if (((insn & 0x02C00000) == 0x02C00000)) { |
+ return decode_c1(insn, state); |
+ } |
+ |
+ if (((insn & 0x03400000) == 0x02000000)) { |
+ return decode_c1(insn, state); |
+ } |
+ |
+ if (((insn & 0x03800000) == 0x03000000)) { |
+ return decode_c1(insn, state); |
+ } |
+ |
+ // Catch any attempt to fall through... |
+ fprintf(stderr, "TABLE IS INCOMPLETE: cop1 could not parse %08X",insn.Bits(31,0)); |
+ return state->_Forbidden_instance; |
+} |
+ |
+/* |
+ * Implementation of table c1. |
+ * Specified by: See Table A.14, A.15, A.16, A.17. |
+ */ |
+static inline const ClassDecoder &decode_c1(const Instruction insn, const DecoderState *state) { |
+ if (((insn & 0x0000003F) == 0x00000011)) { |
+ return decode_movcf(insn, state); |
+ } |
+ |
+ if (((insn & 0x0000003F) == 0x00000015)) { |
+ return decode_fp(insn, state); |
+ } |
+ |
+ if (((insn & 0x0000003F) == 0x00000016)) { |
+ return decode_fp(insn, state); |
+ } |
+ |
+ if (((insn & 0x0000003F) == 0x0000001E)) { |
+ return state->_Forbidden_instance; |
+ } |
+ |
+ if (((insn & 0x0000003F) == 0x00000027)) { |
+ return state->_Forbidden_instance; |
+ } |
+ |
+ if (((insn & 0x0000003F) == 0x00000028)) { |
+ return decode_fp(insn, state); |
+ } |
+ |
+ if (((insn & 0x0000003F) == 0x0000002A)) { |
+ return state->_Forbidden_instance; |
+ } |
+ |
+ if (((insn & 0x0000003F) == 0x0000002F)) { |
+ return state->_Safe_instance; |
+ } |
+ |
+ if (((insn & 0x00000037) == 0x00000017)) { |
+ return state->_Forbidden_instance; |
+ } |
+ |
+ if (((insn & 0x00000037) == 0x00000026)) { |
+ return state->_Safe_instance; |
+ } |
+ |
+ if (((insn & 0x0000003B) == 0x00000010)) { |
+ return state->_Forbidden_instance; |
+ } |
+ |
+ if (((insn & 0x0000003D) == 0x00000029)) { |
+ return state->_Forbidden_instance; |
+ } |
+ |
+ if (((insn & 0x0000003E) == 0x00000012)) { |
+ return state->_Safe_instance; |
+ } |
+ |
+ if (((insn & 0x0000003E) == 0x0000001C)) { |
+ return state->_Forbidden_instance; |
+ } |
+ |
+ if (((insn & 0x0000003E) == 0x00000022)) { |
+ return state->_Forbidden_instance; |
+ } |
+ |
+ if (((insn & 0x0000003E) == 0x0000002C)) { |
+ return state->_Safe_instance; |
+ } |
+ |
+ if (((insn & 0x0000003A) == 0x00000020)) { |
+ return decode_fp(insn, state); |
+ } |
+ |
+ if (((insn & 0x0000003C) == 0x00000000)) { |
+ return state->_Safe_instance; |
+ } |
+ |
+ if (((insn & 0x0000003C) == 0x00000008)) { |
+ return decode_fp(insn, state); |
+ } |
+ |
+ if (((insn & 0x0000003C) == 0x00000018)) { |
+ return state->_Forbidden_instance; |
+ } |
+ |
+ if (((insn & 0x00000034) == 0x00000004)) { |
+ return decode_fp(insn, state); |
+ } |
+ |
+ if (((insn & 0x00000030) == 0x00000030)) { |
+ return decode_c_cond_fmt(insn, state); |
+ } |
+ |
+ // Catch any attempt to fall through... |
+ fprintf(stderr, "TABLE IS INCOMPLETE: c1 could not parse %08X",insn.Bits(31,0)); |
+ return state->_Forbidden_instance; |
+} |
+ |
+/* |
+ * Implementation of table movcf. |
+ * Specified by: See Table A.18. |
+ */ |
+static inline const ClassDecoder &decode_movcf(const Instruction insn, const DecoderState *state) { |
+ if (((insn & 0x00020000) == 0x00000000)) { |
+ return state->_Safe_instance; |
+ } |
+ |
+ if (((insn & 0x00020000) == 0x00020000)) { |
+ return state->_Forbidden_instance; |
+ } |
+ |
+ // Catch any attempt to fall through... |
+ fprintf(stderr, "TABLE IS INCOMPLETE: movcf could not parse %08X",insn.Bits(31,0)); |
+ return state->_Forbidden_instance; |
+} |
+ |
+/* |
+ * Implementation of table cop2. |
+ * Specified by: See Table A.19. |
+ */ |
+static inline const ClassDecoder &decode_cop2(const Instruction insn, const DecoderState *state) { |
+ if (((insn & 0x03E00000) == 0x01000000)) { |
+ return decode_bc2(insn, state); |
+ } |
+ |
+ if (((insn & 0x03E00000) == 0x03C00000)) { |
+ return state->_Forbidden_instance; |
+ } |
+ |
+ if (((insn & 0x01E00000) == 0x01E00000)) { |
+ return state->_Forbidden_instance; |
+ } |
+ |
+ if (((insn & 0x03600000) == 0x01400000)) { |
+ return state->_Forbidden_instance; |
+ } |
+ |
+ if (((insn & 0x03A00000) == 0x01200000)) { |
+ return state->_Forbidden_instance; |
+ } |
+ |
+ if (((insn & 0x01C00000) == 0x01800000)) { |
+ return state->_Forbidden_instance; |
+ } |
+ |
+ if (((insn & 0x03800000) == 0x03000000)) { |
+ return state->_Forbidden_instance; |
+ } |
+ |
+ if (((insn & 0x01000000) == 0x00000000)) { |
+ return state->_Forbidden_instance; |
+ } |
+ |
+ // Catch any attempt to fall through... |
+ fprintf(stderr, "TABLE IS INCOMPLETE: cop2 could not parse %08X",insn.Bits(31,0)); |
+ return state->_Forbidden_instance; |
+} |
+ |
+/* |
+ * Implementation of table cop1x. |
+ * Specified by: See Table A.20. |
+ */ |
+static inline const ClassDecoder &decode_cop1x(const Instruction insn, const DecoderState *state) { |
+ if (((insn & 0x0000003F) == 0x00000036)) { |
+ return state->_Safe_instance; |
+ } |
+ |
+ if (((insn & 0x0000003F) == 0x00000037)) { |
+ return state->_Forbidden_instance; |
+ } |
+ |
+ if (((insn & 0x0000001F) == 0x0000001E)) { |
+ return state->_Safe_instance; |
+ } |
+ |
+ if (((insn & 0x0000001F) == 0x0000001F)) { |
+ return state->_Forbidden_instance; |
+ } |
+ |
+ if (((insn & 0x00000037) == 0x00000026)) { |
+ return state->_Safe_instance; |
+ } |
+ |
+ if (((insn & 0x00000037) == 0x00000027)) { |
+ return state->_Forbidden_instance; |
+ } |
+ |
+ if (((insn & 0x0000003E) == 0x00000034)) { |
+ return state->_Forbidden_instance; |
+ } |
+ |
+ if (((insn & 0x0000001E) == 0x0000001C)) { |
+ return state->_Forbidden_instance; |
+ } |
+ |
+ if (((insn & 0x00000036) == 0x00000024)) { |
+ return state->_Forbidden_instance; |
+ } |
+ |
+ if (((insn & 0x0000003C) == 0x00000018)) { |
+ return state->_Forbidden_instance; |
+ } |
+ |
+ if (((insn & 0x00000026) == 0x00000020)) { |
+ return state->_Safe_instance; |
+ } |
+ |
+ if (((insn & 0x00000026) == 0x00000022)) { |
+ return state->_Forbidden_instance; |
+ } |
+ |
+ if (((insn & 0x00000038) == 0x00000010)) { |
+ return state->_Forbidden_instance; |
+ } |
+ |
+ if (((insn & 0x00000030) == 0x00000000)) { |
+ return state->_Forbidden_instance; |
+ } |
+ |
+ // Catch any attempt to fall through... |
+ fprintf(stderr, "TABLE IS INCOMPLETE: cop1x could not parse %08X",insn.Bits(31,0)); |
+ return state->_Forbidden_instance; |
+} |
+ |
+/* |
+ * Implementation of table branch_1. |
+ * Specified by: blez, bgtz, blezl, bgtzl. |
+ */ |
+static inline const ClassDecoder &decode_branch_1(const Instruction insn, const DecoderState *state) { |
+ if (((insn & 0x001F0000) != 0x00000000)) { |
+ return state->_Forbidden_instance; |
+ } |
+ |
+ if (((insn & 0x001F0000) == 0x00000000)) { |
+ return state->_Branch_instance; |
+ } |
+ |
+ // Catch any attempt to fall through... |
+ fprintf(stderr, "TABLE IS INCOMPLETE: branch_1 could not parse %08X",insn.Bits(31,0)); |
+ return state->_Forbidden_instance; |
+} |
+ |
+/* |
+ * Implementation of table arithm2_1. |
+ * Specified by: lui. |
+ */ |
+static inline const ClassDecoder &decode_arithm2_1(const Instruction insn, const DecoderState *state) { |
+ if (((insn & 0x03E00000) != 0x00000000)) { |
+ return state->_Forbidden_instance; |
+ } |
+ |
+ if (((insn & 0x03E00000) == 0x00000000)) { |
+ return state->_Arithm2_instance; |
+ } |
+ |
+ // Catch any attempt to fall through... |
+ fprintf(stderr, "TABLE IS INCOMPLETE: arithm2_1 could not parse %08X",insn.Bits(31,0)); |
+ return state->_Forbidden_instance; |
+} |
+ |
+/* |
+ * Implementation of table arithm3_1. |
+ * Specified by: sll, sra, wsbh, seb, seh. |
+ */ |
+static inline const ClassDecoder &decode_arithm3_1(const Instruction insn, const DecoderState *state) { |
+ if (((insn & 0x03E00000) != 0x00000000)) { |
+ return state->_Forbidden_instance; |
+ } |
+ |
+ if (((insn & 0x03E00000) == 0x00000000)) { |
+ return state->_Arithm3_instance; |
+ } |
+ |
+ // Catch any attempt to fall through... |
+ fprintf(stderr, "TABLE IS INCOMPLETE: arithm3_1 could not parse %08X",insn.Bits(31,0)); |
+ return state->_Forbidden_instance; |
+} |
+ |
+/* |
+ * Implementation of table arithm3_2. |
+ * Specified by: sllv, srav, movz, movn, mul, clz, clo. |
+ */ |
+static inline const ClassDecoder &decode_arithm3_2(const Instruction insn, const DecoderState *state) { |
+ if (((insn & 0x000007C0) != 0x00000000)) { |
+ return state->_Forbidden_instance; |
+ } |
+ |
+ if (((insn & 0x000007C0) == 0x00000000)) { |
+ return state->_Arithm3_instance; |
+ } |
+ |
+ // Catch any attempt to fall through... |
+ fprintf(stderr, "TABLE IS INCOMPLETE: arithm3_2 could not parse %08X",insn.Bits(31,0)); |
+ return state->_Forbidden_instance; |
+} |
+ |
+/* |
+ * Implementation of table jr. |
+ * Specified by: jr. |
+ */ |
+static inline const ClassDecoder &decode_jr(const Instruction insn, const DecoderState *state) { |
+ if (((insn & 0x03E00000) != 0x00000000) && ((insn & 0x001FFFC0) == 0x00000000)) { |
+ return state->_JmpReg_instance; |
+ } |
+ |
+ if (((insn & 0x03E00000) == 0x00000000) && ((insn & 0x001FFFC0) == 0x00000000)) { |
+ return state->_NaClHalt_instance; |
+ } |
+ |
+ if ((true) && ((insn & 0x001FFFC0) != 0x00000000)) { |
+ return state->_Forbidden_instance; |
+ } |
+ |
+ // Catch any attempt to fall through... |
+ fprintf(stderr, "TABLE IS INCOMPLETE: jr could not parse %08X",insn.Bits(31,0)); |
+ return state->_Forbidden_instance; |
+} |
+ |
+/* |
+ * Implementation of table jalr. |
+ * Specified by: jalr. |
+ */ |
+static inline const ClassDecoder &decode_jalr(const Instruction insn, const DecoderState *state) { |
+ if (((insn & 0x001F0000) != 0x00000000) && ((insn & 0x000007C0) != 0x00000000)) { |
+ return state->_Forbidden_instance; |
+ } |
+ |
+ if (((insn & 0x001F0000) == 0x00000000) && ((insn & 0x000007C0) == 0x00000000)) { |
+ return state->_JalReg_instance; |
+ } |
+ |
+ // Catch any attempt to fall through... |
+ fprintf(stderr, "TABLE IS INCOMPLETE: jalr could not parse %08X",insn.Bits(31,0)); |
+ return state->_Forbidden_instance; |
+} |
+ |
+/* |
+ * Implementation of table sync. |
+ * Specified by: sync. |
+ */ |
+static inline const ClassDecoder &decode_sync(const Instruction insn, const DecoderState *state) { |
+ if (((insn & 0x03FFFFC0) != 0x00000000)) { |
+ return state->_Forbidden_instance; |
+ } |
+ |
+ if (((insn & 0x03FFFFC0) == 0x00000000)) { |
+ return state->_Safe_instance; |
+ } |
+ |
+ // Catch any attempt to fall through... |
+ fprintf(stderr, "TABLE IS INCOMPLETE: sync could not parse %08X",insn.Bits(31,0)); |
+ return state->_Forbidden_instance; |
+} |
+ |
+/* |
+ * Implementation of table mfhi. |
+ * Specified by: mfhi, mflo. |
+ */ |
+static inline const ClassDecoder &decode_mfhi(const Instruction insn, const DecoderState *state) { |
+ if (((insn & 0x03FF0000) != 0x00000000) && ((insn & 0x000007C0) != 0x00000000)) { |
+ return state->_Forbidden_instance; |
+ } |
+ |
+ if (((insn & 0x03FF0000) == 0x00000000) && ((insn & 0x000007C0) == 0x00000000)) { |
+ return state->_Arithm3_instance; |
+ } |
+ |
+ // Catch any attempt to fall through... |
+ fprintf(stderr, "TABLE IS INCOMPLETE: mfhi could not parse %08X",insn.Bits(31,0)); |
+ return state->_Forbidden_instance; |
+} |
+ |
+/* |
+ * Implementation of table mthi. |
+ * Specified by: mthi, mtlo. |
+ */ |
+static inline const ClassDecoder &decode_mthi(const Instruction insn, const DecoderState *state) { |
+ if (((insn & 0x001FFFC0) != 0x00000000)) { |
+ return state->_Forbidden_instance; |
+ } |
+ |
+ if (((insn & 0x001FFFC0) == 0x00000000)) { |
+ return state->_Safe_instance; |
+ } |
+ |
+ // Catch any attempt to fall through... |
+ fprintf(stderr, "TABLE IS INCOMPLETE: mthi could not parse %08X",insn.Bits(31,0)); |
+ return state->_Forbidden_instance; |
+} |
+ |
+/* |
+ * Implementation of table mult. |
+ * Specified by: mult, multu, div, divu, madd, maddu, msub, msubu. |
+ */ |
+static inline const ClassDecoder &decode_mult(const Instruction insn, const DecoderState *state) { |
+ if (((insn & 0x0000FFC0) != 0x00000000)) { |
+ return state->_Forbidden_instance; |
+ } |
+ |
+ if (((insn & 0x0000FFC0) == 0x00000000)) { |
+ return state->_Safe_instance; |
+ } |
+ |
+ // Catch any attempt to fall through... |
+ fprintf(stderr, "TABLE IS INCOMPLETE: mult could not parse %08X",insn.Bits(31,0)); |
+ return state->_Forbidden_instance; |
+} |
+ |
+/* |
+ * Implementation of table arithm3_3. |
+ * Specified by: add, addu, sub, subu, and, or, xor, nor, slt, sltu. |
+ */ |
+static inline const ClassDecoder &decode_arithm3_3(const Instruction insn, const DecoderState *state) { |
+ if (((insn & 0x000007C0) != 0x00000000)) { |
+ return state->_Forbidden_instance; |
+ } |
+ |
+ if (((insn & 0x000007C0) == 0x00000000)) { |
+ return state->_Arithm3_instance; |
+ } |
+ |
+ // Catch any attempt to fall through... |
+ fprintf(stderr, "TABLE IS INCOMPLETE: arithm3_3 could not parse %08X",insn.Bits(31,0)); |
+ return state->_Forbidden_instance; |
+} |
+ |
+/* |
+ * Implementation of table mfmc0. |
+ * Specified by: di, ei. |
+ */ |
+static inline const ClassDecoder &decode_mfmc0(const Instruction insn, const DecoderState *state) { |
+ if ((true)) { |
+ return state->_Forbidden_instance; |
+ } |
+ |
+ // Catch any attempt to fall through... |
+ fprintf(stderr, "TABLE IS INCOMPLETE: mfmc0 could not parse %08X",insn.Bits(31,0)); |
+ return state->_Forbidden_instance; |
+} |
+ |
+/* |
+ * Implementation of table mfc1. |
+ * Specified by: mfc1, mfhc1. |
+ */ |
+static inline const ClassDecoder &decode_mfc1(const Instruction insn, const DecoderState *state) { |
+ if (((insn & 0x000007FF) != 0x00000000)) { |
+ return state->_Forbidden_instance; |
+ } |
+ |
+ if (((insn & 0x000007FF) == 0x00000000)) { |
+ return state->_Arithm2_instance; |
+ } |
+ |
+ // Catch any attempt to fall through... |
+ fprintf(stderr, "TABLE IS INCOMPLETE: mfc1 could not parse %08X",insn.Bits(31,0)); |
+ return state->_Forbidden_instance; |
+} |
+ |
+/* |
+ * Implementation of table mtc1. |
+ * Specified by: mtc1, mthc1. |
+ */ |
+static inline const ClassDecoder &decode_mtc1(const Instruction insn, const DecoderState *state) { |
+ if (((insn & 0x000007FF) != 0x00000000)) { |
+ return state->_Forbidden_instance; |
+ } |
+ |
+ if (((insn & 0x000007FF) == 0x00000000)) { |
+ return state->_Safe_instance; |
+ } |
+ |
+ // Catch any attempt to fall through... |
+ fprintf(stderr, "TABLE IS INCOMPLETE: mtc1 could not parse %08X",insn.Bits(31,0)); |
+ return state->_Forbidden_instance; |
+} |
+ |
+/* |
+ * Implementation of table bc1. |
+ * Specified by: bc1f, bc1t, bc1fl, bc1tl. |
+ */ |
+static inline const ClassDecoder &decode_bc1(const Instruction insn, const DecoderState *state) { |
+ if ((true)) { |
+ return state->_Branch_instance; |
+ } |
+ |
+ // Catch any attempt to fall through... |
+ fprintf(stderr, "TABLE IS INCOMPLETE: bc1 could not parse %08X",insn.Bits(31,0)); |
+ return state->_Forbidden_instance; |
+} |
+ |
+/* |
+ * Implementation of table fp. |
+ * Specified by: sqrt.fmt, abs.fmt, mov.fmt, neg.fmt, round.l.fmt, trunc.l.fmt, ceil.l.fmt, floor.l.fmt, round.w.fmt, trunc.w.fmt, ceil.w.fmt, floor.w.fmt, recip.fmt, rsqrt.fmt, cvt.s.fmt, cvt.d.fmt, cvt.w.fmt, cvt.l.fmt, cvt.s.pl. |
+ */ |
+static inline const ClassDecoder &decode_fp(const Instruction insn, const DecoderState *state) { |
+ if (((insn & 0x001F0000) != 0x00000000)) { |
+ return state->_Forbidden_instance; |
+ } |
+ |
+ if (((insn & 0x001F0000) == 0x00000000)) { |
+ return state->_Safe_instance; |
+ } |
+ |
+ // Catch any attempt to fall through... |
+ fprintf(stderr, "TABLE IS INCOMPLETE: fp could not parse %08X",insn.Bits(31,0)); |
+ return state->_Forbidden_instance; |
+} |
+ |
+/* |
+ * Implementation of table bc2. |
+ * Specified by: bc2f, bc2t, bc2fl, bc2tl. |
+ */ |
+static inline const ClassDecoder &decode_bc2(const Instruction insn, const DecoderState *state) { |
+ if ((true)) { |
+ return state->_Forbidden_instance; |
+ } |
+ |
+ // Catch any attempt to fall through... |
+ fprintf(stderr, "TABLE IS INCOMPLETE: bc2 could not parse %08X",insn.Bits(31,0)); |
+ return state->_Forbidden_instance; |
+} |
+ |
+/* |
+ * Implementation of table c_cond_fmt. |
+ * Specified by: c.cond.fmt. |
+ */ |
+static inline const ClassDecoder &decode_c_cond_fmt(const Instruction insn, const DecoderState *state) { |
+ if (((insn & 0x000000C0) != 0x00000000)) { |
+ return state->_Forbidden_instance; |
+ } |
+ |
+ if (((insn & 0x000000C0) == 0x00000000)) { |
+ return state->_Safe_instance; |
+ } |
+ |
+ // Catch any attempt to fall through... |
+ fprintf(stderr, "TABLE IS INCOMPLETE: c_cond_fmt could not parse %08X",insn.Bits(31,0)); |
+ return state->_Forbidden_instance; |
+} |
+ |
+const DecoderState *init_decode() { |
+ return new DecoderState; |
+} |
+void delete_state(const DecoderState *state) { |
+ delete (DecoderState *)state; |
+} |
+ |
+const ClassDecoder &decode(const Instruction insn, const DecoderState *state) { |
+ return decode_MIPS32(insn, (DecoderState *)state); |
+} |
+ |
+} // namespace |