X-Git-Url: https://git.lukelau.me/?a=blobdiff_plain;f=codegen.scm;h=2d60c0aed64c22d3f1933544bf1a5df7101ce62c;hb=d0e9f5296b7510fe057be4a2f9e2a31ed856652c;hp=517cc110e545d9fe3490b0eeaf5c5d35b2c3d375;hpb=c3ee0f7639a02371a2d01b39ddca91506c4791c3;p=scheme.git diff --git a/codegen.scm b/codegen.scm index 517cc11..2d60c0a 100644 --- a/codegen.scm +++ b/codegen.scm @@ -67,17 +67,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) @@ -309,7 +304,6 @@ (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 +352,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))