diff --git a/module/language/glil/compile-assembly.scm b/module/language/glil/compile-assembly.scm index 73b2cd132..4c92e0f5a 100644 --- a/module/language/glil/compile-assembly.scm +++ b/module/language/glil/compile-assembly.scm @@ -312,7 +312,12 @@ (error "Unknown instruction:" inst)) (let ((pops (instruction-pops inst))) (cond ((< pops 0) - (emit-code `((,inst ,nargs)))) + (case (instruction-length inst) + ((1) (emit-code `((,inst ,nargs)))) + ((2) (emit-code `((,inst ,(quotient nargs 256) + ,(modulo nargs 256))))) + (else (error "Unknown length for variable-arg instruction:" + inst (instruction-length inst))))) ((= pops nargs) (emit-code `((,inst)))) (else diff --git a/module/language/tree-il/compile-glil.scm b/module/language/tree-il/compile-glil.scm index 78e2d1e94..17592d275 100644 --- a/module/language/tree-il/compile-glil.scm +++ b/module/language/tree-il/compile-glil.scm @@ -79,7 +79,9 @@ ((set-car! . 2) . set-car!) ((set-cdr! . 2) . set-cdr!) ((null? . 1) . null?) - ((list? . 1) . list?))) + ((list? . 1) . list?) + (list . list) + (vector . vector))) (define (make-label) (gensym ":L")) @@ -254,8 +256,9 @@ (emit-code src (make-glil-call 'drop 1))))) ((and (primitive-ref? proc) - (hash-ref *primcall-ops* - (cons (primitive-ref-name proc) (length args)))) + (or (hash-ref *primcall-ops* + (cons (primitive-ref-name proc) (length args))) + (hash-ref *primcall-ops* (primitive-ref-name proc)))) => (lambda (op) (for-each comp-push args) (emit-code src (make-glil-call op (length args))) diff --git a/module/language/tree-il/optimize.scm b/module/language/tree-il/optimize.scm index 03193b256..57755ea5e 100644 --- a/module/language/tree-il/optimize.scm +++ b/module/language/tree-il/optimize.scm @@ -53,6 +53,8 @@ not pair? null? list? acons cons cons* + list vector + car cdr set-car! set-cdr!