x64/x86 instruction encoder (common subset). Covers integer moves, ALU, stack, jumps/calls, enough for hello-world/bf-jit.
Procs
proc encAluMemImm(a: var auto; mn: string; mem: MemOp; imm: int64; size: OpSize; isX64: bool)
proc encAluMemReg(a: var auto; mn: string; mem: MemOp; src: Register; size: OpSize; isX64: bool)
proc encAluRegImm(a: var auto; mn: string; dst: Register; imm: int64; size: OpSize)
proc encAluRegMem(a: var auto; mn: string; dst: Register; mem: MemOp; size: OpSize; isX64: bool)
proc encAluRegReg(a: var auto; mn: string; dst, src: Register; size: OpSize)
proc encCallMem(a: var auto; mem: MemOp; isX64: bool)
proc encCallReg(a: var auto; reg: Register)
proc encCallRel(a: var auto; lr: LabelRef)
proc encImulRegImm(a: var auto; dst, src: Register; imm: int64; size: OpSize)
- 3-operand imul dst, src, imm8/32: 6B /r ib or 69 /r id
proc encImulRegMem(a: var auto; dst: Register; mem: MemOp; size: OpSize; isX64: bool)
proc encImulRegReg(a: var auto; dst, src: Register; size: OpSize)
proc encIncDecMem(a: var auto; mn: string; mem: MemOp; size: OpSize; isX64: bool)
proc encInt3(a: var auto)
proc encJccShort(a: var auto; mn: string; lr: LabelRef)
proc encJmpShort(a: var auto; lr: LabelRef)
proc encLeaSized(a: var auto; dst: Register; dstSize: OpSize; mem: MemOp; isX64: bool)
proc encMovMemImm(a: var auto; mem: MemOp; imm: int64; size: OpSize; isX64: bool)
proc encMovMemReg(a: var auto; mem: MemOp; src: Register; size: OpSize; isX64: bool)
proc encMovRegImm(a: var auto; dst: Register; imm: int64; size: OpSize)
proc encMovRegMem(a: var auto; dst: Register; mem: MemOp; size: OpSize; isX64: bool)
proc encMovRegReg(a: var auto; dst, src: Register; size: OpSize)
proc encMovzxRegMem(a: var auto; dst: Register; mem: MemOp; srcSize: OpSize; dstSize: OpSize; isX64: bool)
proc encMovzxRegReg(a: var auto; dst, src: Register; srcSize: OpSize; dstSize: OpSize)
proc encNop(a: var auto)
proc encPushReg(a: var auto; reg: Register; isX64: bool)
proc encRet(a: var auto)
proc encShiftMemImm(a: var auto; mn: string; mem: MemOp; count: int64; size: OpSize; isX64: bool)
proc encShiftRegCl(a: var auto; mn: string; reg: Register; size: OpSize)
proc encShiftRegImm(a: var auto; mn: string; reg: Register; count: int64; size: OpSize)
proc encTestRegReg(a: var auto; lhs, rhs: Register; size: OpSize)
Templates
template emitRexIfNeeded(a: untyped; w, r, x, b: bool; extraForce: bool = false)