(in-package #:nekod.llm2asm) ;; Generate machine code from AST ;; Not bytecode -- raw x86-64 ASM (defun ast->bytes (ast) "Compile an infra-ast to raw x86-64 bytes." (case (infra-ast-type ast) (:place ;; Emit: call to scheduling kernel ;; ADD kernel as placeholder scheduling op (lookup-kernel "ADD")) (:route ;; Network routing: XOR-based packet classification (lookup-kernel "XOR")) (:scale ;; Loop over replica count (lookup-kernel "LOOP")) (:heal ;; MEMCPY state snapshot for recovery (lookup-kernel "MEMCPY")) (:secure ;; MEMSET for zero-fill sensitive regions (lookup-kernel "MEMSET")) (t (lookup-kernel "ADD")))) (defun emit-function-prologue () "x86-64 function prologue bytes." #(#x55 ; push rbp #x48 #x89 #xe5)) ; mov rbp, rsp (defun emit-function-epilogue () "x86-64 function epilogue bytes." #(#x5d ; pop rbp #xc3)) ; ret (defun codegen (ast) "Full code generation: AST -> complete x86-64 function bytes." (let ((body (ast->bytes ast))) (if body (concatenate 'vector (emit-function-prologue) body (emit-function-epilogue)) (error "codegen: no bytes for AST type ~a" (infra-ast-type ast))))) (defun compile-intent (intent-string) "One-shot: NL intent string -> raw x86-64 bytes." (let* ((tokens (tokenize-intent intent-string)) (ast (extract-ast tokens)) (bytes (codegen ast))) (values bytes ast)))