Adds a new instruction.
If inst.code == 0, Finds an available code, assigns inst.code that code.
Otherwise inst.code is used, if available, or -1 returned.
instruction code if success, or -1 in case of error
Error can be: code!=0 and code already used. No more codes left. Or another instruction with same name and arg types exists
Adds a new instruction. If inst.code == 0, Finds an available code, assigns inst.code that code. Otherwise inst.code is used, if available, or -1 returned.