|
|
@ -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))
|