Ikarus can compile immediates in 64-bit mode.
It feels like I'm going through my compilers tutorial all over again!
This commit is contained in:
		
							parent
							
								
									341e53a36d
								
							
						
					
					
						commit
						3b8eb4bbd4
					
				|  | @ -1909,7 +1909,8 @@ | ||||||
|       [(4) 2] |       [(4) 2] | ||||||
|       [(8) 3] |       [(8) 3] | ||||||
|       [else  |       [else  | ||||||
|        (error 'ikarus "wordsize is neither 4 nor 8" wordsize)]))  |        (error 'ikarus "wordsize is neither 4 nor 8" wordsize)])) | ||||||
|  |   (define fx-scale wordsize) | ||||||
|   (define object-alignment (* 2 wordsize)) |   (define object-alignment (* 2 wordsize)) | ||||||
|   (define align-shift (+ wordshift 1)) |   (define align-shift (+ wordshift 1)) | ||||||
|   (define fx-shift  wordshift) |   (define fx-shift  wordshift) | ||||||
|  | @ -2085,6 +2086,13 @@ | ||||||
| (define pcb-collect-key            (* 12 wordsize)) | (define pcb-collect-key            (* 12 wordsize)) | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | (define (fx? x) | ||||||
|  |   (let* ([intbits (* wordsize 8)] | ||||||
|  |          [fxbits (- intbits fx-shift)]) | ||||||
|  |     (and (or (fixnum? x) (bignum? x)) | ||||||
|  |          (<= (- (expt 2 (- fxbits 1))) | ||||||
|  |              x | ||||||
|  |              (- (expt 2 (- fxbits 1)) 1))))) | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| (module () | (module () | ||||||
|  |  | ||||||
|  | @ -1 +1 @@ | ||||||
| 1316 | 1317 | ||||||
|  |  | ||||||
|  | @ -131,7 +131,7 @@ | ||||||
| (define-primop immediate? safe | (define-primop immediate? safe | ||||||
|   [(P x) |   [(P x) | ||||||
|    (make-conditional |    (make-conditional | ||||||
|      (tag-test (T x) fixnum-mask fixnum-tag) |      (tag-test (T x) fx-mask fx-tag) | ||||||
|      (make-constant #t) |      (make-constant #t) | ||||||
|      (tag-test (T x) 7 7))] |      (tag-test (T x) 7 7))] | ||||||
|   [(E x) (nop)]) |   [(E x) (nop)]) | ||||||
|  | @ -151,7 +151,7 @@ | ||||||
| (define-primop pointer-value unsafe | (define-primop pointer-value unsafe | ||||||
|   [(V x) (prm 'logand  |   [(V x) (prm 'logand  | ||||||
|            (prm 'srl (T x) (K 1)) |            (prm 'srl (T x) (K 1)) | ||||||
|            (K (* -1 fixnum-scale)))] |            (K (* -1 fx-scale)))] | ||||||
|   [(P x) (K #t)] |   [(P x) (K #t)] | ||||||
|   [(E x) (nop)]) |   [(E x) (nop)]) | ||||||
| 
 | 
 | ||||||
|  | @ -336,7 +336,7 @@ | ||||||
|     /section) |     /section) | ||||||
| 
 | 
 | ||||||
| (define-primop vector? unsafe | (define-primop vector? unsafe | ||||||
|   [(P x) (sec-tag-test (T x) vector-mask vector-tag fixnum-mask fixnum-tag)] |   [(P x) (sec-tag-test (T x) vector-mask vector-tag fx-mask fx-tag)] | ||||||
|   [(E x) (nop)]) |   [(E x) (nop)]) | ||||||
| 
 | 
 | ||||||
| (define-primop $make-vector unsafe | (define-primop $make-vector unsafe | ||||||
|  | @ -349,7 +349,7 @@ | ||||||
|                         (K vector-tag))]) |                         (K vector-tag))]) | ||||||
|           (prm 'mset v  |           (prm 'mset v  | ||||||
|                (K (- disp-vector-length vector-tag)) |                (K (- disp-vector-length vector-tag)) | ||||||
|                (K (make-constant (* i fixnum-scale)))) |                (K (make-constant (* i fx-scale)))) | ||||||
|           v)] |           v)] | ||||||
|      [else |      [else | ||||||
|       (with-tmp ([alen (align-code (T len) disp-vector-data)]) |       (with-tmp ([alen (align-code (T len) disp-vector-data)]) | ||||||
|  | @ -566,7 +566,7 @@ | ||||||
| (section ;;; fixnums | (section ;;; fixnums | ||||||
| 
 | 
 | ||||||
| (define-primop fixnum? safe | (define-primop fixnum? safe | ||||||
|   [(P x) (tag-test (T x) fixnum-mask fixnum-tag)] |   [(P x) (tag-test (T x) fx-mask fx-tag)] | ||||||
|   [(E x) (nop)]) |   [(E x) (nop)]) | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | @ -641,7 +641,7 @@ | ||||||
|         (unless (fixnum? b) (interrupt)) |         (unless (fixnum? b) (interrupt)) | ||||||
|         (prm 'int* (T a) (K b))] |         (prm 'int* (T a) (K b))] | ||||||
|        [else |        [else | ||||||
|         (prm 'int* (T a) (prm 'sra (T b) (K fixnum-shift)))])])] |         (prm 'int* (T a) (prm 'sra (T b) (K fx-shift)))])])] | ||||||
|   [(P x y) (K #t)] |   [(P x y) (K #t)] | ||||||
|   [(E x y) (nop)]) |   [(E x y) (nop)]) | ||||||
| 
 | 
 | ||||||
