#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 }, { "AND", OPC_AND }, { "OR", OPC_OR }, { "CMP", OPC_CMP }, { "EQ", OPC_EQ }, { "NE", OPC_NE }, { "LT", OPC_LT }, { "GE", OPC_GE }, { "LE", OPC_LE }, { "GT", OPC_GT }, { "MOV", OPC_MOV }, { "LW", OPC_LW }, { "SW", OPC_SW }, { "PUSH", OPC_PUSH }, { "POP", OPC_POP }, { "BEZ", OPC_BEZ }, { "JMP", OPC_JMP }, { "CALL", OPC_CALL }, { "RET", OPC_RET }, { "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; }