084230937b
On Android (ART), the unsignedMultiplyHigh wrapper function has per-call branching for API level detection that prevents ART's JIT from inlining the intrinsic into the hot loop. This creates ~10,000 extra function calls per signature verify (20 wrapper calls × 500 field muls). This commit introduces fieldMulReduce/fieldSqrReduce as expect/actual functions that fuse U256.mulWide + FieldP.reduceWide into a single compilation unit. The multiply-high intrinsic is passed as a crossinline lambda and inlined at each call site, producing platform-specific code with zero wrapper overhead: - Android API 35+: Math.unsignedMultiplyHigh inlined directly (UMULH) - Android API 31-34: Math.multiplyHigh + correction inlined (SMULH) - Android API <31: pure-Kotlin fallback inlined - JVM: Math.unsignedMultiplyHigh inlined directly - Native: pure-Kotlin fallback inlined The API level check happens ONCE per fieldMulReduce call (outermost branch) rather than per multiply-high call (innermost loop), so ART profiles and JIT-compiles only the hot path. https://claude.ai/code/session_01EMY5RnXb9rnsyU2KbXrSaY