stage0 新增内存复制指令 重构vm交互
This commit is contained in:
1 parent
0b8f649818
commit
40cffa9cb5
22 files changed
+626
-158
No files matched your search
@@ -785,6 +785,14 @@ int spl_vm_stack_set(spl_vm_t *vm, usize index, spl_vm_val_t val) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
usize spl_vm_call_arg_base(spl_vm_t *vm, const spl_vm_call_t *call) {
|
||||
if (!vm || !call || !call->args || !vm->stacks.data)
|
||||
return (usize)-1;
|
||||
if (call->args < vm->stacks.data)
|
||||
return (usize)-1;
|
||||
return (usize)(call->args - vm->stacks.data);
|
||||
}
|
||||
|
||||
spl_vm_val_t spl_vm_mem_alloc(spl_vm_t *vm, usize size) { return spl_vm_asp_alloc(vm, size); }
|
||||
|
||||
int spl_vm_mem_read(spl_vm_t *vm, spl_vm_val_t off, void *dst, usize n) {
|
||||
@@ -1358,6 +1366,7 @@ static int vm_loop(spl_vm_t *vm, size_t limit) {
|
||||
DT(SPL_CALLI), DT(SPL_RET), DT(SPL_ALLOC),
|
||||
DT(SPL_LADDR), DT(SPL_GADDR), DT(SPL_LOAD),
|
||||
DT(SPL_STORE), DT(SPL_NCALL), DT(SPL_NLIB),
|
||||
DT(SPL_MEMCPY),
|
||||
DT(SPL_BK), DT(SPL_DBG), [SPL_ERROR] = &&L_default,
|
||||
};
|
||||
|
||||
@@ -1679,6 +1688,20 @@ L_SPL_STORE:
|
||||
memcpy(_addr, &_v, spl_type_size(ins->type));
|
||||
DISPATCH();
|
||||
}
|
||||
L_SPL_MEMCPY:
|
||||
{
|
||||
spl_vm_val_t _n = POP();
|
||||
spl_vm_val_t _src = POP();
|
||||
spl_vm_val_t _dst = POP();
|
||||
if (_n) {
|
||||
void *_d = spl_vm_xlate(vm, _dst, (usize)_n);
|
||||
void *_s = spl_vm_xlate(vm, _src, (usize)_n);
|
||||
if (!_d || !_s)
|
||||
VM_ERROR("MEMCPY: invalid address");
|
||||
memmove(_d, _s, (usize)_n);
|
||||
}
|
||||
DISPATCH();
|
||||
}
|
||||
|
||||
/* ========== Type Conversion ========== */
|
||||
L_SPL_TRUNC:
|
||||
|
||||
Reference in new issue
Block a user