q/src/build/arch/x64/numberToRegister.go

44 lines
913 B
Go

package x64
// numRegReg encodes an instruction with up to two registers and a number parameter.
func numRegReg(code []byte, opCode8 byte, opCode32 byte, reg byte, rm byte, number int) []byte {
w := byte(1) // Indicates a 64-bit register.
r := byte(0) // Extension to the "reg" field in ModRM.
x := byte(0) // Extension to the SIB index field.
b := byte(0) // Extension to the "rm" field in ModRM or the SIB base (r8 up to r15 use this).
mod := byte(0b11) // Direct addressing mode, no register offsets.
if reg > 0b111 {
r = 1
reg &= 0b111
}
if rm > 0b111 {
b = 1
rm &= 0b111
}
rex := REX(w, r, x, b)
modRM := ModRM(mod, reg, rm)
if sizeOf(number) == 1 {
return append(
code,
rex,
opCode8,
modRM,
byte(number),
)
}
return append(
code,
rex,
opCode32,
modRM,
byte(number),
byte(number>>8),
byte(number>>16),
byte(number>>24),
)
}