From 9f65c417b7575eab5ebd2733a817a0f0e954c4d9 Mon Sep 17 00:00:00 2001 From: David Thompson Date: Wed, 10 Aug 2022 18:49:33 -0400 Subject: Step 2: Immediate Constants --- compiler.scm | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) (limited to 'compiler.scm') diff --git a/compiler.scm b/compiler.scm index 1285ac6..919be4c 100644 --- a/compiler.scm +++ b/compiler.scm @@ -5,6 +5,23 @@ (newline)) (define (compile-program x) + (define fixnum-shift 2) + (define fixnum-tag 0) + (define char-shift 8) + (define char-tag 15) + (define boolean-shift 7) + (define boolean-tag 31) + (define empty-list 47) ;; #b00101111 + (define (immediate-rep x) + (cond + ((integer? x) + (ash x fixnum-shift)) + ((char? x) + (logior (ash (char->integer x) char-shift) char-tag)) + ((boolean? x) + (logior (ash (if x 1 0) boolean-shift) boolean-tag)) + ((null? x) + empty-list))) (with-output-to-file "scheme_entry.S" (lambda () (display ".text @@ -13,5 +30,5 @@ .type scheme_entry, @function scheme_entry: ") - (emit "movl $~a, %eax" x) + (emit "movl $~a, %eax" (immediate-rep x)) (emit "ret")))) -- cgit v1.2.3