Skip to content

Windows embedded target: kiosk builds, Shell Launcher deploy, hardware APIs - #6208

Merged
shai-almog merged 7 commits into
masterfrom
windows-embedded
Nov 11, 2026
Merged

shai-almog merged 7 commits into
masterfrom
windows-embedded

Conversation

@shai-almog

Copy link
Copy Markdown
Collaborator

Codename One apps can now run as the single, locked-down application on Windows 10/11 IoT Enterprise devices: panel PCs, point-of-sale terminals, self-service kiosks and arm64 IoT boards. It's the same JVM-free native .exe the Windows port already builds, plus the kiosk layer around it and the hardware APIs embedded projects need.

What you get

  • windows.embedded=true: the app takes a whole monitor with no frame and stays above everything else. The Windows key, Alt+Tab, Alt+Esc, Alt+F4 and Ctrl+Esc don't reach the system. Touch panels hide the cursor, and text entry uses Codename One's on-screen keyboard, shared with embedded Linux.
  • Board profiles: generic-x64, generic-x64-mouse, generic-arm64, imx8 and qualcomm-iot set the CPU architecture, rotation, DPI and cursor. Hints override any of them, and so do CN1_* environment variables on the device, without a rebuild.
  • One-command deploy: cn1:deploy-device (or gradle cn1DeployDevice) installs over the OpenSSH server that ships with Windows and makes the app the device's shell with Shell Launcher. Administrators keep Explorer for servicing. Options: one kiosk account, a Keyboard Filter that also blocks Ctrl+Alt+Del, or a plain logon autostart for development devices. cn1:device-logs follows the app's log.
  • Locked down by default: only administrators can write next to the shell exe, so a standard user can't swap it or plant a DLL beside it. The app writes its log to its own folder.
  • Hardware from Java: com.codename1.hardware works on Windows for serial ports, GPIO, I2C, SPI, PWM (through Windows.Devices, on boards whose vendor ships the bus drivers) and the display backlight (DDC/CI or WMI).
  • Docs: a new Embedded Windows devices chapter in the developer guide.

Verification

  • The xwin cross-compile test now also builds the kiosk variant for x64 and arm64. CI lays out the arm64 SDK too.
  • A new kiosk-run job launches the kiosk exe on windows-latest. It checks that the window is a frameless, topmost popup covering the primary monitor and is in the foreground. It then sends Alt+F4 and Alt+Tab and checks the app survives with focus intact. Finally it closes the window with WM_CLOSE as a control.
  • Unit tests cover the generated PowerShell install script (shell mode, kiosk account, autostart, Keyboard Filter, permissions, quoting) and the hint-to-define mapping.
  • Shell Launcher itself needs IoT Enterprise, which no GitHub runner has.

🤖 Generated with Claude Code

shai-almog and others added 5 commits November 10, 2026 16:56
windows.embedded=true builds the native Windows exe as a kiosk for
Windows 10/11 IoT Enterprise: a borderless topmost window on a chosen
monitor, rotation/DPI/cursor defaults from board profiles (generic-x64,
generic-x64-mouse, generic-arm64, imx8, qualcomm-iot) overridable through
CN1_* variables, system shortcuts blocked by a low-level keyboard hook,
the shared on-screen keyboard (EmbeddedTextEditor, moved to core from the
Linux port) and stdout/stderr redirected to CN1_LOG_FILE.

cn1:deploy-device recognises a PE and installs it over OpenSSH with a
PowerShell script: Shell Launcher v2 as the shell (Explorer kept for
Administrators), or a logon task, optional Keyboard Filter, machine
environment variables. device-logs tails the log file.

com.codename1.hardware on Windows: serial (COM ports), GPIO/I2C/SPI/PWM
through Windows.Devices, backlight through DDC/CI with a WMI fallback.
UWP builds stub the natives.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… it in CI

The xwin cross-compile test now also builds the windows.embedded variant
for x64 and arm64 (the arm64 sysroot is splatted in CI), which caught a
10-bit I2C mode Windows.Devices.I2c does not have: such an address now
answers ENOTSUP. A new kiosk-run job launches the x64 kiosk exe on
windows-latest and checks the window is a frameless topmost popup covering
the primary monitor, survives Alt+F4 and Alt+Tab, and writes CN1_LOG_FILE.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
WinRT awaits keep their completion event in the handler object and cancel
on timeout (ETIMEDOUT) instead of reading a dead stack event; enumeration
parks the thread for GC; GPIO edge waiters detect a reused slot by
generation, are woken on close and stop on WAIT_FAILED. The kiosk exe
directory is admin-only (Users read/execute, no inheritance) so no user
can swap the shell or plant a DLL beside it; the log moves to logs\.
The CI kiosk job proves the window is foreground before sending Alt+F4
and closes it with WM_CLOSE as a control.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
GPIO edge callbacks check the slot generation so a late edge of a closed
pin never reaches the pin that reopened the slot; the kiosk log is
unbuffered (the MS CRT treats _IOLBF as full buffering); CN1_* booleans
accept true/false; icacls failures stop the install; docs list every key
the Keyboard Filter blocks and say autostart covers administrators.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
# Conflicts:
#	docs/developer-guide/developer-guide.asciidoc
@github-actions

