summaryrefslogtreecommitdiff
path: root/compiler.scm
diff options
context:
space:
mode:
Diffstat (limited to 'compiler.scm')
-rw-r--r--compiler.scm19
1 files changed, 18 insertions, 1 deletions
diff --git a/compiler.scm b/compiler.scm
index 1285ac6..919be4c 100644
--- a/compiler.scm
+++ b/compiler.scm
@@ -5,6 +5,23 @@
(newline))
(define (compile-program x)
+ (define fixnum-shift 2)
+ (define fixnum-tag 0)
+ (define char-shift 8)
+ (define char-tag 15)
+ (define boolean-shift 7)
+ (define boolean-tag 31)
+ (define empty-list 47) ;; #b00101111
+ (define (immediate-rep x)
+ (cond
+ ((integer? x)
+ (ash x fixnum-shift))
+ ((char? x)
+ (logior (ash (char->integer x) char-shift) char-tag))
+ ((boolean? x)
+ (logior (ash (if x 1 0) boolean-shift) boolean-tag))
+ ((null? x)
+ empty-list)))
(with-output-to-file "scheme_entry.S"
(lambda ()
(display ".text
@@ -13,5 +30,5 @@
.type scheme_entry, @function
scheme_entry:
")
- (emit "movl $~a, %eax" x)
+ (emit "movl $~a, %eax" (immediate-rep x))
(emit "ret"))))