fx+ in progress

This commit is contained in:
Abdulaziz Ghuloum 2006-12-08 06:12:35 -05:00
parent 1d2a277063
commit 96c647b69d
4 changed files with 59 additions and 7 deletions

Binary file not shown.

View File

@ -1125,6 +1125,30 @@
(make-constant t))))))) (make-constant t)))))))
(make-primcall op rand*)))) (make-primcall op rand*))))
(giveup))] (giveup))]
#;[(fx+)
(or (and (fx= (length rand*) 2)
(let ([a0 (car rand*)] [a1 (cadr rand*)])
(or (constant-value a1
(lambda (v1)
(and (fixnum? v1)
(or (constant-value a0
(lambda (v0)
(and (fixnum? v0)
(let ([r (+ v0 v1)])
(and (fixnum? r)
(mk-seq (mk-seq a0 a1)
(make-constant r)))))))
(mk-seq a1
(make-primcall op
(list a0 (make-constant v1))))))))
(constant-value a0
(lambda (v0)
(and (fixnum? v0)
(mk-seq a0
(make-primcall op
(list (make-constant v0) a1))))))
(make-primcall op rand*))))
(giveup))]
;X; [(fx- fx+ fx*) ;X; [(fx- fx+ fx*)
;X; (or (and (fx= (length rand*) 2) ;X; (or (and (fx= (length rand*) 2)
;X; (let ([a0 (car rand*)] [a1 (cadr rand*)]) ;X; (let ([a0 (car rand*)] [a1 (cadr rand*)])
@ -2082,6 +2106,20 @@
char? symbol? eof-object? char? symbol? eof-object?
)) ;;; SIMPLIFY )) ;;; SIMPLIFY
(make-primcall op (map Expr arg*))] (make-primcall op (map Expr arg*))]
[(memq op '(fx+))
(cond
[(simple? (cadr arg*))
(make-primcall op
(list (Expr (car arg*)) (cadr arg*)))]
[(simple? (car arg*))
(make-primcall op
(list (car arg*) (Expr (cadr arg*))))]
[else
(simplify* (cdr arg*) '() '()
(lambda (a* lhs* rhs*)
(make-bind^ lhs* rhs*
(make-primcall op
(cons (Expr (car arg*)) a*)))))])]
[else [else
(simplify* arg* '() '() (simplify* arg* '() '()
(lambda (arg* lhs* rhs*) (lambda (arg* lhs* rhs*)
@ -2657,7 +2695,14 @@
(if (eq? call-conv 'foreign) (if (eq? call-conv 'foreign)
(values x f) (values x f)
(values x 0))] (values x 0))]
[(primcall op arg*) (do-primcall op arg* f)] [(primcall op arg*)
(let loop ([arg* arg*] [ls '()] [f f])
(cond
[(null? arg*)
(do-primcall op (reverse ls) f)]
[else
(let-values ([(a f) (NonTail (car arg*) f)])
(loop (cdr arg*) (cons a ls) f))]))]
[(fix lhs* rhs* body) [(fix lhs* rhs* body)
(let-values ([(body f) (NonTail body f)]) (let-values ([(body f) (NonTail body f)])
(values (make-fix lhs* rhs* body) f))] (values (make-fix lhs* rhs* body) f))]
@ -4671,7 +4716,8 @@
)))) ))))
(define (compile-expr expr) (define (compile-expr expr)
(let* ([p (expand expr)] (let* ([p (parameterize ([assembler-output #f])
(expand expr))]
[p (recordize p)] [p (recordize p)]
[p (optimize-direct-calls p)] [p (optimize-direct-calls p)]
[p (optimize-letrec p)] [p (optimize-letrec p)]
@ -4689,10 +4735,11 @@
[p (optimize-ap-check p)]) [p (optimize-ap-check p)])
(let ([ls* (generate-code p)]) (let ([ls* (generate-code p)])
(when (assembler-output) (when (assembler-output)
(for-each (parameterize ([gensym-prefix "L"])
(lambda (ls) (for-each
(for-each (lambda (x) (printf " ~s\n" x)) ls)) (lambda (ls)
ls*)) (for-each (lambda (x) (printf " ~s\n" x)) ls))
ls*)))
(let ([code* (list*->code* (let ([code* (list*->code*
(lambda (x) (lambda (x)
(if (closure? x) (if (closure? x)

View File

@ -59,4 +59,9 @@
(lambda (x) (lambda (x)
(error 'cadr "invalid list structure in ~s" x))) (error 'cadr "invalid list structure in ~s" x)))
(primitive-set! 'fx+-error
(lambda (x)
(if (fixnum? x)
(error 'fx+ "overflow")
(error 'fx+ "~s is not a fixnum" x))))

View File

@ -276,4 +276,4 @@
(join " " (map caddr scheme-library-files)))) (join " " (map caddr scheme-library-files))))
(#%compiler-giveup-tally) (#%compiler-giveup-tally)
; vim:syntax=scheme