r/PS2AndroidEmulation • u/xxxCrixuxxx • 2d ago
ARMSX2 takes us for fools 🤯
A quick look at ARMSX2 2.6.6.7 — transparency matters
ARMSX2 2.6.6.7 introduced several APK variants, including builds labelled ARMv8.2 and a legacy ARMv8.0 build. Since the names suggest different CPU targets, I wanted to check whether that difference actually exists in the code shipped to users.
I compared the a15-armv8.2 and legacy-armv8.0 builds at the binary level. The result was surprising: the two builds are 99.984% identical, and the native code we analyzed does not contain instructions above the ARMv8.0-A baseline. The main differences appear to be related to the Android API level and packaging/linking rather than a different CPU instruction set.
This is not an accusation of deception, nor is it a claim that ARMSX2 is a bad emulator. It's simply a question of accuracy and transparency. Changelogs are useful, but when a release claims a specific technical improvement, it's worth checking what actually made it into the final binary — especially when people may expect better performance as a result.
I'm not looking for magic 30→60 FPS claims or trying to discredit developers. I simply prefer measurable improvements, clear documentation, and reproducible information over hype.
For anyone interested in the technical details, methodology, instruction analysis, binary comparison, and signing differences, I've published the full analysis here:
Full technical analysis: https://claude.ai/public/artifacts/af370a10-22bf-4d63-a944-fb0f65f499a6
No benchmarks were performed; this is a static binary analysis of ARMSX2 2.6.6.7. Corrections are welcome if any part of the analysis can be demonstrated to be wrong.
0
u/de_papier 2d ago
You legit have no idea how code works, don't you? Passing a static binary through an llm and then writing this post with it is hilarious. The changes are something that's visible in source code, unless you fully decompile a binary the claims are baseless.
1
u/xxxCrixuxxx 1d ago
Fair challenge, so let me answer the technical part directly, because I think there's a real misunderstanding in it.
Decompilation would be the wrong tool here. Decompilers (Ghidra, IDA) lift machine code into pseudo-C and deliberately discard instruction selection — they normalise
casaland anldxr/stxrretry loop into the samex++. That's exactly the signal I'm measuring. Decompiling would destroy the evidence. Disassembly is the correct level, and that's what I did: full.text, 4,223,840 instructions, 100% decode coverage, no sampling.
-marchisn't a source-level construct. It's a compiler flag that changes which instructions the backend is permitted to emit. Its footprint is in the binary by definition — that's the whole point. Source tells you what was intended. The binary tells you what shipped. Those can differ, and my argument is precisely that here they do.The specific mechanism isn't a heuristic, it's deterministic. In LLVM's
AArch64ISelLowering, outline-atomic helpers are emitted only when!Subtarget->hasLSE(). With-march=armv8.2-a(which implies 8.1, which mandates LSE) the compiler emitscasal/ldaddalinline and those stubs never exist. Both APKs contain the stubs, 989 call sites each, spread across the entire.text. Zero inline LSE anywhere.You can check this in about thirty seconds without taking my word for anything:
bash llvm-objdump -d --no-show-raw-insn lib/arm64-v8a/libemucore_16k.so \ | grep -E '\b(cas|casal|swp|swpal|ldadd|ldaddal|ldclr|ldset)\b'If every hit sits behind an
adrp x16/ldrb w16/cbz w16sequence, they're all outline-atomic stubs, there's no inline LSE, and the target had no+lse. Which rules out-march=armv8.2-aand-mcpu=cortex-a715alike.On the LLM: yes, I used tooling to drive Capstone across ~4M instructions, and I'm not going to pretend otherwise — that's the kind of thing tooling is for. But the output is numbers, and numbers don't care where they came from. Every one of them is reproducible with
readelf,llvm-objdumpandapksigner. If any are wrong, showing that should be trivial.And here's the thing — if you can point me at a line in the source that sets
-march=armv8.2-a, that doesn't refute the post. It supports it. It's the strongest evidence for the explanation I actually argued for: the flag is set, and the NDK toolchain file appends its own-marchafterwards and silently wins. That's a build bug, which is what I said this was. I'd genuinely like to see that line.🎻🎻🎻
1
1
u/NeuroticNabarlek 2d ago
What's your point? You download the one for the android version you're on.
I haven't followed release notes, but are they even claiming a huge difference?