|
|
|
@ -1041,10 +1041,12 @@ M3Result ReadBlockType (IM3Compilation o, u8 * o_blockType)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
M3Result Compile_Loop_Block (IM3Compilation o, u8 i_opcode)
|
|
|
|
|
M3Result Compile_LoopOrBlock (IM3Compilation o, u8 i_opcode)
|
|
|
|
|
{
|
|
|
|
|
M3Result result;
|
|
|
|
|
|
|
|
|
|
_ (PreserveRegisters (o));
|
|
|
|
|
|
|
|
|
|
u8 blockType;
|
|
|
|
|
_ (ReadBlockType (o, & blockType));
|
|
|
|
|
|
|
|
|
@ -1244,8 +1246,8 @@ const M3OpInfo c_operations [] =
|
|
|
|
|
{
|
|
|
|
|
{ "unreachable", 0, none, NULL, NULL, NULL, Compile_Trap }, // 0x00
|
|
|
|
|
{ "nop", 0, none, NULL, NULL, NULL, Compile_Nop }, // 0x01 .
|
|
|
|
|
{ "block", 0, none, NULL, NULL, NULL, Compile_Loop_Block }, // 0x02
|
|
|
|
|
{ "loop", 0, none, NULL, NULL, NULL, Compile_Loop_Block }, // 0x03
|
|
|
|
|
{ "block", 0, none, NULL, NULL, NULL, Compile_LoopOrBlock }, // 0x02
|
|
|
|
|
{ "loop", 0, none, NULL, NULL, NULL, Compile_LoopOrBlock }, // 0x03
|
|
|
|
|
{ "if", -1, none, NULL, NULL, NULL, Compile_If }, // 0x04
|
|
|
|
|
{ "else", 0, none, NULL, NULL, NULL, Compile_Else_End }, // 0x05
|
|
|
|
|
|
|
|
|
@ -1282,7 +1284,7 @@ const M3OpInfo c_operations [] =
|
|
|
|
|
|
|
|
|
|
{ "i32.load8_s", 0, i_32, op_i32_Load_i8_r, op_i32_Load_i8_s, NULL, Compile_Load_Store }, // 0x2c
|
|
|
|
|
{ "i32.load8_u", 0, i_32, op_i32_Load_u8_r, op_i32_Load_u8_s, NULL, Compile_Load_Store }, // 0x2d
|
|
|
|
|
{ "i32.load16_s", 0, i_32, NULL, NULL, NULL, Compile_Load_Store }, // 0x2e
|
|
|
|
|
{ "i32.load16_s", 0, i_32, op_i32_Load_i16_r, op_i32_Load_i16_s, NULL, Compile_Load_Store }, // 0x2e
|
|
|
|
|
{ "i32.load16_u", 0, i_32, op_i32_Load_u16_r, op_i32_Load_u16_s, NULL, Compile_Load_Store }, // 0x2f
|
|
|
|
|
|
|
|
|
|
{ "i64.load8_s", 0, i_64, NULL, NULL, NULL, }, // 0x30
|
|
|
|
@ -1571,27 +1573,28 @@ M3Result Compile_Block (IM3Compilation o, u8 i_blockType, u8 i_blockOpcode)
|
|
|
|
|
{
|
|
|
|
|
M3Result result;
|
|
|
|
|
|
|
|
|
|
// if (i_blockOpcode != c_waOp_block) yes or no??
|
|
|
|
|
{
|
|
|
|
|
u16 i = GetFunctionNumArgsAndLocals (o->function);
|
|
|
|
|
while (i < o->stackIndex)
|
|
|
|
|
{
|
|
|
|
|
u16 location = o->wasmStack [i];
|
|
|
|
|
if (IsRegisterLocation (location))
|
|
|
|
|
{
|
|
|
|
|
printf ("deal! %d - %d \n", (i32) i, (i32) location);
|
|
|
|
|
abort ();
|
|
|
|
|
d_m3Assert(false);
|
|
|
|
|
}
|
|
|
|
|
++i;
|
|
|
|
|
}
|
|
|
|
|
} d_m3Assert (not IsRegisterAllocated (o, 0));
|
|
|
|
|
d_m3Assert (not IsRegisterAllocated (o, 1));
|
|
|
|
|
u32 numArgsAndLocals = GetFunctionNumArgsAndLocals (o->function);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// save and clear the locals modification slots
|
|
|
|
|
u16 locals [numArgsAndLocals];
|
|
|
|
|
|
|
|
|
|
// {
|
|
|
|
|
// u16 i = GetFunctionNumArgsAndLocals (o->function);
|
|
|
|
|
// while (i < o->stackIndex)
|
|
|
|
|
// {
|
|
|
|
|
// u16 location = o->wasmStack [i];
|
|
|
|
|
// if (IsRegisterLocation (location))
|
|
|
|
|
// {
|
|
|
|
|
// printf ("deal! %d - %d \n", (i32) i, (i32) location);
|
|
|
|
|
//// abort ();
|
|
|
|
|
//// d_m3Assert(false);
|
|
|
|
|
// }
|
|
|
|
|
// ++i;
|
|
|
|
|
// }
|
|
|
|
|
// }
|
|
|
|
|
d_m3Assert (not IsRegisterAllocated (o, 0));
|
|
|
|
|
d_m3Assert (not IsRegisterAllocated (o, 1));
|
|
|
|
|
|
|
|
|
|
memcpy (locals, o->wasmStack, numArgsAndLocals * sizeof (u16));
|
|
|
|
|
for (u32 i = 0; i < numArgsAndLocals; ++i)
|
|
|
|
|
{
|
|
|
|
|