floor, ceil and round over f32, which is what a position and a tile coordinate are here. The only rounding mode available is the cast's truncation toward zero, so each of these is that cast plus the correction the mode does not make, and the content is which inputs make the cast itself undefined. NaN fails every comparison, so it needs its own (not (= x x)) and nothing else finds it; the infinities fall out of the magnitude test; and above 2^23 an f32 has no fractional bits left, which makes returning the input there the exact answer and also the guard that keeps the cast inside i32. round is half away from zero, written as floor of the magnitude and mirrored. The obvious (floor-f32 (+ x 0.5)) is wrong twice: half-up rather than half-away, so -2.5 comes out -2, and at the largest f32 below 0.5 the addition alone rounds to 1.0 and answers 1 for a number under a half. Both are in the table, which is why every case there is a negative or a half. sqrt is the decision in this commit and it goes out to libm, which is a change to the release link and so is said out loud. Every other number in the prelude is reachable from the four operations and a cast; a square root is not. Newton's method needs a starting guess, the good guess comes from reinterpreting the exponent bits, and the language has only value-preserving casts - no bit-cast between f32 and u32. Without one the iteration needs a scaling loop to normalise and still produces a result that is merely close, which is the one thing a standard library must not hand back. IEEE-754 makes sqrt correctly rounded, so libm's answer is the same bit pattern on native and on wasm32; for this function the byte-identical argument points at C rather than away from it. The cost is -lm on every link, and its placement matters. It goes after the objects, not in the leading flags, because --as-needed drops a library named before the object that wants it. Worse, at -O2 LLVM folds most sqrtf calls into the hardware instruction and the symbol never has to resolve - so this looked linked before the flag existed and failed only at -O0, which is exactly why the table runs both. Untested against --target=wasm32: wasi-libc ships libm.a as a stub because the symbols live in libc, so it should be inert there, but nothing here exercises it. The better fix is not in this lane. llvm.sqrt.f32 as a builtin in check.ml and emit.ml is one instruction, no symbol and no flag, and it belongs to whoever owns the compiler.
Description
Languages
OCaml
67.2%
Emacs Lisp
15.2%
C
10.4%
HTML
2.9%
Standard ML
2.8%
Other
1.5%