Copy link
Copy Markdown
Contributor

Cloudflare Preview

@github-actions

github-actions Bot commented Nov 10, 2026 •

Copy link
Copy Markdown
Contributor

Developer Guide build artifacts are available for download from this workflow run:

Developer Guide quality checks:

  • AsciiDoc linter: No issues found (report)
  • Vale: No alerts found (report)
  • Paragraph capitalization: No paragraph capitalization issues (report)
  • LanguageTool: No grammar matches (report)
  • Image references: No unused images detected (report)

shai-almog and others added 2 commits November 10, 2026 21:18
…or Vale

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…bedded editor dialog

freopen_s opens without write sharing, so reopening stderr on the log path
failed and setvbuf on the closed stream aborted with 0xC0000409.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown
Contributor

✅ Continuous Quality Report

Test & Coverage

Static Analysis

  • SpotBugs [Report archive]
    • ✅ ByteCodeTranslator: 0 findings (no issues)
    • ✅ android: 0 findings (no issues)
    • ✅ android-compat: 0 findings (no issues)
    • ✅ android-res-compiler: 0 findings (no issues)
    • ✅ backend: 0 findings (no issues)
    • ✅ backend-test: 0 findings (no issues)
    • ✅ build-engine: 0 findings (no issues)
    • ✅ build-hint-catalog: 0 findings (no issues)
    • ✅ build-hint-tools: 0 findings (no issues)
    • ✅ codenameone-gradle-plugin: 0 findings (no issues)
    • ✅ codenameone-maven-plugin: 0 findings (no issues)
    • ✅ compose-compat: 0 findings (no issues)
    • ✅ core-unittests: 0 findings (no issues)
    • ✅ desktop-compat-runtime: 0 findings (no issues)
    • ✅ fxml-compiler: 0 findings (no issues)
    • ✅ ios: 0 findings (no issues)
    • ✅ javac: 0 findings (no issues)
    • ✅ javafx-compat: 0 findings (no issues)
    • ✅ project-model: 0 findings (no issues)
    • ✅ python-runtime: 0 findings (no issues)
    • ✅ python-transpiler: 0 findings (no issues)
    • ✅ swing-compat: 0 findings (no issues)
  • ✅ PMD: 0 findings (no issues) [Report archive]
  • ✅ Checkstyle: 0 findings (no issues) [Report archive]

Generated automatically by the PR CI workflow.

@github-actions

Copy link
Copy Markdown
Contributor

✅ ByteCodeTranslator Quality Report

Test & Coverage

  • ✅ Tests: 933 total, 0 failed, 55 skipped

Benchmark Results

  • Execution Time: 6947 ms

  • Hotspots (Top 20 sampled methods):

    • 9.27% java.lang.System.identityHashCode (96 samples)
    • 8.69% java.util.ArrayList.indexOf (90 samples)
    • 6.18% java.lang.Object.hashCode (64 samples)
    • 2.99% java.lang.StringBuilder.append (31 samples)
    • 2.41% com.codename1.tools.translator.BytecodeMethod.equals (25 samples)
    • 1.93% java.io.FileOutputStream.writeBytes (20 samples)
    • 1.74% com.codename1.tools.translator.ByteCodeClass.updateAllDependencies (18 samples)
    • 1.74% com.codename1.tools.translator.ByteCodeClass.fillVirtualMethodTable (18 samples)
    • 1.64% java.util.AbstractCollection.containsAll (17 samples)
    • 1.54% com.codename1.tools.translator.NativeSymbolIndex.<init> (16 samples)
    • 1.35% com.codename1.tools.translator.bytecodes.Invoke.resolveDirectTarget (14 samples)
    • 1.35% java.lang.String.equals (14 samples)
    • 1.35% com.codename1.tools.translator.ByteCodeClass.hasDeclaredMethod (14 samples)
    • 1.25% com.codename1.tools.translator.ByteCodeClass.generateCCode (13 samples)
    • 1.25% java.util.HashMap.putVal (13 samples)
    • 1.25% com.codename1.tools.translator.BytecodeMethod.addToConstantPool (13 samples)
    • 1.25% com.codename1.tools.translator.BytecodeMethod.updateInlinableFieldDependencies (13 samples)
    • 1.25% java.util.HashMap.hash (13 samples)
    • 1.25% java.io.UnixFileSystem.getBooleanAttributes0 (13 samples)
    • 1.25% com.codename1.tools.translator.classfile.analysis.Analyzer.analyze (13 samples)
  • ⚠️ Coverage report not generated.