|  | @ -677,7 +677,7 @@ | ||||||
|       (unless (fixnum? i) (interrupt)) |       (unless (fixnum? i) (interrupt)) | ||||||
|       (prm 'sll (T x) (K i))] |       (prm 'sll (T x) (K i))] | ||||||
|      [else  |      [else  | ||||||
|       (prm 'sll (T x) (prm 'sra (T i) (K fixnum-shift)))])] |       (prm 'sll (T x) (prm 'sra (T i) (K fx-shift)))])] | ||||||
|   [(P x i) (K #t)] |   [(P x i) (K #t)] | ||||||
|   [(E x i) (nop)]) |   [(E x i) (nop)]) | ||||||
| 
 | 
 | ||||||
|  | @ -688,23 +688,23 @@ | ||||||
|       (unless (fixnum? i) (interrupt)) |       (unless (fixnum? i) (interrupt)) | ||||||
|       (prm 'logand  |       (prm 'logand  | ||||||
|            (prm 'sra (T x) (K (if (> i 31) 31 i))) |            (prm 'sra (T x) (K (if (> i 31) 31 i))) | ||||||
|            (K (* -1 fixnum-scale)))] |            (K (* -1 fx-scale)))] | ||||||
|      [else  |      [else  | ||||||
|       (with-tmp ([i (prm 'sra (T i) (K fixnum-shift))]) |       (with-tmp ([i (prm 'sra (T i) (K fx-shift))]) | ||||||
|         (with-tmp ([i (make-conditional |         (with-tmp ([i (make-conditional | ||||||
|                         (prm '< i (K 32)) |                         (prm '< i (K 32)) | ||||||
|                         i |                         i | ||||||
|                         (K 31))]) |                         (K 31))]) | ||||||
|            (prm 'logand |            (prm 'logand | ||||||
|                 (prm 'sra (T x) i) |                 (prm 'sra (T x) i) | ||||||
|                 (K (* -1 fixnum-scale)))))])] |                 (K (* -1 fx-scale)))))])] | ||||||
|   [(P x i) (K #t)] |   [(P x i) (K #t)] | ||||||
|   [(E x i) (nop)]) |   [(E x i) (nop)]) | ||||||
| 
 | 
 | ||||||
| (define-primop $fxquotient unsafe | (define-primop $fxquotient unsafe | ||||||
|   [(V a b)  |   [(V a b)  | ||||||
|    (with-tmp ([b (T b)]) ;;; FIXME: why is quotient called remainder? |    (with-tmp ([b (T b)]) ;;; FIXME: why is quotient called remainder? | ||||||
|     (prm 'sll (prm 'remainder (T a) b) (K fixnum-shift)))] |     (prm 'sll (prm 'remainder (T a) b) (K fx-shift)))] | ||||||
|   [(P a b) (K #t)] |   [(P a b) (K #t)] | ||||||
|   [(E a b) (nop)]) |   [(E a b) (nop)]) | ||||||
| 
 | 
 | ||||||
|  | @ -783,7 +783,7 @@ | ||||||
|         (prm 'srl ;;; FIXME: bref |         (prm 'srl ;;; FIXME: bref | ||||||
|            (prm 'mref (T s) |            (prm 'mref (T s) | ||||||
|                 (prm 'int+ |                 (prm 'int+ | ||||||
|                    (prm 'sra (T i) (K fixnum-shift)) |                    (prm 'sra (T i) (K fx-shift)) | ||||||
|                    ;;; ENDIANNESS DEPENDENCY |                    ;;; ENDIANNESS DEPENDENCY | ||||||
|                    (K (- disp-bignum-data  |                    (K (- disp-bignum-data  | ||||||
|                          (- wordsize 1)  |                          (- wordsize 1)  | ||||||
|  | @ -1004,7 +1004,7 @@ | ||||||
|        (prm 'mref (T x) |        (prm 'mref (T x) | ||||||
|           (K (- (+ disp-flonum-data 4) vector-tag))) |           (K (- (+ disp-flonum-data 4) vector-tag))) | ||||||
|        (K 20)) |        (K 20)) | ||||||
|      (K fixnum-shift))]) |      (K fx-shift))]) | ||||||
| 
 | 
 | ||||||
| /section) | /section) | ||||||
| 
 | 
 | ||||||
|  | @ -1054,7 +1054,7 @@ | ||||||
|          (assert-fixnums (car a*) (cdr a*)))] |          (assert-fixnums (car a*) (cdr a*)))] | ||||||
|     [else |     [else | ||||||
|      (interrupt-unless  |      (interrupt-unless  | ||||||
|        (tag-test (or* (T a) a*) fixnum-mask fixnum-tag))])) |        (tag-test (or* (T a) a*) fx-mask fx-tag))])) | ||||||
| 
 | 
 | ||||||
