Compile a straight-line/same-page REGION rooted at a block into one CompiledBlock (XENIA_JIT_CHAIN): the set of same-page blocks reachable by compile-time-known direct branches (BFS, capped by XENIA_JIT_REGION_MAX=32 + 512-instr budget). Internal transitions between member blocks become plain native jmps to dynasm labels — no per-block prologue/epilogue, no jit_chain_next lookup, no stack churn — while the lockstep yield guards (chain-enabled / budget / mmio) are evaluated inline at each block boundary and a sync-sensitive block ends the region. Any successor not inlined (indirect target, cross-page) falls to the increment-1 boundary chain: jit_chain_next tail-jumps to the next region on a hit, or signals Rust to build+compile it on a miss. Byte-identical schedule to run_superblock: the SAME blocks run in the SAME order with the SAME per-block budget/mmio/sync checks — only the dispatch MECHANISM differs. Inlining is purely an optimization; the boundary chain is the always-correct fallback, and inlined successors are same-page (⇒ mapped, non-thunk) with the LR_HALT sentinel filtered, so next_pc_breaks_chain's runtime arms are statically satisfied. THROUGHPUT (best-of-5, n=200M --gpu-inline): interp 3.76s · plain JIT 3.98s · increment-1 chain 3.97s · REGION 3.49s. Region is ~1.08-1.14x FASTER than the interpreter (first clear JIT win on the boot bench) and ~1.14x faster than increment-1's throughput-neutral block chaining — confirming the thesis that the real dispatch cost was the per-block prologue/epilogue increment 1 kept. Region-size sweep: gains saturate by max=32 (max=64 identical). GOLDEN n200m BYTE-IDENTICAL across 6 configs: interp / JIT / JIT+CHAIN(region) / JIT+CHAIN+REGCACHE / JIT+CHAIN+REGION_MAX=1 / JIT+CHAIN+budget=1 == interp+budget=1. 21 xenia-jit tests (added region_multiblock_matches_interp_ superblock + region_sync_block_ends_superblock). Bug found+fixed during bring-up: a region chained PAST a sync-sensitive block via the boundary chain instead of ending the superblock (compile_block gives sync blocks the plain epilogue; the region must too) — this diverged the whole 200M schedule (draws 3201 vs 3165). Fix: sync block tail = unconditional jmp l_region_ret; BFS never expands past a sync block. The sync regression test asserts the region stops after A+B (cycle==4) instead of looping to budget. New: xenia_cpu::block_cache::decode_block (pub standalone decoder for the region builder) + DecodedBlock: Clone. Diagnostic knobs XENIA_JIT_REGION_MAX (cap, default 32; =1 reproduces increment-1 chaining) and XENIA_JIT_NOREGION (route chain compiles through compile_block — the A/B knob that isolated the sync bug). Default XENIA_JIT/XENIA_JIT_CHAIN both still OFF; shipping path unchanged.