@@ -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
0 commit comments