If I recall correctly, QEMU did portable JIT by implementing the instructions in C and then copying their compiled versions out of the emulator binary instead of calling them as functions.
Right, but it kinda depends on what you mean by "portable". Only an interpreter will work without modification on a new host arch, but code for a JIT that is organized in such a way that makes it easy to add support for new host arch might also be called "portable".