From 2a017a336c26b0723a111c10215333d05c95b140 Mon Sep 17 00:00:00 2001 From: Daniel Kolesa Date: Sun, 28 Mar 2021 17:11:35 +0200 Subject: [PATCH] reorder vm a bit --- src/cs_vm.cc | 163 ++++++++++++++++++++++++++------------------------- 1 file changed, 83 insertions(+), 80 deletions(-) diff --git a/src/cs_vm.cc b/src/cs_vm.cc index 688ef98..7b9a13c 100644 --- a/src/cs_vm.cc +++ b/src/cs_vm.cc @@ -611,6 +611,15 @@ std::uint32_t *vm_exec( } break; + case BC_INST_BLOCK: { + std::uint32_t len = op >> 8; + args.emplace_back(cs).set_code( + reinterpret_cast(code + 1) + ); + code += len; + continue; + } + case BC_INST_EMPTY | BC_RET_NULL: args.emplace_back(cs).set_code( bcode_get_empty(ts.istate->empty, VAL_NULL) @@ -631,14 +640,7 @@ std::uint32_t *vm_exec( bcode_get_empty(ts.istate->empty, VAL_FLOAT) ); break; - case BC_INST_BLOCK: { - std::uint32_t len = op >> 8; - args.emplace_back(cs).set_code( - reinterpret_cast(code + 1) - ); - code += len; - continue; - } + case BC_INST_COMPILE: { any_value &arg = args.back(); codegen_state gs{ts}; @@ -680,6 +682,7 @@ std::uint32_t *vm_exec( ); continue; } + case BC_INST_COND: { any_value &arg = args.back(); switch (arg.get_type()) { @@ -900,6 +903,24 @@ std::uint32_t *vm_exec( continue; } + case BC_INST_CONC | BC_RET_NULL: + case BC_INST_CONC | BC_RET_STRING: + case BC_INST_CONC | BC_RET_FLOAT: + case BC_INST_CONC | BC_RET_INT: + case BC_INST_CONC_W | BC_RET_NULL: + case BC_INST_CONC_W | BC_RET_STRING: + case BC_INST_CONC_W | BC_RET_FLOAT: + case BC_INST_CONC_W | BC_RET_INT: { + std::size_t numconc = op >> 8; + auto buf = concat_values( + cs, std::span{&args[args.size() - numconc], numconc}, + ((op & BC_INST_OP_MASK) == BC_INST_CONC) ? " " : "" + ); + args.resize(args.size() - numconc, any_value{cs}); + force_arg(args.emplace_back(cs), op & BC_INST_RET_MASK); + continue; + } + case BC_INST_SVAR | BC_RET_STRING: case BC_INST_SVAR | BC_RET_NULL: args.emplace_back(cs).set_str(static_cast( @@ -1009,78 +1030,6 @@ std::uint32_t *vm_exec( continue; } - case BC_INST_COM | BC_RET_NULL: - case BC_INST_COM | BC_RET_STRING: - case BC_INST_COM | BC_RET_FLOAT: - case BC_INST_COM | BC_RET_INT: { - command_impl *id = static_cast( - ts.istate->identmap[op >> 8] - ); - std::size_t offset = args.size() - id->get_num_args(); - result.force_none(); - id->call(cs, std::span{ - &args[offset], std::size_t(id->get_num_args()) - }, result); - force_arg(result, op & BC_INST_RET_MASK); - args.resize(offset, any_value{cs}); - continue; - } - - case BC_INST_COM_V | BC_RET_NULL: - case BC_INST_COM_V | BC_RET_STRING: - case BC_INST_COM_V | BC_RET_FLOAT: - case BC_INST_COM_V | BC_RET_INT: { - command_impl *id = static_cast( - ts.istate->identmap[op >> 13] - ); - std::size_t callargs = (op >> 8) & 0x1F; - std::size_t offset = args.size() - callargs; - result.force_none(); - id->call(cs, std::span{&args[offset], callargs}, result); - force_arg(result, op & BC_INST_RET_MASK); - args.resize(offset, any_value{cs}); - continue; - } - case BC_INST_COM_C | BC_RET_NULL: - case BC_INST_COM_C | BC_RET_STRING: - case BC_INST_COM_C | BC_RET_FLOAT: - case BC_INST_COM_C | BC_RET_INT: { - command_impl *id = static_cast( - ts.istate->identmap[op >> 13] - ); - std::size_t callargs = (op >> 8) & 0x1F, - offset = args.size() - callargs; - result.force_none(); - { - any_value tv{cs}; - tv.set_str(concat_values(cs, std::span{ - &args[offset], callargs - }, " ")); - id->call(cs, std::span{&tv, 1}, result); - } - force_arg(result, op & BC_INST_RET_MASK); - args.resize(offset, any_value{cs}); - continue; - } - - case BC_INST_CONC | BC_RET_NULL: - case BC_INST_CONC | BC_RET_STRING: - case BC_INST_CONC | BC_RET_FLOAT: - case BC_INST_CONC | BC_RET_INT: - case BC_INST_CONC_W | BC_RET_NULL: - case BC_INST_CONC_W | BC_RET_STRING: - case BC_INST_CONC_W | BC_RET_FLOAT: - case BC_INST_CONC_W | BC_RET_INT: { - std::size_t numconc = op >> 8; - auto buf = concat_values( - cs, std::span{&args[args.size() - numconc], numconc}, - ((op & BC_INST_OP_MASK) == BC_INST_CONC) ? " " : "" - ); - args.resize(args.size() - numconc, any_value{cs}); - force_arg(args.emplace_back(cs), op & BC_INST_RET_MASK); - continue; - } - case BC_INST_ALIAS: { auto *imp = static_cast( ts.istate->identmap[op >> 8] @@ -1251,6 +1200,60 @@ noid: } } } + + case BC_INST_COM | BC_RET_NULL: + case BC_INST_COM | BC_RET_STRING: + case BC_INST_COM | BC_RET_FLOAT: + case BC_INST_COM | BC_RET_INT: { + command_impl *id = static_cast( + ts.istate->identmap[op >> 8] + ); + std::size_t offset = args.size() - id->get_num_args(); + result.force_none(); + id->call(cs, std::span{ + &args[offset], std::size_t(id->get_num_args()) + }, result); + force_arg(result, op & BC_INST_RET_MASK); + args.resize(offset, any_value{cs}); + continue; + } + + case BC_INST_COM_V | BC_RET_NULL: + case BC_INST_COM_V | BC_RET_STRING: + case BC_INST_COM_V | BC_RET_FLOAT: + case BC_INST_COM_V | BC_RET_INT: { + command_impl *id = static_cast( + ts.istate->identmap[op >> 13] + ); + std::size_t callargs = (op >> 8) & 0x1F; + std::size_t offset = args.size() - callargs; + result.force_none(); + id->call(cs, std::span{&args[offset], callargs}, result); + force_arg(result, op & BC_INST_RET_MASK); + args.resize(offset, any_value{cs}); + continue; + } + case BC_INST_COM_C | BC_RET_NULL: + case BC_INST_COM_C | BC_RET_STRING: + case BC_INST_COM_C | BC_RET_FLOAT: + case BC_INST_COM_C | BC_RET_INT: { + command_impl *id = static_cast( + ts.istate->identmap[op >> 13] + ); + std::size_t callargs = (op >> 8) & 0x1F, + offset = args.size() - callargs; + result.force_none(); + { + any_value tv{cs}; + tv.set_str(concat_values(cs, std::span{ + &args[offset], callargs + }, " ")); + id->call(cs, std::span{&tv, 1}, result); + } + force_arg(result, op & BC_INST_RET_MASK); + args.resize(offset, any_value{cs}); + continue; + } } } return code;