Add check for code section size, fix interp float operations (#1480)
And enable classic interpreter instead fast interpreter when llvm jit is enabled, so as to fix the issue that llvm jit cannot handle opcode drop_64/select_64.
This commit is contained in:
@ -189,6 +189,30 @@ popcount64(uint64 u)
|
||||
return ret;
|
||||
}
|
||||
|
||||
static float
|
||||
local_copysignf(float x, float y)
|
||||
{
|
||||
union {
|
||||
float f;
|
||||
uint32_t i;
|
||||
} ux = { x }, uy = { y };
|
||||
ux.i &= 0x7fffffff;
|
||||
ux.i |= uy.i & 0x80000000;
|
||||
return ux.f;
|
||||
}
|
||||
|
||||
static double
|
||||
local_copysign(double x, double y)
|
||||
{
|
||||
union {
|
||||
double f;
|
||||
uint64_t i;
|
||||
} ux = { x }, uy = { y };
|
||||
ux.i &= -1ULL / 2;
|
||||
ux.i |= uy.i & 1ULL << 63;
|
||||
return ux.f;
|
||||
}
|
||||
|
||||
#if WASM_CPU_SUPPORTS_UNALIGNED_ADDR_ACCESS != 0
|
||||
#define LOAD_U32_WITH_2U16S(addr) (*(uint32 *)(addr))
|
||||
#define LOAD_PTR(addr) (*(void **)(addr))
|
||||
@ -2415,7 +2439,7 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
|
||||
/* numberic instructions of f32 */
|
||||
HANDLE_OP(WASM_OP_F32_ABS)
|
||||
{
|
||||
DEF_OP_MATH(float32, F32, fabs);
|
||||
DEF_OP_MATH(float32, F32, fabsf);
|
||||
HANDLE_OP_END();
|
||||
}
|
||||
|
||||
@ -2433,31 +2457,31 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
|
||||
|
||||
HANDLE_OP(WASM_OP_F32_CEIL)
|
||||
{
|
||||
DEF_OP_MATH(float32, F32, ceil);
|
||||
DEF_OP_MATH(float32, F32, ceilf);
|
||||
HANDLE_OP_END();
|
||||
}
|
||||
|
||||
HANDLE_OP(WASM_OP_F32_FLOOR)
|
||||
{
|
||||
DEF_OP_MATH(float32, F32, floor);
|
||||
DEF_OP_MATH(float32, F32, floorf);
|
||||
HANDLE_OP_END();
|
||||
}
|
||||
|
||||
HANDLE_OP(WASM_OP_F32_TRUNC)
|
||||
{
|
||||
DEF_OP_MATH(float32, F32, trunc);
|
||||
DEF_OP_MATH(float32, F32, truncf);
|
||||
HANDLE_OP_END();
|
||||
}
|
||||
|
||||
HANDLE_OP(WASM_OP_F32_NEAREST)
|
||||
{
|
||||
DEF_OP_MATH(float32, F32, rint);
|
||||
DEF_OP_MATH(float32, F32, rintf);
|
||||
HANDLE_OP_END();
|
||||
}
|
||||
|
||||
HANDLE_OP(WASM_OP_F32_SQRT)
|
||||
{
|
||||
DEF_OP_MATH(float32, F32, sqrt);
|
||||
DEF_OP_MATH(float32, F32, sqrtf);
|
||||
HANDLE_OP_END();
|
||||
}
|
||||
|
||||
@ -2525,8 +2549,7 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
|
||||
|
||||
b = *(float32 *)(frame_lp + GET_OFFSET());
|
||||
a = *(float32 *)(frame_lp + GET_OFFSET());
|
||||
*(float32 *)(frame_lp + GET_OFFSET()) =
|
||||
(float32)(signbit(b) ? -fabs(a) : fabs(a));
|
||||
*(float32 *)(frame_lp + GET_OFFSET()) = local_copysignf(a, b);
|
||||
HANDLE_OP_END();
|
||||
}
|
||||
|
||||
@ -2642,7 +2665,7 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
|
||||
|
||||
b = POP_F64();
|
||||
a = POP_F64();
|
||||
PUSH_F64(signbit(b) ? -fabs(a) : fabs(a));
|
||||
PUSH_F64(local_copysign(a, b));
|
||||
HANDLE_OP_END();
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user