Add notes on ownership
[scheme.git] / codegen.scm
index 517cc110e545d9fe3490b0eeaf5c5d35b2c3d375..52c494bb233fb728ff907fa5fed63db57fb05478 100644 (file)
@@ -1,7 +1,8 @@
 (load "typecheck.scm")
 (load "ast.scm")
+(load "platform.scm")
 
-(define target 'darwin)
+(define target host-os)
 
 (define (emit . s)
   (begin
@@ -45,9 +46,9 @@
   (codegen-expr a si env)
   (emit "movq %rax, ~a(%rbp)" si)
   (codegen-expr b (- si wordsize) env)
-  (emit "subq ~a(%rbp), %rax" si)
-  (emit "not %rax")
-  (emit "andq $1, %rax"))
+  (emit "## ~a = ~b" a b)
+  (emit "cmpq ~a(%rbp), %rax" si)
+  (emit "sete %al"))
 
                                        ; 'write file handle addr-string num-bytes
 
   (emit "not %rcx")      ; -%rcx = strlen + 1
   (emit "dec %rcx")
   
-  (case target
-    ('darwin
   (emit "movq %rbx, %rsi") ; string addr
   (emit "movq %rcx, %rdx") ; num bytes
   (emit "movq $1, %rdi")   ; file handle (stdout)
-     (emit "movq $0x2000004, %rax")) ; syscall 4 (write)
-    ('linux
-     (emit "mov %rbx, %rsi")  ; string addr
-     (emit "mov %rcx, %rdx")  ; num bytes
-     (emit "mov $1, %rax")    ; file handle (stdout)
-     (emit "mov $1, %rdi"))) ; syscall 1 (write)
+  (case target
+    ('darwin (emit "mov $0x2000004, %rax")) ; syscall 4 (write)
+    ('linux  (emit "mov $1, %rax"))) ; syscall 1 (write)
   (emit "syscall"))
 
 (define (range s n)
     (emit "pop %rbp") ; restore caller's base pointer
     (emit "ret")))
 
-(define (codegen-string label)
-  (case target
-    ('darwin (emit "movq ~a@GOTPCREL(%rip), %rax" label))
-    ('linux  (emit "lea $~a, %rax" label))))
-
 (define cur-label 0)
 (define (fresh-label)
   (set! cur-label (+ 1 cur-label))
     (emit "~a:" exit-label)))
 
 (define (codegen-expr e si env)
+  (emit "# ~a" e)
   (case (ast-type e)
     ('closure (codegen-closure (cadr e) (caddr e) si env))
     ('app
     ('bool-literal (emit "movq $~a, %rax" (if e 1 0)))
     ('int-literal (emit "movq $~a, %rax" e))
     
-    ('static-string (codegen-string (cadr e)))
+    ('static-string (emit "movq ~a@GOTPCREL(%rip), %rax"
+                         (cadr e)))
 
     (else (error #f "don't know how to codegen this"))))
 
 
-(define (fold-map f x) (fold-left append '() (map f x)))
 
 (define (free-vars prog)
   (define bound '())
       ('+ "_add")
       ('- "_sub")
       ('* "_mul")
+      ('! "_not")
+      ('= "_eq")
       ('bool->int "_bool2int")
-      (else (error #f "fill this out"))))
+      ('print "_print")
+      (else (error #f "don't know this builtin"))))
   (define (builtin-args e)
     (case e
       ('+ '(x y))
       ('- '(x y))
       ('* '(x y))
+      ('! '(x))
+      ('= '(x y))
       ('bool->int '(x))
-      (else (error #f "fill this out"))))
+      ('print '(x))
+      (else (error #f "don't know this builtin"))))
 
   (define (add-builtin-lambda e)
     (let* [(label (builtin-name e))
     (emit "movq %rax, (%rsi)")))
 
 (define (codegen program)
+  (set! cur-label 0)
+  (set! cur-lambda 0)
   (let* ((extract-res-0 (extract-strings program))
         (strings (car extract-res-0))
         (extract-res-1 (extract-lambdas (cdr extract-res-0)))