diff --git a/libsledge/README.md b/libsledge/README.md index 1fdff5e..254adad 100644 --- a/libsledge/README.md +++ b/libsledge/README.md @@ -69,19 +69,20 @@ The ABI includes the | i64.trunc_f32_u | `u64_trunc_f32` | `UINT64_MAX`, `stderr`, `fprintf` | `sledge_abi__wasm_trap_raise`, `WASM_TRAP_ILLEGAL_ARITHMETIC_OPERATION` | | i64.trunc_f64_s | `i64_trunc_f64` | `INT64_MIN`, `INT64_MAX`, `stderr`, `fprintf` | `sledge_abi__wasm_trap_raise`, `WASM_TRAP_ILLEGAL_ARITHMETIC_OPERATION` | | i64.trunc_f64_u | `u64_trunc_f64` | `UINT64_MAX`, `stderr`, `fprintf` | `sledge_abi__wasm_trap_raise`, `WASM_TRAP_ILLEGAL_ARITHMETIC_OPERATION` | -| f32.ceil | `f32_ceil` | **NOT SUPPORTED** | **NOT SUPPORTED** | -| f32.copysign | `f32_copysign` | **NOT SUPPORTED** | **NOT SUPPORTED** | -| f32.floor | `f32_floor` | `floor` | None | +| f32.ceil | `f32_ceil` | `ceilf` | `ceilf` | +| f32.copysign | `f32_copysign` | `copysignf` | `copysignf` | +| f32.floor | `f32_floor` | `floorf` | `floorf` | | f32.max | `f32_max` | None | None | | f32.min | `f32_min` | None | None | -| f32.nearest | `f32_nearest` | **NOT SUPPORTED** | **NOT SUPPORTED** | -| f32.trunc | `f32_trunc_f32` | `trunc` | None | -| f64.ceil | `f64_ceil` | **NOT SUPPORTED** | **NOT SUPPORTED** | -| f64.floor | `f64_floor` | `floor` | None | +| f32.nearest | `f32_nearest` | `nearbyintf` | `nearbyintf` | +| f32.trunc | `f32_trunc_f32` | `truncf` | `truncf` | +| f64.ceil | `f64_ceil` | `ceil` | `ceil` | +| f64.copysign | `f64_copysign` | `copysign` | `copysign` | +| f64.floor | `f64_floor` | `floor` | `floor` | | f64.max | `f64_max` | None | None | | f64.min | `f64_min` | None | None | -| f64.nearest | `f64_nearest` | **NOT SUPPORTED** | **NOT SUPPORTED** | -| f64.trunc | `f64_trunc_f64` | **NOT SUPPORTED** | **NOT SUPPORTED** | +| f64.nearest | `f64_nearest` | `nearbyint` | `nearbyint` | +| f64.trunc | `f64_trunc_f64` | `trunc` | `trunc` | ### [Memory Instructions](https://webassembly.github.io/spec/core/syntax/instructions.html#memory-instructions) diff --git a/libsledge/src/numeric_instructions.c b/libsledge/src/numeric_instructions.c index 73fd6ee..785590a 100644 --- a/libsledge/src/numeric_instructions.c +++ b/libsledge/src/numeric_instructions.c @@ -170,7 +170,7 @@ i64_trunc_f64(double f) INLINE float f32_trunc_f32(float f) { - return trunc(f); + return truncf(f); } INLINE float @@ -188,7 +188,32 @@ f32_max(float a, float b) INLINE float f32_floor(float a) { - return floor(a); + return floorf(a); +} + +INLINE float +f32_ceil(float a) +{ + return ceilf(a); +} + +INLINE float +f32_copysign(float a, float b) +{ + return copysignf(a, b); +} + +INLINE float +f32_nearest(float a) +{ + return nearbyintf(a); +} + +// Float => Float truncation functions +INLINE double +f64_trunc_f64(double f) +{ + return trunc(f); } INLINE double @@ -208,3 +233,22 @@ f64_floor(double a) { return floor(a); } + +INLINE double +f64_ceil(double a) +{ + return ceil(a); +} + +// TODO: Is this missing in aWsm? f64.copysign +INLINE double +f64_copysign(double a, double b) +{ + return copysign(a, b); +} + +INLINE double +f64_nearest(double a) +{ + return nearbyint(a); +}