#include #include #include "opc.h" typedef struct opc_mapping { const char *name; uint32_t opcode; } opc_mapping_t; opc_mapping_t opc_map[] = { { "ADD", OPC_ADD }, { "SUB", OPC_SUB }, { "MUL", OPC_MUL }, { "DIV", OPC_DIV }, { "MOD", OPC_MOD }, { "SHL", OPC_SHL }, { "SHR", OPC_SHR }, { "AND", OPC_AND }, { "OR", OPC_OR }, { "XOR", OPC_XOR }, { "NOR", OPC_NOR }, { "MOV", OPC_MOV }, { "LB", OPC_LB }, { "LH", OPC_LH }, { "LW", OPC_LW }, { "SB", OPC_SB }, { "SH", OPC_SH }, { "SW", OPC_SW }, { "CMP", OPC_CMP }, { "BEZ", OPC_BEZ }, { "EQ", OPC_EQ }, { "NE", OPC_NE }, { "LT", OPC_LT }, { "GE", OPC_GE }, { "LE", OPC_LE }, { "GT", OPC_GT }, { "J", OPC_J }, { "JAL", OPC_JAL }, { "SYS", OPC_SYS }, { NULL, 0 } }; uint32_t mnemonic2opc(const char *mnemonic) { for (uint8_t i = 0; opc_map[i].name; i++) { if (strcmp(opc_map[i].name, mnemonic) == 0) return opc_map[i].opcode << 26; } return ~0; } const char *opc2mnemonic(uint32_t IR) { uint32_t opcode = IR >> 26; for (uint8_t i = 0; opc_map[i].name; i++) { if (opc_map[i].opcode == opcode) return opc_map[i].name; } return NULL; }