code wiki / (root) / nxasm_x86_enc.nx

nxasm_x86_enc.nx

buildroot/runtime/nxasm_x86_enc.nx

42301 B1022 linesdepth 0pulls 0 transitivereach 28 importersview sourcekind librarytopic nxasm
docsdependenciesstructsconstsfunctions

about

nxasm_x86_enc.nx -- x86_64 instruction encoder + minimal ELF writer, written in NishiLang. The x86_64 sibling of asm_enc.nx (RV64). First brick of the SOVEREIGN x86_64 backend: replaces GNU `as` + `ld` on the output path. Pure bit-manipulation -- no syscalls, no file I/O here, so it stays architecture-neutral and the encoder KAT runs under any lane. Live emit (write the ELF to a fd) is composed in the test/driver via the syscall layer. Scope (this iteration): the exact constructs needed to emit a runnable static ELF -- enough to prove the whole sovereign chain end-to-end with an exit(N) binary. The full 29-mnemonic AT&T subset nxc2 emits (movq/movabsq/add/sub/and/or/cmp/test/imul/idiv/cqo/shl/ sar/lea/call/jmp/jcc/setcc/movzbq/...) lands incrementally on this same REX/ModRM/SIB foundation, each gated by a byte-exact KAT vs the objdump oracle (Wheeler/benchmark reference only -- NEVER in our output path). Encoding model (Intel SDM Vol.2): REX prefix 0100 WRXB (0x40 base; W=64-bit, B=reg ext bit3) ModRM mod(2) reg(3) rm(3) immediates little-endian genealogy_id: intel_sdm_vol2 + amd_apm + osdev_elf (Wheeler refs) lineage_id: nishi_sovereign_x86_64_backend_m1 license_tier: ORIGINAL

dependencies 0 imports · 1 importers

nxasm_x86_enc.nx nxasm_x86.nx

imports: none

imported by: nxasm_x86.nx

structs

none

consts

29const X86_RAX: i64 = 0
30const X86_RCX: i64 = 1
31const X86_RDX: i64 = 2
32const X86_RBX: i64 = 3
33const X86_RSP: i64 = 4
34const X86_RBP: i64 = 5
35const X86_RSI: i64 = 6
36const X86_RDI: i64 = 7
37const X86_R8: i64 = 8
38const X86_R9: i64 = 9
39const X86_R10: i64 = 10
40const X86_R11: i64 = 11
41const X86_R12: i64 = 12
42const X86_R13: i64 = 13
43const X86_R14: i64 = 14
44const X86_R15: i64 = 15
47const EM_X86_64: i64 = 62
48const X86_BASE: i64 = 0x400000 // conventional static ET_EXEC base
49const X86_HDRLEN: i64 = 120 // 64 (ehdr) + 56 (one phdr)
388const X86_OP_ADD: i64 = 0x01
389const X86_OP_SUB: i64 = 0x29
390const X86_OP_AND: i64 = 0x21
391const X86_OP_OR: i64 = 0x09
392const X86_OP_XOR: i64 = 0x31
393const X86_OP_CMP: i64 = 0x39
394const X86_OP_TEST: i64 = 0x85
396const X86_EXT_ADD: i64 = 0
397const X86_EXT_OR: i64 = 1
398const X86_EXT_AND: i64 = 4
399const X86_EXT_SUB: i64 = 5
400const X86_EXT_CMP: i64 = 7
402const X86_EXT_SHL: i64 = 4
403const X86_EXT_SHR: i64 = 5
404const X86_EXT_SAR: i64 = 7
406const X86_CC_E: i64 = 4
407const X86_CC_NE: i64 = 5
408const X86_CC_L: i64 = 0xC
409const X86_CC_LE: i64 = 0xE
410const X86_CC_G: i64 = 0xF
411const X86_CC_GE: i64 = 0xD
412const X86_CC_S: i64 = 8 // SF=1 (negative) -- the G22 bias-select
413const X86_CC_NS: i64 = 9 // SF=0

functions

