code wiki / (root) / nxasm_x86_enc.nx

nxasm_x86_enc.nx

buildroot/runtime/nxasm_x86_enc.nx

49438 B1173 linesdepth 0pulls 0 transitivereach 29 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
407const X86_CC_O: i64 = 0
408const X86_CC_NO: i64 = 1
409const X86_CC_E: i64 = 4
410const X86_CC_NE: i64 = 5
411const X86_CC_L: i64 = 0xC
412const X86_CC_LE: i64 = 0xE
413const X86_CC_G: i64 = 0xF
414const X86_CC_GE: i64 = 0xD
415const X86_CC_S: i64 = 8 // SF=1 (negative) -- the G22 bias-select
416const X86_CC_NS: i64 = 9 // SF=0
1035const X86_SHT_ENTS: i64 = 4 // NULL, .text, .debug_line, .shstrtab
1036const X86_SHT_ENTSZ: i64 = 64

functions

52func x86_put_u16le(out: *u8, o: i64, v: i64) -> i64
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
123func x86_vex2_rr(out: *u8, o: i64, opc: i64, dst: i64, src1: i64, src2: i64, l: i64, pp: i64) -> i64
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
173func x86_sse_mem(out: *u8, o: i64, pfx: i64, opc: i64, reg: i64, base: i64, disp: i64) -> i64
192func x86_sse_shift_imm(out: *u8, o: i64, opc: i64, ext: i64, xmm: i64, imm8: i64) -> i64
207func x86_sse_rri(out: *u8, o: i64, pfx: i64, opc: i64, reg: i64, rm: i64, imm8: i64) -> i64
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
317func x86_movabs(out: *u8, o: i64, reg: i64, imm: i64) -> i64
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
350func x86_syscall(out: *u8, o: i64) -> i64
359func x86_rdtsc(out: *u8, o: i64) -> i64
366func x86_ret(out: *u8, o: i64) -> i64
372func x86_push(out: *u8, o: i64, reg: i64) -> i64
380func x86_pop(out: *u8, o: i64, reg: i64) -> i64
419func x86_alu_rr(out: *u8, o: i64, opcode: i64, dst: i64, src: i64) -> i64
429func x86_alu_imm(out: *u8, o: i64, ext: i64, dst: i64, imm: i64) -> i64
449func x86_mem_operand(out: *u8, o: i64, reg_field: i64, base: i64, disp: i64) -> i64
460func x86_mov_load(out: *u8, o: i64, dst: i64, base: i64, disp: i64) -> i64
468func x86_mov_store(out: *u8, o: i64, base: i64, disp: i64, src: i64) -> i64
478func x86_rex_wx(reg_field: i64, index_field: i64, base_field: i64) -> i64
487func x86_scale_log2(scale: i64) -> i64
498func x86_mem_operand_sib(out: *u8, o: i64, reg_field: i64, base: i64,
512func x86_mov_load_sib(out: *u8, o: i64, dst: i64, base: i64, index: i64, scale: i64, disp: i64) -> i64
520func x86_mov_store_sib(out: *u8, o: i64, base: i64, index: i64, scale: i64, disp: i64, src: i64) -> i64
529func x86_movl_rex_if(out: *u8, o: i64, reg: i64, rm: i64) -> i64
537func x86_movl_store(out: *u8, o: i64, base: i64, disp: i64, src: i64) -> i64
542func x86_movl_load(out: *u8, o: i64, dst: i64, base: i64, disp: i64) -> i64
548func x86_movl_rr(out: *u8, o: i64, dst: i64, src: i64) -> i64
556func x86_lea(out: *u8, o: i64, dst: i64, base: i64, disp: i64) -> i64
568func x86_lea_sib(out: *u8, o: i64, dst: i64, base: i64, index: i64, scale: i64, disp: i64) -> i64
577func x86_lea_rip(out: *u8, o: i64, dst: i64, disp32: i64) -> i64
588func x86_imul_rr(out: *u8, o: i64, dst: i64, src: i64) -> i64
598func x86_movzbq(out: *u8, o: i64, dst: i64, src: i64) -> i64
607func x86_movzbq_mem(out: *u8, o: i64, dst: i64, base: i64, disp: i64) -> i64
622func x86_movsbq(out: *u8, o: i64, dst: i64, src: i64) -> i64
631func x86_movsbq_mem(out: *u8, o: i64, dst: i64, base: i64, disp: i64) -> i64
639func x86_movswq(out: *u8, o: i64, dst: i64, src: i64) -> i64
648func x86_movswq_mem(out: *u8, o: i64, dst: i64, base: i64, disp: i64) -> i64
656func x86_movzwq(out: *u8, o: i64, dst: i64, src: i64) -> i64
665func x86_movzwq_mem(out: *u8, o: i64, dst: i64, base: i64, disp: i64) -> i64
673func x86_movslq(out: *u8, o: i64, dst: i64, src: i64) -> i64
681func x86_movslq_mem(out: *u8, o: i64, dst: i64, base: i64, disp: i64) -> i64
689func x86_cqo(out: *u8, o: i64) -> i64
695func x86_idiv(out: *u8, o: i64, reg: i64) -> i64
707func x86_mul(out: *u8, o: i64, reg: i64) -> i64
721func x86_crc32_r64(out: *u8, o: i64, dst: i64, src: i64) -> i64
738func x86_pdep_r64(out: *u8, o: i64, dst: i64, src1: i64, src2: i64) -> i64
747func x86_pext_r64(out: *u8, o: i64, dst: i64, src1: i64, src2: i64) -> i64
759func x86_mulx_r64(out: *u8, o: i64, dst_hi: i64, dst_lo: i64, src: i64) -> i64
771func x86_adcx_r64(out: *u8, o: i64, dst: i64, src: i64) -> i64
781func x86_adox_r64(out: *u8, o: i64, dst: i64, src: i64) -> i64
793func x86_shift_imm(out: *u8, o: i64, ext: i64, reg: i64, imm8: i64) -> i64
803func x86_jmp_rel32(out: *u8, o: i64, rel: i64) -> i64
809func x86_call_rel32(out: *u8, o: i64, rel: i64) -> i64
815func x86_jcc_rel32(out: *u8, o: i64, cc: i64, rel: i64) -> i64
824func x86_cmovcc(out: *u8, o: i64, cc: i64, dst: i64, src: i64) -> i64
834func x86_setcc(out: *u8, o: i64, cc: i64, reg: i64) -> i64
845func x86_rot_imm(out: *u8, o: i64, is_ror: i64, reg: i64, imm8: i64) -> i64
854func x86_rot_cl(out: *u8, o: i64, is_ror: i64, reg: i64) -> i64
862func x86_shift_cl(out: *u8, o: i64, ext: i64, reg: i64) -> i64
870func x86_bswap(out: *u8, o: i64, reg: i64) -> i64
878func x86_popcnt(out: *u8, o: i64, dst: i64, src: i64) -> i64
890func x86_cnt32(out: *u8, o: i64, opc: i64, dst: i64, src: i64) -> i64
904func x86_lzcnt32(out: *u8, o: i64, dst: i64, src: i64) -> i64 { return x86_cnt32(out, o, 0xBD, dst, src) }
905func x86_tzcnt32(out: *u8, o: i64, dst: i64, src: i64) -> i64 { return x86_cnt32(out, o, 0xBC, dst, src) }
907func x86_unary_f7(out: *u8, o: i64, ext: i64, reg: i64) -> i64
914func x86_neg(out: *u8, o: i64, reg: i64) -> i64 { return x86_unary_f7(out, o, 3, reg) }
915func x86_not(out: *u8, o: i64, reg: i64) -> i64 { return x86_unary_f7(out, o, 2, reg) }
917func x86_incdec(out: *u8, o: i64, ext: i64, reg: i64) -> i64
925func x86_movb_imm(out: *u8, o: i64, base: i64, disp: i64, imm8: i64) -> i64
936func x86_movb_imm_reg(out: *u8, o: i64, reg: i64, imm8: i64) -> i64
947func x86_movb_store(out: *u8, o: i64, base: i64, disp: i64, src: i64) -> i64
958func x86_call_indirect(out: *u8, o: i64, reg: i64) -> i64
965func x86_jmp_indirect(out: *u8, o: i64, reg: i64) -> i64
979func x86_build_elf_at(code: *u8, code_len: i64, entry_off: i64, out: *u8) -> i64
1041func x86_sh_str(out: *u8, off: i64, s: *u8) -> i64
1048func x86_sh_ent(out: *u8, at: i64, name: i64, styp: i64, flags: i64,
1062func x86_build_elf_dbg_at(code: *u8, code_len: i64, entry_off: i64, out: *u8,
1112func x86_build_elf_dbg3_at(code: *u8, code_len: i64, entry_off: i64, out: *u8,
1171func x86_build_elf(code: *u8, code_len: i64, out: *u8) -> i64