Skip to content

Releases: t0b1kent/hyperbridge

HyperBridge 1.1.0

HyperBridge 1.1.0 Pre-release
Pre-release

Choose a tag to compare

@t0b1kent t0b1kent released this 05 Nov 03:46

HyperBridge 1.1.0

For a separate module download, use HyperBridge-1.1.0-arm64-r1.zip: it adds the separate FEX-Emu license and copyright notice to the initial packaging. The executable modules are unchanged. The full MacRunner application already includes this notice.

This version includes experimental paths for block headers keyed by PC, comparisons, returns without polling, RIP literals and in-block QPC. HEADER_BY_PC, RET_NOPOLL, CMP_ZC, RIP_LITERAL and QPC_INLINE are disabled by default. The table below reports defaults and the experimental M configuration separately; “on par with Rosetta” refers to M.

Translator measurements on M1 Pro

xbench, November 3, 2026: cycles per step, median of three rounds; lower is better. Rosetta and HyperBridge/FEX execute the same x86-64 code; ARM64 is a separate native reference. Calibration: ARM64 addchain = 1 cycle.

Path Call/return Indirect call Byte compare Mixed loop Arithmetic
ARM64 3.00 3.00 2.00 4.00 4.21
Rosetta 4.01 5.54 2.95 5.01 4.21
HyperBridge/FEX, new switches disabled (k0) 5.02 6.02 3.65 6.04 4.21
HyperBridge/FEX, experimental M configuration 4.01 4.53 3.01 5.02 4.21

In configuration M, indirect-call time is 18.2% lower than Rosetta; call/return is equal, while byte comparison and the mixed loop are close. M enables CMP_ZC, RIP_LITERAL, RET_NOPOLL, HEADER_BY_PC, QPC_INLINE=5 and PAUSE=isb. These are experimental settings; the new FEX switches are disabled by default in 1.1.0. These hot microloops on one machine do not establish average application performance. Priority is identical within the series; the background launcher added nice 5 and xbench added another nice 10. Source: FEXXFER series, sections 10–11, DLL 71a43f7e.

DirectX 12 without Rosetta

Elden Ring (DirectX 12) runs on Apple Silicon without Rosetta — our own x86 translator (HyperBridge) and our own DX12 → Metal layer. As far as we know, this is a first: CrossOver Preview (FEX, no Rosetta) does not start Elden Ring. This was checked by the owner; its FEX bottles include only D3D10/11.

First launch in MacRunner

On a game's first launch, the app prepares its bottle for several minutes. Shader compilation during the game's first few minutes can cause stuttering. On the second launch, preparation is complete and cached shaders allow smoother play. New scenes may require compilation. MacRunner 1.1.0 does not include shader-cache migration after an engine update. For the best frame rates, close demanding background apps and disconnect your second monitor; both remained active in the owner's recordings.

HyperBridge engine 0227 (MacRunner 1.0.9)

Choose a tag to compare

@t0b1kent t0b1kent released this 07 Oct 02:28

HyperBridge is MacRunner's CPU engine for Windows x86-64 and x86 programs on Apple Silicon through ARM64 Wine. It is built on FEX-Emu (MIT), with MacRunner's downstream patch series in fex/.

This build: engine 0227, shipped in MacRunner 1.0.9 on October 7, 2026. The files are copied without alteration from the notarized application.

File in the archive Role SHA-256
engine/fex/aarch64-windows/xtajit64.dll ARM64EC, 64-bit x86 processes ed14b28a89675c4544e84da2a4c271b3cd7c6ac61becbe804aa68cb96553147d
engine/fex/aarch64-windows/xtajit.dll WOW64, 32-bit x86 processes (unchanged since engine 0161) aef436aacd966ce9e55ccc1e68706f4af2d2192da923cf0ae17b682580742025
engine/fex/aarch64-unix/libarm64ecfex.so Signed host library for xtajit64.dll (unchanged) ed19d22504721add4010d4cb00bfdb2b529bb04fe480a10db87cc6783ad43e93
engine/fex/aarch64-unix/libwow64fex.so Signed host library for xtajit.dll (unchanged) 7cc8079be2620ce32a80b9d06d9a713ebc78cd7d19af552f51c9654bbba7d1ce

