diff --git a/.gitignore b/.gitignore index 1194e6b..bc09a4f 100644 --- a/.gitignore +++ b/.gitignore @@ -11,3 +11,5 @@ cmake-build-debug # autogen files include/besm-666/autogen/* +!include/besm-666/autogen/opcodes-to-format.hpp +!include/besm-666/autogen/operations-matrix.hpp diff --git a/include/besm-666/autogen/opcodes-to-format.hpp b/include/besm-666/autogen/opcodes-to-format.hpp new file mode 100644 index 0000000..4097611 --- /dev/null +++ b/include/besm-666/autogen/opcodes-to-format.hpp @@ -0,0 +1,29 @@ +#pragma once + +#include "operations-matrix.hpp" +#include + +namespace besm::dec { + +// @todo #10:90m Generate this file with matrix instead of copypaste from the +// current raw generator. + +constexpr static uint8_t OPCODE2FORMAT[128] = { + ILLEGAL, ILLEGAL, ILLEGAL, I, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, + ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, I, + ILLEGAL, ILLEGAL, ILLEGAL, I, ILLEGAL, ILLEGAL, ILLEGAL, U, + ILLEGAL, ILLEGAL, ILLEGAL, I, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, + ILLEGAL, ILLEGAL, ILLEGAL, S, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, + ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, + ILLEGAL, ILLEGAL, ILLEGAL, R, ILLEGAL, ILLEGAL, ILLEGAL, U, + ILLEGAL, ILLEGAL, ILLEGAL, R, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, + ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, + ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, + ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, + ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, + ILLEGAL, ILLEGAL, ILLEGAL, B, ILLEGAL, ILLEGAL, ILLEGAL, I, + ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, J, + ILLEGAL, ILLEGAL, ILLEGAL, I, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, + ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL}; + +} // namespace besm::dec diff --git a/include/besm-666/autogen/operations-matrix.hpp b/include/besm-666/autogen/operations-matrix.hpp new file mode 100644 index 0000000..cfcff9c --- /dev/null +++ b/include/besm-666/autogen/operations-matrix.hpp @@ -0,0 +1,1301 @@ +#pragma once +#include "besm-666/decoder/decoder.hpp" +#include "besm-666/rv-instruction-op.hpp" + +namespace besm::dec { + +/* + * @todo #10:90m Generate this file instead of copypaste from the current raw + * generator. + */ + +enum Format { ILLEGAL, R, I, S, B, U, J }; + +struct Cell { + const Format format; + const InstructionOp operation; +}; + +constexpr static Cell INSTR_WHO[128][8] = { + { + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + }, // opcode: 0b0 + { + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + }, // opcode: 0b1 + { + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + }, // opcode: 0b10 + { + {I, LB}, + {I, LH}, + {I, LW}, + {I, LD}, + {I, LBU}, + {I, LHU}, + {I, LWU}, + {I, NON_OP}, + }, // opcode: 0b11 + { + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + }, // opcode: 0b100 + { + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + }, // opcode: 0b101 + { + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + }, // opcode: 0b110 + { + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + }, // opcode: 0b111 + { + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + }, // opcode: 0b1000 + { + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + }, // opcode: 0b1001 + { + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + }, // opcode: 0b1010 + { + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + }, // opcode: 0b1011 + { + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + }, // opcode: 0b1100 + { + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + }, // opcode: 0b1101 + { + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + }, // opcode: 0b1110 + { + {I, PAUSE}, + {I, NON_OP}, + {I, NON_OP}, + {I, NON_OP}, + {I, NON_OP}, + {I, NON_OP}, + {I, NON_OP}, + {I, NON_OP}, + }, // opcode: 0b1111 + { + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + }, // opcode: 0b10000 + { + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + }, // opcode: 0b10001 + { + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + }, // opcode: 0b10010 + { + {I, ADDI}, + {I, SLLI}, + {I, SLTI}, + {I, SLTIU}, + {I, XORI}, + {I, SRAI}, + {I, ORI}, + {I, ANDI}, + }, // opcode: 0b10011 + { + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + }, // opcode: 0b10100 + { + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + }, // opcode: 0b10101 + { + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + }, // opcode: 0b10110 + { + {U, NON_OP}, + {U, NON_OP}, + {U, NON_OP}, + {U, NON_OP}, + {U, NON_OP}, + {U, NON_OP}, + {U, NON_OP}, + {U, NON_OP}, + }, // opcode: 0b10111 + { + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + }, // opcode: 0b11000 + { + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + }, // opcode: 0b11001 + { + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + }, // opcode: 0b11010 + { + {I, ADDIW}, + {I, SLLIW}, + {I, NON_OP}, + {I, NON_OP}, + {I, NON_OP}, + {I, SRAIW}, + {I, NON_OP}, + {I, NON_OP}, + }, // opcode: 0b11011 + { + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + }, // opcode: 0b11100 + { + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + }, // opcode: 0b11101 + { + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + }, // opcode: 0b11110 + { + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + }, // opcode: 0b11111 + { + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + }, // opcode: 0b100000 + { + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + }, // opcode: 0b100001 + { + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + }, // opcode: 0b100010 + { + {S, SB}, + {S, SH}, + {S, SW}, + {S, SD}, + {S, NON_OP}, + {S, NON_OP}, + {S, NON_OP}, + {S, NON_OP}, + }, // opcode: 0b100011 + { + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + }, // opcode: 0b100100 + { + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + }, // opcode: 0b100101 + { + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + }, // opcode: 0b100110 + { + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + }, // opcode: 0b100111 + { + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + }, // opcode: 0b101000 + { + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + }, // opcode: 0b101001 + { + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + }, // opcode: 0b101010 + { + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + }, // opcode: 0b101011 + { + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + }, // opcode: 0b101100 + { + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + }, // opcode: 0b101101 + { + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + }, // opcode: 0b101110 + { + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + }, // opcode: 0b101111 + { + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + }, // opcode: 0b110000 + { + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + }, // opcode: 0b110001 + { + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + }, // opcode: 0b110010 + { + {R, NON_OP}, + {R, NON_OP}, + {R, NON_OP}, + {R, NON_OP}, + {R, NON_OP}, + {R, NON_OP}, + {R, NON_OP}, + {R, NON_OP}, + }, // opcode: 0b110011 + { + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + }, // opcode: 0b110100 + { + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + }, // opcode: 0b110101 + { + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + }, // opcode: 0b110110 + { + {U, NON_OP}, + {U, NON_OP}, + {U, NON_OP}, + {U, NON_OP}, + {U, NON_OP}, + {U, NON_OP}, + {U, NON_OP}, + {U, NON_OP}, + }, // opcode: 0b110111 + { + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + }, // opcode: 0b111000 + { + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + }, // opcode: 0b111001 + { + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + }, // opcode: 0b111010 + { + {R, NON_OP}, + {R, NON_OP}, + {R, NON_OP}, + {R, NON_OP}, + {R, NON_OP}, + {R, NON_OP}, + {R, NON_OP}, + {R, NON_OP}, + }, // opcode: 0b111011 + { + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + }, // opcode: 0b111100 + { + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + }, // opcode: 0b111101 + { + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + }, // opcode: 0b111110 + { + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + }, // opcode: 0b111111 + { + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + }, // opcode: 0b1000000 + { + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + }, // opcode: 0b1000001 + { + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + }, // opcode: 0b1000010 + { + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + }, // opcode: 0b1000011 + { + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + }, // opcode: 0b1000100 + { + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + }, // opcode: 0b1000101 + { + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + }, // opcode: 0b1000110 + { + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + }, // opcode: 0b1000111 + { + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + }, // opcode: 0b1001000 + { + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + }, // opcode: 0b1001001 + { + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + }, // opcode: 0b1001010 + { + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + }, // opcode: 0b1001011 + { + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + }, // opcode: 0b1001100 + { + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + }, // opcode: 0b1001101 + { + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + }, // opcode: 0b1001110 + { + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + }, // opcode: 0b1001111 + { + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + }, // opcode: 0b1010000 + { + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + }, // opcode: 0b1010001 + { + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + }, // opcode: 0b1010010 + { + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + }, // opcode: 0b1010011 + { + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + }, // opcode: 0b1010100 + { + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + }, // opcode: 0b1010101 + { + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + }, // opcode: 0b1010110 + { + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + }, // opcode: 0b1010111 + { + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + }, // opcode: 0b1011000 + { + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + }, // opcode: 0b1011001 + { + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + }, // opcode: 0b1011010 + { + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + }, // opcode: 0b1011011 + { + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + }, // opcode: 0b1011100 + { + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + }, // opcode: 0b1011101 + { + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + }, // opcode: 0b1011110 + { + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + }, // opcode: 0b1011111 + { + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + }, // opcode: 0b1100000 + { + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + }, // opcode: 0b1100001 + { + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + }, // opcode: 0b1100010 + { + {B, BEQ}, + {B, BNE}, + {B, NON_OP}, + {B, NON_OP}, + {B, BLT}, + {B, BGE}, + {B, BLTU}, + {B, BGEU}, + }, // opcode: 0b1100011 + { + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + }, // opcode: 0b1100100 + { + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + }, // opcode: 0b1100101 + { + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + }, // opcode: 0b1100110 + { + {I, JALR}, + {I, NON_OP}, + {I, NON_OP}, + {I, NON_OP}, + {I, NON_OP}, + {I, NON_OP}, + {I, NON_OP}, + {I, NON_OP}, + }, // opcode: 0b1100111 + { + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + }, // opcode: 0b1101000 + { + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + }, // opcode: 0b1101001 + { + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + }, // opcode: 0b1101010 + { + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + }, // opcode: 0b1101011 + { + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + }, // opcode: 0b1101100 + { + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + }, // opcode: 0b1101101 + { + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + }, // opcode: 0b1101110 + { + {J, NON_OP}, + {J, NON_OP}, + {J, NON_OP}, + {J, NON_OP}, + {J, NON_OP}, + {J, NON_OP}, + {J, NON_OP}, + {J, NON_OP}, + }, // opcode: 0b1101111 + { + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + }, // opcode: 0b1110000 + { + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + }, // opcode: 0b1110001 + { + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + }, // opcode: 0b1110010 + { + {I, EBREAK}, + {I, NON_OP}, + {I, NON_OP}, + {I, NON_OP}, + {I, NON_OP}, + {I, NON_OP}, + {I, NON_OP}, + {I, NON_OP}, + }, // opcode: 0b1110011 + { + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + }, // opcode: 0b1110100 + { + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + }, // opcode: 0b1110101 + { + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + }, // opcode: 0b1110110 + { + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + }, // opcode: 0b1110111 + { + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + }, // opcode: 0b1111000 + { + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + }, // opcode: 0b1111001 + { + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + }, // opcode: 0b1111010 + { + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + }, // opcode: 0b1111011 + { + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + }, // opcode: 0b1111100 + { + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + }, // opcode: 0b1111101 + { + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + }, // opcode: 0b1111110 + { + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + {ILLEGAL, NON_OP}, + }, // opcode: 0b1111111 +}; +} // namespace besm::dec diff --git a/include/besm-666/decoder/decoder.hpp b/include/besm-666/decoder/decoder.hpp new file mode 100644 index 0000000..00b6ac2 --- /dev/null +++ b/include/besm-666/decoder/decoder.hpp @@ -0,0 +1,180 @@ +#pragma once +#include "besm-666/autogen/operations-matrix.hpp" +#include "besm-666/instruction.hpp" +#include +#include +#include + +namespace besm::dec { + +class Decoder { + +private: + static constexpr RV64UWord OPCODE_MASK = 0b01111111; + static constexpr int FUNC3_shift = 12; + static constexpr RV64UWord FUNC3_MASK = 0b111 << FUNC3_shift; + static constexpr int RD_SHIFT = 7; + static constexpr RV64UWord RD_MASK = 0b11111 << RD_SHIFT; + static constexpr int RS1_SHIFT = 15; + static constexpr RV64UWord RS1_MASK = 0b11111 << RS1_SHIFT; + static constexpr int RS2_SHIFT = 20; + static constexpr RV64UWord RS2_MASK = 0b11111 << RS2_SHIFT; + +public: + /** + * Give the {@link Instruction} by the word. + * @param word word. + * @return {@link Instruction} struct. + */ + besm::Instruction parse(const RV64UWord bytecode) const { + const Opcode opcode = bytecode & OPCODE_MASK; + const uint8_t func3 = (bytecode & FUNC3_MASK) >> FUNC3_shift; + assert(opcode < 128); + assert(func3 < 8); + const Cell *cell = &(INSTR_WHO[opcode][func3]); + const Format format = cell->format; + const InstructionOp operation = cell->operation; + switch (format) { + case R: + return parse_R(bytecode, opcode, func3); + break; + case I: + return parse_I(bytecode, operation, opcode); + break; + case S: + return parse_S(bytecode, operation); + break; + case B: + return parse_B(bytecode, operation); + break; + case U: + return parse_U(bytecode, operation); + break; + case J: + return parse_J(bytecode, operation); + break; + } + return Instruction{.operation = NON_OP}; + } + +private: + static inline Instruction parse_R(const RV64UWord bytecode, + const Opcode opcode, + const uint8_t func3) { + constexpr int FUNC7_SHIFT = 25; + constexpr RV64UWord FUNC7_MASK = 0b1111111 << FUNC7_SHIFT; + const uint16_t func7 = (bytecode & FUNC7_MASK) >> (FUNC7_SHIFT - 3); + const uint16_t func10 = func7 | func3; + assert(func10 < 0b10000000000); + InstructionOp operation = NON_OP; + switch (opcode) { + case 0b0110011: + switch (func10) { + case 0b0000000000: + operation = ADD; + break; + case 0b0100000000: + operation = SUB; + break; + case 0b0000000001: + operation = SLL; + break; + case 0b0000000010: + operation = SLT; + break; + case 0b0000000011: + operation = SLTU; + break; + case 0b0000000100: + operation = XOR; + break; + case 0b0000000101: + operation = SRL; + break; + case 0b0100000101: + operation = SRA; + break; + case 0b0000000110: + operation = OR; + break; + case 0b0000000111: + operation = AND; + } + break; + case 0b0111011: + switch (func10) { + case 0b0000000000: + operation = ADDW; + break; + case 0b0100000000: + operation = SUBW; + break; + case 0b0000000001: + operation = SLLW; + break; + case 0b0000000101: + operation = SRLW; + break; + case 0b0100000101: + operation = SRAW; + break; + } + break; + } + return Instruction{ + .rd = static_cast((bytecode & RD_MASK) >> RD_SHIFT), + .rs1 = static_cast((bytecode & RS1_MASK) >> RS1_SHIFT), + .rs2 = static_cast((bytecode & RS2_MASK) >> RS2_SHIFT), + .immidiate = Instruction::IMMIDIATE_POISON, + .operation = operation}; + } + + /* + * @todo #1ILLEGAL:90m Implement the functions of I format. Now it is + * just a stub. We need to implement every of them and test. + * ALARM: pay attention to 0b1110011 opcode. + */ + static inline Instruction parse_I(const RV64UWord word, + const InstructionOp operation, + const Opcode opcode) { + return Instruction{}; + } + + /* + * @todo #1ILLEGAL:9ILLEGALm Implement the functions of S format. Now it is + * just a stub. We need to implement every of them and test. + */ + static inline Instruction parse_S(const RV64UWord word, + const InstructionOp operation) { + return Instruction{}; + } + + /* + * @todo #1ILLEGAL:9ILLEGALm Implement the functions of B format. Now it is + * just a stub. We need to implement every of them and test. + */ + static inline Instruction parse_B(const RV64UWord word, + const InstructionOp operation) { + return Instruction{}; + } + + /* + * @todo #1ILLEGAL:9ILLEGALm Implement the functions of U format. Now it is + * just a stub. We need to implement every of them and test. + */ + static inline Instruction parse_U(const RV64UWord word, + const InstructionOp operation) { + return Instruction{}; + } + + /* + * @todo #1ILLEGAL:9ILLEGALm Implement the functions of J format. Now it is + * just a stub. We need to implement every of them and test. + */ + static inline Instruction parse_J(const RV64UWord word, + const InstructionOp operation) { + return Instruction{}; + } +}; + +} // namespace besm::dec diff --git a/include/besm-666/instruction.hpp b/include/besm-666/instruction.hpp index ecf2377..67b0575 100644 --- a/include/besm-666/instruction.hpp +++ b/include/besm-666/instruction.hpp @@ -15,6 +15,8 @@ struct Instruction { const Register rs2; const Immidiate immidiate; const InstructionOp operation; + + static constexpr Immidiate IMMIDIATE_POISON = UINT32_MAX; }; } // namespace besm diff --git a/include/besm-666/rv-instruction-op.hpp b/include/besm-666/rv-instruction-op.hpp index 835c8ec..c5c04a8 100644 --- a/include/besm-666/rv-instruction-op.hpp +++ b/include/besm-666/rv-instruction-op.hpp @@ -3,6 +3,7 @@ namespace besm { enum InstructionOp { + NON_OP, // RV32I: LUI, AUIPC, diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 80ce67c..955fa7d 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -12,5 +12,5 @@ endfunction(besm666_test) besm666_test(./dummy_test.cpp) besm666_test(./reg/gprf-tests.cpp) - add_subdirectory(./memory) +add_subdirectory(./decoder) diff --git a/test/decoder/CMakeLists.txt b/test/decoder/CMakeLists.txt new file mode 100644 index 0000000..1d745cc --- /dev/null +++ b/test/decoder/CMakeLists.txt @@ -0,0 +1 @@ +besm666_test(decoder_test.cpp) diff --git a/test/decoder/decoder_test.cpp b/test/decoder/decoder_test.cpp new file mode 100644 index 0000000..d64b728 --- /dev/null +++ b/test/decoder/decoder_test.cpp @@ -0,0 +1,274 @@ +#include "./besm-666/decoder/decoder.hpp" +#include "besm-666/autogen/encoding.out.h" +#include + +using besm::Instruction; + +static bool equal_R(const Instruction lhs, const Instruction rhs) { + return lhs.operation == rhs.operation && lhs.rd == rhs.rd && + lhs.rs1 == rhs.rs1 && lhs.rs2 == rhs.rs2; +} + +class Decoder_R : public ::testing::Test { +protected: + const besm::dec::Decoder decoder{}; + void SetUp() override {} + + void TearDown() override {} +}; + +TEST_F(Decoder_R, decodes_ADD) { + auto instance = + besm::Instruction{.rd = 0b11111, + .rs1 = 0b11111, + .rs2 = 0b11111, + .immidiate = Instruction::IMMIDIATE_POISON, + .operation = besm::ADD}; + besm::Instruction parsed = + decoder.parse(0b00000001111111111000111110110011); + EXPECT_EQ(instance.operation, parsed.operation); + EXPECT_EQ(instance.rs1, parsed.rs1); + EXPECT_EQ(instance.rs2, parsed.rs2); + EXPECT_EQ(instance.rd, parsed.rd); + EXPECT_TRUE(equal_R(parsed, instance)); +} + +TEST_F(Decoder_R, decodes_SUB) { + auto instance = + besm::Instruction{.rd = 0b00010, + .rs1 = 0b10011, + .rs2 = 0b01111, + .immidiate = Instruction::IMMIDIATE_POISON, + .operation = besm::SUB}; + besm::Instruction parsed = + decoder.parse(0b01000000111110011000000100110011); + EXPECT_EQ(instance.operation, parsed.operation); + EXPECT_EQ(instance.rs1, parsed.rs1); + EXPECT_EQ(instance.rs2, parsed.rs2); + EXPECT_EQ(instance.rd, parsed.rd); + EXPECT_TRUE(equal_R(parsed, instance)); +} + +TEST_F(Decoder_R, decodes_SLL) { + auto instance = + besm::Instruction{.rd = 0b10000, + .rs1 = 0b01011, + .rs2 = 0b01011, + .immidiate = Instruction::IMMIDIATE_POISON, + .operation = besm::SLL}; + besm::Instruction parsed = + decoder.parse(0b00000000101101011001100000110011); + EXPECT_EQ(instance.operation, parsed.operation); + EXPECT_EQ(instance.rs1, parsed.rs1); + EXPECT_EQ(instance.rs2, parsed.rs2); + EXPECT_EQ(instance.rd, parsed.rd); + EXPECT_TRUE(equal_R(parsed, instance)); +} + +TEST_F(Decoder_R, decodes_SLT) { + auto instance = + besm::Instruction{.rd = 0b11111, + .rs1 = 0b11111, + .rs2 = 0b11111, + .immidiate = Instruction::IMMIDIATE_POISON, + .operation = besm::SLT}; + besm::Instruction parsed = + decoder.parse(0b00000001111111111010111110110011); + EXPECT_EQ(instance.operation, parsed.operation); + EXPECT_EQ(instance.rs1, parsed.rs1); + EXPECT_EQ(instance.rs2, parsed.rs2); + EXPECT_EQ(instance.rd, parsed.rd); + EXPECT_TRUE(equal_R(parsed, instance)); +} + +TEST_F(Decoder_R, decodes_SLTU) { + auto instance = + besm::Instruction{.rd = 0b00011, + .rs1 = 0b10011, + .rs2 = 0b00000, + .immidiate = Instruction::IMMIDIATE_POISON, + .operation = besm::SLTU}; + besm::Instruction parsed = + decoder.parse(0b00000000000010011011000110110011); + EXPECT_EQ(instance.operation, parsed.operation); + EXPECT_EQ(instance.rs1, parsed.rs1); + EXPECT_EQ(instance.rs2, parsed.rs2); + EXPECT_EQ(instance.rd, parsed.rd); + EXPECT_TRUE(equal_R(parsed, instance)); +} + +TEST_F(Decoder_R, decodes_XOR) { + auto instance = + besm::Instruction{.rd = 0b00010, + .rs1 = 0b10011, + .rs2 = 0b11000, + .immidiate = Instruction::IMMIDIATE_POISON, + .operation = besm::XOR}; + besm::Instruction parsed = + decoder.parse(0b00000001100010011100000100110011); + EXPECT_EQ(instance.operation, parsed.operation); + EXPECT_EQ(instance.rs1, parsed.rs1); + EXPECT_EQ(instance.rs2, parsed.rs2); + EXPECT_EQ(instance.rd, parsed.rd); + EXPECT_TRUE(equal_R(parsed, instance)); +} + +TEST_F(Decoder_R, decodes_SRL) { + auto instance = + besm::Instruction{.rd = 0b01010, + .rs1 = 0b10011, + .rs2 = 0b00111, + .immidiate = Instruction::IMMIDIATE_POISON, + .operation = besm::SRL}; + besm::Instruction parsed = + decoder.parse(0b00000000011110011101010100110011); + EXPECT_EQ(instance.operation, parsed.operation); + EXPECT_EQ(instance.rs1, parsed.rs1); + EXPECT_EQ(instance.rs2, parsed.rs2); + EXPECT_EQ(instance.rd, parsed.rd); + EXPECT_TRUE(equal_R(parsed, instance)); +} + +TEST_F(Decoder_R, decodes_SRA) { + auto instance = + besm::Instruction{.rd = 0b11011, + .rs1 = 0b11011, + .rs2 = 0b11011, + .immidiate = Instruction::IMMIDIATE_POISON, + .operation = besm::SRA}; + besm::Instruction parsed = + decoder.parse(0b01000001101111011101110110110011); + EXPECT_EQ(instance.operation, parsed.operation); + EXPECT_EQ(instance.rs1, parsed.rs1); + EXPECT_EQ(instance.rs2, parsed.rs2); + EXPECT_EQ(instance.rd, parsed.rd); + EXPECT_TRUE(equal_R(parsed, instance)); +} + +TEST_F(Decoder_R, decodes_OR) { + auto instance = + besm::Instruction{.rd = 0b00100, + .rs1 = 0b11011, + .rs2 = 0b01011, + .immidiate = Instruction::IMMIDIATE_POISON, + .operation = besm::OR}; + besm::Instruction parsed = + decoder.parse(0b00000000101111011110001000110011); + EXPECT_EQ(instance.operation, parsed.operation); + EXPECT_EQ(instance.rs1, parsed.rs1); + EXPECT_EQ(instance.rs2, parsed.rs2); + EXPECT_EQ(instance.rd, parsed.rd); + EXPECT_TRUE(equal_R(parsed, instance)); +} + +TEST_F(Decoder_R, decodes_AND) { + auto instance = + besm::Instruction{.rd = 0b11011, + .rs1 = 0b11011, + .rs2 = 0b11011, + .immidiate = Instruction::IMMIDIATE_POISON, + .operation = besm::AND}; + besm::Instruction parsed = + decoder.parse(0b00000001101111011111110110110011); + EXPECT_EQ(instance.operation, parsed.operation); + EXPECT_EQ(instance.rs1, parsed.rs1); + EXPECT_EQ(instance.rs2, parsed.rs2); + EXPECT_EQ(instance.rd, parsed.rd); + EXPECT_TRUE(equal_R(parsed, instance)); +} + +TEST_F(Decoder_R, decodes_ADDW) { + auto instance = + besm::Instruction{.rd = 0b10011, + .rs1 = 0b11011, + .rs2 = 0b11010, + .immidiate = Instruction::IMMIDIATE_POISON, + .operation = besm::ADDW}; + besm::Instruction parsed = + decoder.parse(0b00000001101011011000100110111011); + EXPECT_EQ(instance.operation, parsed.operation); + EXPECT_EQ(instance.rs1, parsed.rs1); + EXPECT_EQ(instance.rs2, parsed.rs2); + EXPECT_EQ(instance.rd, parsed.rd); + EXPECT_TRUE(equal_R(parsed, instance)); +} + +TEST_F(Decoder_R, decodes_SUBW) { + auto instance = + besm::Instruction{.rd = 0b11011, + .rs1 = 0b11011, + .rs2 = 0b11011, + .immidiate = Instruction::IMMIDIATE_POISON, + .operation = besm::SUBW}; + besm::Instruction parsed = + decoder.parse(0b01000001101111011000110110111011); + EXPECT_EQ(instance.operation, parsed.operation); + EXPECT_EQ(instance.rs1, parsed.rs1); + EXPECT_EQ(instance.rs2, parsed.rs2); + EXPECT_EQ(instance.rd, parsed.rd); + EXPECT_TRUE(equal_R(parsed, instance)); +} + +TEST_F(Decoder_R, decodes_SLLW) { + auto instance = + besm::Instruction{.rd = 0b01011, + .rs1 = 0b11011, + .rs2 = 0b10011, + .immidiate = Instruction::IMMIDIATE_POISON, + .operation = besm::SLLW}; + besm::Instruction parsed = + decoder.parse(0b00000001001111011001010110111011); + EXPECT_EQ(instance.operation, parsed.operation); + EXPECT_EQ(instance.rs1, parsed.rs1); + EXPECT_EQ(instance.rs2, parsed.rs2); + EXPECT_EQ(instance.rd, parsed.rd); + EXPECT_TRUE(equal_R(parsed, instance)); +} + +TEST_F(Decoder_R, decodes_SRLW) { + auto instance = + besm::Instruction{.rd = 0b01000, + .rs1 = 0b11010, + .rs2 = 0b10001, + .immidiate = Instruction::IMMIDIATE_POISON, + .operation = besm::SRLW}; + besm::Instruction parsed = + decoder.parse(0b00000001000111010101010000111011); + EXPECT_EQ(instance.operation, parsed.operation); + EXPECT_EQ(instance.rs1, parsed.rs1); + EXPECT_EQ(instance.rs2, parsed.rs2); + EXPECT_EQ(instance.rd, parsed.rd); + EXPECT_TRUE(equal_R(parsed, instance)); +} + +TEST_F(Decoder_R, decodes_SRAW) { + auto instance = + besm::Instruction{.rd = 0b00000, + .rs1 = 0b00101, + .rs2 = 0b00001, + .immidiate = Instruction::IMMIDIATE_POISON, + .operation = besm::SRAW}; + besm::Instruction parsed = + decoder.parse(0b01000000000100101101000000111011); + EXPECT_EQ(instance.operation, parsed.operation); + EXPECT_EQ(instance.rs1, parsed.rs1); + EXPECT_EQ(instance.rs2, parsed.rs2); + EXPECT_EQ(instance.rd, parsed.rd); + EXPECT_TRUE(equal_R(parsed, instance)); +} + +TEST_F(Decoder_R, decodes_SUBW_fails) { + auto instance = + besm::Instruction{.rd = 0b11011, + .rs1 = 0b11011, + .rs2 = 0b1111, + .immidiate = Instruction::IMMIDIATE_POISON, + .operation = besm::SUBW}; + besm::Instruction parsed = + decoder.parse(0b01000001101111011000110110111011); + EXPECT_EQ(instance.operation, parsed.operation); + EXPECT_EQ(instance.rs1, parsed.rs1); + EXPECT_NE(instance.rs2, parsed.rs2); + EXPECT_EQ(instance.rd, parsed.rd); + EXPECT_FALSE(equal_R(parsed, instance)); +}