Static Analysis

  • ✅ SpotBugs: no findings (report was not generated by the build).
  • ⚠️ PMD report not generated.
  • ⚠️ Checkstyle report not generated.

Generated automatically by the PR CI workflow.

@shai-almog

shai-almog commented Nov 10, 2026 •

Copy link
Copy Markdown
Collaborator Author

Compared 231 screenshots: 231 matched.
✅ JavaScript-port screenshot tests passed.

@shai-almog

shai-almog commented Nov 11, 2026 •

Copy link
Copy Markdown
Collaborator Author

Compared 210 screenshots: 210 matched.
Native Windows port (x64 / Intel-AMD): full hellocodenameone screenshot suite rendered offscreen with Direct2D/DirectWrite, plus the real benchmarks (base64 native/CN1/SIMD, image createMask/applyMask/modifyAlpha/PNG/JPEG, SSE2 SIMD kernels). Compared against the in-repo baseline in scripts/windows/screenshots.

Benchmark Results

Detailed Performance Metrics

Metric Duration
SIMD kernel backend SSE2 (x64) / NEON (arm64) native kernels
SIMD int-add (64K x300) java 26ms / native 2ms = 13.0x speedup
SIMD float-mul (64K x300) java 25ms / native 2ms = 12.5x speedup
SIMD kernel correctness PASS (native result == scalar reference)
Base64 native bridge unavailable (CN1 + SIMD + image benchmarks only)
Base64 payload size 8192 bytes
Base64 benchmark iterations 6000
Base64 SIMD byte path gated to scalar (CPU autovectorizes scalar; explicit SIMD not beneficial here)
Base64 CN1 encode 40.000 ms
Base64 CN1 decode 47.000 ms
Base64 SIMD encode 55.000 ms
Base64 encode ratio (SIMD/CN1) 1.375x (37.5% slower)
Base64 SIMD decode 47.000 ms
Base64 decode ratio (SIMD/CN1) 1.000x (0.0% slower)
Image encode benchmark iterations 100
Image createMask (SIMD off) 7.000 ms
Image createMask (SIMD on) 4.000 ms
Image createMask ratio (SIMD on/off) 0.571x (42.9% faster)
Image applyMask (SIMD off) 19.000 ms
Image applyMask (SIMD on) 12.000 ms
Image applyMask ratio (SIMD on/off) 0.632x (36.8% faster)
Image modifyAlpha (SIMD off) 18.000 ms
Image modifyAlpha (SIMD on) 14.000 ms
Image modifyAlpha ratio (SIMD on/off) 0.778x (22.2% faster)
Image modifyAlpha removeColor (SIMD off) 18.000 ms
Image modifyAlpha removeColor (SIMD on) 9.000 ms
Image modifyAlpha removeColor ratio (SIMD on/off) 0.500x (50.0% faster)

ParparVM vs HotSpot (JDK 25): Windows x64

Runner CPU: AMD64 Family 26 Model 2 Stepping 1, AuthenticAMD (baseline windows-x64@amd64-family-26-model-2-authenticamd)

Ratios are ParparVM / JDK 25: below 1.00x ParparVM is faster (time) or smaller (RAM). Median of 5 interleaved, paired rounds; every run's output was verified. A ratio more than 20% (time) / 25% (RAM) above its baseline in vm/selfhost/perf-baseline/ is a regression and fails; one that far below is an improvement, reported but not failed (a row whose calibration runs were noisier carries a wider tolerance), and for RAM the change must also exceed 0.05x in absolute terms. Both run unpinned on all of the runner's CPUs, with their own default thread counts.

