Skip to content

Commit ab929c2

Browse files
authored
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.
1 parent 7593668 commit ab929c2

File tree

9 files changed

+175
-22
lines changed

9 files changed

+175
-22
lines changed

build-scripts/runtime_lib.cmake

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ endif ()
5252
################ optional according to settings ################
5353
if (WAMR_BUILD_INTERP EQUAL 1 OR WAMR_BUILD_JIT EQUAL 1
5454
OR WAMR_BUILD_FAST_JIT EQUAL 1)
55-
if (WAMR_BUILD_FAST_JIT EQUAL 1)
55+
if (WAMR_BUILD_FAST_JIT EQUAL 1 OR WAMR_BUILD_JIT EQUAL 1)
5656
set (WAMR_BUILD_FAST_INTERP 0)
5757
endif ()
5858
include (${IWASM_DIR}/interpreter/iwasm_interp.cmake)

core/iwasm/interpreter/wasm_interp_classic.c

Lines changed: 32 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,30 @@ popcount64(uint64 u)
198198
return ret;
199199
}
200200

201+
static float
202+
local_copysignf(float x, float y)
203+
{
204+
union {
205+
float f;
206+
uint32_t i;
207+
} ux = { x }, uy = { y };
208+
ux.i &= 0x7fffffff;
209+
ux.i |= uy.i & 0x80000000;
210+
return ux.f;
211+
}
212+
213+
static double
214+
local_copysign(double x, double y)
215+
{
216+
union {
217+
double f;
218+
uint64_t i;
219+
} ux = { x }, uy = { y };
220+
ux.i &= -1ULL / 2;
221+
ux.i |= uy.i & 1ULL << 63;
222+
return ux.f;
223+
}
224+
201225
static uint64
202226
read_leb(const uint8 *buf, uint32 *p_offset, uint32 maxbits, bool sign)
203227
{
@@ -2580,7 +2604,7 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
25802604
/* numberic instructions of f32 */
25812605
HANDLE_OP(WASM_OP_F32_ABS)
25822606
{
2583-
DEF_OP_MATH(float32, F32, fabs);
2607+
DEF_OP_MATH(float32, F32, fabsf);
25842608
HANDLE_OP_END();
25852609
}
25862610

@@ -2597,31 +2621,31 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
25972621

25982622
HANDLE_OP(WASM_OP_F32_CEIL)
25992623
{
2600-
DEF_OP_MATH(float32, F32, ceil);
2624+
DEF_OP_MATH(float32, F32, ceilf);
26012625
HANDLE_OP_END();
26022626
}
26032627

26042628
HANDLE_OP(WASM_OP_F32_FLOOR)
26052629
{
2606-
DEF_OP_MATH(float32, F32, floor);
2630+
DEF_OP_MATH(float32, F32, floorf);
26072631
HANDLE_OP_END();
26082632
}
26092633

26102634
HANDLE_OP(WASM_OP_F32_TRUNC)
26112635
{
2612-
DEF_OP_MATH(float32, F32, trunc);
2636+
DEF_OP_MATH(float32, F32, truncf);
26132637
HANDLE_OP_END();
26142638
}
26152639

26162640
HANDLE_OP(WASM_OP_F32_NEAREST)
26172641
{
2618-
DEF_OP_MATH(float32, F32, rint);
2642+
DEF_OP_MATH(float32, F32, rintf);
26192643
HANDLE_OP_END();
26202644
}
26212645

26222646
HANDLE_OP(WASM_OP_F32_SQRT)
26232647
{
2624-
DEF_OP_MATH(float32, F32, sqrt);
2648+
DEF_OP_MATH(float32, F32, sqrtf);
26252649
HANDLE_OP_END();
26262650
}
26272651

@@ -2687,7 +2711,7 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
26872711

26882712
b = POP_F32();
26892713
a = POP_F32();
2690-
PUSH_F32(signbit(b) ? -fabs(a) : fabs(a));
2714+
PUSH_F32(local_copysignf(a, b));
26912715
HANDLE_OP_END();
26922716
}
26932717

