1/* The flush counter and, on wasm32, the exported float operations of Z (mesh-ref ftz.rs, `ops`). */
2#include "mesh/ftz.h"
34_Atomic uint64_t mesh_ftz_flush_count = 0;
56uint64_t mesh_ftz_flushes(void) { return atomic_load_explicit(&mesh_ftz_flush_count, memory_order_relaxed); }
78#if defined(__wasm32__)
9#define MESH_FTZ_EXPORT(name) __attribute__((export_name(#name), noinline))
1011MESH_FTZ_EXPORT(mesh_ftz_add) float mesh_ftz_add(float a, float b) { MESH_FTZ_BINOP(a, b, +); }
12MESH_FTZ_EXPORT(mesh_ftz_sub) float mesh_ftz_sub(float a, float b) { MESH_FTZ_BINOP(a, b, -); }
13MESH_FTZ_EXPORT(mesh_ftz_mul) float mesh_ftz_mul(float a, float b) { MESH_FTZ_BINOP(a, b, *); }
14MESH_FTZ_EXPORT(mesh_ftz_div) float mesh_ftz_div(float a, float b) { MESH_FTZ_BINOP(a, b, /); }
15/* As Rust's `-x` and `x.abs()` compile on wasm32: f32.neg and f32.abs, bit operations. */
16MESH_FTZ_EXPORT(mesh_ftz_neg) float mesh_ftz_neg(float a) { return -mesh_ftz_flush(a); }
17MESH_FTZ_EXPORT(mesh_ftz_abs) float mesh_ftz_abs(float a) { return __builtin_fabsf(mesh_ftz_flush(a)); }
18MESH_FTZ_EXPORT(mesh_ftz_to_f64) double mesh_ftz_to_f64(float a) { return (double)mesh_ftz_flush(a); }
19MESH_FTZ_EXPORT(mesh_ftz_from_f64) float mesh_ftz_from_f64(double a) { return mesh_ftz_flush((float)a); }
20MESH_FTZ_EXPORT(mesh_ftz_cmp) int32_t mesh_ftz_cmp(float a, float b) {
21 a = mesh_ftz_flush(a);
22 b = mesh_ftz_flush(b);
23 if (a < b) return MESH_FTZ_LESS;
24 if (a > b) return MESH_FTZ_GREATER;
25 if (a == b) return MESH_FTZ_EQUAL;
26 return MESH_FTZ_UNORDERED;
27}
28#endif