Something went wrong. Try again.
🌱 A minimal programming language and compiler. git.urbach.dev/cli/q
high-performance programming-language compiler
Something went wrong. Try again.
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253package x86
import "git.urbach.dev/cli/q/src/cpu"
// encode2 is the core function that encodes an instruction with an index.func encode2(code []byte, mod AddressMode, reg cpu.Register, base cpu.Register, index cpu.Register, scale Scale, length byte, opCode uint32) []byte { var ( w byte r byte x byte b byte )
if length == 8 { w = 1 } else { w = 0 }
r, reg = split(reg) x, index = split(index) b, base = split(base)
if length == 2 { code = append(code, 0x66) }
if opCode&0xFF000000 != 0 { code = append(code, byte(opCode>>24)) }
if w != 0 || r != 0 || x != 0 || b != 0 || (length == 1 && reg >= SP && reg <= R7) { code = append(code, REX(w, r, x, b)) }
if opCode&0xFF0000 != 0 { code = append(code, byte(opCode>>16)) }
if opCode&0xFF00 != 0 { code = append(code, byte(opCode>>8)) }
code = append(code, byte(opCode)) code = append(code, ModRM(mod, byte(reg), 0b100)) code = append(code, SIB(scale, byte(index), byte(base)))
if mod == AddressMemoryOffset8 { code = append(code, 0x00) }
return code}