52func x86_put_u16le(out: *u8, o: i64, v: i64) -> i64
called by 1: x86_build_elf_at
58func x86_put_u32le(out: *u8, o: i64, v: i64) -> i64
66func x86_put_u64le(out: *u8, o: i64, v: i64) -> i64
80func x86_rex_w(reg_field: i64, rm_field: i64) -> i64
88func x86_modrm(mod: i64, reg: i64, rm: i64) -> i64
97func x86_sse_rr(out: *u8, o: i64, pfx: i64, esc: i64, opc: i64, reg: i64, rm: i64) -> i64
called by 1: axc_emit calls 1: x86_modrm
123func x86_vex2_rr(out: *u8, o: i64, opc: i64, dst: i64, src1: i64, src2: i64, l: i64, pp: i64) -> i64
calls 1: x86_modrm
136func x86_vex3_rr(out: *u8, o: i64, mmmmm: i64, w: i64, opc: i64, dst: i64, src1: i64, src2: i64, l: i64, pp: i64) -> i64
150func x86_sse_rr_w(out: *u8, o: i64, pfx: i64, esc: i64, opc: i64, reg: i64, rm: i64) -> i64
called by 1: axc_emit calls 1: x86_modrm
173func x86_sse_mem(out: *u8, o: i64, pfx: i64, opc: i64, reg: i64, base: i64, disp: i64) -> i64
called by 1: axc_emit calls 1: x86_mem_operand
192func x86_sse_shift_imm(out: *u8, o: i64, opc: i64, ext: i64, xmm: i64, imm8: i64) -> i64
called by 1: axc_emit calls 1: x86_modrm
207func x86_sse_rri(out: *u8, o: i64, pfx: i64, opc: i64, reg: i64, rm: i64, imm8: i64) -> i64
called by 1: axc_emit calls 1: x86_modrm
231func x86_vex_rrr(out: *u8, o: i64, pp: i64, mmmmm: i64, w: i64, vexL: i64, opc: i64, dst: i64, src1: i64, src2: i64) -> i64
251func x86_vex_rm(out: *u8, o: i64, pp: i64, mmmmm: i64, w: i64, vexL: i64, opc: i64, reg: i64, base: i64, disp: i64) -> i64
273func x86_vex_shift_imm(out: *u8, o: i64, pp: i64, mmmmm: i64, vexL: i64, opc: i64, ext: i64, dst: i64, src: i64, imm8: i64) -> i64
295func x86_vex_rmi(out: *u8, o: i64, pp: i64, mmmmm: i64, w: i64, vexL: i64, opc: i64, dst: i64, src: i64, imm8: i64) -> i64
called by 1: axc_emit calls 1: x86_modrm
317func x86_movabs(out: *u8, o: i64, reg: i64, imm: i64) -> i64
called by 1: axc_emit calls 1: x86_put_u64le
327func x86_mov_imm32(out: *u8, o: i64, reg: i64, imm: i64) -> i64
339func x86_mov_reg(out: *u8, o: i64, dst: i64, src: i64) -> i64
called by 1: axc_emit calls 2: x86_rex_wx86_modrm
350func x86_syscall(out: *u8, o: i64) -> i64
called by 1: axc_emit
359func x86_rdtsc(out: *u8, o: i64) -> i64
called by 1: axc_emit
366func x86_ret(out: *u8, o: i64) -> i64
called by 1: axc_emit
372func x86_push(out: *u8, o: i64, reg: i64) -> i64
called by 1: axc_emit
380func x86_pop(out: *u8, o: i64, reg: i64) -> i64
called by 1: axc_emit
416func x86_alu_rr(out: *u8, o: i64, opcode: i64, dst: i64, src: i64) -> i64
426func x86_alu_imm(out: *u8, o: i64, ext: i64, dst: i64, imm: i64) -> i64
446func x86_mem_operand(out: *u8, o: i64, reg_field: i64, base: i64, disp: i64) -> i64
457func x86_mov_load(out: *u8, o: i64, dst: i64, base: i64, disp: i64) -> i64
called by 1: axc_emit calls 2: x86_rex_wx86_mem_operand
465func x86_mov_store(out: *u8, o: i64, base: i64, disp: i64, src: i64) -> i64
called by 1: axc_emit calls 2: x86_rex_wx86_mem_operand
475func x86_rex_wx(reg_field: i64, index_field: i64, base_field: i64) -> i64
484func x86_scale_log2(scale: i64) -> i64
called by 1: x86_mem_operand_sib
495func x86_mem_operand_sib(out: *u8, o: i64, reg_field: i64, base: i64,
509func x86_mov_load_sib(out: *u8, o: i64, dst: i64, base: i64, index: i64, scale: i64, disp: i64) -> i64
517func x86_mov_store_sib(out: *u8, o: i64, base: i64, index: i64, scale: i64, disp: i64, src: i64) -> i64
526func x86_movl_rex_if(out: *u8, o: i64, reg: i64, rm: i64) -> i64
534func x86_movl_store(out: *u8, o: i64, base: i64, disp: i64, src: i64) -> i64
539func x86_movl_load(out: *u8, o: i64, dst: i64, base: i64, disp: i64) -> i64
545func x86_movl_rr(out: *u8, o: i64, dst: i64, src: i64) -> i64
called by 1: axc_emit calls 2: x86_movl_rex_ifx86_modrm
553func x86_lea(out: *u8, o: i64, dst: i64, base: i64, disp: i64) -> i64
called by 1: axc_emit calls 2: x86_rex_wx86_mem_operand
565func x86_lea_sib(out: *u8, o: i64, dst: i64, base: i64, index: i64, scale: i64, disp: i64) -> i64
574func x86_lea_rip(out: *u8, o: i64, dst: i64, disp32: i64) -> i64
called by 1: axc_emit calls 2: x86_modrmx86_put_u32le
585func x86_imul_rr(out: *u8, o: i64, dst: i64, src: i64) -> i64
called by 1: axc_emit calls 2: x86_rex_wx86_modrm
595func x86_movzbq(out: *u8, o: i64, dst: i64, src: i64) -> i64
called by 1: axc_emit calls 2: x86_rex_wx86_modrm
604func x86_movzbq_mem(out: *u8, o: i64, dst: i64, base: i64, disp: i64) -> i64
called by 1: axc_emit calls 2: x86_rex_wx86_mem_operand
619func x86_movsbq(out: *u8, o: i64, dst: i64, src: i64) -> i64
called by 1: axc_emit calls 2: x86_rex_wx86_modrm
628func x86_movsbq_mem(out: *u8, o: i64, dst: i64, base: i64, disp: i64) -> i64
called by 1: axc_emit calls 2: x86_rex_wx86_mem_operand
636func x86_movswq(out: *u8, o: i64, dst: i64, src: i64) -> i64
called by 1: axc_emit calls 2: x86_rex_wx86_modrm
645func x86_movswq_mem(out: *u8, o: i64, dst: i64, base: i64, disp: i64) -> i64
called by 1: axc_emit calls 2: x86_rex_wx86_mem_operand
653func x86_movzwq(out: *u8, o: i64, dst: i64, src: i64) -> i64
called by 1: axc_emit calls 2: x86_rex_wx86_modrm
662func x86_movzwq_mem(out: *u8, o: i64, dst: i64, base: i64, disp: i64) -> i64
called by 1: axc_emit calls 2: x86_rex_wx86_mem_operand
670func x86_movslq(out: *u8, o: i64, dst: i64, src: i64) -> i64
called by 1: axc_emit calls 2: x86_rex_wx86_modrm
678func x86_movslq_mem(out: *u8, o: i64, dst: i64, base: i64, disp: i64) -> i64
called by 1: axc_emit calls 2: x86_rex_wx86_mem_operand
686func x86_cqo(out: *u8, o: i64) -> i64
called by 1: axc_emit
692func x86_idiv(out: *u8, o: i64, reg: i64) -> i64
called by 1: axc_emit calls 2: x86_rex_wx86_modrm
704func x86_mul(out: *u8, o: i64, reg: i64) -> i64
called by 1: axc_emit calls 2: x86_rex_wx86_modrm
718func x86_crc32_r64(out: *u8, o: i64, dst: i64, src: i64) -> i64
called by 1: axc_emit calls 2: x86_rex_wx86_modrm
735func x86_pdep_r64(out: *u8, o: i64, dst: i64, src1: i64, src2: i64) -> i64
called by 1: axc_emit calls 1: x86_vex3_rr
744func x86_pext_r64(out: *u8, o: i64, dst: i64, src1: i64, src2: i64) -> i64
called by 1: axc_emit calls 1: x86_vex3_rr
756func x86_mulx_r64(out: *u8, o: i64, dst_hi: i64, dst_lo: i64, src: i64) -> i64
called by 1: axc_emit calls 1: x86_vex3_rr
768func x86_adcx_r64(out: *u8, o: i64, dst: i64, src: i64) -> i64
called by 1: axc_emit calls 2: x86_rex_wx86_modrm
778func x86_adox_r64(out: *u8, o: i64, dst: i64, src: i64) -> i64
called by 1: axc_emit calls 2: x86_rex_wx86_modrm
790func x86_shift_imm(out: *u8, o: i64, ext: i64, reg: i64, imm8: i64) -> i64
800func x86_jmp_rel32(out: *u8, o: i64, rel: i64) -> i64
called by 1: axc_emit calls 1: x86_put_u32le
806func x86_call_rel32(out: *u8, o: i64, rel: i64) -> i64
called by 1: axc_emit calls 1: x86_put_u32le
812func x86_jcc_rel32(out: *u8, o: i64, cc: i64, rel: i64) -> i64
called by 1: axc_emit calls 1: x86_put_u32le
821func x86_cmovcc(out: *u8, o: i64, cc: i64, dst: i64, src: i64) -> i64
called by 1: axc_emit calls 2: x86_rex_wx86_modrm
831func x86_setcc(out: *u8, o: i64, cc: i64, reg: i64) -> i64
called by 1: axc_emit calls 1: x86_modrm
842func x86_rot_imm(out: *u8, o: i64, is_ror: i64, reg: i64, imm8: i64) -> i64
called by 1: axc_emit calls 2: x86_rex_wx86_modrm
851func x86_rot_cl(out: *u8, o: i64, is_ror: i64, reg: i64) -> i64
called by 2: axc_emitaxc_emit calls 2: x86_rex_wx86_modrm
859func x86_shift_cl(out: *u8, o: i64, ext: i64, reg: i64) -> i64
867func x86_bswap(out: *u8, o: i64, reg: i64) -> i64
called by 1: axc_emit
875func x86_popcnt(out: *u8, o: i64, dst: i64, src: i64) -> i64
called by 1: axc_emit calls 2: x86_rex_wx86_modrm
887func x86_cnt32(out: *u8, o: i64, opc: i64, dst: i64, src: i64) -> i64
called by 2: x86_lzcnt32x86_tzcnt32 calls 1: x86_modrm
901func x86_lzcnt32(out: *u8, o: i64, dst: i64, src: i64) -> i64 { return x86_cnt32(out, o, 0xBD, dst, src) }
called by 1: axc_emit calls 1: x86_cnt32
902func x86_tzcnt32(out: *u8, o: i64, dst: i64, src: i64) -> i64 { return x86_cnt32(out, o, 0xBC, dst, src) }
called by 1: axc_emit calls 1: x86_cnt32
904func x86_unary_f7(out: *u8, o: i64, ext: i64, reg: i64) -> i64
called by 2: x86_negx86_not calls 2: x86_rex_wx86_modrm
911func x86_neg(out: *u8, o: i64, reg: i64) -> i64 { return x86_unary_f7(out, o, 3, reg) }
called by 1: axc_emit calls 1: x86_unary_f7
912func x86_not(out: *u8, o: i64, reg: i64) -> i64 { return x86_unary_f7(out, o, 2, reg) }
called by 1: axc_emit calls 1: x86_unary_f7
914func x86_incdec(out: *u8, o: i64, ext: i64, reg: i64) -> i64
called by 1: axc_emit calls 2: x86_rex_wx86_modrm
922func x86_movb_imm(out: *u8, o: i64, base: i64, disp: i64, imm8: i64) -> i64
called by 1: axc_emit calls 1: x86_mem_operand
933func x86_movb_imm_reg(out: *u8, o: i64, reg: i64, imm8: i64) -> i64
944func x86_movb_store(out: *u8, o: i64, base: i64, disp: i64, src: i64) -> i64
called by 1: axc_emit calls 1: x86_mem_operand
955func x86_call_indirect(out: *u8, o: i64, reg: i64) -> i64
called by 1: axc_emit calls 1: x86_modrm
962func x86_jmp_indirect(out: *u8, o: i64, reg: i64) -> i64
called by 1: axc_emit calls 1: x86_modrm
976func x86_build_elf_at(code: *u8, code_len: i64, entry_off: i64, out: *u8) -> i64
1020func x86_build_elf(code: *u8, code_len: i64, out: *u8) -> i64