Benchmark Cores Time RAM Status
hello (WinHelloMain) 4 2.07x (base 1.41x, +47.0%) 0.70x (base 0.68x, +2.9%) ok
translator (self) 4 0.91x (base 0.90x, +1.4%) 0.47x (base 0.47x, +1.4%) ok
intArithmetic 4 0.99x (base 0.99x, +0.2%) 0.06x (base 0.05x, +2.9%) ok
longArithmetic 4 0.99x (base 0.99x, -0.0%) 0.06x (base 0.05x, +3.2%) ok
mathTranscendental 4 0.92x (base 0.94x, -1.3%) 0.06x (base 0.06x, +2.9%) ok
arraySequential 4 1.65x (base 1.75x, -5.7%) 0.38x (base 0.38x, +0.2%) ok
arrayRandom 4 0.98x (base 1.00x, -2.2%) 0.23x (base 0.23x, +0.7%) ok
objectAllocation 4 1.56x (base 1.65x, -5.0%) 0.24x (base 0.21x, +17.0%) ok
valueEscape 4 0.10x (base 0.10x, +0.9%) 0.05x (base 0.04x, +3.2%) ok
hashMapChurn 4 1.65x (base 1.59x, +3.9%) 0.08x (base 0.09x, -8.3%) ok
stringBuilding 4 1.41x (base 1.39x, +1.7%) 0.27x (base 0.27x, +0.1%) ok
recursion 4 1.41x (base 1.44x, -2.3%) 0.06x (base 0.06x, +3.3%) ok
quicksort 4 1.07x (base 1.06x, +1.0%) 0.12x (base 0.12x, +1.6%) ok

Result: no regression

@shai-almog

shai-almog commented Nov 11, 2026 •

Copy link
Copy Markdown
Collaborator Author

Compared 210 screenshots: 210 matched.
Native Windows port, REAL shipping pipeline: the hellocodenameone screenshot suite rendered by a binary CROSS-COMPILED on Linux (clang-cl + xwin, WebView2 linked) and RUN on a Windows x64 runner. Compared against the in-repo baseline in scripts/windows/screenshots.

Benchmark Results

Detailed Performance Metrics

Metric Duration
SIMD kernel backend SSE2 (x64) / NEON (arm64) native kernels
SIMD int-add (64K x300) java 57ms / native 5ms = 11.4x speedup
SIMD float-mul (64K x300) java 57ms / native 4ms = 14.2x speedup
SIMD kernel correctness PASS (native result == scalar reference)
Base64 native bridge unavailable (CN1 + SIMD + image benchmarks only)
Base64 payload size 8192 bytes
Base64 benchmark iterations 6000
Base64 SIMD byte path gated to scalar (CPU autovectorizes scalar; explicit SIMD not beneficial here)
Base64 CN1 encode 79.000 ms
Base64 CN1 decode 100.000 ms
Base64 SIMD encode 127.000 ms
Base64 encode ratio (SIMD/CN1) 1.608x (60.8% slower)
Base64 SIMD decode 100.000 ms
Base64 decode ratio (SIMD/CN1) 1.000x (0.0% slower)
Image encode benchmark iterations 100
Image createMask (SIMD off) 9.000 ms
Image createMask (SIMD on) 4.000 ms
Image createMask ratio (SIMD on/off) 0.444x (55.6% faster)
Image applyMask (SIMD off) 29.000 ms
Image applyMask (SIMD on) 28.000 ms
Image applyMask ratio (SIMD on/off) 0.966x (3.4% faster)
Image modifyAlpha (SIMD off) 25.000 ms
Image modifyAlpha (SIMD on) 15.000 ms
Image modifyAlpha ratio (SIMD on/off) 0.600x (40.0% faster)
Image modifyAlpha removeColor (SIMD off) 35.000 ms
Image modifyAlpha removeColor (SIMD on) 17.000 ms
Image modifyAlpha removeColor ratio (SIMD on/off) 0.486x (51.4% faster)

@shai-almog

shai-almog commented Nov 11, 2026 •

Copy link
Copy Markdown
Collaborator Author

Compared 195 screenshots: 195 matched.

Native Android coverage

  • 📊 Line coverage: 19.17% (56160/292885 lines covered) [HTML preview] (artifact android-coverage-report, jacocoAndroidReport/html/index.html)
    • Other counters: instruction 18.13% (270550/1492353), branch 12.38% (19675/158943), complexity 10.36% (15847/153017), method 15.74% (11411/72518), class 27.94% (2248/8045)
    • Lowest covered classes
      • kotlin.collections.unsigned.kotlin.collections.unsigned.UArraysKt___UArraysKt – 0.00% (0/2396 lines covered)
      • org.jacoco.agent.rt.internal_0e20598.asm.org.jacoco.agent.rt.internal_0e20598.asm.ClassReader – 0.00% (0/1524 lines covered)
      • androidx.compose.runtime.androidx.compose.runtime.LinkComposer – 0.00% (0/1430 lines covered)
      • org.jacoco.agent.rt.internal_0e20598.asm.org.jacoco.agent.rt.internal_0e20598.asm.MethodWriter – 0.00% (0/922 lines covered)
      • kotlinx.coroutines.channels.kotlinx.coroutines.channels.BufferedChannel – 0.00% (0/863 lines covered)
      • kotlin.sequences.kotlin.sequences.SequencesKt___SequencesKt – 0.00% (0/744 lines covered)
      • com.google.common.cache.com.google.common.cache.LocalCache$Segment – 0.00% (0/726 lines covered)
      • okio.okio.Buffer – 0.00% (0/687 lines covered)
      • kotlin.text.kotlin.text.StringsKt___StringsKt – 0.00% (0/630 lines covered)
      • com.codename1.androidcompat.rt.com.codename1.androidcompat.rt.TextXmlPullParser – 0.00% (0/623 lines covered)

