aboutsummaryrefslogtreecommitdiff
path: root/assembler
diff options
context:
space:
mode:
authorMistivia <i@mistivia.com>2024-11-25 16:49:32 +0800
committerMistivia <i@mistivia.com>2024-11-25 16:49:32 +0800
commitc1f94e913931dfd5e63eac76deac2a2a05337552 (patch)
treef7ff4338325d7aa4ae3306839df97a7c57466583 /assembler
parent39f1c7302552935c042bacd0e7048af0d9c97246 (diff)
add tag preprocessor in assembler
Diffstat (limited to 'assembler')
-rw-r--r--assembler/fvm-as.scm48
1 files changed, 38 insertions, 10 deletions
diff --git a/assembler/fvm-as.scm b/assembler/fvm-as.scm
index 9e37a30..b65cfb7 100644
--- a/assembler/fvm-as.scm
+++ b/assembler/fvm-as.scm
@@ -36,15 +36,15 @@
(bput . ((imm 8) mul bp add st))
(sput . ((imm 8) mul bp add st)))))
-(define (is-pseudo-op sym)
+(define (is-pseudo-op? sym)
(hash-table-ref/default pseudo-op-table sym #f))
-(define (is-op sym)
+(define (is-op? sym)
(hash-table-ref/default opcode-table sym #f))
-(define (is-tag sym tag-table)
- (not (or (is-op sym)
- (is-pseudo-op sym)
+(define (is-tag? sym tag-table)
+ (not (or (is-op? sym)
+ (is-pseudo-op? sym)
(not (hash-table-ref/default tag-table sym #f)))))
(define (pseudo-op-pass prog)
@@ -56,18 +56,45 @@
(if (null? prog)
ret
(let ((next-op (car prog)))
- (if (is-pseudo-op next-op)
+ (if (is-pseudo-op? next-op)
(impl (cdr prog) (add-to-prog
(hash-table-ref pseudo-op-table next-op)
ret))
(impl (cdr prog) (cons (car prog) ret))))))
(reverse (impl prog '())))
-(define (is-tag-op op)
- (and (list? op) (eq 'tag (car op))))
+(define (is-tag-op? op)
+ (and (list? op) (eq? 'tag (car op))))
-(define (is-imm-op op)
- (and (list? op) (eq 'imm (car op))))
+(define (is-imm-op? op)
+ (and (list? op) (eq? 'imm (car op))))
+
+(define (tag-preprocess-pass prog)
+ (define (is-local-tag? sym)
+ (eq? #\. (string-ref (symbol->string sym) 0)))
+ (define (compose-tag seg sym)
+ (if (null? seg)
+ sym
+ (if (is-local-tag? sym)
+ (string->symbol (string-append (symbol->string seg) (symbol->string sym)))
+ sym)))
+ (define (not-op? sym) (not (or (is-op? sym) (is-pseudo-op? sym))))
+ (define (impl prog ret curseg)
+ (if (null? prog)
+ (reverse ret)
+ (let ((cur (car prog)))
+ (cond ((symbol? cur) (if (not-op? cur)
+ (impl (cdr prog)
+ (cons (compose-tag curseg cur) ret)
+ curseg)
+ (impl (cdr prog) (cons cur ret) curseg)))
+ ((tag-op? cur) (if (local-tag? (cadr cur))
+ (impl (cdr prog)
+ (cons (list 'tag (compose-tag curseg (cadr cur))) ret)
+ curseg)
+ (impl (cdr prog) (cons cur ret) (cadr cur))))
+ (else (impl (cdr prog) (cons cur ret) curseg))))))
+ (impl prog '() '()))
(define (calculate-tag-pos prog)
(define (impl prog cur-pos tag-table)
@@ -91,6 +118,7 @@
(with-input-from-file input-file
(lambda (port) (set! prog (read port))))
(set! prog (pseudo-op-pass prog))
+ (set! prog (tag-preprocess-pass prog))
(set! prog (tag-pass prog))
(with-output-to-file output-file
(lambda (port) (output-prog prog port))))