eliminated runtime dependence from code pages to allow for (future) code-sharing

extensions
Steven Massey 5 years ago
parent 453348bd4e
commit 7c5ce6fb2c

@ -53,18 +53,14 @@ u32 NumFreeLines (IM3CodePage i_page)
void EmitWord_impl (IM3CodePage i_page, void * i_word)
{
d_m3Assert (i_page->info.lineIndex+1 <= i_page->info.numLines);
{ d_m3Assert (i_page->info.lineIndex+1 <= i_page->info.numLines);
i_page->code [i_page->info.lineIndex++] = (void *) i_word;
}
void EmitWord64_impl (IM3CodePage i_page, const u64 i_word)
{
d_m3Assert (i_page->info.lineIndex+2 <= i_page->info.numLines);
*((u64*)&i_page->code[i_page->info.lineIndex]) = i_word;
i_page->info.lineIndex+=2;
{ d_m3Assert (i_page->info.lineIndex+2 <= i_page->info.numLines);
*((u64 *) & i_page->code [i_page->info.lineIndex]) = i_word;
i_page->info.lineIndex += 2;
}

@ -479,13 +479,6 @@ M3Result EmitTopSlotAndPop (IM3Compilation o)
}
void EmitMemory (IM3Compilation o)
{
// this is factored out for potential future functionality. see comment on op_Loop in m3_exec.c
EmitPointer (o, & o->runtime->memory);
}
M3Result AddTrapRecord (IM3Compilation o)
{
M3Result result = c_m3Err_none;
@ -1151,8 +1144,6 @@ _ (CompileCallArgsReturn (o, & slotTop, function->funcType, false));
_ (EmitOp (o, op));
EmitPointer (o, operand);
EmitOffset (o, slotTop);
EmitMemory (o);
}
else
{
@ -1185,7 +1176,6 @@ _ (EmitOp (o, op_CallIndirect));
EmitPointer (o, o->module);
EmitPointer (o, type); // TODO: unify all types in M3Environment
EmitOffset (o, execTop);
EmitMemory (o);
}
else _throw ("function type index out of range");
@ -1201,7 +1191,6 @@ M3Result Compile_Memory_Current (IM3Compilation o, u8 i_opcode)
_ (ReadLEB_i7 (& reserved, & o->wasm, o->wasmEnd));
_ (EmitOp (o, op_MemCurrent));
EmitPointer (o, o->runtime);
_ (PushRegister (o, c_m3Type_i32)); // i32?
@ -1220,7 +1209,6 @@ _ (MoveStackTopToRegister (o)); // a stack flavor of Grow would get rid of t
_ (Pop (o));
_ (EmitOp (o, op_MemGrow));
EmitPointer (o, o->runtime);
_ (PushRegister (o, c_m3Type_i32)); // i32?

@ -10,9 +10,34 @@
#include "m3_compile.h"
static inline
M3MemoryHeader * GetMemoryHeader (u8 * i_memory)
{
M3MemoryHeader * header = (M3MemoryHeader *) i_memory - 1;
return header;
}
static inline
IM3Memory GetMemoryInfo (u8 * i_memory)
{
M3MemoryHeader * header = GetMemoryHeader (i_memory);
IM3Memory memory = & header->runtime->memory;
return memory;
}
static inline
IM3Runtime GetRuntime (u8 * i_memory)
{
M3MemoryHeader * header = GetMemoryHeader (i_memory);
return header->runtime;
}
m3ret_t ReportOutOfBoundsMemoryError (pc_t i_pc, u8 * i_mem, u32 i_offset)
{
M3MemoryHeader * info = (M3MemoryHeader*)(i_mem) - 1;
M3MemoryHeader * info = GetMemoryHeader (i_mem);
u8 * mem8 = i_mem + i_offset;
ErrorRuntime (c_m3Err_trapOutOfBoundsMemoryAccess, info->runtime,
@ -29,11 +54,14 @@ void ReportError2 (IM3Function i_function, m3ret_t i_result)
}
d_m3OpDef (Call)
{
pc_t callPC = immediate (pc_t);
i32 stackOffset = immediate (i32);
IM3Memory memory = immediate (IM3Memory);
IM3Memory memory = GetMemoryInfo (_mem);
m3stack_t sp = _sp + stackOffset;
@ -53,7 +81,7 @@ d_m3OpDef (CallIndirect)
IM3Module module = immediate (IM3Module);
IM3FuncType type = immediate (IM3FuncType);
i32 stackOffset = immediate (i32);
M3Memory * memory = immediate (M3Memory *);
IM3Memory memory = GetMemoryInfo (_mem);
m3stack_t sp = _sp + stackOffset;
@ -114,9 +142,9 @@ d_m3OpDef (MemCurrent)
{
// TODO: get memory from _mem, so that compiled code isn't tied to a specific runtime
IM3Runtime runtime = immediate (IM3Runtime);
IM3Memory memory = GetMemoryInfo (_mem);
_r0 = runtime->memory.numPages;
_r0 = memory->numPages;
return nextOp ();
}
@ -124,11 +152,8 @@ d_m3OpDef (MemCurrent)
d_m3OpDef (MemGrow)
{
// TODO: get memory from _mem, so that compiled code isn't tied to a specific runtime
IM3Runtime runtime = immediate (IM3Runtime);
IM3Memory memory = & runtime->memory;
IM3Runtime runtime = GetRuntime (_mem);
IM3Memory memory = & runtime->memory;
u32 numPagesToGrow = (u32) _r0;
_r0 = memory->numPages;
@ -155,7 +180,7 @@ d_m3OpDef (MemGrow)
// do both.
d_m3OpDef (Compile)
{
rewrite (op_Call);
rewrite_op (op_Call);
IM3Function function = immediate (IM3Function);
@ -307,12 +332,12 @@ d_m3OpDef (SetGlobal_i)
}
d_m3OpDef (Loop)
{
m3ret_t r;
M3MemoryHeader * header = (M3MemoryHeader *) _mem - 1;
IM3Memory memory = & header->runtime->memory;
IM3Memory memory = GetMemoryInfo (_mem);
do
{

@ -19,7 +19,7 @@
#include <math.h>
#include <limits.h>
# define rewrite(NAME) * ((void **) (_pc-1)) = (void*)(NAME)
# define rewrite_op(OP) * ((void **) (_pc-1)) = (void*)(OP)
# define d_m3RetSig static inline m3ret_t vectorcall
# define d_m3Op(NAME) d_m3RetSig op_##NAME (d_m3OpSig)
@ -28,7 +28,7 @@
# define d_m3OpDecl(NAME) d_m3OpDef (NAME);
# define immediate(TYPE) * ((TYPE *) _pc++)
# define skip_immediate(TYPE) (void)* ((TYPE *) _pc++)
# define skip_immediate(TYPE) (_pc++)
# define slot(TYPE) * (TYPE *) (_sp + immediate (i32))
# define slot_ptr(TYPE) (TYPE *) (_sp + immediate (i32))

Loading…
Cancel
Save