✅ Native Android screenshot tests passed.

Native Android coverage

  • 📊 Line coverage: 19.17% (56160/292885 lines covered) [HTML preview] (artifact android-coverage-report, jacocoAndroidReport/html/index.html)
    • Other counters: instruction 18.13% (270550/1492353), branch 12.38% (19675/158943), complexity 10.36% (15847/153017), method 15.74% (11411/72518), class 27.94% (2248/8045)
    • Lowest covered classes
      • kotlin.collections.unsigned.kotlin.collections.unsigned.UArraysKt___UArraysKt – 0.00% (0/2396 lines covered)
      • org.jacoco.agent.rt.internal_0e20598.asm.org.jacoco.agent.rt.internal_0e20598.asm.ClassReader – 0.00% (0/1524 lines covered)
      • androidx.compose.runtime.androidx.compose.runtime.LinkComposer – 0.00% (0/1430 lines covered)
      • org.jacoco.agent.rt.internal_0e20598.asm.org.jacoco.agent.rt.internal_0e20598.asm.MethodWriter – 0.00% (0/922 lines covered)
      • kotlinx.coroutines.channels.kotlinx.coroutines.channels.BufferedChannel – 0.00% (0/863 lines covered)
      • kotlin.sequences.kotlin.sequences.SequencesKt___SequencesKt – 0.00% (0/744 lines covered)
      • com.google.common.cache.com.google.common.cache.LocalCache$Segment – 0.00% (0/726 lines covered)
      • okio.okio.Buffer – 0.00% (0/687 lines covered)
      • kotlin.text.kotlin.text.StringsKt___StringsKt – 0.00% (0/630 lines covered)
      • com.codename1.androidcompat.rt.com.codename1.androidcompat.rt.TextXmlPullParser – 0.00% (0/623 lines covered)

Benchmark Results

Detailed Performance Metrics

Metric Duration
SIMD kernel backend scalar fallback (no native SIMD)
SIMD int-add (64K x300) java 139ms / native 65ms = 2.1x speedup
SIMD float-mul (64K x300) java 157ms / native 15ms = 10.4x speedup
SIMD kernel correctness PASS (native result == scalar reference)
Base64 payload size 8192 bytes
Base64 benchmark iterations 6000
Base64 SIMD byte path gated to scalar (CPU autovectorizes scalar; explicit SIMD not beneficial here)
Base64 CN1 encode 65.000 ms
Base64 CN1 decode 67.000 ms
Base64 native encode 360.000 ms
Base64 encode ratio (CN1/native) 0.181x (81.9% faster)
Base64 native decode 225.000 ms
Base64 decode ratio (CN1/native) 0.298x (70.2% faster)
Image encode benchmark status skipped (SIMD unsupported)

@shai-almog

shai-almog commented Nov 11, 2026 •

Copy link
Copy Markdown
Collaborator Author

Compared 210 screenshots: 210 matched.
Native Windows port (arm64 / Apple Silicon - Arm): full hellocodenameone screenshot suite rendered offscreen with Direct2D/DirectWrite, plus the real benchmarks (base64 native/CN1/SIMD, image createMask/applyMask/modifyAlpha/PNG/JPEG, NEON SIMD kernels). Compared against the in-repo baseline in scripts/windows/screenshots.

Benchmark Results

Detailed Performance Metrics