| (define (fixnum-fold-p op a a*) | (define (fixnum-fold-p op a a*) | ||||||
|   (cond |   (cond | ||||||
|  | @ -1309,13 +1309,13 @@ | ||||||
| (define-primop $fixnum->char unsafe | (define-primop $fixnum->char unsafe | ||||||
|   [(V x)  |   [(V x)  | ||||||
|    (prm 'logor |    (prm 'logor | ||||||
|         (prm 'sll (T x) (K (- char-shift fixnum-shift))) |         (prm 'sll (T x) (K (- char-shift fx-shift))) | ||||||
|         (K char-tag))] |         (K char-tag))] | ||||||
|   [(P x) (K #t)] |   [(P x) (K #t)] | ||||||
|   [(E x) (nop)]) |   [(E x) (nop)]) | ||||||
| 
 | 
 | ||||||
| (define-primop $char->fixnum unsafe | (define-primop $char->fixnum unsafe | ||||||
|   [(V x) (prm 'sra (T x) (K (- char-shift fixnum-shift)))] |   [(V x) (prm 'sra (T x) (K (- char-shift fx-shift)))] | ||||||
|   [(P x) (K #t)] |   [(P x) (K #t)] | ||||||
|   [(E x) (nop)]) |   [(E x) (nop)]) | ||||||
| 
 | 
 | ||||||
|  | @ -1403,7 +1403,7 @@ | ||||||
|                       (K bytevector-tag))]) |                       (K bytevector-tag))]) | ||||||
|          (prm 'mset s |          (prm 'mset s | ||||||
|              (K (- disp-bytevector-length bytevector-tag)) |              (K (- disp-bytevector-length bytevector-tag)) | ||||||
|              (K (* n fixnum-scale))) |              (K (* n fx-scale))) | ||||||
|          (prm 'bset/c s |          (prm 'bset/c s | ||||||
|              (K (+ n (- disp-bytevector-data bytevector-tag))) |              (K (+ n (- disp-bytevector-data bytevector-tag))) | ||||||
|              (K 0)) |              (K 0)) | ||||||
|  | @ -1411,7 +1411,7 @@ | ||||||
|      [else |      [else | ||||||
|       (with-tmp ([s (prm 'alloc  |       (with-tmp ([s (prm 'alloc  | ||||||
|                       (align-code  |                       (align-code  | ||||||
|                         (prm 'sra (T n) (K fixnum-shift)) |                         (prm 'sra (T n) (K fx-shift)) | ||||||
|                         (+ disp-bytevector-data 1)) |                         (+ disp-bytevector-data 1)) | ||||||
|                       (K bytevector-tag))]) |                       (K bytevector-tag))]) | ||||||
|           (prm 'mset s |           (prm 'mset s | ||||||
|  | @ -1419,7 +1419,7 @@ | ||||||
|             (T n)) |             (T n)) | ||||||
|           (prm 'bset/c s |           (prm 'bset/c s | ||||||
|                (prm 'int+  |                (prm 'int+  | ||||||
|                     (prm 'sra (T n) (K fixnum-shift)) |                     (prm 'sra (T n) (K fx-shift)) | ||||||
|                     (K (- disp-bytevector-data bytevector-tag))) |                     (K (- disp-bytevector-data bytevector-tag))) | ||||||
|                (K 0)) |                (K 0)) | ||||||
|           s)])] |           s)])] | ||||||
|  | @ -1447,7 +1447,7 @@ | ||||||
|         (prm 'logand |         (prm 'logand | ||||||
|            (prm 'bref (T s) |            (prm 'bref (T s) | ||||||
|                 (prm 'int+ |                 (prm 'int+ | ||||||
|                    (prm 'sra (T i) (K fixnum-shift)) |                    (prm 'sra (T i) (K fx-shift)) | ||||||
|                    (K (- disp-bytevector-data bytevector-tag)))) |                    (K (- disp-bytevector-data bytevector-tag)))) | ||||||
|            (K 255)) |            (K 255)) | ||||||
|         (K fx-shift))])] |         (K fx-shift))])] | ||||||
|  | @ -1472,7 +1472,7 @@ | ||||||
|         (prm 'sll |         (prm 'sll | ||||||
|            (prm 'bref (T s) |            (prm 'bref (T s) | ||||||
|                 (prm 'int+ |                 (prm 'int+ | ||||||
|                    (prm 'sra (T i) (K fixnum-shift)) |                    (prm 'sra (T i) (K fx-shift)) | ||||||
|                    (K (- disp-bytevector-data bytevector-tag)))) |                    (K (- disp-bytevector-data bytevector-tag)))) | ||||||
|            (K (- (* wordsize 8) 8))) |            (K (- (* wordsize 8) 8))) | ||||||
|         (K (- (* wordsize 8) (+ 8 fx-shift))))])] |         (K (- (* wordsize 8) (+ 8 fx-shift))))])] | ||||||
|  | @ -1504,7 +1504,7 @@ | ||||||
|          (unless (fixnum? c) (interrupt)) |          (unless (fixnum? c) (interrupt)) | ||||||
|          (prm 'bset/c (T x)  |          (prm 'bset/c (T x)  | ||||||
|               (prm 'int+  |               (prm 'int+  | ||||||
|                    (prm 'sra (T i) (K fixnum-shift)) |                    (prm 'sra (T i) (K fx-shift)) | ||||||
|                    (K (- disp-bytevector-data bytevector-tag))) |                    (K (- disp-bytevector-data bytevector-tag))) | ||||||
|               (K (cond |               (K (cond | ||||||
|                    [(<= -128 c 127) c] |                    [(<= -128 c 127) c] | ||||||
|  | @ -1513,7 +1513,7 @@ | ||||||
|         [else |         [else | ||||||
|          (prm 'bset/h (T x) |          (prm 'bset/h (T x) | ||||||
|                (prm 'int+  |                (prm 'int+  | ||||||
|                     (prm 'sra (T i) (K fixnum-shift)) |                     (prm 'sra (T i) (K fx-shift)) | ||||||
|                     (K (- disp-bytevector-data bytevector-tag))) |                     (K (- disp-bytevector-data bytevector-tag))) | ||||||
|                (prm 'sll (T c) (K (- 8 fx-shift))))])])]) |                (prm 'sll (T c) (K (- 8 fx-shift))))])])]) | ||||||
| 
 | 
 | ||||||
