summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorbd <bdunahu@operationnull.com>2025-01-18 02:07:07 -0700
committerbd <bdunahu@operationnull.com>2025-01-18 02:07:07 -0700
commita3d234983b259576e985f810eacf0d03eefc02d2 (patch)
tree7c9257fe9de777ecb5c804da79d2736643bd60cc /src
parentddd448ae86e5730d5cd297f44ec89ee3fa3c0006 (diff)
Add new emitter files for code generation
Diffstat (limited to 'src')
-rw-r--r--src/modules/emitter/driver.scm6
-rw-r--r--src/modules/emitter/traverse.scm50
2 files changed, 56 insertions, 0 deletions
diff --git a/src/modules/emitter/driver.scm b/src/modules/emitter/driver.scm
new file mode 100644
index 0000000..7ce8517
--- /dev/null
+++ b/src/modules/emitter/driver.scm
@@ -0,0 +1,6 @@
+(define-module (emitter driver)
+ #:export (assembly->string))
+
+
+(define (assembly->string n)
+ (eval n (resolve-module '(emitter traverse))))
diff --git a/src/modules/emitter/traverse.scm b/src/modules/emitter/traverse.scm
new file mode 100644
index 0000000..6c0c19d
--- /dev/null
+++ b/src/modules/emitter/traverse.scm
@@ -0,0 +1,50 @@
+(define-module (emitter traverse)
+ #:export (prog
+ subrout
+ instr
+ allocate
+ mov
+ ret
+ neg
+ not
+ allocate
+ reg
+ stack
+ imm))
+
+
+(define (prog srout)
+ (string-append/shared srout ".section .note.GNU-stack,\"\",@progbits\n"))
+
+(define (srout label instrs)
+ (format #f " .globl ~a
+~a:
+\tpushq\t%rbp
+\tmovq\t%rsp, %rbp
+~a" label label (apply string-append/shared instrs)))
+
+(define (mov src dst)
+ (format #f "\tmovl\t~a, ~a\n" src dst))
+
+(define (ret)
+ "\tmovq\t%rbp, %rsp
+\tpopq\t%rbp
+\tret\n")
+
+(define (neg dst)
+ (format #f "\tnegl\t~a\n" dst))
+
+(define (not dst)
+ (format #f "\tnotl\t~a\n" dst))
+
+(define (alloc size)
+ (format #f "\tsubq\t$~a, %rsp\n" size))
+
+(define (reg r)
+ (format #f "%~a" r))
+
+(define (stack loc)
+ (format #f "~a(%rbp)" loc))
+
+(define (imm int)
+ (format #f "$~a" int))