preparing for 32-bit slots

extensions
Steven Massey 5 years ago
parent f91d57b55c
commit bc09270ceb

@ -247,7 +247,6 @@ u16 GetRegisterStackIndex (IM3Compilation o, u32 i_register)
}
u16 GetMaxExecSlot (IM3Compilation o)
{
u16 i = o->firstSlotIndex;
@ -286,7 +285,7 @@ M3Result PreserveRegisterIfOccupied (IM3Compilation o, u8 i_type)
{
o->wasmStack [stackIndex] = slot;
_ (EmitOp (o, regSelect ? op_SetSlot_f : op_SetSlot_i));
_ (EmitOp (o, regSelect ? op_SetSlot_f64 : op_SetSlot_i64));
EmitConstant (o, slot);
}
else _throw (c_m3Err_functionStackOverflow);
@ -435,6 +434,7 @@ M3Result PushConst (IM3Compilation o, u64 i_word, u8 i_m3Type)
u32 numConstants = o->constSlotIndex - o->firstConstSlotIndex;
// search for duplicate matching constant slot to reuse
for (u32 i = 0; i < numConstants; ++i)
{
if (o->constants [i] == i_word)
@ -487,7 +487,7 @@ M3Result CopyTopSlot (IM3Compilation o, u16 i_destSlot)
if (IsStackTopInRegister (o))
{
bool isFp = IsStackTopTypeFp (o);
op = isFp ? op_SetSlot_f : op_SetSlot_i;
op = isFp ? op_SetSlot_f64 : op_SetSlot_i64;
}
else op = op_CopySlot;
@ -514,7 +514,7 @@ M3Result PreservedCopyTopSlot (IM3Compilation o, u16 i_destSlot, u16 i_preserv
if (IsStackTopInRegister (o))
{
bool isFp = IsStackTopTypeFp (o);
op = isFp ? op_PreserveSetSlot_f : op_PreserveSetSlot_i;
op = isFp ? op_PreserveSetSlot_f64 : op_PreserveSetSlot_i64;
}
else op = op_PreserveCopySlot;
@ -539,9 +539,7 @@ M3Result MoveStackTopToRegister (IM3Compilation o)
{
u8 type = GetStackTopType (o);
// if (
IM3Operation op = IsFpType (type) ? op_SetRegister_f : op_SetRegister_i;
IM3Operation op = IsFpType (type) ? op_SetRegister_f64 : op_SetRegister_i64;
_ (EmitOp (o, op));
_ (EmitTopSlotAndPop (o));
@ -799,7 +797,7 @@ M3Result Compile_SetGlobal (IM3Compilation o, M3Global * i_global)
IM3Operation op;
if (IsStackTopInRegister (o))
op = IsStackTopTypeFp (o) ? op_SetGlobal_f : op_SetGlobal_i;
op = IsStackTopTypeFp (o) ? op_SetGlobal_f64 : op_SetGlobal_i;
else
op = op_SetGlobal_s;
@ -1138,8 +1136,8 @@ _ (Compile_ElseBlock (o, pc, blockType));
} _catch: return result;
}
static const IM3Operation ops_Select_i [] = { op_Select_i_ssr, op_Select_i_srs, op_Select_i_rss, op_Select_i_sss };
static const IM3Operation ops_Select_f [] = { op_Select_f_ssr, op_Select_f_srs, op_Select_f_rss, op_Select_f_sss };
static const IM3Operation ops_Select_i [] = { op_Select_i64_ssr, op_Select_i64_srs, op_Select_i64_rss, op_Select_i64_sss };
static const IM3Operation ops_Select_f [] = { op_Select_f64_ssr, op_Select_f64_srs, op_Select_f64_rss, op_Select_f64_sss };
M3Result Compile_Select (IM3Compilation o, u8 i_opcode)
{

@ -31,6 +31,7 @@
# define skip_immediate(TYPE) (void)* ((TYPE *) _pc++)
# define slot(TYPE) * (TYPE *) (_sp + immediate (i32))
# define slot_ptr(TYPE) (TYPE *) (_sp + immediate (i32))
#define nextOpDirect() ((IM3Operation)(* _pc))(_pc + 1, d_m3OpArgs)
#define jumpOpDirect(PC) ((IM3Operation)(* PC))( PC + 1, d_m3OpArgs)
@ -364,105 +365,60 @@ d_m3OpDecl (If_r)
d_m3OpDecl (If_s)
d_m3Op (Select_i_ssr)
{
i32 condition = (i32) _r0;
i64 operand2 = * (_sp + immediate (i32));
i64 operand1 = * (_sp + immediate (i32));
_r0 = (condition) ? operand1 : operand2;
return nextOp ();
}
d_m3Op (Select_i_srs)
{
i32 condition = (i32) * (_sp + immediate (i32));
i64 operand2 = _r0;
i64 operand1 = * (_sp + immediate (i32));
_r0 = (condition) ? operand1 : operand2;
return nextOp ();
}
d_m3Op (Select_i_rss)
{
i32 condition = (i32) * (_sp + immediate (i32));
i64 operand2 = * (_sp + immediate (i32));
i64 operand1 = _r0;
_r0 = (condition) ? operand1 : operand2;
return nextOp ();
}
d_m3Op (Select_i_sss)
{
i32 condition = (i32) * (_sp + immediate (i32));
i64 operand2 = * (_sp + immediate (i32));
i64 operand1 = * (_sp + immediate (i32));
_r0 = (condition) ? operand1 : operand2;
return nextOp ();
}
d_m3Op (Select_f_ssr)
{
i32 condition = (i32) _r0;
f64 operand2 = * (f64*)(_sp + immediate (i32));
f64 operand1 = * (f64*)(_sp + immediate (i32));
_fp0 = (condition) ? operand1 : operand2;
return nextOp ();
}
d_m3Op (Select_f_srs)
{
i32 condition = (i32) * (_sp + immediate (i32));
f64 operand2 = _fp0;
f64 operand1 = * (f64*)(_sp + immediate (i32));
_fp0 = (condition) ? operand1 : operand2;
return nextOp ();
}
d_m3Op (Select_f_rss)
{
i32 condition = (i32) * (_sp + immediate (i32));
f64 operand2 = * (f64*)(_sp + immediate (i32));
f64 operand1 = _fp0;
_fp0 = (condition) ? operand1 : operand2;
return nextOp ();
}
d_m3Op (Select_f_sss)
{
i32 condition = (i32) * (_sp + immediate (i32));
#define d_m3Select(TYPE, REG) \
d_m3Op (Select_##TYPE##_ssr) \
{ \
i32 condition = (i32) _r0; \
\
TYPE operand2 = slot (TYPE); \
TYPE operand1 = slot (TYPE); \
\
REG = (condition) ? operand1 : operand2; \
\
return nextOp (); \
} \
\
d_m3Op (Select_##TYPE##_srs) \
{ \
i32 condition = slot (i32); \
\
TYPE operand2 = (TYPE) REG; \
TYPE operand1 = slot (TYPE); \
\
REG = (condition) ? operand1 : operand2; \
\
return nextOp (); \
} \
\
d_m3Op (Select_##TYPE##_rss) \
{ \
i32 condition = slot (i32); \
\
TYPE operand2 = slot (TYPE); \
TYPE operand1 = (TYPE) REG; \
\
REG = (condition) ? operand1 : operand2; \
\
return nextOp (); \
} \
\
d_m3Op (Select_##TYPE##_sss) \
{ \
i32 condition = slot (i32); \
\
TYPE operand2 = slot (TYPE); \
TYPE operand1 = slot (TYPE); \
\
REG = (condition) ? operand1 : operand2; \
\
return nextOp (); \
}
d_m3Select (i32, _r0)
d_m3Select (i64, _r0)
d_m3Select (f32, _fp0)
d_m3Select (f64, _fp0)
f64 operand2 = * (f64*)(_sp + immediate (i32));
f64 operand1 = * (f64*)(_sp + immediate (i32));
_fp0 = (condition) ? operand1 : operand2;
return nextOp ();
}
d_m3Op (Return)
{
@ -542,10 +498,11 @@ d_m3OpDecl (Entry)
d_m3OpDecl (MemCurrent)
d_m3OpDecl (MemGrow)
d_m3Op (Const)
{
u64 constant = immediate (u64);
i32 offset = immediate (i32);
u64 constant = immediate (u64);
i32 offset = immediate (i32);
* (_sp + offset) = constant;
return nextOp ();
@ -601,113 +558,88 @@ d_m3Op (SetGlobal_i)
}
d_m3Op (SetGlobal_f)
d_m3Op (SetGlobal_f32)
{
f64 * global = immediate (f64 *);
f32 * global = immediate (f32 *);
* global = _fp0;
return nextOp ();
}
d_m3Op (CopySlot)
{
u64 * dst = _sp + immediate (i32);
u64 * src = _sp + immediate (i32);
* dst = * src; // printf ("copy: %p <- %" PRIi64 " <- %p\n", dst, * dst, src);
return nextOp ();
}
d_m3Op (PreserveCopySlot)
{
u64 * dest = _sp + immediate (i32);
u64 * src = _sp + immediate (i32);
u64 * preserve = _sp + immediate (i32);
* preserve = * dest;
* dest = * src;
return nextOp ();
}
d_m3Op (SetRegister_i)
{
i32 offset = immediate (i32);
u64 * stack = _sp + offset;
_r0 = * stack;
return nextOp ();
}
d_m3Op (SwapRegister_i)
d_m3Op (SetGlobal_f64)
{
slot (u64) = _r0;
_r0 = slot (u64);
f64 * global = immediate (f64 *);
* global = _fp0;
return nextOp ();
}
d_m3Op (SetRegister_f)
d_m3Op (CopySlot)
{
i32 offset = immediate (i32);
f64 * stack = (f64 *) _sp + offset;
_fp0 = * stack;
u64 * dst = slot_ptr (u64);
u64 * src = slot_ptr (u64);
* dst = * src; // printf ("copy: %p <- %" PRIi64 " <- %p\n", dst, * dst, src);
return nextOp ();
}
d_m3Op (SetSlot_i)
d_m3Op (PreserveCopySlot)
{
i32 offset = immediate (i32);
// printf ("setslot_i %d\n", offset);
u64 * stack = _sp + offset;
* stack = _r0;
return nextOp ();
}
u64 * dest = slot_ptr (u64);
u64 * src = slot_ptr (u64);
u64 * preserve = slot_ptr (u64);
d_m3Op (PreserveSetSlot_i)
{
u64 * stack = (u64 *) _sp + immediate (i32);
u64 * preserve = (u64 *) _sp + immediate (i32);
* preserve = * stack;
* stack = _r0;
* preserve = * dest;
* dest = * src;
return nextOp ();
}
d_m3Op (SetSlot_f)
{
i32 offset = immediate (i32);
f64 * stack = (f64 *) _sp + offset;
* stack = _fp0;
return nextOp ();
}
d_m3Op (PreserveSetSlot_f)
{
f64 * stack = (f64 *) _sp + immediate (i32);
f64 * preserve = (f64 *) _sp + immediate (i32);
* preserve = * stack;
* stack = _fp0;
return nextOp ();
}
//d_m3Op (SwapRegister_i)
//{
// slot (u64) = _r0;
// _r0 = slot (u64);
//
// return nextOp ();
//}
#define d_m3SetRegisterSetSlot(TYPE, REG) \
d_m3Op (SetRegister_##TYPE) \
{ \
REG = slot (TYPE); \
return nextOp (); \
} \
\
d_m3Op (SetSlot_##TYPE) \
{ \
slot (TYPE) = (TYPE) REG; \
return nextOp (); \
} \
\
d_m3Op (PreserveSetSlot_##TYPE) \
{ \
TYPE * stack = slot_ptr (TYPE); \
TYPE * preserve = slot_ptr (TYPE); \
\
* preserve = * stack; \
* stack = (TYPE) REG; \
\
return nextOp (); \
}
d_m3SetRegisterSetSlot (i32, _r0)
d_m3SetRegisterSetSlot (i64, _r0)
d_m3SetRegisterSetSlot (f32, _fp0)
d_m3SetRegisterSetSlot (f64, _fp0)
#define d_outOfBounds return c_m3Err_trapOutOfBoundsMemoryAccess

Loading…
Cancel
Save