|  | @ -1522,7 +1522,7 @@ | ||||||
|    (with-tmp ([x (prm 'alloc (K (align flonum-size)) (K vector-tag))]) |    (with-tmp ([x (prm 'alloc (K (align flonum-size)) (K vector-tag))]) | ||||||
|      (prm 'mset x (K (- vector-tag)) (K flonum-tag)) |      (prm 'mset x (K (- vector-tag)) (K flonum-tag)) | ||||||
|      (prm 'fl:load  |      (prm 'fl:load  | ||||||
|        (prm 'int+ (T bv) (prm 'sra (T i) (K fixnum-shift))) |        (prm 'int+ (T bv) (prm 'sra (T i) (K fx-shift))) | ||||||
|        (K (- disp-bytevector-data bytevector-tag))) |        (K (- disp-bytevector-data bytevector-tag))) | ||||||
|      (prm 'fl:store x (K (- disp-flonum-data vector-tag))) |      (prm 'fl:store x (K (- disp-flonum-data vector-tag))) | ||||||
|      x)]) |      x)]) | ||||||
|  | @ -1534,7 +1534,7 @@ | ||||||
| ;   (with-tmp ([x (prm 'alloc (K (align flonum-size)) (K vector-tag))]) | ;   (with-tmp ([x (prm 'alloc (K (align flonum-size)) (K vector-tag))]) | ||||||
| ;     (prm 'mset x (K (- vector-tag)) (K flonum-tag)) | ;     (prm 'mset x (K (- vector-tag)) (K flonum-tag)) | ||||||
| ;     (prm 'fl:load  | ;     (prm 'fl:load  | ||||||
| ;       (prm 'int+ (T bv) (prm 'sra (T i) (K fixnum-shift))) | ;       (prm 'int+ (T bv) (prm 'sra (T i) (K fx-shift))) | ||||||
| ;       (K (- disp-bytevector-data bytevector-tag))) | ;       (K (- disp-bytevector-data bytevector-tag))) | ||||||
| ;     (prm 'fl:shuffle | ;     (prm 'fl:shuffle | ||||||
| ;       (K (make-object '#vu8(7 6 2 3 4 5 1 0))) | ;       (K (make-object '#vu8(7 6 2 3 4 5 1 0))) | ||||||
|  | @ -1549,7 +1549,7 @@ | ||||||
|      (with-tmp ([x (prm 'alloc (K (align flonum-size)) (K vector-tag))]) |      (with-tmp ([x (prm 'alloc (K (align flonum-size)) (K vector-tag))]) | ||||||
|        (prm 'mset x (K (- vector-tag)) (K flonum-tag)) |        (prm 'mset x (K (- vector-tag)) (K flonum-tag)) | ||||||
|        (with-tmp ([t (prm 'int+ (T bv)  |        (with-tmp ([t (prm 'int+ (T bv)  | ||||||
|                         (prm 'sra (T i) (K fixnum-shift)))]) |                         (prm 'sra (T i) (K fx-shift)))]) | ||||||
|          (with-tmp ([x0 (prm 'mref t (K bvoff))]) |          (with-tmp ([x0 (prm 'mref t (K bvoff))]) | ||||||
|            (prm 'bswap! x0 x0) |            (prm 'bswap! x0 x0) | ||||||
|            (prm 'mset x (K (+ floff wordsize)) x0)) |            (prm 'mset x (K (+ floff wordsize)) x0)) | ||||||
|  | @ -1564,7 +1564,7 @@ | ||||||
|    (seq* |    (seq* | ||||||
|      (prm 'fl:load (T x) (K (- disp-flonum-data vector-tag))) |      (prm 'fl:load (T x) (K (- disp-flonum-data vector-tag))) | ||||||
|      (prm 'fl:store |      (prm 'fl:store | ||||||
|        (prm 'int+ (T bv) (prm 'sra (T i) (K fixnum-shift))) |        (prm 'int+ (T bv) (prm 'sra (T i) (K fx-shift))) | ||||||
|        (K (- disp-bytevector-data bytevector-tag))))]) |        (K (- disp-bytevector-data bytevector-tag))))]) | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | @ -1573,7 +1573,7 @@ | ||||||
|    (with-tmp ([x (prm 'alloc (K (align flonum-size)) (K vector-tag))]) |    (with-tmp ([x (prm 'alloc (K (align flonum-size)) (K vector-tag))]) | ||||||
|      (prm 'mset x (K (- vector-tag)) (K flonum-tag)) |      (prm 'mset x (K (- vector-tag)) (K flonum-tag)) | ||||||
|      (prm 'fl:load-single |      (prm 'fl:load-single | ||||||
|        (prm 'int+ (T bv) (prm 'sra (T i) (K fixnum-shift))) |        (prm 'int+ (T bv) (prm 'sra (T i) (K fx-shift))) | ||||||
|        (K (- disp-bytevector-data bytevector-tag))) |        (K (- disp-bytevector-data bytevector-tag))) | ||||||
|      (prm 'fl:single->double) |      (prm 'fl:single->double) | ||||||
|      (prm 'fl:store x (K (- disp-flonum-data vector-tag))) |      (prm 'fl:store x (K (- disp-flonum-data vector-tag))) | ||||||
|  | @ -1585,7 +1585,7 @@ | ||||||
|      (prm 'fl:load (T x) (K (- disp-flonum-data vector-tag))) |      (prm 'fl:load (T x) (K (- disp-flonum-data vector-tag))) | ||||||
|      (prm 'fl:double->single) |      (prm 'fl:double->single) | ||||||
|      (prm 'fl:store-single |      (prm 'fl:store-single | ||||||
|        (prm 'int+ (T bv) (prm 'sra (T i) (K fixnum-shift))) |        (prm 'int+ (T bv) (prm 'sra (T i) (K fx-shift))) | ||||||
|        (K (- disp-bytevector-data bytevector-tag))))]) |        (K (- disp-bytevector-data bytevector-tag))))]) | ||||||
| 
 | 
 | ||||||
