Something went wrong. Try again.
quick and dirty pure lua webassembly interpreter
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404local ops = {}
local constants = require("constants")local intutil = require("intutil")
function ops.select(a, b, c) return (c ~= 0) and a or bend
--[[ i64 ]]
function ops.i64_eqz(a) return (a == 0) and 1 or 0end
function ops.i64_eq(a, b) return (a == b) and 1 or 0end
function ops.i64_ne(a, b) return (a ~= b) and 1 or 0end
function ops.i64_lt_s(a, b) return (a < b) and 1 or 0end
function ops.i64_gt_s(a, b) return (a > b) and 1 or 0end
function ops.i64_le_s(a, b) return (a <= b) and 1 or 0end
function ops.i64_ge_s(a, b) return (a >= b) and 1 or 0end
function ops.i64_clz(a) if a == 0 then return 64 end
local n = 0 if (a & 0xFFFFFFFF00000000) == 0 then n = n + 32 a = a << 32 end if (a & 0xFFFF000000000000) == 0 then n = n + 16 a = a << 16 end if (a & 0xFF00000000000000) == 0 then n = n + 8 a = a << 8 end if (a & 0xF000000000000000) == 0 then n = n + 4 a = a << 4 end if (a & 0xC000000000000000) == 0 then n = n + 2 a = a << 2 end if (a & 0x8000000000000000) == 0 then n = n + 1 end return nend
function ops.i64_ctz(a) if a == 0 then return 64 end
local n = 0 if (a & 0x00000000FFFFFFFF) == 0 then n = n + 32 a = a >> 32 end if (a & 0x000000000000FFFF) == 0 then n = n + 16 a = a >> 16 end if (a & 0x00000000000000FF) == 0 then n = n + 8 a = a >> 8 end if (a & 0x000000000000000F) == 0 then n = n + 4 a = a >> 4 end if (a & 0x0000000000000003) == 0 then n = n + 2 a = a >> 2 end if (a & 0x0000000000000001) == 0 then n = n + 1 end return nend
function ops.i64_popcnt(a) local n = 0 for _ = 1, 64 do if (a & 1) == 1 then n = n + 1 end a = a >> 1 end return nend
function ops.i64_add(a, b) return a + bend
function ops.i64_sub(a, b) return a - bend
function ops.i64_mul(a, b) return a * bend
function ops.i64_div_s(a, b) return a // bend
function ops.i64_rem_s(a, b) return a % bend
function ops.i64_and(a, b) return a & bend
function ops.i64_or(a, b) return a | bend
function ops.i64_xor(a, b) return a ~ bend
function ops.i64_shl(a, b) return a << bend
function ops.i64_shr_u(a, b) return a >> bend
function ops.i64_rotl(a, b) local c = b % 64 return (a << c) | (a >> (64 - c))end
function ops.i64_rotr(a, b) local c = b % 64 return (a >> c) | (a << (64 - c))end
--[[ i32 ]]
function ops.i32_eqz(a) return (a == 0) and 1 or 0end
function ops.i32_eq(a, b) return (a == b) and 1 or 0end
function ops.i32_ne(a, b) return (a ~= b) and 1 or 0end
function ops.i32_lt_s(a, b) a = intutil.signexti32(a) b = intutil.signexti32(b) return (a < b) and 1 or 0end
function ops.i32_lt_s(a, b) a = intutil.signexti32(a) b = intutil.signexti32(b) return (a < b) and 1 or 0end
function ops.i32_lt_u(a, b) return (a < b) and 1 or 0end
function ops.i32_gt_s(a, b) a = intutil.signexti32(a) b = intutil.signexti32(b) return (a > b) and 1 or 0end
function ops.i32_gt_u(a, b) return (a > b) and 1 or 0end
function ops.i32_le_s(a, b) a = intutil.signexti32(a) b = intutil.signexti32(b) return (a <= b) and 1 or 0end
function ops.i32_le_u(a, b) return (a <= b) and 1 or 0end
function ops.i32_ge_s(a, b) a = intutil.signexti32(a) b = intutil.signexti32(b) return (a >= b) and 1 or 0end
function ops.i32_ge_u(a, b) return (a >= b) and 1 or 0end
function ops.i32_clz(a) if a == 0 then return 32 end
local n = 0 if (a & 0xFFFF0000) == 0 then n = n + 16 a = a << 16 end if (a & 0xFF000000) == 0 then n = n + 8 a = a << 8 end if (a & 0xF0000000) == 0 then n = n + 4 a = a << 4 end if (a & 0xC0000000) == 0 then n = n + 2 a = a << 2 end if (a & 0x80000000) == 0 then n = n + 1 end return nend
function ops.i32_ctz(a) if a == 0 then return 64 end
local n = 0 if (a & 0x0000FFFF) == 0 then n = n + 16 a = a >> 16 end if (a & 0x000000FF) == 0 then n = n + 8 a = a >> 8 end if (a & 0x0000000F) == 0 then n = n + 4 a = a >> 4 end if (a & 0x00000003) == 0 then n = n + 2 a = a >> 2 end if (a & 0x00000001) == 0 then n = n + 1 end return nend
function ops.i32_popcnt(a) local n = 0 for _ = 1, 32 do if (a & 1) == 1 then n = n + 1 end a = a >> 1 end return nend
function ops.i32_add(a, b) return (a + b) & constants.I32_MAXend
function ops.i32_sub(a, b) return (a - b) & constants.I32_MAXend
function ops.i32_mul(a, b) return (a * b) & constants.I32_MAXend
function ops.i32_div_s(a, b) a = intutil.signexti32(a) b = intutil.signexti32(b) return (a // b) & constants.I32_MAXend
function ops.i32_div_u(a, b) return (a // b) & constants.I32_MAXend
function ops.i32_rem_s(a, b) a = intutil.signexti32(a) b = intutil.signexti32(b) return (a % b) & constants.I32_MAXend
function ops.i32_rem_u(a, b) return (a % b) & constants.I32_MAXend
function ops.i32_and(a, b) return a & bend
function ops.i32_or(a, b) return a | bend
function ops.i32_xor(a, b) return a ~ bend
function ops.i32_shl(a, b) return (a << b) & constants.I32_MAXend
function ops.i32_shr_u(a, b) return (a >> b) & constants.I32_MAXend
function ops.i32_shr_s(a, b) if b >= 32 then if (a & 0x80000000) == 0 then return 0 else return constants.I32_MAX end end
local result = a >> b if (a & 0x80000000) ~= 0 then result = result | (((1 << b) - 1) << (32 - b)) end return resultend
function ops.i32_rotl(a, b) local c = b % 32 return ((a << c) | (a >> (32 - c))) & constants.I32_MAXend
function ops.i32_rotr(a, b) local c = b % 32 return ((a >> c) | (a << (32 - c))) & constants.I32_MAXend
--[[ int conversions ]]
function ops.i32_wrap_i64(a) return a & constants.I32_MAXend
function ops.i64_extend_i32_s(a) return intutil.signexti32(a)end
function ops.i64_extend_i32_u(a) return aend
function ops.i32_extend8_s(a) return intutil.signexti8(a) & constants.I32_MAXend
function ops.i32_extend16_s(a) return intutil.signexti16(a) & constants.I32_MAXend
function ops.i64_extend8_s(a) return intutil.signexti8(a)end
function ops.i64_extend16_s(a) return intutil.signexti16(a)end
function ops.i64_extend32_s(a) return intutil.signexti32(a)end
return ops