(int x) is no longer emitted by the cogen.

assembler handles (int x) and fixnums similarly.
This commit is contained in:
Abdulaziz Ghuloum 2007-01-09 09:24:07 +03:00
parent 63575db860
commit ffc5ef557c
4 changed files with 63 additions and 80 deletions

Binary file not shown.

View File

@ -323,7 +323,7 @@
(f (make-seq a (E (car d))) (cdr d))]))] (f (make-seq a (E (car d))) (cdr d))]))]
[(letrec) [(letrec)
(let ([bind* (cadr x)] [body (caddr x)]) (let ([bind* (cadr x)] [body (caddr x)])
(let ([lhs* (map car bind*)] (let ([lhs* (map (lambda (x) (car x)) bind*)]
[rhs* (map cadr bind*)]) [rhs* (map cadr bind*)])
(let ([nlhs* (gen-fml* lhs*)]) (let ([nlhs* (gen-fml* lhs*)])
(let ([expr (make-recbind nlhs* (map E rhs*) (E body ))]) (let ([expr (make-recbind nlhs* (map E rhs*) (E body ))])
@ -444,7 +444,6 @@
[base-idx: ,base-idx] [base-idx: ,base-idx]
[arg-count: ,arg-count] [arg-count: ,arg-count]
[live-mask: ,live-mask])] [live-mask: ,live-mask])]
[(tailcall-cp convention label arg-count) [(tailcall-cp convention label arg-count)
`(tailcall-cp ,convention ,label ,arg-count)] `(tailcall-cp ,convention ,label ,arg-count)]
[(foreign-label x) `(foreign-label ,x)] [(foreign-label x) `(foreign-label ,x)]
@ -452,6 +451,7 @@
[else (error 'unparse "invalid record ~s" x)])) [else (error 'unparse "invalid record ~s" x)]))
(E x)) (E x))
(define (optimize-direct-calls x) (define (optimize-direct-calls x)
(define who 'optimize-direct-calls) (define who 'optimize-direct-calls)
(define (make-conses ls) (define (make-conses ls)
@ -3093,7 +3093,11 @@
[(fixnum? off) (list 'disp (int off) val)] [(fixnum? off) (list 'disp (int off) val)]
[(register? off) (list 'disp off val)] [(register? off) (list 'disp off val)]
[else (error 'mem "invalid disp ~s" off)])) [else (error 'mem "invalid disp ~s" off)]))
(define (int x) (list 'int x)) (define (int x)
(cond
[(fixnum? x) x]
[else (error 'int "not a fixnum ~s" x)]))
(define (obj x) (list 'obj x)) (define (obj x) (list 'obj x))
(define (byte x) (list 'byte x)) (define (byte x) (list 'byte x))
(define (byte-vector x) (list 'byte-vector x)) (define (byte-vector x) (list 'byte-vector x))
@ -3108,6 +3112,7 @@
(define (xorl src targ) (list 'xorl src targ)) (define (xorl src targ) (list 'xorl src targ))
(define (andl src targ) (list 'andl src targ)) (define (andl src targ) (list 'andl src targ))
(define (movl src targ) (list 'movl src targ)) (define (movl src targ) (list 'movl src targ))
(define (leal src targ) (list 'leal src targ))
(define (movb src targ) (list 'movb src targ)) (define (movb src targ) (list 'movb src targ))
(define (addl src targ) (list 'addl src targ)) (define (addl src targ) (list 'addl src targ))
(define (imull src targ) (list 'imull src targ)) (define (imull src targ) (list 'imull src targ))
@ -3178,6 +3183,16 @@
(mem (fx- disp-symbol-system-value symbol-tag) (mem (fx- disp-symbol-system-value symbol-tag)
(obj op))) (obj op)))
(define-syntax car
(syntax-rules ()
[(_ x)
(let ([t x])
(if (pair? t)
(#%car t)
(error '(car x) "~s is not a pair" t)))]))
(define (generate-code x) (define (generate-code x)
(define who 'generate-code) (define who 'generate-code)
(define (rp-label x L_multi) (define (rp-label x L_multi)
@ -3871,9 +3886,8 @@
(list* (movl (Simple (car arg*)) eax) (list* (movl (Simple (car arg*)) eax)
(movl (Simple (cadr arg*)) ebx) (movl (Simple (cadr arg*)) ebx)
(movl eax (mem disp-car apr)) (movl eax (mem disp-car apr))
(movl apr eax)
(movl ebx (mem disp-cdr apr)) (movl ebx (mem disp-cdr apr))
(addl (int pair-tag) eax) (leal (mem pair-tag apr) eax)
(addl (int (align pair-size)) apr) (addl (int (align pair-size)) apr)
ac)] ac)]
[(list) [(list)
@ -4479,60 +4493,6 @@
(NonTail body ac)] (NonTail body ac)]
[(call-cp) [(call-cp)
(handle-call-cp x ac NonTail)] (handle-call-cp x ac NonTail)]
#;[(call-cp call-convention direct-label save-cp? rp-convention offset size mask)
(let ([L_CALL (unique-label)])
(case call-convention
[(normal)
(list* (addl (int (frame-adjustment offset)) fpr)
(movl (int (argc-convention size)) eax)
(jmp L_CALL)
; NEW FRAME
`(byte-vector ,mask)
`(int ,(fx* offset wordsize))
`(current-frame-offset)
(rp-label rp-convention)
`(byte 0) ; padding for indirect calls only
`(byte 0) ; direct calls are ok
L_CALL
(indirect-cpr-call)
(if save-cp? (movl (mem 0 fpr) cpr) '(nop))
(subl (int (frame-adjustment offset)) fpr)
ac)]
[(direct)
(list* (addl (int (frame-adjustment offset)) fpr)
;(movl (int (argc-convention size)) eax)
(jmp L_CALL)
; NEW FRAME
`(byte-vector ,mask)
`(int ,(fx* offset wordsize))
`(current-frame-offset)
(rp-label rp-convention)
;;; no padding for direct calls
L_CALL
(call (label direct-label))
(if save-cp? (movl (mem 0 fpr) cpr) '(nop))
(subl (int (frame-adjustment offset)) fpr)
ac)]
[(foreign)
(list* (addl (int (frame-adjustment offset)) fpr)
(movl (int (argc-convention size)) eax)
(movl '(foreign-label "ik_foreign_call") ebx)
(jmp L_CALL)
; NEW FRAME
(byte-vector mask)
`(int ,(fx* offset wordsize))
`(current-frame-offset)
(rp-label rp-convention) ; should be 0, since C has 1 rv
'(byte 0)
'(byte 0)
'(byte 0)
L_CALL
(call ebx)
(if save-cp? (movl (mem 0 fpr) cpr) '(nop))
(subl (int (frame-adjustment offset)) fpr)
ac)]
[else
(error who "invalid convention ~s for call-cp" call-convention)]))]
[else (error 'NonTail "invalid expression ~s" x)])) [else (error 'NonTail "invalid expression ~s" x)]))
(define (Pred x Lt Lf ac) (define (Pred x Lt Lf ac)
(record-case x (record-case x
@ -4791,9 +4751,9 @@
(movl (primref-loc 'do-vararg-overflow) cpr) ; load handler (movl (primref-loc 'do-vararg-overflow) cpr) ; load handler
(jmp L_CALL) ; go to overflow handler (jmp L_CALL) ; go to overflow handler
; NEW FRAME ; NEW FRAME
(int 0) ; if the framesize=0, then the framesize is dynamic '(int 0) ; if the framesize=0, then the framesize is dynamic
'(current-frame-offset) '(current-frame-offset)
(int 0) ; multiarg rp '(int 0) ; multiarg rp
(byte 0) (byte 0)
(byte 0) (byte 0)
L_CALL L_CALL
@ -4985,7 +4945,7 @@
(jmp (label L_cwv_call)) (jmp (label L_cwv_call))
; MV NEW FRAME ; MV NEW FRAME
(byte-vector '#(#b110)) (byte-vector '#(#b110))
(int (fx* wordsize 3)) `(int ,(fx* wordsize 3))
'(current-frame-offset) '(current-frame-offset)
(label-address L_cwv_multi_rp) (label-address L_cwv_multi_rp)
(byte 0) (byte 0)

View File

@ -38,6 +38,13 @@
(let () (let ()
(define-syntax car
(syntax-rules ()
[(_ x)
(let ([t x])
(if (pair? t)
(#%car t)
(error '(car x) "~s is not a pair" t)))]))
(define fold (define fold
(lambda (f init ls) (lambda (f init ls)
@ -153,13 +160,14 @@
(define mem? (define mem?
(lambda (x) (lambda (x)
(and (list? x) (and (pair? x)
(fx= (length x) 3) ;(fx= (length x) 3)
(eq? (car x) 'disp) (eq? (car x) 'disp)
(or (imm? (cadr x)) ;(or (imm? (cadr x))
(reg? (cadr x))) ; (reg? (cadr x)))
(or (imm? (caddr x)) ;(or (imm? (caddr x))
(reg? (caddr x)))))) ; (reg? (caddr x)))
)))
(define small-disp? (define small-disp?
(lambda (x) (lambda (x)
@ -186,11 +194,17 @@
(cons (byte #x24) ac) (cons (byte #x24) ac)
ac)))) ac))))
(define (int-val x)
(cond
[(fixnum? x) x]
[(and (pair? x) (eq? (car x) 'int)) (cadr x)]
[else (error 'int-val "not a fixnum ~s" x)]))
(define IMM32 (define IMM32
(lambda (n ac) (lambda (n ac)
(cond (cond
[(int? n) [(int? n)
(let ([n (cadr n)]) (let ([n (int-val n)])
(list* (byte n) (list* (byte n)
(byte (fxsra n 8)) (byte (fxsra n 8))
(byte (fxsra n 16)) (byte (fxsra n 16))
@ -215,7 +229,7 @@
(lambda (n ac) (lambda (n ac)
(cond (cond
[(int? n) [(int? n)
(let ([n (cadr n)]) (let ([n (int-val n)])
(list* (byte n) ac))] (list* (byte n) ac))]
[else (error 'IMM8 "invalid ~s" n)]))) [else (error 'IMM8 "invalid ~s" n)])))
@ -235,7 +249,7 @@
(define imm8? (define imm8?
(lambda (x) (lambda (x)
(and (int? x) (byte? (cadr x))))) (and (int? x) (byte? (int-val x)))))
(define label? (define label?
(lambda (x) (lambda (x)
@ -265,7 +279,9 @@
(define int? (define int?
(lambda (x) (lambda (x)
(and (pair? x) (eq? (car x) 'int)))) (or
(fixnum? x)
(and (pair? x) (eq? (car x) 'int)))))
(define obj? (define obj?
(lambda (x) (lambda (x)
@ -319,7 +335,7 @@
(lambda (i1 i2 ac) (lambda (i1 i2 ac)
(cond (cond
[(and (int? i1) (obj? i2)) [(and (int? i1) (obj? i2))
(let ([d (cadr i1)] [v (cadr i2)]) (let ([d (int-val i1)] [v (cadr i2)])
(cons (reloc-word+ v d) ac))] (cons (reloc-word+ v d) ac))]
[else (error 'assemble "IMM32*2 ~s ~s" i1 i2)]))) [else (error 'assemble "IMM32*2 ~s ~s" i1 i2)])))
@ -554,6 +570,11 @@
[(and (mem? src) (reg? dst)) [(and (mem? src) (reg? dst))
(CODErd #x33 dst src ac)] (CODErd #x33 dst src ac)]
[else (error who "invalid ~s" instr)])] [else (error who "invalid ~s" instr)])]
[(leal src dst)
(cond
[(and (mem? src) (reg? dst))
(CODErd #x8D dst src ac)]
[else (error who "invalid ~s" instr)])]
[(cmpl src dst) [(cmpl src dst)
(cond (cond
[(and (imm8? src) (reg? dst)) [(and (imm8? src) (reg? dst))
@ -690,6 +711,7 @@
[(current-frame-offset) [(current-frame-offset)
(cons '(current-frame-offset) ac)] (cons '(current-frame-offset) ac)]
[(nop) ac] [(nop) ac]
)) ))
@ -886,7 +908,7 @@
(define list*->code* (define list*->code*
(lambda (thunk?-label ls*) (lambda (thunk?-label ls*)
(let ([closure-size* (map car ls*)] (let ([closure-size* (map (lambda (x) (car x)) ls*)]
[ls* (map cdr ls*)]) [ls* (map cdr ls*)])
(let* ([ls* (map convert-instructions ls*)] (let* ([ls* (map convert-instructions ls*)]
[ls* (map optimize-local-jumps ls*)]) [ls* (map optimize-local-jumps ls*)])

View File

@ -259,13 +259,14 @@
(let () #;(let ()
(define (compile-all who) (define (compile-all who)
(for-each (for-each
(lambda (x) (lambda (x)
(when (eq? who (caddr x)) (when (eq? who (caddr x))
(compile-library (car x) (cadr x)))) (compile-library (car x) (cadr x))))
scheme-library-files)) scheme-library-files))
(define (time x) x)
(fork (fork
(lambda (pid) (lambda (pid)
(time (compile-all 'p1)) (time (compile-all 'p1))
@ -275,11 +276,11 @@
(time (compile-all 'p0)) (time (compile-all 'p0))
(exit)))) (exit))))
;;; (for-each (for-each
;;; (lambda (x) (lambda (x)
;;; (when (cadr x) (when (cadr x)
;;; (compile-library (car x) (cadr x)))) (compile-library (car x) (cadr x))))
;;; scheme-library-files) scheme-library-files)
(define (join s ls) (define (join s ls)
(cond (cond