@@ -2801,7 +2825,7 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
28012825

28022826
b = POP_F64();
28032827
a = POP_F64();
2804-
PUSH_F64(signbit(b) ? -fabs(a) : fabs(a));
2828+
PUSH_F64(local_copysign(a, b));
28052829
HANDLE_OP_END();
28062830
}
28072831

core/iwasm/interpreter/wasm_interp_fast.c

Lines changed: 32 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,30 @@ popcount64(uint64 u)
189189
return ret;
190190
}
191191

192+
static float
193+
local_copysignf(float x, float y)
194+
{
195+
union {
196+
float f;
197+
uint32_t i;
198+
} ux = { x }, uy = { y };
199+
ux.i &= 0x7fffffff;
200+
ux.i |= uy.i & 0x80000000;
201+
return ux.f;
202+
}
203+
204+
static double
205+
local_copysign(double x, double y)
206+
{
207+
union {
208+
double f;
209+
uint64_t i;
210+
} ux = { x }, uy = { y };
211+
ux.i &= -1ULL / 2;
212+
ux.i |= uy.i & 1ULL << 63;
213+
return ux.f;
214+
}
215+
192216
#if WASM_CPU_SUPPORTS_UNALIGNED_ADDR_ACCESS != 0
193217
#define LOAD_U32_WITH_2U16S(addr) (*(uint32 *)(addr))
194218
#define LOAD_PTR(addr) (*(void **)(addr))
@@ -2415,7 +2439,7 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
24152439
/* numberic instructions of f32 */
24162440
HANDLE_OP(WASM_OP_F32_ABS)
24172441
{
2418-
DEF_OP_MATH(float32, F32, fabs);
2442+
DEF_OP_MATH(float32, F32, fabsf);
24192443
HANDLE_OP_END();
24202444
}
24212445

@@ -2433,31 +2457,31 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
24332457

24342458
HANDLE_OP(WASM_OP_F32_CEIL)
24352459
{
2436-
DEF_OP_MATH(float32, F32, ceil);
2460+
DEF_OP_MATH(float32, F32, ceilf);
24372461
HANDLE_OP_END();
24382462
}
24392463

24402464
HANDLE_OP(WASM_OP_F32_FLOOR)
24412465
{
2442-
DEF_OP_MATH(float32, F32, floor);
2466+
DEF_OP_MATH(float32, F32, floorf);
24432467
HANDLE_OP_END();
24442468
}
24452469

24462470
HANDLE_OP(WASM_OP_F32_TRUNC)
24472471
{
2448-
DEF_OP_MATH(float32, F32, trunc);
2472+
DEF_OP_MATH(float32, F32, truncf);
24492473
HANDLE_OP_END();
24502474
}
24512475

24522476
HANDLE_OP(WASM_OP_F32_NEAREST)
24532477
{
2454-
DEF_OP_MATH(float32, F32, rint);
2478+
DEF_OP_MATH(float32, F32, rintf);
24552479
HANDLE_OP_END();
24562480
}
24572481

24582482
HANDLE_OP(WASM_OP_F32_SQRT)
24592483
{
2460-
DEF_OP_MATH(float32, F32, sqrt);
2484+
DEF_OP_MATH(float32, F32, sqrtf);
24612485
HANDLE_OP_END();
24622486
}
24632487

@@ -2525,8 +2549,7 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
25252549

25262550
b = *(float32 *)(frame_lp + GET_OFFSET());
25272551
a = *(float32 *)(frame_lp + GET_OFFSET());
2528-
*(float32 *)(frame_lp + GET_OFFSET()) =
2529-
(float32)(signbit(b) ? -fabs(a) : fabs(a));
2552+
*(float32 *)(frame_lp + GET_OFFSET()) = local_copysignf(a, b);
25302553
HANDLE_OP_END();
25312554
}
25322555

@@ -2642,7 +2665,7 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
26422665

