aboutsummaryrefslogtreecommitdiffstats
path: root/lib/csc/ir2.csc
diff options
context:
space:
mode:
Diffstat (limited to 'lib/csc/ir2.csc')
-rw-r--r--lib/csc/ir2.csc217
1 files changed, 217 insertions, 0 deletions
diff --git a/lib/csc/ir2.csc b/lib/csc/ir2.csc
new file mode 100644
index 0000000..888437f
--- /dev/null
+++ b/lib/csc/ir2.csc
@@ -0,0 +1,217 @@
+(define-library (csc ir2)
+ (export
+ %apply
+ %branch
+ %closure
+ %fix
+ %globals
+ %label
+ %primitive
+ %tail
+ %variable
+ *globals*
+ *tail*
+ apply-arguments
+ apply-procedure
+ apply?
+ branch-atom
+ branch-false
+ branch-true
+ branch?
+ call-closure-args
+ call-closure-closure
+ call-closure?
+ closure-arguments
+ closure-body
+ closure-name
+ closure-rest
+ closure?
+ fix-body
+ fix-functions
+ fix?
+ globals?
+ label-gensym
+ label?
+ make-apply
+ make-branch
+ make-call-closure
+ make-closure
+ make-fix
+ make-label
+ make-primitive
+ make-variable
+ primitive-arguments
+ primitive-continuation
+ primitive-operation
+ primitive-results
+ primitive?
+ tail?
+ variable-gensym
+ variable?
+
+ ; Re-exports from IR1.
+ %constant
+ %library-ref
+ constant-expression
+ constant?
+ lexical-ref-gensym
+ lexical-ref-name
+ lexical-ref?
+ lexical-set-expression
+ lexical-set-ref
+ lexical-set?
+ library-ref-library
+ library-ref-name
+ library-ref?
+ make-constant
+ make-lexical-ref
+ make-lexical-set
+ make-library-ref)
+ (import (scheme base)
+ (only (csc ir1)
+ %constant
+ %library-ref
+ constant-expression
+ constant?
+ lexical-ref-gensym
+ lexical-ref-name
+ lexical-ref?
+ lexical-set-expression
+ lexical-set-ref
+ lexical-set?
+ library-ref-library
+ library-ref-name
+ library-ref?
+ make-constant
+ make-lexical-ref
+ make-lexical-set
+ make-library-ref)
+ (only (csc list) all)
+ (only (csc loop)
+ loop
+ return)
+ (only (csc match)
+ define-match-record-type
+ match))
+ (begin
+ ; This library defines the intermediate representation IR2.
+ ; It's CPS time bitch.
+
+ ; CPS atom:
+ ; An atom is a value that can be computed immediately without
+ ; any subexpressions.
+ ; Atoms consist of
+ ; - constant,
+ ; - lexical-ref,
+ ; - library-ref,
+ ; - or globals.
+ ; After closure conversion, there are no more lexical refs.
+ ; Each lexical ref will be converted to a <variable>.
+
+
+ ; A function argument or local variable.
+ (define-match-record-type <variable>
+ (make-variable gensym)
+ variable?
+ %variable
+ (gensym variable-gensym))
+
+
+ ; The globals array. This will eventually be stored in register 0.
+ (define-match-record-type <globals>
+ (make-globals)
+ globals?
+ %globals)
+
+
+ ; A global instance of <globals>.
+ ; Considered equal to calling (make-globals).
+ (define *globals* (make-globals))
+
+
+ ; A label, used for function names and will compile to a constant.
+ (define-match-record-type <label>
+ (make-label gensym)
+ label?
+ %label
+ (gensym label-gensym))
+
+
+ ; CPS expressions:
+ ; CPS expressions are similar to IR1 expressions,
+ ; but constrained not to have any subexpressions except atoms.
+ ; And they take a continuation.
+
+
+ ; A primitive encodes one of a number of primitive operations.
+ ; Each operation takes a number of arguments,
+ ; and binds some number of result variables.
+ ; The known primitives are listed below, along with their arity.
+ ; - alloc: size -> result
+ ; - peek: pointer * offset -> result
+ ; - poke: word * pointer * offset -> ()
+ ; - exit: code -> ()
+ (define-match-record-type <primitive>
+ (make-primitive operation arguments results continuation)
+ primitive?
+ %primitive
+ (operation primitive-operation)
+ (arguments primitive-arguments)
+ (results primitive-results)
+ (continuation primitive-continuation))
+
+
+ ; Branches depending on the given atom.
+ ; If it is true, continue with continuation true.
+ ; If false, continue with continuation false.
+ (define-match-record-type <branch>
+ (make-branch atom true false)
+ branch?
+ %branch
+ (atom branch-atom)
+ (true branch-true)
+ (false branch-false))
+
+
+ ; Applies a procedure to a list of arguments. Apply does not take a
+ ; continuation. Instead the continuation will be passed as the first
+ ; argument to the function.
+ (define-match-record-type <apply>
+ (make-apply procedure arguments)
+ apply?
+ %apply
+ (procedure apply-procedure)
+ (arguments apply-arguments))
+
+
+ ; The tail continuation. Used for the exit point of library init functions,
+ ; and the end of a program.
+ (define-match-record-type <tail>
+ (make-tail)
+ tail?
+ %tail)
+
+
+ (define *tail* (make-tail))
+
+
+ ; A procedure. All closures are allocated in a fix expression. A closure
+ ; does not take a continuation. Instead, the procedure will accept the
+ ; continuation as an argument.
+ (define-match-record-type <closure>
+ (make-closure name arguments body)
+ closure?
+ %closure
+ (name closure-name)
+ (arguments closure-arguments)
+ (body closure-body))
+
+
+ ; Defines a list of mutually recursive procedures.
+ ; Functions is a list of closures, and body is an expression.
+ (define-match-record-type <fix>
+ (make-fix functions body)
+ fix?
+ %fix
+ (functions fix-functions)
+ (body fix-body))))