package x86 import ( "encoding/binary" "git.urbach.dev/cli/q/src/cpu" ) // memLoadExtend encodes a memory load with sign or zero extension. func memLoadExtend(code []byte, register cpu.Register, base cpu.Register, offset int32, length byte, opCode8 uint32, opCode16 uint32, opCode32 uint32) []byte { var ( opCode uint32 mod = AddressMemory ) switch length { case 1: opCode = opCode8 case 2: opCode = opCode16 case 4: opCode = opCode32 } if offset != 0 || base == R5 || base == R13 { mod = AddressMemoryOffset8 if cpu.SizeInt(int64(offset)) > 1 { mod = AddressMemoryOffset32 } } code = encode(code, mod, register, base, 8, opCode) switch mod { case AddressMemoryOffset8: return append(code, byte(offset)) case AddressMemoryOffset32: return binary.LittleEndian.AppendUint32(code, uint32(offset)) default: return code } }