X-Git-Url: http://git.lukelau.me/?a=blobdiff_plain;f=codegen.scm;h=00e01296af20661539f8fda3d882c6fa39547092;hb=8b8c603a6106151188bdeab95501cacaf72912d4;hp=517cc110e545d9fe3490b0eeaf5c5d35b2c3d375;hpb=c3ee0f7639a02371a2d01b39ddca91506c4791c3;p=scheme.git diff --git a/codegen.scm b/codegen.scm index 517cc11..00e0129 100644 --- a/codegen.scm +++ b/codegen.scm @@ -1,7 +1,8 @@ (load "typecheck.scm") (load "ast.scm") +(load "platform.scm") -(define target 'darwin) +(define target host-os) (define (emit . s) (begin @@ -67,17 +68,12 @@ (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) @@ -253,11 +249,6 @@ (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)) @@ -304,12 +295,12 @@ ('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 '()) @@ -358,15 +349,21 @@ ('+ "_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))