| (define-primop $bytevector-ieee-single-nonnative-ref unsafe | (define-primop $bytevector-ieee-single-nonnative-ref unsafe | ||||||
|  | @ -1594,7 +1594,7 @@ | ||||||
|          [floff (- disp-flonum-data vector-tag)]) |          [floff (- disp-flonum-data vector-tag)]) | ||||||
|      (with-tmp ([x (prm 'alloc (K (align flonum-size)) (K vector-tag))]) |      (with-tmp ([x (prm 'alloc (K (align flonum-size)) (K vector-tag))]) | ||||||
|        (prm 'mset x (K (- vector-tag)) (K flonum-tag)) |        (prm 'mset x (K (- vector-tag)) (K flonum-tag)) | ||||||
|        (with-tmp ([t (prm 'int+ (T bv) (prm 'sra (T i) (K fixnum-shift)))]) |        (with-tmp ([t (prm 'int+ (T bv) (prm 'sra (T i) (K fx-shift)))]) | ||||||
|          (with-tmp ([x0 (prm 'mref t (K bvoff))]) |          (with-tmp ([x0 (prm 'mref t (K bvoff))]) | ||||||
|            (prm 'bswap! x0 x0) |            (prm 'bswap! x0 x0) | ||||||
|            (prm 'mset x (K floff) x0))) |            (prm 'mset x (K floff) x0))) | ||||||
|  | @ -1613,7 +1613,7 @@ | ||||||
| ;       (K (make-object '#vu8(7 6 2 3 4 5 1 0))) | ;       (K (make-object '#vu8(7 6 2 3 4 5 1 0))) | ||||||
| ;       (K (- disp-bytevector-data bytevector-tag))) | ;       (K (- disp-bytevector-data bytevector-tag))) | ||||||
| ;     (prm 'fl:store | ;     (prm 'fl:store | ||||||
| ;       (prm 'int+ (T bv) (prm 'sra (T i) (K fixnum-shift))) | ;       (prm 'int+ (T bv) (prm 'sra (T i) (K fx-shift))) | ||||||
| ;       (K (- disp-bytevector-data bytevector-tag))))]) | ;       (K (- disp-bytevector-data bytevector-tag))))]) | ||||||
| 
 | 
 | ||||||
