Reasonable means the simplest and most minimal set of instructions to implement a particular behavior. These are your Primitives for the intermediate language. If you find something that you can't do in terms of the existing instructions, then the required operation should be added to your set of primitives. A good way to figure some of this out is to read through a minimal FORTH, say something like Jones FORTH (https://github.com/phf/forth/tree/master/x86 here's at least one port). The core set of primitives is in the .S assembly file and everything else is implemented in terms of those 'words'. If you want a really simple one, look up something like https://esolangs.org/wiki/Brainfuck and work your way up into a more reasonable (i.e. actual numbers!) ISA.