Pluggable instruction sets

This commit is contained in:
2026-02-10 10:58:48 -06:00
parent e4fe2c6bff
commit 4280841719
6 changed files with 226 additions and 188 deletions

View File

@@ -9,24 +9,26 @@
assembler-pos assembler-pos-set!
assembler-buf
assembler-labels
assembler-instruction-set
emit-label
emit-instruction
emit-literal
emit-reference
finalize-references
assembler-backpatch!
assembler-dump-program))
(define (make-label) (cons #f '()))
(define-record-type <assembler>
(make-assembler pos buf labels)
(make-assembler pos buf labels instruction-set)
assembler?
(pos assembler-pos assembler-pos-set!)
(buf assembler-buf assembler-buf-set!)
(labels assembler-labels))
(labels assembler-labels)
(instruction-set assembler-instruction-set))
(define (make-assembler*)
(make-assembler 0 (make-bytevector 1024) (make-hash-table)))
(define (make-assembler* instruction-set)
(make-assembler 0 (make-bytevector 1024) (make-hash-table) instruction-set))
(define (assembler-buf-grow! asm)
(let ([buf (make-bytevector (ash (bytevector-length (assembler-buf asm)) -1))])
@@ -59,7 +61,7 @@
(assembler-label-add-value asm name (assembler-pos asm)))
(define (emit-instruction asm inst)
(let ([inst-object (assq inst *instruction-set*)])
(let ([inst-object (instruction-lookup (assembler-instruction-set asm) inst)])
(write-byte (instruction-code inst-object) asm)
(assembler-pos-set! asm (+ (assembler-pos asm) 1))))
@@ -71,7 +73,7 @@
(assembler-label-add-reference asm name (assembler-pos asm))
(assembler-pos-set! asm (+ (assembler-pos asm) 4)))
(define (finalize-references asm)
(define (assembler-backpatch! asm)
(define (install-location _name label)
(for-each
(cute write-word (car label) asm <>)