| (define-primop $bytevector-ieee-double-nonnative-set! unsafe | (define-primop $bytevector-ieee-double-nonnative-set! unsafe | ||||||
|  | @ -1621,7 +1621,7 @@ | ||||||
|    (let ([bvoff (- disp-bytevector-data bytevector-tag)] |    (let ([bvoff (- disp-bytevector-data bytevector-tag)] | ||||||
|          [floff (- disp-flonum-data vector-tag)]) |          [floff (- disp-flonum-data vector-tag)]) | ||||||
|      (with-tmp ([t (prm 'int+ (T bv) |      (with-tmp ([t (prm 'int+ (T bv) | ||||||
|                       (prm 'sra (T i) (K fixnum-shift)))]) |                       (prm 'sra (T i) (K fx-shift)))]) | ||||||
|        (with-tmp ([x0 (prm 'mref (T x) (K floff))]) |        (with-tmp ([x0 (prm 'mref (T x) (K floff))]) | ||||||
|          (prm 'bswap! x0 x0) |          (prm 'bswap! x0 x0) | ||||||
|          (prm 'mset t (K (+ bvoff wordsize)) x0)) |          (prm 'mset t (K (+ bvoff wordsize)) x0)) | ||||||
|  | @ -1637,7 +1637,7 @@ | ||||||
|        (prm 'fl:load (T x) (K floff)) |        (prm 'fl:load (T x) (K floff)) | ||||||
|        (prm 'fl:double->single) |        (prm 'fl:double->single) | ||||||
|        (with-tmp ([t (prm 'int+ (T bv) |        (with-tmp ([t (prm 'int+ (T bv) | ||||||
|                         (prm 'sra (T i) (K fixnum-shift)))]) |                         (prm 'sra (T i) (K fx-shift)))]) | ||||||
|          (prm 'fl:store-single t (K bvoff)) |          (prm 'fl:store-single t (K bvoff)) | ||||||
|          (with-tmp ([x0 (prm 'mref t (K bvoff))]) |          (with-tmp ([x0 (prm 'mref t (K bvoff))]) | ||||||
|            (prm 'bswap! x0 x0) |            (prm 'bswap! x0 x0) | ||||||
|  | @ -1660,7 +1660,7 @@ | ||||||
|                       (K string-tag))]) |                       (K string-tag))]) | ||||||
|          (prm 'mset s |          (prm 'mset s | ||||||
|              (K (- disp-string-length string-tag)) |              (K (- disp-string-length string-tag)) | ||||||
|              (K (* n fixnum-scale))) |              (K (* n fx-scale))) | ||||||
|          s)] |          s)] | ||||||
|      [else |      [else | ||||||
|       (with-tmp ([s (prm 'alloc  |       (with-tmp ([s (prm 'alloc  | ||||||
|  | @ -1685,7 +1685,7 @@ | ||||||
|      [(constant i) |      [(constant i) | ||||||
|       (unless (fixnum? i) (interrupt)) |       (unless (fixnum? i) (interrupt)) | ||||||
|       (prm 'mref (T s) |       (prm 'mref (T s) | ||||||
|         (K (+ (* i fixnum-scale)  |         (K (+ (* i fx-scale)  | ||||||
|               (- disp-string-data string-tag))))] |               (- disp-string-data string-tag))))] | ||||||
|      [else |      [else | ||||||
|       (prm 'mref (T s) |       (prm 'mref (T s) | ||||||
|  | @ -1731,7 +1731,7 @@ | ||||||
|      [(constant i)  |      [(constant i)  | ||||||
|       (unless (fixnum? i) (interrupt)) |       (unless (fixnum? i) (interrupt)) | ||||||
|       (prm 'mset (T x)  |       (prm 'mset (T x)  | ||||||
|          (K (+ (* i fixnum-scale) (- disp-string-data string-tag))) |          (K (+ (* i fx-scale) (- disp-string-data string-tag))) | ||||||
|          (T c))] |          (T c))] | ||||||
|      [else |      [else | ||||||
|       (prm 'mset (T x)  |       (prm 'mset (T x)  | ||||||
|  | @ -1985,18 +1985,18 @@ | ||||||
|      (prm 'logand |      (prm 'logand | ||||||
|           (prm 'mref (T x) |           (prm 'mref (T x) | ||||||
|                (prm 'int+ |                (prm 'int+ | ||||||
|                     (prm 'sra (T i) (K fixnum-shift)) |                     (prm 'sra (T i) (K fx-shift)) | ||||||
|                     (K (- disp-code-data vector-tag)))) |                     (K (- disp-code-data vector-tag)))) | ||||||
|           (K 255)) |           (K 255)) | ||||||
|      (K fixnum-shift))]) |      (K fx-shift))]) | ||||||
| 
 | 
 | ||||||
| (define-primop $code-set! unsafe | (define-primop $code-set! unsafe | ||||||
|   [(E x i v) |   [(E x i v) | ||||||
|    (prm 'bset/h (T x) |    (prm 'bset/h (T x) | ||||||
|         (prm 'int+  |         (prm 'int+  | ||||||
|              (prm 'sra (T i) (K fixnum-shift)) |              (prm 'sra (T i) (K fx-shift)) | ||||||
|              (K (- disp-code-data vector-tag))) |              (K (- disp-code-data vector-tag))) | ||||||
|         (prm 'sll (T v) (K (- 8 fixnum-shift))))]) |         (prm 'sll (T v) (K (- 8 fx-shift))))]) | ||||||
| 
 | 
 | ||||||
| (define-primop $set-code-annotation! unsafe | (define-primop $set-code-annotation! unsafe | ||||||
|   [(E x v) (mem-assign v (T x) (- disp-code-annotation vector-tag))]) |   [(E x v) (mem-assign v (T x) (- disp-code-annotation vector-tag))]) | ||||||
|  | @ -2010,9 +2010,10 @@ | ||||||
| 
 | 
 | ||||||
| (define-primop $data->transcoder unsafe | (define-primop $data->transcoder unsafe | ||||||
|   [(V x) (prm 'logor |   [(V x) (prm 'logor | ||||||
|               (prm 'sll (T x) (K (- transcoder-payload-shift fixnum-shift))) |               (prm 'sll (T x) (K (- transcoder-payload-shift | ||||||
|  |                                     fx-shift))) | ||||||
|               (K transcoder-tag))]) |               (K transcoder-tag))]) | ||||||
| (define-primop $transcoder->data unsafe | (define-primop $transcoder->data unsafe | ||||||
|   [(V x) (prm 'sra (T x) (K (- transcoder-payload-shift fixnum-shift)))]) |   [(V x) (prm 'sra (T x) (K (- transcoder-payload-shift fx-shift)))]) | ||||||
| /section) | /section) | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -20,17 +20,17 @@ | ||||||
| ; | ; | ||||||
| ;#!eof | ;#!eof | ||||||
| 
 | 
 | ||||||
| (define-syntax export-all-module | ;(define-syntax export-all-module | ||||||
|   (syntax-rules (define) | ;  (syntax-rules (define) | ||||||
|     [(_ M (define name* v*) ...) | ;    [(_ M (define name* v*) ...) | ||||||
|      (module M (name* ...) | ;     (module M (name* ...) | ||||||
|        (define name* v*) ...)])) | ;       (define name* v*) ...)])) | ||||||
| 
 | ; | ||||||
| (export-all-module object-representation | ;(export-all-module object-representation | ||||||
|   (define fixnum-scale 4) | ;  (define fixnum-scale 4) | ||||||
|   (define fixnum-shift 2) | ;  (define fixnum-shift 2) | ||||||
|   (define fixnum-tag 0) | ;  (define fixnum-tag 0) | ||||||
|   (define fixnum-mask 3)) | ;  (define fixnum-mask 3)) | ||||||
| 
 | 
 | ||||||
| (module primops (primop? get-primop set-primop!) | (module primops (primop? get-primop set-primop!) | ||||||
|   (define cookie (gensym)) |   (define cookie (gensym)) | ||||||
|  | @ -44,7 +44,7 @@ | ||||||
|   ) |   ) | ||||||
| 
 | 
 | ||||||
