Some notes about the maintenance:
AsmJit library is relatively small, but it has more than 15 years of development history and during that time I have rewritten it 3 times to end up with the current architecture. AsmJit’s ISA completeness was the initial goal of the library - to create something that can be used by many other projects without facing restrictions like “this instruction was not implemented and thus cannot be used”. For me it’s very hard to see alternatives in low-latency JIT compilation field. For example LLVM is not a competitor of AsmJit - it’s a library for a completely different use-case.
The problem is that just to keep AsmJit up-to-date I have to dig into instruction manuals of all supported architectures and add these instructions to AsmJit’s database, and write encoders for them, tests, etc… Just keeping the ISA-level up-to-date is a lot of work - just look at AVX-512, for example, how massive it is (but I got it!). And now there is Intel’s APX, AVX10.2, new AMX additions, etc… And In ARM world there is SVE, SVE2, SME, SME2, and many new extensions.
But that’s not all - if you emit your code there is another problem - to run it! There has been a lot of restrictions employed by OS vendors lately regarding the possibility to run JIT code. For example using MAP_JIT on Apple Silicon, W^X pages on hardened platforms, etc… And this is a minefield - Linux, Windows, Apple, each BSD variation, etc… you literally write separate code for each of these and I still remember this NetBSD or OpenBSD bug (sorry don’t remember which one was it) that we found was actually an OS bug that caused invalidation of private mappings after fork() - and to find this it took me literally days of my time - to find a bug in OS that I was not even using.
And lately, I started the UJIT sub-project within AsmJit which tries to make code-generation platform independent with an escape hatch to use architecture-dependent pieces where it makes a difference. That’s a fresh thing that I have ported from Blend2D project to make it more accessible to other projects.
In other words - the development costs a lot of time and development activity is necessary.
What are the options?
- Core team becoming maintainers of AsmJit: I think this would be possible and probably the best solution if the current state of matters is not resolved. But the question is why the core team should be distracted by this kind of work? Would the development of the core project then be slower due to maintenance costs? They would still have to do the maintenance, and possibly write new ports if RISC-V or Loongarch becomes a thing.
- Using a different library instead. There is xbyak (x86), which has something comparable to AsmJit’s x86/x64 Assembler - it could theoretically be used if higher portability is not a big concern. AsmJit’s virtual memory management would have to be ported to this library though as I’m not aware of it being able to do dual mapping, for example.
- Avoid JIT entirely or design something simpler like copy&patch. I have no idea whether this would be worth it.
I still think that AsmJit getting the deserved funding would be the best outcome, because I would finally be able to make things better on AsmJit front (like having SIMD-accelerated encoders, more ports, etc…). But that doesn’t depend on me. Companies like Meta are not gonna help, they are busy counting billions, has to be somebody else.