valeri/src/opcode.cpp

92 lines
2.7 KiB
C++

#include "opcode.hpp"
#include "die.hpp"
struct op_t {
const char* opname;
OpcodeType optype;
};
static const op_t opcode_tbl[] = {};
op_t get_op(Oc op) {
switch (op) {
case Oc::Unknown:
return op_t{0, OpcodeType::Reg0};
case Oc::Add:
return op_t{"add", OpcodeType::Reg3};
case Oc::Sub:
return op_t{"sub", OpcodeType::Reg3};
case Oc::Mul:
return op_t{"mul", OpcodeType::Reg3};
case Oc::Div:
return op_t{"div", OpcodeType::Reg3};
case Oc::Mod:
return op_t{"mod", OpcodeType::Reg3};
case Oc::Mov:
return op_t{"mov", OpcodeType::Reg2};
case Oc::LoadConst:
return op_t{"loadc", OpcodeType::Reg1I};
case Oc::LoadStack:
return op_t{"lfi", OpcodeType::Reg1I};
case Oc::Jump:
return op_t{"jump", OpcodeType::Reg0I};
case Oc::Equal:
return op_t{"equal", OpcodeType::Reg2I};
case Oc::Less:
return op_t{"less", OpcodeType::Reg2I};
case Oc::LessEqual:
return op_t{"less-equal", OpcodeType::Reg2I};
case Oc::Call:
return op_t{"call", OpcodeType::Reg2};
case Oc::TailCall:
return op_t{"tailcall", OpcodeType::Reg1I};
case Oc::Ret:
return op_t{"ret", OpcodeType::Reg1};
case Oc::RetNil:
return op_t{"retnil", OpcodeType::Reg0};
case Oc::ShiftRight:
return op_t{"sri", OpcodeType::Reg2I};
case Oc::ShiftLeft:
return op_t{"sli", OpcodeType::Reg2I};
case Oc::BitwiseAnd:
return op_t{"band", OpcodeType::Reg3};
case Oc::BitwiseOr:
return op_t{"bor", OpcodeType::Reg3};
case Oc::BitwiseXor:
return op_t{"bxor", OpcodeType::Reg3};
case Oc::BitwiseNeg:
return op_t{"bneg", OpcodeType::Reg2};
case Oc::MakeArray:
return op_t{"make-array", OpcodeType::Reg1I};
case Oc::ArrayLoad:
return op_t{"al", OpcodeType::Reg3};
case Oc::ArrayStore:
return op_t{"as", OpcodeType::Reg4};
case Oc::Push:
return op_t{"push", OpcodeType::Reg1};
case Oc::Pop:
return op_t{"pop", OpcodeType::Reg1};
case Oc::StackReserve:
return op_t{"sr", OpcodeType::Reg0I};
case Oc::AssertEqual:
return op_t{"assert-equal", OpcodeType::Reg2};
case Oc::MakeDict:
return op_t{"make-dict", OpcodeType::Reg1};
case Oc::SetJump:
return op_t{"setjump", OpcodeType::Reg1I};
return op_t{"setglobal", OpcodeType::Reg2};
case Oc::GlobalLoad:
return op_t{"global-load", OpcodeType::Reg2};
case Oc::MakeClosure:
return op_t{"make-closure", OpcodeType::Reg2};
case Oc::ClosureLoad:
return op_t{"closure-load", OpcodeType::Reg1I};
default:
die("Unknown opcode\n");
}
}
const char* opcode_name(Oc op) { return get_op(op).opname; }
OpcodeType opcode_type(Oc op) { return get_op(op).optype; }