multi-return fixes

extensions
Steven Massey 3 years ago
parent 34a313555f
commit 80aa6730a3

@ -106,7 +106,7 @@ u16 GetTypeNumSlots (u8 i_type)
i16 GetStackTopIndex (IM3Compilation o)
{ d_m3Assert (o->stackIndex > o->slotFirstDynamicIndex or IsStackPolymorphic (o));
{ d_m3Assert (o->stackIndex > o->stackFirstDynamicIndex or IsStackPolymorphic (o));
return o->stackIndex - 1;
}
@ -1073,7 +1073,7 @@ M3Result ReturnValues (IM3Compilation o, IM3CompilationScope i_targetBlock, bo
{
u8 returnType = GetFuncTypeResultType (i_targetBlock->type, numReturns - 1 - i);
u8 stackType = GetStackTopTypeAtOffset (o, i);
u8 stackType = GetStackTypeFromBottom (o, stackIndex);
if (IsStackPolymorphic (o) and stackType == c_m3Type_none)
stackType = returnType;
@ -2626,8 +2626,8 @@ _ (ReserveConstants (o));
o->function->maxStackSlots = o->slotMaxAllocatedIndexPlusOne = o->slotFirstDynamicIndex;
o->block.topSlot = o->slotFirstDynamicIndex;
o->block.initStackIndex = o->stackFirstDynamicIndex = o->stackIndex; m3log (compile, "start stack index: %d; top slot num: %d", (u32) o->stackFirstDynamicIndex, (u32) o->block.topSlot);
o->block.initStackIndex = o->stackFirstDynamicIndex = o->stackIndex; m3log (compile, "start stack index: %d; top slot num: %d",
(u32) o->stackFirstDynamicIndex, (u32) o->block.topSlot);
_ (EmitOp (o, op_Entry));
EmitPointer (o, io_function);
@ -2638,8 +2638,8 @@ _ (CompileBlockStatements (o));
io_function->compiled = pc;
u16 numConstantSlots = o->slotMaxConstIndex - o->slotFirstConstIndex; m3log (compile, "unique constant slots: %d; unused slots: %d", numConstantSlots, o->slotFirstDynamicIndex - o->slotMaxConstIndex);
u16 numConstantSlots = o->slotMaxConstIndex - o->slotFirstConstIndex; m3log (compile, "unique constant slots: %d; unused slots: %d",
numConstantSlots, o->slotFirstDynamicIndex - o->slotMaxConstIndex);
io_function->numConstantBytes = numConstantSlots * sizeof (m3slot_t);
if (numConstantSlots)

@ -887,11 +887,11 @@ M3Result m3_CallArgv (IM3Function i_function, uint32_t i_argc, const char * i_
}
u8 * AlignStackPointerTo64Bits (const u8 * i_stack)
{
uintptr_t ptr = (uintptr_t) i_stack;
return (u8 *) ((ptr + 7) & ~7);
}
//u8 * AlignStackPointerTo64Bits (const u8 * i_stack)
//{
// uintptr_t ptr = (uintptr_t) i_stack;
// return (u8 *) ((ptr + 7) & ~7);
//}
M3Result m3_GetResults (IM3Function i_function, uint32_t i_retc, const void * o_retptrs[])
@ -911,10 +911,10 @@ M3Result m3_GetResults (IM3Function i_function, uint32_t i_retc, const void *
for (u32 i = 0; i < ftype->numRets; ++i)
{
switch (d_FuncRetType(ftype, i)) {
case c_m3Type_i32: *(i32*)o_retptrs[i] = *(i32*)(s); s += 4; break;
case c_m3Type_i64: s = AlignStackPointerTo64Bits (s); *(i64*)o_retptrs[i] = *(i64*)(s); s += 8; break;
case c_m3Type_i32: *(i32*)o_retptrs[i] = *(i32*)(s); s += 8; break;
case c_m3Type_i64: *(i64*)o_retptrs[i] = *(i64*)(s); s += 8; break;
case c_m3Type_f32: *(f32*)o_retptrs[i] = *(f32*)(s); s += 4; break;
case c_m3Type_f64: s = AlignStackPointerTo64Bits (s); *(f64*)o_retptrs[i] = *(f64*)(s); s += 8; break;
case c_m3Type_f64: *(f64*)o_retptrs[i] = *(f64*)(s); s += 8; break;
default: return "unknown return type";
}
}
@ -943,10 +943,10 @@ M3Result m3_GetResultsVL (IM3Function i_function, va_list o_rets)
for (u32 i = 0; i < ftype->numRets; ++i)
{
switch (d_FuncRetType(ftype, i)) {
case c_m3Type_i32: *va_arg(o_rets, i32*) = *(i32*)(s); s += 4; break;
case c_m3Type_i64: s = AlignStackPointerTo64Bits (s); *va_arg(o_rets, i64*) = *(i64*)(s); s += 8; break;
case c_m3Type_f32: *va_arg(o_rets, f32*) = *(f32*)(s); s += 4; break;
case c_m3Type_f64: s = AlignStackPointerTo64Bits (s); *va_arg(o_rets, f64*) = *(f64*)(s); s += 8; break;
case c_m3Type_i32: *va_arg(o_rets, i32*) = *(i32*)(s); s += 8; break;
case c_m3Type_i64: *va_arg(o_rets, i64*) = *(i64*)(s); s += 8; break;
case c_m3Type_f32: *va_arg(o_rets, f32*) = *(f32*)(s); s += 8; break;
case c_m3Type_f64: *va_arg(o_rets, f64*) = *(f64*)(s); s += 8; break;
default: return "unknown argument type";
}
}

Loading…
Cancel
Save