| (module (specify-representation) | (module (specify-representation) | ||||||
|   (import object-representation) |   ;(import object-representation) | ||||||
|   (import primops) |   (import primops) | ||||||
|   (define-struct PH |   (define-struct PH | ||||||
|     (interruptable? p-handler p-handled? v-handler v-handled? e-handler e-handled?)) |     (interruptable? p-handler p-handled? v-handler v-handled? e-handler e-handled?)) | ||||||
|  | @ -325,10 +325,11 @@ | ||||||
|            (build-closures clhs* crhs* |            (build-closures clhs* crhs* | ||||||
|              (build-setters clhs* crhs* body)))]))) |              (build-setters clhs* crhs* body)))]))) | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
|   (define (constant-rep x) |   (define (constant-rep x) | ||||||
|     (let ([c (constant-value x)]) |     (let ([c (constant-value x)]) | ||||||
|       (cond |       (cond | ||||||
|         [(fixnum? c) (make-constant (* c fixnum-scale))] |         [(fx? c) (make-constant (* c fx-scale))] | ||||||
|         [(boolean? c) (make-constant (if c bool-t bool-f))] |         [(boolean? c) (make-constant (if c bool-t bool-f))] | ||||||
|         [(eq? c (void)) (make-constant void-object)] |         [(eq? c (void)) (make-constant void-object)] | ||||||
|         [(bwp-object? c) (make-constant bwp-object)] |         [(bwp-object? c) (make-constant bwp-object)] | ||||||
|  | @ -461,7 +462,7 @@ | ||||||
|   (define (interrupt-when x) |   (define (interrupt-when x) | ||||||
|     (make-conditional x (interrupt) (prm 'nop)))  |     (make-conditional x (interrupt) (prm 'nop)))  | ||||||
|   (define (interrupt-unless-fixnum x) |   (define (interrupt-unless-fixnum x) | ||||||
|     (interrupt-unless (tag-test x fixnum-mask fixnum-tag))) |     (interrupt-unless (tag-test x fx-mask fx-tag))) | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|   (define (T x) |   (define (T x) | ||||||
|  |  | ||||||
|  | @ -0,0 +1,52 @@ | ||||||
|  | #!/usr/bin/env ikarus --r6rs-script | ||||||
|  | ;;; Ikarus Scheme -- A compiler for R6RS Scheme. | ||||||
|  | ;;; Copyright (C) 2006,2007  Abdulaziz Ghuloum | ||||||
|  | ;;;  | ||||||
|  | ;;; This program is free software: you can redistribute it and/or modify | ||||||
|  | ;;; it under the terms of the GNU General Public License version 3 as | ||||||
|  | ;;; published by the Free Software Foundation. | ||||||
|  | ;;;  | ||||||
|  | ;;; This program is distributed in the hope that it will be useful, but | ||||||
|  | ;;; WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  | ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | ||||||
|  | ;;; General Public License for more details. | ||||||
|  | ;;;  | ||||||
|  | ;;; You should have received a copy of the GNU General Public License | ||||||
|  | ;;; along with this program.  If not, see <http://www.gnu.org/licenses/>. | ||||||
|  | 
 | ||||||
|  | ;;; vim:syntax=scheme | ||||||
|  | (import  | ||||||
|  |   (ikarus compiler) | ||||||
|  |   (except (ikarus) assembler-output)) | ||||||
|  | 
 | ||||||
|  | (define (compile1 x) | ||||||
|  |   (printf "Compiling ~s\n" x) | ||||||
|  |   (let ([p (open-file-output-port "test64.boot" (file-options no-fail))]) | ||||||
|  |     (parameterize ([assembler-output #t]) | ||||||
|  |       (compile-core-expr-to-port x p)) | ||||||
|  |     (close-output-port p))) | ||||||
|  | 
 | ||||||
|  | (define (compile-and-run x)  | ||||||
|  |   (compile1 x) | ||||||
|  |   (let ([rs (system "../src/ikarus -b test64.boot > test64.out")]) | ||||||
|  |     (unless (= rs 0) (error 'run1 "died")) | ||||||
|  |     (with-input-from-file "test64.out" read))) | ||||||
|  | 
 | ||||||
|  | (define (compile-test-and-run expr expected) | ||||||
|  |   (let ([val (compile-and-run expr)]) | ||||||
|  |     (unless (equal? val expected)  | ||||||
|  |       (error 'compile-test-and-run "failed:got:expected" val expected)))) | ||||||
|  | 
 | ||||||
|  | (define all-tests | ||||||
|  |   '([(quote 42)   42] | ||||||
|  |     [(quote #f)   #f] | ||||||
|  |     [(quote ())  ()])) | ||||||
|  | 
 | ||||||
|  | (for-each | ||||||
|  |   (lambda (x) | ||||||
|  |      (compile-test-and-run (car x) (cadr x))) | ||||||
|  |   all-tests) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | (printf "Happy Happy Joy Joy\n") | ||||||
|  | 
 | ||||||
|  | @ -32,18 +32,31 @@ | ||||||
| .align 8
 | .align 8
 | ||||||
| ik_asm_enter: | ik_asm_enter: | ||||||
| _ik_asm_enter: | _ik_asm_enter: | ||||||
|   # ignored value is the third arg 12(%esp) | # c parameters come in registers: | ||||||
|   # code is the second arg  8(%esp) | #     %rdi, %rsi, %rdx, %rcx, %r8 and %r9 | ||||||
|   # pcb is the first arg    4(%esp) | # return value registers are %rax and %rdi | ||||||
|   # return point is at      0(%esp) | # callee-save registers: | ||||||
|   movl %esi, -4(%esp)    #  preserve | #     %rbp, %rbx, %r12, r13, r14, %r15 are callee-save  | ||||||
|   movl %ebp, -8(%esp)    #  preserve | 
 | ||||||
|   movl 4(%esp), %esi    | 
 | ||||||
|   movl 0(%esi), %ebp     # allocation pointer is at 0(pcb) |   # First, save all callee-save registers | ||||||
|   movl %esp, %eax |   mov %rbp,  -8(%rsp)      # preserve | ||||||
|   subl $16, %esp         # 24 for alignment |   mov %rbx,  -16(%rsp)     # preserve | ||||||
|   movl %esp, 24(%esi)    # save esp in pcb->system_stack |   mov %r12,  -24(%rsp)     # preserve | ||||||
|   movl 8(%esi), %esp     # load scheme stack from pcb->frame_pinter |   mov %r13,  -32(%rsp)     # preserve | ||||||
|  |   mov %r14,  -40(%rsp)     # preserve | ||||||
|  |   mov %r15,  -48(%rsp)     # preserve | ||||||
|  | 
 | ||||||
|  |   # code is the second arg, or  %rsi | ||||||
|  |   # pcb is the first arg, or    %rdi | ||||||
|  |   # return point is at       0(%rsp) | ||||||
|  | 
 | ||||||
|  |   mov %rsi, %rax     # move code pointer to %rax | ||||||
|  |   mov %rdi, %rsi     # move pcb into pcb-register (%rsi) | ||||||
|  |   mov 0(%rsi), %rbp  # allocation pointer is at 0(pcb) | ||||||
|  |   sub $64, %rsp         # 64 for alignment | ||||||
|  |   mov %rsp, 48(%rsi)    # save esp in pcb->system_stack | ||||||
|  |   mov 16(%rsi), %rsp    # load scheme stack from pcb->frame_pinter | ||||||
|   jmp L_call |   jmp L_call | ||||||
|   .byte 0
 |   .byte 0
 | ||||||
|   .byte 0
 |   .byte 0
 | ||||||
|  | @ -59,21 +72,27 @@ L_multivalue_label: # FIXME | ||||||
|   .byte 0
 |   .byte 0
 | ||||||
|   .byte 0
 |   .byte 0
 | ||||||
| L_call: | L_call: | ||||||
|   call *8(%eax)         # goooooooo |   call *%rax         # goooooooo | ||||||
|   # now we're back |   # now we're back | ||||||
| ik_underflow_handler: | ik_underflow_handler: | ||||||
|   movl %eax, -8(%esp)   # store the return value |   mov %rax, -16(%rsp)   # store the return value | ||||||
|   movl $-4, %eax        # set rvcount = 1 |   mov $-8, %rax         # set rvcount = 1 | ||||||
| L_do_underflow: | L_do_underflow: | ||||||
|   movl %esp, 8(%esi)    # store scheme stack in pcb->frame_pointer |   mov %rsp, 16(%rsi)    # store scheme stack in pcb->frame_pointer | ||||||
|   movl %ebp, 0(%esi)    # store allocation pointer |   mov %rbp, 0(%rsi)     # store allocation pointer | ||||||
|   movl 24(%esi), %esp   # restore system stack |   mov 48(%rsi), %rsp    # restore system stack | ||||||
|   addl $16, %esp        # 24 for alignment (>= 16) |   add $64, %rsp         # 64 for alignment | ||||||
|   movl -4(%esp), %esi   # restore callee-save registers | 
 | ||||||
|   movl -8(%esp), %ebp   # |   # restore callee-save registers | ||||||
|   ret                   # back to C, which handled the underflow |   mov -8(%rsp) ,  %rbp     # restore | ||||||
|  |   mov -16(%rsp),  %rbx     # restore | ||||||
|  |   mov -24(%rsp),  %r12     # restore | ||||||
|  |   mov -32(%rsp),  %r13     # restore | ||||||
|  |   mov -40(%rsp),  %r14     # restore | ||||||
|  |   mov -48(%rsp),  %r15     # restore | ||||||
|  |   ret      # back to C, which handled the underflow | ||||||
| L_multivalue_underflow: | L_multivalue_underflow: | ||||||
|   addl $4, %esp |   add $8, %rsp | ||||||
|   jmp L_do_underflow |   jmp L_do_underflow | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -64,8 +64,8 @@ ikptr ik_exec_code(ikpcb* pcb, ikptr code_ptr){ | ||||||
|     argc = ik_asm_reenter(pcb, new_fbase, argc); |     argc = ik_asm_reenter(pcb, new_fbase, argc); | ||||||
|     next_k =  pcb->next_k; |     next_k =  pcb->next_k; | ||||||
|   } |   } | ||||||
|   return ref(pcb->frame_base, -2*wordsize); |   ikptr rv = ref(pcb->frame_base, -2*wordsize); | ||||||
|   return argc; |   return rv; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -110,16 +110,12 @@ void ik_fasl_load(ikpcb* pcb, char* fasl_file){ | ||||||
|       } |       } | ||||||
|       close(fd); |       close(fd); | ||||||
|     } |     } | ||||||
|     ikptr val = void_object; |  | ||||||
|     if(wordsize == 4){ |     if(wordsize == 4){ | ||||||
|       ik_exec_code(pcb, v); |       ik_exec_code(pcb, v); | ||||||
|     } else { |     } else { | ||||||
|       fprintf(stderr, "NOT EXECING YET\n"); |       fprintf(stderr, ";;; EXECING ...\n"); | ||||||
|     } |       ikptr val = ik_exec_code(pcb, v); | ||||||
|     if(val != void_object){ |       fprintf(stderr, ";;; RETURNED ...\n"); | ||||||
|       /* this is from revision 1 
 |  | ||||||
|          and is no longer needed  |  | ||||||
|          and should be removed */ |  | ||||||
|       ik_print(val); |       ik_print(val); | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
|  | @ -127,10 +123,6 @@ void ik_fasl_load(ikpcb* pcb, char* fasl_file){ | ||||||
|     fprintf(stderr, "fasl-read did not reach eof!\n"); |     fprintf(stderr, "fasl-read did not reach eof!\n"); | ||||||
|     exit(-10); |     exit(-10); | ||||||
|   } |   } | ||||||
|   if(wordsize == 8){ |  | ||||||
|     fprintf(stderr, "DONE READING FASL, EXITING ...\n"); |  | ||||||
|     exit(-1); |  | ||||||
|   } |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static ikptr  | static ikptr  | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	 Abdulaziz Ghuloum
						Abdulaziz Ghuloum