What is new in the 64-bit translator (32 patches on top of engine 0161; apply the series in the order given by fex/PATCH-ORDER.txt):

  • integer div/idiv on a shorter path, with the divide-error cases kept exact;
  • exact unaligned lock operations (a two-thread stress test that failed in 5–8 runs out of 10 on engine 0161 now passes 10 out of 10);
  • flags of read-modify-write memory instructions computed after the store;
  • scalar SSE arithmetic that keeps the upper register bits in one host instruction in the processor's x86-compatible mode;
  • no redundant write of the floating-point control register on transitions to native code;
  • a faster x87 path, present in the source and disabled by default.

The archive's ENGINE.json lists the defaults this build ships with: MACRUNNER_FEX_DIV_FAST=1, MACRUNNER_FEX_SPLIT_ATOMIC_EXACT=1, MACRUNNER_FEX_RMW_FLAGS_AFTER_STORE=1, MACRUNNER_FEX_HW_SCALAR_MERGE=1.

Checks: 500,595 recorded processor states with no new differences against engine 0161; hardware-mode stands on the signed build — 812,402 flag states with no new differences and 919,405 SIMD states passing (18,968 already-known differences from the hardware reference remain listed).

Measured on this build (October 7; five alternating runs of engine 0161 and engine 0227 inside their MacRunner packages on an M1 Pro, fastest run of each, nanoseconds per iteration): xor edx,edx; div ecx 2.09 → 0.92, cqo; idiv rcx 1.96 → 0.81, addss chain 1.57 → 0.94. The other 18 loops of xbench are unchanged within 1 %. Micro-loops, not game frame rates; the Mac was in use during the session.

The 64-bit module was compiled on our own Mac. A rebuild from this repository on a clean cloud machine is in progress and is not finished, so byte-identical reproduction is not claimed for this build.

This is an engine payload, not a standalone Wine installation: use the matching MacRunner 1.0.9 runtime and ENGINE.json. Licenses and third-party notices are inside the archive. No game data is included.

HyperBridge engine 0161 (MacRunner 1.0.8)

Choose a tag to compare

@t0b1kent t0b1kent released this 05 Oct 00:09

HyperBridge is MacRunner's CPU engine for Windows x86-64 and x86 programs on Apple Silicon through ARM64 Wine. It is built on FEX-Emu (MIT), with MacRunner's downstream patch series in fex/.

This build: engine 0161, shipped in MacRunner 1.0.8 on October 5, 2026. The files are copied without alteration from the notarized application. The release source archive includes the common chain, the separate WOW64 additions and the final 0160/0161 increments.

File in the archive Role SHA-256
engine/fex/aarch64-windows/xtajit64.dll ARM64EC, 64-bit x86 processes eb13ea53bf16c9a2153577a02b4ac07d77b3ae0332f905694cd593abc5551401
engine/fex/aarch64-windows/xtajit.dll WOW64, 32-bit x86 processes aef436aacd966ce9e55ccc1e68706f4af2d2192da923cf0ae17b682580742025
engine/fex/aarch64-unix/libarm64ecfex.so Signed host library for xtajit64.dll ed19d22504721add4010d4cb00bfdb2b529bb04fe480a10db87cc6783ad43e93
engine/fex/aarch64-unix/libwow64fex.so Signed host library for xtajit.dll 7cc8079be2620ce32a80b9d06d9a713ebc78cd7d19af552f51c9654bbba7d1ce

Archive layout and notices follow engine 0049. This is an engine payload, not a standalone Wine installation: use the matching MacRunner 1.0.8 runtime and ENGINE.json. That runtime supplies the additional libmacrunner-hwtso.dylib; it is outside this four-file archive. Its hash, unix aliases and all delivered defaults are in fex/MANIFEST.json.