26432666
b = POP_F64();
26442667
a = POP_F64();
2645-
PUSH_F64(signbit(b) ? -fabs(a) : fabs(a));
2668+
PUSH_F64(local_copysign(a, b));
26462669
HANDLE_OP_END();
26472670
}
26482671

core/iwasm/interpreter/wasm_loader.c

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3278,6 +3278,13 @@ load_from_sections(WASMModule *module, WASMSection *sections,
32783278
error_buf_size)) {
32793279
return false;
32803280
}
3281+
3282+
if (i == module->function_count - 1
3283+
&& func->code + func->code_size != buf_code_end) {
3284+
set_error_buf(error_buf, error_buf_size,
3285+
"code section size mismatch");
3286+
return false;
3287+
}
32813288
}
32823289

32833290
if (!module->possible_memory_grow) {
@@ -7344,7 +7351,7 @@ wasm_loader_prepare_bytecode(WASMModule *module, WASMFunction *func,
73447351
else if (is_64bit_type(*(loader_ctx->frame_ref - 1))) {
73457352
loader_ctx->frame_ref -= 2;
73467353
loader_ctx->stack_cell_num -= 2;
7347-
#if (WASM_ENABLE_FAST_INTERP == 0) || (WASM_ENABLE_JIT != 0)
7354+
#if WASM_ENABLE_FAST_INTERP == 0
73487355
*(p - 1) = WASM_OP_DROP_64;
73497356
#endif
73507357
#if WASM_ENABLE_FAST_INTERP != 0
@@ -7406,7 +7413,7 @@ wasm_loader_prepare_bytecode(WASMModule *module, WASMFunction *func,
74067413
break;
74077414
case REF_I64_2:
74087415
case REF_F64_2:
7409-
#if (WASM_ENABLE_FAST_INTERP == 0) || (WASM_ENABLE_JIT != 0)
7416+
#if WASM_ENABLE_FAST_INTERP == 0
74107417
*(p - 1) = WASM_OP_SELECT_64;
74117418
#endif
74127419
#if WASM_ENABLE_FAST_INTERP != 0

core/iwasm/interpreter/wasm_mini_loader.c

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2115,6 +2115,10 @@ load_from_sections(WASMModule *module, WASMSection *sections,
21152115
error_buf_size)) {
21162116
return false;
21172117
}
2118+
2119+
if (i == module->function_count - 1) {
2120+
bh_assert(func->code + func->code_size == buf_code_end);
2121+
}
21182122
}
21192123

21202124
if (!module->possible_memory_grow) {
@@ -5545,7 +5549,7 @@ wasm_loader_prepare_bytecode(WASMModule *module, WASMFunction *func,
55455549
else if (is_64bit_type(*(loader_ctx->frame_ref - 1))) {
55465550
loader_ctx->frame_ref -= 2;
55475551
loader_ctx->stack_cell_num -= 2;
5548-
#if (WASM_ENABLE_FAST_INTERP == 0) || (WASM_ENABLE_JIT != 0)
5552+
#if WASM_ENABLE_FAST_INTERP == 0
55495553
*(p - 1) = WASM_OP_DROP_64;
55505554
#endif
55515555
#if WASM_ENABLE_FAST_INTERP != 0
@@ -5591,7 +5595,7 @@ wasm_loader_prepare_bytecode(WASMModule *module, WASMFunction *func,
55915595
break;
55925596
case REF_I64_2:
55935597
case REF_F64_2:
5594-
#if (WASM_ENABLE_FAST_INTERP == 0) || (WASM_ENABLE_JIT != 0)
5598+
#if WASM_ENABLE_FAST_INTERP == 0
55955599
*(p - 1) = WASM_OP_SELECT_64;
55965600
#endif
55975601
#if WASM_ENABLE_FAST_INTERP != 0

core/shared/platform/alios/platform_internal.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,11 +52,13 @@ double fmax(double x, double y);
5252
double rint(double x);
5353
double fabs(double x);
5454
double trunc(double x);
55+
float sqrtf(float x);
5556
float floorf(float x);
5657
float ceilf(float x);
5758
float fminf(float x, float y);
5859
float fmaxf(float x, float y);
5960
float rintf(float x);
61+
float fabsf(float x);
6062
float truncf(float x);
6163
int signbit(double x);
6264
int isnan(double x);

core/shared/platform/common/math/math.c

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -622,6 +622,74 @@ freebsd_atan2(double y, double x)
622622
}
623623
}
624624

625+
static float
626+
freebsd_sqrtf(float x)
627+
{
628+
float z;
629+
int32_t sign = (int)0x80000000;
630+
int32_t ix, s, q, m, t, i;
631+
u_int32_t r;
632+
633+
GET_FLOAT_WORD(ix, x);
634+
635+
/* take care of Inf and NaN */
636+
if ((ix & 0x7f800000) == 0x7f800000) {
637+
return x * x + x; /* sqrt(NaN)=NaN, sqrt(+inf)=+inf
638+
sqrt(-inf)=sNaN */
639+
}
640+
/* take care of zero */
641+
if (ix <= 0) {
642+
if ((ix & (~sign)) == 0)
643+
return x; /* sqrt(+-0) = +-0 */
644+
else if (ix < 0)
645+
return (x - x) / (x - x); /* sqrt(-ve) = sNaN */
646+
}
647+
/* normalize x */
648+
m = (ix >> 23);
649+
if (m == 0) { /* subnormal x */
650+
for (i = 0; (ix & 0x00800000) == 0; i++)
651+
ix <<= 1;
652+
m -= i - 1;
653+
}
654+
m -= 127; /* unbias exponent */
655+
ix = (ix & 0x007fffff) | 0x00800000;
656+
if (m & 1) /* odd m, double x to make it even */
657+
ix += ix;
658+
m >>= 1; /* m = [m/2] */
659+
660+
/* generate sqrt(x) bit by bit */
661+
ix += ix;
662+
q = s = 0; /* q = sqrt(x) */
663+
r = 0x01000000; /* r = moving bit from right to left */
664+
665+
while (r != 0) {
666+
t = s + r;
667+
if (t <= ix) {
668+
s = t + r;
669+
ix -= t;
670+
q += r;
671+
}
672+
ix += ix;
673+
r >>= 1;
674+
}
675+
676+
/* use floating add to find out rounding direction */
677+
if (ix != 0) {
678+
z = one - tiny; /* trigger inexact flag */
679+
if (z >= one) {
680+
z = one + tiny;
681+
if (z > one)
682+
q += 2;
683+
else
684+
q += (q & 1);
685+
}
686+
}
687+
ix = (q >> 1) + 0x3f000000;
688+
ix += (m << 23);
689+
SET_FLOAT_WORD(z, ix);
690+
return z;
691+
}
692+
625693
static double
626694
freebsd_sqrt(double x) /* wrapper sqrt */
627695
{
@@ -935,6 +1003,15 @@ freebsd_isnan(double d)
9351003
}
9361004
}
9371005

1006+
static float
1007+
freebsd_fabsf(float x)
1008+
{
1009+
u_int32_t ix;
1010+
GET_FLOAT_WORD(ix, x);
1011+
SET_FLOAT_WORD(x, ix & 0x7fffffff);
1012+
return x;
1013+
}
1014+
9381015
static double
9391016
freebsd_fabs(double x)
9401017
{
@@ -1537,6 +1614,12 @@ signbit(double x)
15371614
return ((__HI(x) & 0x80000000) >> 31);
15381615
}
15391616

1617+
float
1618+
fabsf(float x)
1619+
{
1620+
return freebsd_fabsf(x);
1621+
}
1622+
15401623
float
15411624
truncf(float x)
15421625
{
@@ -1573,6 +1656,12 @@ fmaxf(float x, float y)
15731656
return freebsd_fmaxf(x, y);
15741657
}
15751658

1659+
float
1660+
sqrtf(float x)
1661+
{
1662+
return freebsd_sqrtf(x);
1663+
}
1664+
15761665
double
15771666
pow(double x, double y)
15781667
{

0 commit comments

Comments
 (0)