Right now it knows about uint12 immediate values (and their negative equivalents) but doesn't know about the optional shift: case shift of when '00' imm = ZeroExtend(imm12, datasize); when '01' imm = ZeroExtend(imm12:Zeros(12), datasize); // <--- THIS when '1x' ReservedValue(); This exists in add and sub at a minimum. Look at all opcodes which have this optional shift, and teach the ARM64 assembler to use them!