Metric Duration
SIMD kernel backend SSE2 (x64) / NEON (arm64) native kernels
SIMD int-add (64K x300) java 50ms / native 3ms = 16.6x speedup
SIMD float-mul (64K x300) java 49ms / native 2ms = 24.5x speedup
SIMD kernel correctness PASS (native result == scalar reference)
Base64 native bridge unavailable (CN1 + SIMD + image benchmarks only)
Base64 payload size 8192 bytes
Base64 benchmark iterations 6000
Base64 SIMD byte path gated to scalar (CPU autovectorizes scalar; explicit SIMD not beneficial here)
Base64 CN1 encode 61.000 ms
Base64 CN1 decode 70.000 ms
Base64 SIMD encode 73.000 ms
Base64 encode ratio (SIMD/CN1) 1.197x (19.7% slower)
Base64 SIMD decode 68.000 ms
Base64 decode ratio (SIMD/CN1) 0.971x (2.9% faster)
Image encode benchmark iterations 100
Image createMask (SIMD off) 5.000 ms
Image createMask (SIMD on) 1.000 ms
Image createMask ratio (SIMD on/off) 0.200x (80.0% faster)
Image applyMask (SIMD off) 15.000 ms
Image applyMask (SIMD on) 16.000 ms
Image applyMask ratio (SIMD on/off) 1.067x (6.7% slower)
Image modifyAlpha (SIMD off) 17.000 ms
Image modifyAlpha (SIMD on) 8.000 ms
Image modifyAlpha ratio (SIMD on/off) 0.471x (52.9% faster)
Image modifyAlpha removeColor (SIMD off) 21.000 ms
Image modifyAlpha removeColor (SIMD on) 12.000 ms
Image modifyAlpha removeColor ratio (SIMD on/off) 0.571x (42.9% faster)

ParparVM vs HotSpot (JDK 25): Windows arm64

Runner CPU: ARMv8 (64-bit) Family 8 Model D49 Revision 0, MICROSOFT CORPORATION (baseline windows-arm64@armv8-64-bit-family-8-model-d49-microsoft-corporation)

Ratios are ParparVM / JDK 25: below 1.00x ParparVM is faster (time) or smaller (RAM). Median of 5 interleaved, paired rounds; every run's output was verified. A ratio more than 20% (time) / 25% (RAM) above its baseline in vm/selfhost/perf-baseline/ is a regression and fails; one that far below is an improvement, reported but not failed (a row whose calibration runs were noisier carries a wider tolerance), and for RAM the change must also exceed 0.05x in absolute terms. Both run unpinned on all of the runner's CPUs, with their own default thread counts.

Benchmark Cores Time RAM Status
hello (WinHelloMain) 4 1.54x (base 1.45x, +6.3%) 0.76x (base 0.75x, +1.2%) ok
translator (self) 4 0.90x (base 0.84x, +7.6%) 0.54x (base 0.51x, +6.0%) ok
intArithmetic 4 1.04x (base 1.04x, +0.0%) 0.06x (base 0.06x, +3.3%) ok
longArithmetic 4 0.79x (base 0.80x, -0.1%) 0.06x (base 0.06x, +3.4%) ok
mathTranscendental 4 0.73x (base 0.72x, +1.8%) 0.07x (base 0.06x, +2.0%) ok
arraySequential 4 0.41x (base 0.46x, -11.0%) 0.39x (base 0.39x, -0.0%) ok
arrayRandom 4 0.94x (base 0.94x, +0.2%) 0.23x (base 0.23x, +0.3%) ok
objectAllocation 4 1.81x (base 1.82x, -0.4%) 0.42x (base 0.43x, -3.3%) ok
valueEscape 4 0.76x (base 0.76x, +0.0%) 0.05x (base 0.05x, +3.4%) ok
hashMapChurn 4 1.00x (base 0.98x, +1.8%) 0.12x (base 0.12x, -1.4%) ok
stringBuilding 4 1.55x (base 1.43x, +8.6%) 0.27x (base 0.27x, -0.3%) ok
recursion 4 1.42x (base 1.46x, -2.9%) 0.07x (base 0.07x, +1.3%) ok
quicksort 4 1.01x (base 1.00x, +0.5%) 0.12x (base 0.12x, +0.7%) ok

Result: no regression

@shai-almog

shai-almog commented Nov 11, 2026 •

Copy link
Copy Markdown
Collaborator Author

Compared 210 screenshots: 210 matched.
Native Linux port (x64), GTK3/Cairo/Pango, ParparVM bytecode-to-C (no JVM): the hellocodenameone screenshot suite rendered by a native ELF built + run on the GitHub x64 runner. Baseline: scripts/linux/screenshots.

ParparVM vs HotSpot (JDK 25): Linux x64

Runner CPU: AMD EPYC 9V74 80-Core Processor (baseline linux-x64@amd-epyc-9v74-80-core-processor)

Ratios are ParparVM / JDK 25: below 1.00x ParparVM is faster (time) or smaller (RAM). Median of 5 interleaved, paired rounds; every run's output was verified. A ratio more than 20% (time) / 25% (RAM) above its baseline in vm/selfhost/perf-baseline/ is a regression and fails; one that far below is an improvement, reported but not failed (a row whose calibration runs were noisier carries a wider tolerance), and for RAM the change must also exceed 0.05x in absolute terms. Both run unpinned on all of the runner's CPUs, with their own default thread counts.

