#include <stdlib.h>
#include <string.h>
#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;
}