New compared with engine 0049

  • 0055 per-thread Darwin hardware TSO admission and boundary handling.
  • 0056 preserve upper AVX halves across inline self-modifying-code restart.
  • 0065 restore independent MXCSR DAZ/FTZ state through Apple's compatibility AFPCR.
  • 0075 BLSR/BLSMSK CF zero-test uses the operand width.
  • 0160 single Q loads on admitted hardware-TSO paths.
  • 0161 JIT code-buffer guard, alignment and initial capacity account for the host page size.
  • WOW64: 0070, 0071, 0052-port, 0050, 0053 and 0087, in that explicit order: suspend/teardown lifetime, isolated interrupt page, cooperative backedges and Get/Set owner reentry.

The common chain is 55 patches on FEX-Emu fd141ed6d, applied in filename order. The WOW64 additions live separately in fex/wow64/: they start on the common 53-patch base through 0075, followed by 0160/0161. Both orders passed local CI-equivalent sequential check/apply tests; no patch touches an absent upstream submodule.

MacRunner 1.0.8 sets MACRUNNER_FEX_HW_TSO=2, FEX_TSOENABLED=1, MACRUNNER_FEX_APPLE_AFP=1, MACRUNNER_FEX_DIV_PROVEN_HIGH=1, MACRUNNER_FEX_SUSPEND_BACKEDGE=1 and MACRUNNER_HB_JIT_HOST_GUARD=1. AFP requires native-thread admission; see the complete patch/default notes.

Reproduction

A clean Xcode Cloud Mac rebuilt the two distinct PE modules from the release source with our reproduction recipe (not yet published): xtajit64.dll and xtajit.dll match the delivered files byte for byte. The unix libraries match the measured functions and material sections, but their whole-file hashes differ. Function/section equality is not semantic, signature, load-command or relocation equivalence. It was a diagnostic build: nothing was installed or signed.

The manifest records exact hashes and tools (llvm-mingw clang 22.1.5, Apple clang 21.0.0, SDK 27.0, CMake 4.3.2). The generic fex/build.sh omits the separate WOW64 chain and is not a complete byte-exact 1.0.8 reproduction recipe.

Measured

Hollow Knight's menu used 23% less game CPU time per frame than 1.0.7 (alternating runs; two identical runs differed by 0.9%); FPS was capped at 120 Hz. With the new defaults, Hollow Knight's time to menu was 31.1 → 25.4 s; ABZU's was 32.61 → 32.11 s, a 1.5% reduction from one pair without a repeat. These application runs preceded final packaging. They do not measure this final archive's FPS or isolate one patch.

The October 5 comparison note also records Prism (M1 Pro VM), Rosetta (cloud M2 Pro VMs), HyperBridge 1.0.8 (M1 Pro) and direct x86 (AMD EPYC cloud VM) loop times. Different machines and related programs preclude a cross-column translator speed ranking.

Known limits

Matching PE bytes and applicable patches are not whole-product or gameplay validation. Floating-point equivalence, full REP partial-fault recovery, general Wine ABI/runtime correctness and native whole-file reproduction remain outside those proofs.

Licenses

FEX-Emu and MacRunner's downstream modifications are MIT. Linked third-party components retain their licenses; the archive preserves the engine-0049 notices and license files. FEX-Emu has not reviewed or endorsed this port, and these are not contributions to FEX-Emu.

HyperBridge engine 0049 (MacRunner 1.0.7)

Choose a tag to compare

@t0b1kent t0b1kent released this 03 Oct 02:32

HyperBridge is MacRunner's CPU engine for running Windows x86-64 and x86 programs on Apple Silicon through ARM64 Wine. It is built on FEX-Emu (MIT) and carries MacRunner's own patch series, kept in fex/ of this repository.

This build: the engine shipped in MacRunner 1.0.7 (October 3, 2026): patches 0001–0049 on FEX-Emu fd141ed6d, taken from the notarized application. The exact patched source is in that release's MacRunner-1.0.7-sources.tar (hyperbridge/fex/src, with SOURCE-EXPORT.json); binary reproduction from the patch series is not promised for this build. The CI checks that all 49 patches apply to the pinned upstream commit.

