lunajit/opcodes.lua

97 lines
1.7 KiB
Lua

local bit = require('bit')
local function opcode(id, name, a, b, c, metamethod)
return {
id=id,
name=name,
a=a,
b=b,
c=c,
methametod=metamethod,
}
end
local function gen_opcodes(tbl)
res = {}
for i = 1, #tbl do
res[tbl[i].id] = {
name = tbl[i].name,
a = tbl[i].a,
b = tbl[i].b,
c = tbl[i].c,
metamethod = tbl[i].metamethod,
}
end
return res
end
local Mode = {
none = 0,
dst = 1,
base = 2,
var = 3,
rbase = 4,
uv = 5,
lit = 6,
lits = 7,
pri = 8,
num = 9,
str = 10,
tab = 11,
func = 12,
jump = 13,
cdata = 14,
max = 15,
none = 15, -- same as max
}
local Metamethod = {
index = 0,
newindex = 1,
gc = 2,
mode = 3,
eq = 4,
len = 5,
lt = 6,
le = 7,
concat = 8,
call = 9,
add = 10,
sub = 11,
mul = 12,
div = 13,
mod = 14,
pow = 15,
unm = 16,
metatable = 17,
tostring = 18,
}
local Opcodes_defs = gen_opcodes {
opcode(0x25, 'POW', Mode.dst, Mode.none, Mode.lits, Metamethod.none),
opcode(0x29, 'KSHORT', Mode.dst, Mode.var, Mode.var, Metamethod.pow),
opcode(0x4b, 'RET0', Mode.rbase, Mode.none, Mode.lit, Mode.none),
}
local function decode(ins)
-- TODO: endianess
local id = bit.band(ins, 0xff)
local a = bit.band(ins, 0xff00) / 0x100
local c = bit.band(ins, 0xff0000) / 0x10000
local b = bit.band(ins, 0xff000000) / 0x1000000
local d = bit.band(ins, 0xffff0000) / 0x10000
return {
id = id,
a = a,
b = b,
c = c,
d = d,
}
end
return {
defs = Opcodes_defs,
Mode = Mode,
decode = decode,
}