Thunder is a portable library for dynamic generation of machine code, with backends (so far) for the x86/amd64 (in both 32 and 64 bit mode), the ARM32 and (to come) the MIPS32. It presents an interface rather like a generic RISC machineA computer designed with a simplified instruction set. Typically, these machines have a large set of uniform registers, a small set of addressing modes, and load/store instructions separate from the instructions that carry out arithmetic operations., and on each target generates the native instructions needed to realise each RISC operation.
Thunder was designed to support a JIT-based implementation of the Keiko stack machine, itself the target of the Oxford Oberon-2 compiler. It began as a re-implementation of GNU Lightning, but has evolved since. GNU Lightning supports fairly well applications where target registers are used for fixed tasks, but it does not work so well when the client is (like the Keiko JIT) able to allocate and use multiple general-purpose registers: in such cases, the compile-time simplifications assumed by the design of Lightning are less effective, and there is danger of significant code bloat.
Thunder can be downloaded from Bitbucket (https://bitbucket.org/Spivey/thunder), and there is a page here with a basic tutorial, another page that discusses a larger example, and a listing of the Thunder instruction set.