Emit native x64 for the hot FP-arith ops (currently 61.6% of interpreter fallbacks through the intro video; the JIT emitted ZERO native FP arithmetic before). Phase 1 = add/sub/mul/div, single (op59) + double (op63), Rc=0. Correctness rests on a lemma (validated vs fpscr.rs): if the final result is ±NORMAL or ±ZERO, the interpreter set NO FPSCR exception bit and FPRF=classify(result). So the fast path is: RN-nearest guard (FPSCR RN_MASK=0x3, low 2 bits — NOT 0xC0000000) → native movsd/addsd/subsd/mulsd/divsd in xmm (single narrows via cvtsd2ss;cvtss2sd = to_single at RN-nearest, bit-exact) → result guard (reject inf/NaN; for doubles also reject subnormal → UX+DENORMAL) → store + cheap inline FPRF (sign+iszero → one of ±NORMAL/±ZERO codes). Every guarded (rare) case DEOPTS to jit_interpret_one for that one instruction — counter-neutral (state.retire() defers the +1 on both paths; interp_one bumps no counter and touches only fpr/fpscr/pc, never ctx.gpr, so no RegCache flush). Rc=1 forms fall back (update_cr1 not replicated). FMA (madd) family deferred to Phase 2 (needs hardware FMA3). Infra: Offsets.fpscr; MemHelpers.interpret_one; emit_fp_arith + FpArith enum + emit_fprf_normal_or_zero (emit.rs); DynasmLabelApi import (dynamic labels/relocs in emit.rs). check_fp now SEEDS and ASSERTS fpscr (the real safety net) — added check_fp_seeded. New tests: fp_arith_matches (fuzz + edge floats), fp_arith_directed_rounding_matches (RN!=nearest → deopt), fp_arith_block_matches (multi-op native↔deopt↔fallback boundary). 24 xenia-jit tests green. GOLDEN n200m BYTE-IDENTICAL across all 6 configs (interp / JIT / +CHAIN(region) / +REGCACHE / +REGION_MAX=1 / +budget=1==interp+budget=1). Whole-video speedup measured after Phase 2 (the fmadds family is the single biggest op at 27.7%).