Benchmark Cores Time RAM Status
hello (LinuxHelloMain) 4 1.07x (base 0.90x, +19.3%) 0.87x (base 0.96x, -9.5%) ok
translator (self) 4 0.63x (base 0.63x, +0.7%) 0.55x (base 0.46x, +19.1%) ok
intArithmetic 4 1.10x (base 1.10x, -0.1%) 0.04x (base 0.06x, -31.9%) ok
longArithmetic 4 1.08x (base 1.08x, +0.0%) 0.04x (base 0.06x, -31.5%) ok
mathTranscendental 4 1.10x (base 1.09x, +0.3%) 0.04x (base 0.07x, -39.2%) ok
arraySequential 4 2.90x (base 2.81x, +3.3%) 0.36x (base 0.35x, +1.0%) ok
arrayRandom 4 1.02x (base 1.02x, +0.1%) 0.20x (base 0.21x, -4.9%) ok
objectAllocation 4 1.30x (base 1.21x, +7.9%) 0.32x (base 0.39x, -17.7%) ok
valueEscape 4 0.10x (base 0.10x, -0.0%) 0.03x (base 0.06x, -41.8%) ok
hashMapChurn 4 1.09x (base 1.10x, -0.3%) 0.11x (base 0.10x, +10.3%) ok
stringBuilding 4 1.42x (base 1.49x, -4.7%) 0.31x (base 0.26x, +20.1%) ok
recursion 4 1.33x (base 1.24x, +7.3%) 0.04x (base 0.06x, -29.9%) ok
quicksort 4 1.08x (base 1.07x, +1.2%) 0.10x (base 0.11x, -10.8%) ok

Result: no regression

@shai-almog

shai-almog commented Nov 11, 2026 •

Copy link
Copy Markdown
Collaborator Author

Compared 210 screenshots: 210 matched.
Native Linux port (arm64), GTK3/Cairo/Pango, ParparVM bytecode-to-C (no JVM): the hellocodenameone screenshot suite rendered by a native ELF built + run on the GitHub arm64 runner. Baseline: scripts/linux/screenshots-arm.

ParparVM vs HotSpot (JDK 25): Linux arm64

Runner CPU: Neoverse-N2 (baseline linux-arm64@neoverse-n2)

Ratios are ParparVM / JDK 25: below 1.00x ParparVM is faster (time) or smaller (RAM). Median of 5 interleaved, paired rounds; every run's output was verified. A ratio more than 20% (time) / 25% (RAM) above its baseline in vm/selfhost/perf-baseline/ is a regression and fails; one that far below is an improvement, reported but not failed (a row whose calibration runs were noisier carries a wider tolerance), and for RAM the change must also exceed 0.05x in absolute terms. Both run unpinned on all of the runner's CPUs, with their own default thread counts.

Benchmark Cores Time RAM Status
hello (LinuxHelloMain) 4 1.15x (base 1.02x, +12.7%) 0.78x (base 0.66x, +17.6%) ok
translator (self) 4 0.78x (base 0.70x, +11.7%) 0.45x (base 0.43x, +3.6%) ok
intArithmetic 4 1.04x (base 1.04x, -0.0%) 0.03x (base 0.03x, +4.9%) ok
longArithmetic 4 0.79x (base 0.79x, -0.3%) 0.03x (base 0.03x, +4.8%) ok
mathTranscendental 4 1.09x (base 1.10x, -0.3%) 0.04x (base 0.03x, +9.7%) ok
arraySequential 4 0.35x (base 0.36x, -2.6%) 0.37x (base 0.37x, +0.3%) ok
arrayRandom 4 0.93x (base 0.94x, -0.4%) 0.20x (base 0.20x, +0.6%) ok
objectAllocation 4 1.99x (base 1.77x, +12.5%) 0.36x (base 0.37x, -3.4%) ok
valueEscape 4 0.51x (base 0.51x, -0.1%) 0.03x (base 0.03x, +9.3%) ok
hashMapChurn 4 0.85x (base 0.84x, +1.5%) 0.12x (base 0.12x, +0.8%) ok
stringBuilding 4 1.49x (base 1.57x, -4.9%) 0.26x (base 0.26x, +0.4%) ok
recursion 4 1.56x (base 1.43x, +8.7%) 0.04x (base 0.04x, +3.0%) ok
quicksort 4 1.00x (base 0.99x, +0.6%) 0.10x (base 0.09x, +2.7%) ok

