Przeglądaj źródła

Add one to things?!

Lucas Stadler 8 lat temu
rodzic
commit
5575406c98
1 zmienionych plików z 35 dodań i 13 usunięć
  1. 35 13
      scm/inc/compiler.scm

+ 35 - 13
scm/inc/compiler.scm

@ -7,22 +7,44 @@
7 7
(define char-shift 8)
8 8
(define boolean-shift 7)
9 9
10
(define (compile-program x)
11
  (define (immediate-rep x)
12
    (cond
13
      ((integer? x) (bitwise-arithmetic-shift x fixnum-shift))
14
      ((char? x) (bitwise-xor (bitwise-arithmetic-shift (char->integer x) char-shift) #b00001111))
15
      ((boolean? x) (bitwise-xor (bitwise-arithmetic-shift (cond
16
                                                             ((boolean=? x #t) 1)
17
                                                             ((boolean=? x #f) 0))
18
                                                           boolean-shift)
19
                                 #b0011111))
20
      ((eq? x '()) #b00101111)))
10
(define (immediate-rep x)
11
  (cond
12
    ((integer? x) (bitwise-arithmetic-shift x fixnum-shift))
13
    ((char? x) (bitwise-xor (bitwise-arithmetic-shift (char->integer x) char-shift) #b00001111))
14
    ((boolean? x) (bitwise-xor (bitwise-arithmetic-shift (cond
15
                                                           ((boolean=? x #t) 1)
16
                                                           ((boolean=? x #f) 0))
17
                                                         boolean-shift)
18
                               #b0011111))
19
    ((eq? x '()) #b00101111)))
20
21
(define (immediate? x)
22
  (or (integer? x) (char? x) (boolean? x) (eq? x '())))
23
24
(define (primcall? x)
25
  (list? x))
26
27
(define (primcall-op x)
28
  (car x))
21 29
30
(define (primcall-operand1 x)
31
  (cadr x))
32
33
(define (emit-expr x)
34
  (cond
35
    ((immediate? x)
36
     (emit "movl $~a, %eax" (immediate-rep x)))
37
    ((primcall? x)
38
     (case (primcall-op x)
39
       ((add1)
40
        (emit-expr (primcall-operand1 x))
41
        (emit "addl $~a, %eax" (immediate-rep 1)))))))
42
43
(define (compile-program x)
22 44
  (display ".globl scheme_entry\n\n")
23 45
  (display "scheme_entry:\n")
24 46
25
  (emit "movl $~a, %eax" (immediate-rep x))
47
  (emit-expr x)
26 48
  (emit "ret"))
27 49
28
(compile-program '())
50
(compile-program '(add1 41))