; MIR Medium-Level Intermediate Representation (define-record-type x:=y ((x) (y)) ()) (define-record-discloser type/x:=y (lambda (p) `(x:=y ,(x:=y-x p) ,(x:=y-y p)))) (define-record-type x:=&y ((x) (y)) ()) (define-record-discloser type/x:=&y (lambda (p) `(x:=&y ,(x:=&y-x p) ,(x:=&y-y p)))) (define-record-type x:=*y ((x) (y)) ()) (define-record-discloser type/x:=*y (lambda (p) `(x:=*y ,(x:=*y-x p) ,(x:=*y-y p)))) (define-record-type *x:=y ((x) (y)) ()) (define-record-discloser type/*x:=y (lambda (p) `(*x:=y ,(*x:=y-x p) ,(*x:=y-y p)))) (define-record-type x:=yz ((x) (y) (op) (z)) ()) (define-record-discloser type/x:=yz (lambda (p) `(x:=yz ,(x:=yz-x p) ,(x:=yz-y p) ,(x:=yz-op p) ,(x:=yz-z p)))) (define-record-type x:=y ((x) (op) (y)) ()) (define-record-discloser type/x:=y (lambda (p) `(x:=y ,(x:=y-x p) ,(x:=y-op p) ,(x:=y-y p)))) (define-record-type x:=y ((x) (cast) (y)) ()) (define-record-discloser type/x:=y (lambda (p) `(x:=y ,(x:=y-x p) ,(x:=y-cast p) ,(x:=y-y p)))) (define-record-type binif ((x) (op) (y) (label)) ()) (define-record-discloser type/binif (lambda (p) `(binif ,(binif-x p) ,(binif-op p) ,(binif-y p) ,(binif-label p)))) (define-record-type unif ((op) (x) (label)) ()) (define-record-discloser type/unif (lambda (p) `(unif ,(unif-op p) ,(unif-x p) ,(unif-label p)))) (define-record-type valif ((x) (label)) ()) (define-record-discloser type/valif (lambda (p) `(valif ,(valif-x p) (valif-label p)))) ;(define-record-type goto :goto ; (make-goto label) ; goto? ; (label goto.label goto.label!)) ;(define-record-discloser :goto ; (lambda (p) `(goto (goto.label p)))) (define-record-type callasgn ((func) (args)) ()) (define-record-discloser type/callasgn (lambda (p) `(callasgn ,(callasgn-func p) ,(callasgn-args p)))) (define-record-type returnval ((x)) ()) (define-record-discloser type/returnval (lambda (p) `(returnval ,(returnval-x p)))) (define-record-type return () ()) (define-record-discloser type/return (lambda (p) `(return))) (define-record-type block ((symtab) (stmt)) (define-record-discloser type/block (lambda (p) `(block ,(block-symtab p) ,(block-stmt p))))