extensions
Steven Massey 3 years ago
parent 58e274af31
commit 1aa41b9064

@ -1012,7 +1012,7 @@ M3Result ResolveBlockResults (IM3Compilation o, IM3CompilationScope i_targetBl
u16 numParams = GetFuncTypeNumParams (i_targetBlock->type); u16 numParams = GetFuncTypeNumParams (i_targetBlock->type);
u16 numResults = GetFuncTypeNumResults (i_targetBlock->type); u16 numResults = GetFuncTypeNumResults (i_targetBlock->type);
u16 slotRecords = i_targetBlock->initStackIndex; u16 slotRecords = i_targetBlock->exitStackIndex;
u16 numValues; u16 numValues;
@ -1902,15 +1902,31 @@ _ (EmitSlotNumOfStackTopAndPop (o));
IM3FuncType blockType; IM3FuncType blockType;
_ (ReadBlockType (o, & blockType)); _ (ReadBlockType (o, & blockType));
dump_type_stack (o);
u16 stackIndex = o->stackIndex;
_ (CompileBlock (o, blockType, i_opcode)); _ (CompileBlock (o, blockType, i_opcode));
if (o->previousOpcode == c_waOp_else) if (o->previousOpcode == c_waOp_else)
{ {
o->stackIndex = stackIndex;
_ (CompileElseBlock (o, pc, blockType)); _ (CompileElseBlock (o, pc, blockType));
} }
else else
{ {
* pc = GetPC (o); if (GetFuncTypeNumResults (blockType))
{
// rewind to the if's end to create a fake else block
o->wasm--;
o->stackIndex = stackIndex;
dump_type_stack (o);
_ (CompileElseBlock (o, pc, blockType));
}
else * pc = GetPC (o);
} }
} _catch: return result; } _catch: return result;
@ -2511,7 +2527,7 @@ _catch:
} }
M3Result PushBlockResults (IM3Compilation o, bool i_pushFpReg) M3Result PushBlockResults (IM3Compilation o)
{ {
M3Result result = m3Err_none; M3Result result = m3Err_none;
@ -2523,8 +2539,7 @@ M3Result PushBlockResults (IM3Compilation o, bool i_pushFpReg)
if (i == numResults - 1 and IsFpType (type)) if (i == numResults - 1 and IsFpType (type))
{ {
if (i_pushFpReg) _ (PushRegister (o, type));
_ (PushRegister (o, type));
} }
else else
_ (PushAllocatedSlot (o, type)); _ (PushAllocatedSlot (o, type));
@ -2539,9 +2554,9 @@ M3Result CommitBlockResults (IM3Compilation o)
M3Result result = m3Err_none; M3Result result = m3Err_none;
// pop the param/result slot records // pop the param/result slot records
o->stackIndex = o->block.initStackIndex; o->stackIndex = o->block.exitStackIndex;
_ (PushBlockResults (o, true)); _ (PushBlockResults (o));
_catch: return result; _catch: return result;
} }
@ -2558,7 +2573,6 @@ M3Result CompileBlock (IM3Compilation o, IM3FuncType i_blockType, m3opcode_t i
block->pc = GetPagePC (o->page); block->pc = GetPagePC (o->page);
block->patches = NULL; block->patches = NULL;
block->type = i_blockType; block->type = i_blockType;
// block->initStackIndex = o->stackIndex;
block->depth ++; block->depth ++;
block->opcode = i_blockOpcode; block->opcode = i_blockOpcode;
@ -2576,16 +2590,18 @@ M3Result CompileBlock (IM3Compilation o, IM3FuncType i_blockType, m3opcode_t i
_ (PopType (o, type)); _ (PopType (o, type));
} }
} }
else stackIndex += numParams; else o->stackIndex -= numParams;
printf ("STACK: %d\n", o->stackIndex);
u16 paramIndex = o->stackIndex; u16 paramIndex = o->stackIndex;
block->initStackIndex = paramIndex; // consume the params at block exit block->exitStackIndex = paramIndex; // consume the params at block exit
// keep a copy of param slots in the stack // keep copies of param slots in the stack
o->stackIndex = stackIndex; o->stackIndex = stackIndex;
// find slots for the results ---------------------------- // find slots for the results ----------------------------
PushBlockResults (o, false); PushBlockResults (o);
stackIndex = o->stackIndex; stackIndex = o->stackIndex;
@ -2596,6 +2612,8 @@ _ (PopType (o, type));
block->blockStackIndex = o->stackIndex = stackIndex; block->blockStackIndex = o->stackIndex = stackIndex;
dump_type_stack (o);
// push the params back onto the stack ------------------- // push the params back onto the stack -------------------
for (u16 i = 0; i < numParams; ++i) for (u16 i = 0; i < numParams; ++i)
{ {
@ -2603,9 +2621,13 @@ _ (PopType (o, type));
u16 slot = GetSlotForStackIndex (o, paramIndex + i);// o->wasmStack [paramIndex + i] u16 slot = GetSlotForStackIndex (o, paramIndex + i);// o->wasmStack [paramIndex + i]
Push (o, type, slot); Push (o, type, slot);
MarkSlotsAllocatedByType (o, slot, type);
if (slot >= o->slotFirstDynamicIndex)
MarkSlotsAllocatedByType (o, slot, type);
} }
dump_type_stack (o);
//-------------------------------------------------------- //--------------------------------------------------------
_ (CompileBlockStatements (o)); _ (CompileBlockStatements (o));
@ -2617,17 +2639,24 @@ _ (ValidateBlockEnd (o));
if (IsStackPolymorphic (o)) if (IsStackPolymorphic (o))
_ (UnwindBlockStack (o)) _ (UnwindBlockStack (o))
else else
_ (ResolveBlockResults (o, & o->block, false)); _ (ResolveBlockResults (o, & o->block, /* isBranch: */ false));
if (o->previousOpcode == c_waOp_else) if (o->previousOpcode == c_waOp_else)
{ {
_ (UnwindBlockStack (o)) _ (UnwindBlockStack (o))
o->stackIndex = o->block.initStackIndex; // o->stackIndex = o->block.exitStackIndex;
} }
else else
{ {
_ (UnwindBlockStack (o)); _ (UnwindBlockStack (o));
_ (CommitBlockResults (o));
if (i_blockOpcode == c_waOp_if and numResults)
{
//_ (UnwindBlockStack (o))
// o->stackIndex = o->block.exitStackIndex;
}
else
_ (CommitBlockResults (o));
} }
} }

@ -50,7 +50,7 @@ typedef struct M3CompilationScope
pc_t pc; // used by ContinueLoop's pc_t pc; // used by ContinueLoop's
pc_t patches; pc_t patches;
i32 depth; i32 depth;
u16 initStackIndex; u16 exitStackIndex;
i16 blockStackIndex; i16 blockStackIndex;
// u16 topSlot; // u16 topSlot;
IM3FuncType type; IM3FuncType type;

@ -393,8 +393,8 @@ void dump_type_stack (IM3Compilation o)
} }
printf ("\n"); printf ("\n");
for (u32 r = 0; r < 2; ++r) // for (u32 r = 0; r < 2; ++r)
d_m3Assert (regAllocated [r] == 0); // reg allocation & stack out of sync // d_m3Assert (regAllocated [r] == 0); // reg allocation & stack out of sync
u16 maxSlot = GetMaxUsedSlotPlusOne (o); u16 maxSlot = GetMaxUsedSlotPlusOne (o);

Loading…
Cancel
Save