Compilers used outside of IBM (and, most likely, the majority of those inside IBM) did not need to know anything at all about IMPI (internal micro-programmed interface, which is what I assume you mean by the "opcodes and mnemonics").
Instead they worked with the platform-independent TIMI (technology-independent machine interface). Even IBM's OS code was written and run this way.
The only place IMPI had to be known was in the program loader or execution engine of IBM i. This was responsible for translating the TIMI into a suitable format for the platform (be that IMPI or any other future choice) and caching it with the original program. This would happen either:
- the first time it was run; or
- whenever it was detected to be running on a different platform to the cached code.
If anyone had managed to get a hold of the IMPI specification and figured out a way to generate that directly, their program would cease to run on a platform change as the "IMPI" would be different. Unless, of course, they'd generated the TIMI as well in which case the IMPI generation is totally unnecessary (i.e., it would be done as needed, when running the program).
I'd be surprised if anyone outside of a very small subset of the IBM i group (the people responsible for SLIC, the system licensed internal code) could generate IMPI directly.
The use of this translation scheme meant that, even though the IMPI on a 9404 is likely to be vastly different to the "IMPI" on IBM's latest hardware, the TIMI code of bygone days will continue to run just fine on new platforms, without ever having to be recompiled (just one translation the first time it runs on that new platform).
That was, after all, the intent of having the split(1), giving the ability to replace the underlying hardware in its entirety without needing to re-compile all the applications that ran on it. Instead, the platform simply needed a specific layer that would first throw away any existing IMPI code if it was for a different platform, then generate IMPI code from TIMI (if the former did not exist).
(1) When IBM decided to "bet the farm" on the IBM 360 architecture, this was, in part, to get away from the situation where both:
- they had to develop a large amount of system software every time they introduced a new machine; and
- their customers had to rewrite their applications similarly.
That cost them quite a bit of money so almost certainly influenced the requirements behind the AS/400 as well.