Result: no regression

@shai-almog
shai-almog merged commit 86a4876 into master Nov 11, 2026
88 of 93 checks passed
@shai-almog
shai-almog deleted the windows-embedded branch November 11, 2026 02:04
@shai-almog

shai-almog commented Nov 11, 2026 •

Copy link
Copy Markdown
Collaborator Author

Compared 196 screenshots: 196 matched.
✅ Native Mac screenshot tests passed.

Benchmark Results

  • VM Translation Time: 0 seconds
  • Compilation Time: 626 seconds

Detailed Performance Metrics

Metric Duration
SIMD kernel backend SSE2 (x64) / NEON (arm64) native kernels
SIMD int-add (64K x300) java 50ms / native 3ms = 16.6x speedup
SIMD float-mul (64K x300) java 54ms / native 2ms = 27.0x speedup
SIMD kernel correctness PASS (native result == scalar reference)
Base64 native bridge unavailable (CN1 + SIMD + image benchmarks only)
Base64 payload size 8192 bytes
Base64 benchmark iterations 6000
Base64 SIMD byte path active (NEON-accelerated)
Base64 CN1 encode 47.000 ms
Base64 CN1 decode 53.000 ms
Image encode benchmark iterations 100
Image createMask (SIMD off) 7.000 ms
Image createMask (SIMD on) 5.000 ms
Image createMask ratio (SIMD on/off) 0.714x (28.6% faster)
Image applyMask (SIMD off) 94.000 ms
Image applyMask (SIMD on) 77.000 ms
Image applyMask ratio (SIMD on/off) 0.819x (18.1% faster)
Image modifyAlpha (SIMD off) 68.000 ms
Image modifyAlpha (SIMD on) 99.000 ms
Image modifyAlpha ratio (SIMD on/off) 1.456x (45.6% slower)
Image modifyAlpha removeColor (SIMD off) 69.000 ms
Image modifyAlpha removeColor (SIMD on) 59.000 ms
Image modifyAlpha removeColor ratio (SIMD on/off) 0.855x (14.5% faster)

ParparVM vs HotSpot (JDK 25): macOS arm64

Runner CPU: Apple M1 (Virtual) (baseline macos-arm64)

Ratios are ParparVM / JDK 25: below 1.00x ParparVM is faster (time) or smaller (RAM). Median of 5 interleaved, paired rounds; every run's output was verified. A ratio more than 20% (time) / 25% (RAM) above its baseline in vm/selfhost/perf-baseline/ is a regression and fails; one that far below is an improvement, reported but not failed (a row whose calibration runs were noisier carries a wider tolerance), and for RAM the change must also exceed 0.05x in absolute terms. Both run unpinned on all of the runner's CPUs, with their own default thread counts.

Benchmark Cores Time RAM Status
hello (HelloCodenameOne) 3 1.06x (base 0.96x, +10.9%) 0.90x (base 0.93x, -2.7%) ok
translator (self) 3 0.63x (base 0.62x, +1.1%) 0.89x (base 0.78x, +13.4%) ok
intArithmetic 3 1.05x (base 1.03x, +1.5%) 0.12x (base 0.12x, +0.5%) ok
longArithmetic 3 0.99x (base 1.03x, -3.4%) 0.12x (base 0.07x, +67.7%) ok
mathTranscendental 3 0.99x (base 1.01x, -1.8%) 0.12x (base 0.12x, +0.9%) ok
arraySequential 3 0.42x (base 0.42x, -0.8%) 0.53x (base 0.53x, +0.3%) ok
arrayRandom 3 0.98x (base 0.99x, -0.4%) 0.32x (base 0.32x, +0.3%) ok
objectAllocation 3 1.04x (base 1.11x, -5.8%) 0.70x (base 0.72x, -2.7%) ok
valueEscape 3 0.51x (base 0.51x, +0.2%) 0.09x (base 0.09x, +1.6%) ok
hashMapChurn 3 1.09x (base 1.18x, -7.1%) 0.07x (base 0.07x, +8.6%) ok
stringBuilding 3 0.93x (base 0.84x, +10.3%) 0.46x (base 0.46x, -1.1%) ok
recursion 3 1.23x (base 1.24x, -0.8%) 0.12x (base 0.12x, +0.2%) ok
quicksort 3 0.99x (base 1.01x, -2.1%) 0.11x (base 0.11x, +1.3%) ok

Result: no regression

@shai-almog

shai-almog commented Nov 11, 2026 •

Copy link
Copy Markdown
Collaborator Author

Compared 188 screenshots: 188 matched.
✅ Native Apple TV (tvOS, Metal) screenshot tests passed.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant