3ae1fb36d2
Move fe_mul/fe_sqr to static inline in field.h when ASM is available (FE_MUL_ASM=1). This allows the compiler to inline the entire field multiply directly into gej_double and gej_add_ge, eliminating function call boundaries. Before: gej_double had 9 function calls (to fe_mul/fe_sqr) After: gej_double has 2 function calls (fe_half only) The compiler can now: - Keep intermediate results in registers across multiply boundaries - Schedule MULX instructions across adjacent field operations - Eliminate push/pop register saves at call boundaries gej_double: 738 → 1311 instructions (larger but no call overhead) Impact: verifyFast: 35.1µs → 31.6µs (10% faster, 1.19x vs ACINQ) verify: 39.7µs → 38.4µs (0.98x vs ACINQ — essentially tied!) sign: 15.2µs → 14.2µs (1.48x vs ACINQ) batch(200): 6.2µs → 4.5µs per event (7.9x vs ACINQ) https://claude.ai/code/session_011KVZhDcV2G7idNWEBz12GY