File in the archive Role SHA-256
engine/fex/aarch64-windows/xtajit64.dll ARM64EC, 64-bit x86 processes ac3735d6…
engine/fex/aarch64-windows/xtajit.dll WOW64, 32-bit x86 processes 8a58ead0…
engine/fex/aarch64-unix/libarm64ecfex.so host library for xtajit64.dll (signed with MacRunner's Developer ID) f7964bb9…
engine/fex/aarch64-unix/libwow64fex.so host library for xtajit.dll (signed with MacRunner's Developer ID) 456480da…

Full hashes, and those of the unstripped build outputs, are in fex/MANIFEST.json and in SHA256SUMS.

New compared with engine 0019

  • 0020–0025 translation reuse and invalidation experiments (REVIVE, executable ranges, PF/AF/DF across exceptions, MACRUNNER_FEX_RANGE_CACHE, precise invalidation for Mono call targets)
  • 0026 MACRUNNER_FEX_RA_NO_X16 for ARM64EC
  • 0027–0031 code written through a second mapping (.NET): NoTrap validation modes, MACRUNNER_FEX_ALIAS_VIEWS, MACRUNNER_FEX_HOOK_GUARD
  • 0032 diagnostic output without Wine's buffer
  • 0033–0047 guarded x87: fast arithmetic through the host's double with a fall-back to the exact path, tag/status/FIP handling, guarded subnormal loads, FST/FSTP stores and FSCALE; 0036–0037 are tests
  • 0048 floating-point switches default off; ARM64EC integer-width correction
  • 0049 hook and alias correctness switched on automatically when the .NET runtime (coreclr.dll, clrjit.dll) is mapped — this is what lets .NET 6 games such as Stardew Valley start

Patches marked EXPERIMENT are behind switches that are off by default. MacRunner 1.0.7 turns on, through its ENGINE.json, MACRUNNER_FEX_DIV_OVERFLOW_DE=1 (Windows divide exceptions), MACRUNNER_FEX_SHLD16_CF=1 (16-bit SHLD/SHRD carry as hardware) and MACRUNNER_FEX_EFLAGS_KEEP=1.

Measured

Loop times against Microsoft Prism and CrossOver Preview, measured on October 3 with this engine, are in the comparison table. Division is slower than in engine 0019 because MACRUNNER_FEX_DIV_OVERFLOW_DE=1 is on; MACRUNNER_FEX_DIV_PROVEN_HIGH=1 (0017, exact) recovers most of it for idiv and is off in 1.0.7.

Known limits

  • Hardware memory ordering (TSO) is not on by default in this build; it is planned for 1.0.8.
  • Floating-point exactness, alias/W^X outside .NET and 32-bit sound remain open; see the MacRunner 1.0.7 release notes.

Licenses

FEX-Emu with MacRunner's modifications, MIT. The binaries statically link {fmt}, xxHash, unordered_dense, range-v3, rpmalloc, tiny-json, cpp-optparse, Cephes and SoftFloat 3e from the FEX-Emu source tree; their notices are in the archive. FEX-Emu has not reviewed or endorsed these modifications, and they are not contributions to FEX-Emu.

HyperBridge engine 0019

Choose a tag to compare

@t0b1kent t0b1kent released this 29 Sep 03:38

HyperBridge is MacRunner's CPU engine for running Windows x86-64 and x86 programs on Apple Silicon through ARM64 Wine. It is built on FEX-Emu (MIT) and carries MacRunner's own patch series, kept in fex/ of this repository.

This build: patches 0001–0019 on FEX-Emu fd141ed6d, built with fex/build.sh at commit d55632c. Two clean builds in different directories are byte-identical; the hashes are in fex/MANIFEST.json and in SHA256SUMS.

File in the archive Role SHA-256
engine/fex/aarch64-windows/xtajit64.dll ARM64EC, 64-bit x86 processes 3d413809…
engine/fex/aarch64-windows/xtajit.dll WOW64, 32-bit x86 processes 9bc5810d…
engine/fex/aarch64-unix/libarm64ecfex.so host library for xtajit64.dll (same as engine 0015) 373e34d2…
engine/fex/aarch64-unix/libwow64fex.so host library for xtajit.dll (same as engine 0015) 927931f4…

New compared with engine 0015 (the engine of MacRunner 1.0.3)

  • 0016 MACRUNNER_FEX_NULL_HOST=1 (default off): a branch to guest address 0 takes the full lookup instead of jumping to host address 0, so the guest gets its own fault
  • 0017 MACRUNNER_FEX_DIV_PROVEN_HIGH=1 (default off): DIV/IDIV directly after xor edx,edx, CDQ or CQO is a plain n-bit division
  • 0018 with MACRUNNER_FEX_DIV_OVERFLOW_DE=1: Windows programs get STATUS_INTEGER_OVERFLOW (0xC0000095) for a quotient overflow and STATUS_INTEGER_DIVIDE_BY_ZERO (0xC0000094) for a zero divisor, as under Microsoft Prism
  • 0019 Darwin: the engine no longer switches the whole process to hardware TSO after a one-thread probe (the macOS mode is per thread); no change at run time without Apple's entitlement

Verification

  • HB↔FEX oracle, 72 219 x86-64 cases plus 133 division idioms: 0016 changes one case (push 0; ret now faults at guest 0), 0017 and 0018 change no result.
  • Under MacRunner's Wine, a 64-bit probe of 88 DIV/IDIV cases (8–64 bits, register and memory operands): with MACRUNNER_FEX_DIV_OVERFLOW_DE=1 all 88 equal Microsoft Prism — exception code, fault flag and RAX/RDX at the fault.
  • xbench (M1 Pro, three alternating runs): cqo; idiv rcx 0.969 ns without gates, 0.783 ns with MACRUNNER_FEX_DIV_PROVEN_HIGH=1 (MacRunner 1.0.2 engine: 0.722 ns); loops without division unchanged.
  • Game: Hollow Knight 1.5.12620 reaches the main menu in three of three runs with all gates off, with the same start-up timings as engine 0015 (GAME-CHECK.txt).

Known limits

  • 0017 recognizes only the idiom directly before the division; xor edx,edx; mov eax, …; div ecx keeps the slower path.
  • The 32-bit probe cannot start under MacRunner's Wine on this Mac (32-bit programs need the low 4 GB, which needs Apple's entitlement); xtajit.dll was built, not run.

Installing into MacRunner 1.0.3

Quit MacRunner, keep a copy of MacRunner.app/Contents/Resources/engine/fex, and copy the four files over the same paths. Then re-sign only the outer bundle, keeping the signatures and entitlements of the Wine loader inside it: codesign --force --sign - --preserve-metadata=identifier,entitlements,requirements,flags,runtime /Applications/MacRunner.app. Do not use --deep: it re-signs the nested Wine loader without its entitlements. Restore the copy to go back.

Licenses

FEX-Emu with MacRunner's modifications, MIT. The binaries statically link {fmt}, xxHash, unordered_dense, range-v3, rpmalloc, tiny-json, cpp-optparse, Cephes and SoftFloat 3e from the FEX-Emu source tree; their notices are in the archive. FEX-Emu has not reviewed or endorsed these modifications, and they are not contributions to FEX-Emu.

HyperBridge engine 0015

Choose a tag to compare

@t0b1kent t0b1kent released this 29 Sep 00:44

HyperBridge is MacRunner's CPU engine for running Windows x86-64 and x86 programs on Apple Silicon through ARM64 Wine. It is built on FEX-Emu (MIT) and carries MacRunner's own patch series, kept in fex/ of this repository.

This build: patches 0001–0015 on FEX-Emu fd141ed6d, built with fex/build.sh at commit 9930c30. Two clean builds in different directories are byte-identical; the hashes are in fex/MANIFEST.json and in SHA256SUMS.

File in the archive Role SHA-256
engine/fex/aarch64-windows/xtajit64.dll ARM64EC, 64-bit x86 processes c5f82c55…
engine/fex/aarch64-windows/xtajit.dll WOW64, 32-bit x86 processes f998d84e…
engine/fex/aarch64-unix/libarm64ecfex.so host library for xtajit64.dll 373e34d2…
engine/fex/aarch64-unix/libwow64fex.so host library for xtajit.dll 927931f4…

New compared with the engine in MacRunner 1.0.2 (patches 0001–0007)

  • 0008 stale block links are not published; full parity at block entry points
  • 0009 Elden Ring work: JIT statistics, writable-code validation modes, ARM64EC TLS
  • 0010 MACRUNNER_FEX_PROT_KEEP, MACRUNNER_FEX_REVIVE, MACRUNNER_FEX_CODEBUF_MAX (default off)
  • 0011 x87 division by zero raises the exception, SF in the x87 status word; DIV/IDIV raise #DE for a zero divisor
  • 0012 JIT map on Windows for profiling (MACRUNNER_FEX_JITMAP_DIR)
  • 0013 fixes a deadlock between DLL loading and heap growth (black-screen hang in Elden Ring)
  • 0014 MACRUNNER_FEX_DIV_OVERFLOW_DE=1 (default off): DIV/IDIV raise #DE on quotient overflow as x86 does
  • 0015 MACRUNNER_FEX_SHLD16_CF=1 (default off): SHLD r/m16 with a count of 16 sets CF (upstream FEX 6646a5cc)

Verification

  • HB↔FEX oracle, 72 219 x86-64 cases, one binary for all arms: 0014 turns 26 of 26 quotient-overflow cases x86-correct, 0015 3 of 3 SHLD cases; no other result changes.
  • MacRunner-like environment (xtajit64.dll of this build under MacRunner's Wine, 15-case DIV probe): gates off — #DE for a zero divisor; MACRUNNER_FEX_DIV_OVERFLOW_DE=1 — 15 of 15, every #DE at the dividing instruction.
  • Game: Hollow Knight 1.5.12620 (Windows build, Unity 6) with MacRunner 1.0.2 Wine/DXMT and this engine, King's Pass from a save, V-Sync on, 120 Hz display: 110 FPS average at the limit (median frame 8.33 ms), 14.7 ms of CPU per frame, main menu 44 s after launch. The native macOS build of the same game version: 113 FPS, 6.7 ms of CPU per frame, main menu at 16 s. One run each (details in GAME-CHECK.txt; its gameplay start times are not comparable, because the native run entered the game by hand). Comparison with Prism and CrossOver Preview: HyperBridge compared.

Known limits

  • A quotient-overflow #DE is reported as STATUS_INTEGER_DIVIDE_BY_ZERO; Windows reports STATUS_INTEGER_OVERFLOW. Addressed by patch 0018, which goes into the next build.
  • Division-heavy loops are 15–35 % slower than with the 1.0.2 engine (0011 defeats the cqo; idiv fold). Addressed by patch 0017 (MACRUNNER_FEX_DIV_PROVEN_HIGH), which goes into the next build.

Installing into MacRunner 1.0.2

Quit MacRunner, keep a copy of MacRunner.app/Contents/Resources/engine/fex, and copy the four files over the same paths. If macOS then refuses to open the app, re-sign only the outer bundle, keeping the signatures and entitlements of the Wine loader inside it: codesign --force --sign - --preserve-metadata=identifier,entitlements,requirements,flags,runtime /Applications/MacRunner.app. Do not use --deep: it re-signs the nested Wine loader without its entitlements, and Wine can then no longer run translated code. Restore the copy to go back. (Corrected on 29 Sep 2026; an earlier version of this note suggested --deep.)

Licenses

FEX-Emu with MacRunner's modifications, MIT. The binaries statically link {fmt}, xxHash, unordered_dense, range-v3, rpmalloc, tiny-json, cpp-optparse, Cephes and SoftFloat 3e from the FEX-Emu source tree; their license texts are in licenses/ inside the archive and in THIRD_PARTY_NOTICES.md. FEX-Emu has not reviewed or endorsed these modifications, and they are not contributions to FEX-Emu — please report problems to MacRunner.