#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 }, { "BEQ", OPC_BEQ }, { "BNE", OPC_BNE }, { "BLT", OPC_BLT }, { "BGE", OPC_BGE }, { "BLE", OPC_BLE }, { "BGT", OPC_BGT }, { "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; }