* libcore now compiles with chaitin

This commit is contained in:
Abdulaziz Ghuloum 2007-02-14 19:42:36 -05:00
parent 434ebe9525
commit 1a4cdcb7b0
5 changed files with 392 additions and 335 deletions

View File

@ -39,6 +39,15 @@
[movl (disp -4 %esp) %eax]
[ret]))
(asm-test 1
'([movl 8 %eax]
[movl %eax (disp -4 %esp)]
[movl 4 %eax]
[subl %eax (disp -4 %esp)]
[movl -4 %eax]
[movl (disp -4 %esp) %eax]
[ret]))
(asm-test 1
'([movl 1 (disp -4 %esp)]
[sall 2 (disp -4 %esp)]

Binary file not shown.

View File

@ -119,6 +119,7 @@
'([pair? p]
[vector? p]
[null? p]
[bwp-object? p]
[eof-object? p]
[eof-object v]
[$unbound-object? p]
@ -179,15 +180,16 @@
[$string-ref v]
[$string-set! e]
[$make-symbol v]
[$set-symbol-value! e]
[$symbol-string v]
[$symbol-unique-string v]
[$symbol-plist v]
[$set-symbol-plist! e]
[$set-symbol-string! e]
[top-level-value v]
[$symbol-value v]
[$make-symbol v]
[$set-symbol-value! e]
[$symbol-string v]
[$symbol-unique-string v]
[$set-symbol-unique-string! e]
[$symbol-plist v]
[$set-symbol-plist! e]
[$set-symbol-string! e]
[top-level-value v]
[$symbol-value v]
[$record v]
@ -211,6 +213,7 @@
[primitive-set! e]
[primitive-ref v]
[pointer-value v]
[$fp-at-base p]
[$current-frame v]
[$seal-frame-and-call tail]
@ -218,6 +221,7 @@
[$make-call-with-values-procedure v]
[$make-values-procedure v]
[$arg-list v]
))
(define library-prims
@ -642,7 +646,7 @@
(cond
[(null? n*) '()]
[else
(cons (prm 'int+ (list lhs (K n)))
(cons (prm 'int+ lhs (K n))
(adders lhs (+ n (car n*)) (cdr n*)))]))
(define (build-closures lhs* rhs* body)
(let ([lhs (car lhs*)] [rhs (car rhs*)]
@ -737,96 +741,105 @@
[(primcall op arg*)
(case op
[(nop) nop]
[($cpset!)
(let ([x (Value (car arg*))]
[i (cadr arg*)]
[v (Value (caddr arg*))])
(record-case i
[(constant i)
(unless (fixnum? i) (err x))
(prm 'mset x
(K (+ (* i wordsize)
(- disp-closure-data closure-tag)))
v)]
[else (err x)]))]
;;;X[($cpset!)
;;;X (let ([x (Value (car arg*))]
;;;X [i (cadr arg*)]
;;;X [v (Value (caddr arg*))])
;;;X (record-case i
;;;X [(constant i)
;;;X (unless (fixnum? i) (err x))
;;;X (prm 'mset x
;;;X (K (+ (* i wordsize)
;;;X (- disp-closure-data closure-tag)))
;;;X v)]
;;;X [else (err x)]))]
[(primitive-set!)
(let ([x (Value (car arg*))] [v (Value (cadr arg*))])
(mem-assign v x
(- disp-symbol-system-value symbol-tag)))]
[($set-symbol-value!)
(let ([x (Value (car arg*))] [v (Value (cadr arg*))])
(tbind ([x (Value (car arg*))]
[v (Value (cadr arg*))])
(mem-assign v x
(- disp-symbol-value symbol-tag)))]
[($set-symbol-string!)
(let ([x (Value (car arg*))] [v (Value (cadr arg*))])
(tbind ([x (Value (car arg*))] [v (Value (cadr arg*))])
(mem-assign v x
(- disp-symbol-string symbol-tag)))]
[($set-symbol-unique-string!)
(tbind ([x (Value (car arg*))] [v (Value (cadr arg*))])
(mem-assign v x
(- disp-symbol-unique-string symbol-tag)))]
[($set-symbol-plist!)
(let ([x (Value (car arg*))] [v (Value (cadr arg*))])
(tbind ([x (Value (car arg*))] [v (Value (cadr arg*))])
(mem-assign v x
(- disp-symbol-plist symbol-tag)))]
[($vector-set! $record-set!)
(let ([x (Value (car arg*))]
[i (cadr arg*)]
[v (Value (caddr arg*))])
(record-case i
[(constant i)
(unless (fixnum? i) (err x))
(mem-assign v x
(+ (* i wordsize)
(- disp-vector-data vector-tag)))]
[else
(mem-assign v
(prm 'int+ x (Value i))
(- disp-vector-data vector-tag))]))]
(tbind ([x (Value (car arg*))]
[v (Value (caddr arg*))])
(let ([i (cadr arg*)])
(record-case i
[(constant i)
(unless (fixnum? i)
(error who "invalid arg ~s to ~s" i op))
(mem-assign v x
(+ (* i wordsize)
(- disp-vector-data vector-tag)))]
[else
(tbind ([i (Value i)])
(mem-assign v
(prm 'int+ x i)
(- disp-vector-data vector-tag)))])))]
[($set-car! $set-cdr!)
(let ([off (if (eq? op '$set-car!)
(- disp-car pair-tag)
(- disp-cdr pair-tag))])
(tbind ([x (Value (car arg*))])
(tbind ([x (Value (car arg*))]
[v (Value (cadr arg*))])
(seq* ;;; car/cdr addresses are in the same
;;; card as the pair address, so no
;;; adjustment is necessary as was the
;;; case with vectors and records.
(prm 'mset x (K off) (Value (cadr arg*)))
(prm 'mset x (K off) v)
(dirty-vector-set x))))]
[($string-set!)
(let ([x (Value (car arg*))]
[i (cadr arg*)]
[c (caddr arg*)])
(record-case i
[(constant i)
(unless (fixnum? i) (err x))
(record-case c
[(constant c)
(unless (char? i) (err x))
(prm 'bset/c x
(K (+ i (- disp-string-data string-tag)))
(K (char->integer c)))]
[else
(unless (= char-shift 8)
(error who "assumption about char-shift"))
(tbind ([c (Value c)])
(prm 'bset/h x
(K (+ i (- disp-string-data string-tag)))
c))])]
[else
(tbind ([i (Value i)])
(tbind ([x (Value (car arg*))])
(let ([i (cadr arg*)]
[c (caddr arg*)])
(record-case i
[(constant i)
(unless (fixnum? i)
(error who "invalid arg ~s to ~s" i op))
(record-case c
[(constant c)
(unless (char? i) (err x))
(prm 'bset/c x
(prm 'sra i (K fixnum-shift))
(K (char->integer c)))]
[else
(unless (= char-shift 8)
(error who "assumption about char-shift"))
(tbind ([c (Value c)])
(prm 'bset/h x
(prm 'int+
(prm 'sra i (K fixnum-shift))
(K (- disp-string-data string-tag)))
c))]))]))]
[(constant c)
(unless (char? c) (err x))
(prm 'bset/c x
(K (+ i (- disp-string-data string-tag)))
(K (char->integer c)))]
[else
(unless (= char-shift 8)
(error who "assumption about char-shift"))
(tbind ([c (Value c)])
(prm 'bset/h x
(K (+ i (- disp-string-data string-tag)))
c))])]
[else
(tbind ([i (Value i)])
(record-case c
[(constant c)
(unless (char? c) (err x))
(prm 'bset/c x
(prm 'sra i (K fixnum-shift))
(K (char->integer c)))]
[else
(unless (= char-shift 8)
(error who "assumption about char-shift"))
(tbind ([c (Value c)])
(prm 'bset/h x
(prm 'int+
(prm 'sra i (K fixnum-shift))
(K (- disp-string-data string-tag)))
c))]))])))]
[else (error who "invalid effect prim ~s" op)])]
[(forcall op arg*)
(make-forcall op (map Value arg*))]
@ -839,20 +852,20 @@
[else (error who "invalid effect expr ~s" x)]))
;;;
(define (tag-test x mask tag)
(if mask
(make-primcall '=
(list (make-primcall 'logand
(list x (make-constant mask)))
(make-constant tag)))
(make-primcall '=
(list x (make-constant tag)))))
(tbind ([x x])
(if mask
(make-primcall '=
(list (make-primcall 'logand
(list x (make-constant mask)))
(make-constant tag)))
(make-primcall '=
(list x (make-constant tag))))))
(define (sec-tag-test x pmask ptag smask stag)
(let ([t (unique-var 'tmp)])
(make-bind (list t) (list x)
(make-conditional
(tag-test t pmask ptag)
(tag-test (prm 'mref t (K (- ptag))) smask stag)
(make-constant #f)))))
(tbind ([t x])
(make-conditional
(tag-test t pmask ptag)
(tag-test (prm 'mref t (K (- ptag))) smask stag)
(make-constant #f))))
;;;
(define (Pred x)
(record-case x
@ -870,6 +883,7 @@
[(eq?) (make-primcall '= (map Value arg*))]
[(null?) (prm '= (Value (car arg*)) (K nil))]
[(eof-object?) (prm '= (Value (car arg*)) (K eof))]
[(bwp-object?) (prm '= (Value (car arg*)) (K bwp-object))]
[(neq?) (make-primcall '!= (map Value arg*))]
[($fxzero?) (prm '= (Value (car arg*)) (K 0))]
[($unbound-object?) (prm '= (Value (car arg*)) (K unbound))]
@ -900,15 +914,14 @@
(sec-tag-test (Value (car arg*))
vector-mask vector-tag #f output-port-tag)]
[(port?)
(sec-tag-test (Value (car arg*))
(sec-tag-test (Value (car arg*))
vector-mask vector-tag port-mask port-tag)]
[($record/rtd?)
(tbind ([t (Value (car arg*))])
(tbind ([t (Value (car arg*))]
[v (Value (cadr arg*))])
(make-conditional
(tag-test t vector-mask vector-tag)
(prm '=
(prm 'mref t (K (- vector-tag)))
(Value (cadr arg*)))
(prm '= (prm 'mref t (K (- vector-tag))) v)
(make-constant #f)))]
[(immediate?)
(tbind ([t (Value (car arg*))])
@ -973,24 +986,31 @@
[(void) (K void-object)]
[(eof-object) (K eof)]
[($car)
(prm 'mref (Value (car arg*)) (K (- disp-car pair-tag)))]
(tbind ([x (Value (car arg*))])
(prm 'mref x (K (- disp-car pair-tag))))]
[($cdr)
(prm 'mref (Value (car arg*)) (K (- disp-cdr pair-tag)))]
(tbind ([x (Value (car arg*))])
(prm 'mref x (K (- disp-cdr pair-tag))))]
[(primitive-ref)
(prm 'mref (Value (car arg*))
(K (- disp-symbol-system-value symbol-tag)))]
(tbind ([x (Value (car arg*))])
(prm 'mref x
(K (- disp-symbol-system-value symbol-tag))))]
[($symbol-string)
(prm 'mref (Value (car arg*))
(K (- disp-symbol-string symbol-tag)))]
(tbind ([x (Value (car arg*))])
(prm 'mref x
(K (- disp-symbol-string symbol-tag))))]
[($symbol-plist)
(prm 'mref (Value (car arg*))
(K (- disp-symbol-plist symbol-tag)))]
(tbind ([x (Value (car arg*))])
(prm 'mref x
(K (- disp-symbol-plist symbol-tag))))]
[($symbol-value)
(prm 'mref (Value (car arg*))
(K (- disp-symbol-value symbol-tag)))]
(tbind ([x (Value (car arg*))])
(prm 'mref x
(K (- disp-symbol-value symbol-tag))))]
[($symbol-unique-string)
(prm 'mref (Value (car arg*))
(K (- disp-symbol-unique-string symbol-tag)))]
(tbind ([x (Value (car arg*))])
(prm 'mref x
(K (- disp-symbol-unique-string symbol-tag))))]
[($make-symbol)
(tbind ([str (Value (car arg*))])
(tbind ([x (prm 'alloc
@ -1016,21 +1036,21 @@
(K (- disp-symbol-system-plist symbol-tag))
(K nil))
x)))]
[($make-cp)
(let ([label (car arg*)] [len (cadr arg*)])
(record-case len
[(constant i)
(unless (fixnum? i) (err x))
(tbind ([t (prm 'alloc
(K (align (+ disp-closure-data
(* i wordsize))))
(K closure-tag))])
(seq*
(prm 'mset t
(K (- disp-closure-code closure-tag))
(Value label))
t))]
[else (err x)]))]
;;;X[($make-cp)
;;;X (let ([label (car arg*)] [len (cadr arg*)])
;;;X (record-case len
;;;X [(constant i)
;;;X (unless (fixnum? i) (err x))
;;;X (tbind ([t (prm 'alloc
;;;X (K (align (+ disp-closure-data
;;;X (* i wordsize))))
;;;X (K closure-tag))])
;;;X (seq*
;;;X (prm 'mset t
;;;X (K (- disp-closure-code closure-tag))
;;;X (Value label))
;;;X t))]
;;;X [else (err x)]))]
[($record)
(let ([rtd (car arg*)] [v* (map Value (cdr arg*))])
(tbind ([rtd (Value rtd)])
@ -1054,8 +1074,9 @@
(prm 'mset t (K i) (car t*))
(f (cdr t*) (+ i wordsize)))]))))))))]
[($vector-length)
(prm 'mref (Value (car arg*))
(K (- disp-vector-length vector-tag)))]
(tbind ([x (Value (car arg*))])
(prm 'mref x
(K (- disp-vector-length vector-tag))))]
[($make-vector)
(unless (= (length arg*) 1)
(error who "incorrect args to $make-vector"))
@ -1082,34 +1103,35 @@
len)
v))))]))]
[($string-length)
(prm 'mref (Value (car arg*))
(K (- disp-string-length string-tag)))]
(tbind ([x (Value (car arg*))])
(prm 'mref x
(K (- disp-string-length string-tag))))]
[($string-ref)
(let ([s (car arg*)] [i (cadr arg*)])
(record-case i
[(constant i)
(unless (fixnum? i) (err x))
(prm 'logor
(prm 'sll
(prm 'logand
(prm 'mref (Value s)
(K (+ i (- disp-string-data string-tag))))
(K 255))
(K char-shift))
(K char-tag))]
[else
(prm 'logor
(prm 'sll
(prm 'logand
(prm 'mref (Value s)
(prm 'int+
(prm 'sra
(Value i)
(K fixnum-shift))
(K (- disp-string-data string-tag))))
(K 255))
(K char-shift))
(K char-tag))]))]
(tbind ([s (Value (car arg*))])
(let ([i (cadr arg*)])
(record-case i
[(constant i)
(unless (fixnum? i) (err x))
(prm 'logor
(prm 'sll
(prm 'logand
(prm 'mref s
(K (+ i (- disp-string-data string-tag))))
(K 255))
(K char-shift))
(K char-tag))]
[else
(tbind ([i (Value i)])
(prm 'logor
(prm 'sll
(prm 'logand
(prm 'mref s
(prm 'int+
(prm 'sra i (K fixnum-shift))
(K (- disp-string-data string-tag))))
(K 255))
(K char-shift))
(K char-tag)))])))]
[($make-string)
(unless (= (length arg*) 1) (err x))
(let ([n (car arg*)])
@ -1170,8 +1192,9 @@
rtd)
t))))])))]
[($record-rtd)
(prm 'mref (Value (car arg*))
(K (- disp-record-rtd vector-tag)))]
(tbind ([x (Value (car arg*))])
(prm 'mref x
(K (- disp-record-rtd vector-tag))))]
[(cons)
(tbind ([a (Value (car arg*))]
[d (Value (cadr arg*))])
@ -1193,20 +1216,20 @@
(record-case a
[(constant a)
(unless (fixnum? a) (err x))
(prm 'int* (Value b) (K a))]
(tbind ([b (Value b)])
(prm 'int* b (K a)))]
[else
(record-case b
[(constant b)
(unless (fixnum? b) (err x))
(prm 'int* (Value a) (K b))]
[else
(prm 'int*
(Value a)
(prm 'sra (Value b) (K fixnum-shift)))])]))]
(tbind ([a (Value a)])
(prm 'int* a (K b)))]
[else
(tbind ([a (Value a)] [b (Value b)])
(prm 'int* a (prm 'sra b (K fixnum-shift))))])]))]
[($fxquotient)
(prm 'sll
(prm 'remainder (Value (car arg*)) (Value (cadr arg*)))
(K fixnum-shift))]
(tbind ([a (Value (car arg*))] [b (Value (cadr arg*))])
(prm 'sll (prm 'remainder a b) (K fixnum-shift)))]
[($fxmodulo)
(tbind ([a (Value (car arg*))]
[b (Value (cadr arg*))])
@ -1220,25 +1243,30 @@
(record-case c
[(constant i)
(if (fixnum? i)
(prm 'sll (Value a) (K i))
(tbind ([a (Value a)])
(prm 'sll a (K i)))
(error who "invalid arg to fxsll ~s" i))]
[else
(prm 'sll (Value a)
(prm 'sra (Value c) (K fixnum-shift)))]))]
(tbind ([a (Value a)] [c (Value c)])
(prm 'sll a (prm 'sra c (K fixnum-shift))))]))]
[($fxsra)
(let ([a (car arg*)] [c (cadr arg*)])
(record-case c
[(constant i)
(if (fixnum? i)
(prm 'sra (Value a) (K i))
(tbind ([a (Value a)])
(prm 'sra a (K i)))
(error who "invalid arg to fxsra ~s" i))]
[else
(prm 'logand
(prm 'sra (Value a)
(prm 'sra (Value c) (K fixnum-shift)))
(K (* -1 fixnum-scale)))]))]
(tbind ([a (Value a)] [c (Value c)])
(prm 'logand
(prm 'sra a
(prm 'sra c (K fixnum-shift)))
(K (* -1 fixnum-scale))))]))]
[($fxlogand)
(prm 'logand (Value (car arg*)) (Value (cadr arg*)))]
[(pointer-value)
(prm 'logand (Value (car arg*)) (K (* -1 fixnum-scale)))]
[($fxlogxor)
(prm 'logxor (Value (car arg*)) (Value (cadr arg*)))]
[($fxlogor)
@ -1246,16 +1274,18 @@
[($fxlognot)
(Value (prm '$fxlogxor (car arg*) (K -1)))]
[($char->fixnum)
(prm 'sra
(Value (car arg*))
(K (- char-shift fixnum-shift)))]
(tbind ([x (Value (car arg*))])
(prm 'sra x
(K (- char-shift fixnum-shift))))]
[($fixnum->char)
(prm 'logor
(prm 'sll (Value (car arg*))
(K (- char-shift fixnum-shift)))
(K char-tag))]
(tbind ([x (Value (car arg*))])
(prm 'logor
(prm 'sll x (K (- char-shift fixnum-shift)))
(K char-tag)))]
[($current-frame) ;; PCB NEXT-CONTINUATION
(prm 'mref pcr (K 20))]
[($arg-list) ;; PCB ARGS-LIST
(prm 'mref pcr (K 32))]
[($seal-frame-and-call)
(tbind ([proc (Value (car arg*))])
(tbind ([k (prm 'alloc
@ -1305,35 +1335,34 @@
(record-case a1
[(constant i)
(unless (fixnum? i) (err x))
(prm 'mref (Value a0)
(K (+ (- disp-closure-data closure-tag)
(* i wordsize))))]
(tbind ([a0 (Value a0)])
(prm 'mref a0
(K (+ (- disp-closure-data closure-tag)
(* i wordsize)))))]
[else (err x)]))]
[($vector-ref $record-ref)
(let ([a0 (car arg*)] [a1 (cadr arg*)])
(record-case a1
[(constant i)
(unless (fixnum? i) (err x))
(make-primcall 'mref
(list (Value a0)
(K (+ (- disp-vector-data vector-tag)
(* i wordsize)))))]
(tbind ([a0 (Value a0)])
(prm 'mref a0
(K (+ (- disp-vector-data vector-tag)
(* i wordsize)))))]
[else
(make-primcall 'mref
(list (make-primcall 'int+
(list (Value a0)
(Value a1)))
(K (- disp-vector-data vector-tag))))]))]
(tbind ([a0 (Value a0)] [a1 (Value a1)])
(prm 'mref (prm 'int+ a0 a1)
(K (- disp-vector-data vector-tag))))]))]
[($closure-code)
(prm 'int+
(prm 'mref
(Value (car arg*))
(K (- disp-closure-code closure-tag)))
(K (- vector-tag disp-code-data)))]
(tbind ([x (Value (car arg*))])
(prm 'int+
(prm 'mref x
(K (- disp-closure-code closure-tag)))
(K (- vector-tag disp-code-data))))]
[($code-freevars)
(prm 'mref
(Value (car arg*))
(K (- disp-code-freevars vector-tag)))]
(tbind ([x (Value (car arg*))])
(prm 'mref x
(K (- disp-code-freevars vector-tag))))]
[(top-level-value)
(let ([sym
(record-case (car arg*)
@ -1748,6 +1777,7 @@
[(codes code* body)
(make-codes (map Clambda code*) (Main body))]))
;;;
; (print-code x)
(Program x))
@ -2156,7 +2186,7 @@
(let ([i (actual-frame-size vars
(fx+ 2 (max-live live-fv* 0)))])
(assign-frame-vars! vars i)
(NFE (fxsub1 i) (make-mask i live-fv*) body)))]
(NFE (fxsub1 i) (make-mask (fxsub1 i) live-fv*) body)))]
[(ntcall) x]
[else (error who "invalid effect ~s" x)]))
(define (P x)
@ -2485,7 +2515,7 @@
'(byte 0)
LCALL
`(call %ebx)
;;ik_foreign_call adjusts fp back
`(addl ,(* (fxsub1 size) wordsize) ,fpr)
ac)]
[target ;;; known call
(list* `(subl ,(* (fxsub1 size) wordsize) ,fpr)

View File

@ -11,6 +11,7 @@
(primitive-set! 'call-with-values
($make-call-with-values-procedure))
(primitive-set! 'values
($make-values-procedure))
@ -28,14 +29,20 @@
(primitive-set! 'eof-object?
(lambda (x) (eof-object? x)))
(primitive-set! 'fxadd1
(lambda (n)
(fxadd1 n)))
(if (fixnum? n)
($fxadd1 n)
(error 'fxadd1 "~s is not a fixnum" n))))
(primitive-set! 'fxsub1
(lambda (n)
(fxsub1 n)))
(if (fixnum? n)
($fxsub1 n)
(error 'fxsub1 "~s is not a fixnum" n))))
(primitive-set! 'integer->char
(lambda (n)
(unless (fixnum? n)
@ -97,6 +104,7 @@
(fill! ($make-vector n) 0 n fill)]))
(primitive-set! 'make-vector make-vector))
(primitive-set! 'vector-length
(lambda (x)
(unless (vector? x)
@ -132,6 +140,7 @@
(error 'string-length "~s is not a string" x))
($string-length x)))
(primitive-set! 'string->list
(lambda (x)
(unless (string? x)
@ -192,6 +201,35 @@ description:
(strings=? s s* ($string-length s))
(err s))])))
(primitive-set! 'string-ref
(lambda (s i)
(unless (string? s)
(error 'string-ref "~s is not a string" s))
(unless (fixnum? i)
(error 'string-ref "~s is not a valid index" i))
(unless (and ($fx< i ($string-length s))
($fx<= 0 i))
(error 'string-ref "index ~s is out of range for ~s" i s))
($string-ref s i)))
(primitive-set! 'string-set!
(lambda (s i c)
(unless (string? s)
(error 'string-set! "~s is not a string" s))
(unless (fixnum? i)
(error 'string-set! "~s is not a valid index" i))
(unless (and ($fx< i ($string-length s))
($fx>= i 0))
(error 'string-set! "index ~s is out of range for ~s" i s))
(unless (char? c)
(error 'string-set! "~s is not a character" c))
($string-set! s i c)))
#|procedure:string-append
synopsis:
(string-append str ...)
@ -234,6 +272,9 @@ reference-implementation:
(let ([s ($make-string n)])
(fill-strings s s* 0))))))
#|procedure:substring
(substring str i j)
Returns a substring of str starting from index i (inclusive)
@ -267,17 +308,7 @@ reference-implementation:
(primitive-set! 'not
(lambda (x) (if x #f #t)))
(primitive-set! 'symbol->string
(lambda (x)
(unless (symbol? x)
(error 'symbol->string "~s is not a symbol" x))
(let ([str ($symbol-string x)])
(or str
(let ([ct (gensym-count)])
(let ([str (string-append (gensym-prefix) (fixnum->string ct))])
($set-symbol-string! x str)
(gensym-count ($fxadd1 ct))
str))))))
(primitive-set! 'gensym?
(lambda (x)
@ -285,37 +316,6 @@ reference-implementation:
(let ([s ($symbol-unique-string x)])
(and s #t)))))
(let ()
(define f
(lambda (n i j)
(cond
[($fxzero? n)
(values (make-string i) j)]
[else
(let ([q ($fxquotient n 10)])
(call-with-values
(lambda () (f q ($fxadd1 i) j))
(lambda (str j)
(let ([r ($fx- n ($fx* q 10))])
(string-set! str j
($fixnum->char ($fx+ r ($char->fixnum #\0))))
(values str ($fxadd1 j))))))])))
(primitive-set! 'fixnum->string
(lambda (x)
(unless (fixnum? x) (error 'fixnum->string "~s is not a fixnum" x))
(cond
[($fxzero? x) "0"]
[($fx> x 0)
(call-with-values
(lambda () (f x 0 0))
(lambda (str j) str))]
[($fx= x -536870912) "-536870912"]
[else
(call-with-values
(lambda () (f ($fx- 0 x) 1 1))
(lambda (str j)
($string-set! str 0 #\-)
str))]))))
;;; OLD (primitive-set! 'top-level-value
;;; OLD (lambda (x)
@ -366,13 +366,14 @@ reference-implementation:
(primitive-set! x v)
(set-top-level-value! x v)))
(primitive-set! 'fx+
(lambda (x y)
(fx+ x y)))
(unless (fixnum? x)
(error 'fx+ "~s is not a fixnum" x))
(unless (fixnum? y)
(error 'fx+ "~s is not a fixnum" y))
($fx+ x y)))
(primitive-set! 'fx-
(lambda (x y)
@ -381,7 +382,8 @@ reference-implementation:
(unless (fixnum? y)
(error 'fx- "~s is not a fixnum" y))
($fx- x y)))
(primitive-set! 'fx*
(lambda (x y)
(unless (fixnum? x)
@ -390,8 +392,6 @@ reference-implementation:
(error 'fx* "~s is not a fixnum" y))
($fx* x y)))
(primitive-set! 'fxquotient
(lambda (x y)
(unless (fixnum? x)
@ -402,7 +402,6 @@ reference-implementation:
(error 'fxquotient "zero dividend ~s" y))
($fxquotient x y)))
(primitive-set! 'fxremainder
(lambda (x y)
(unless (fixnum? x)
@ -414,7 +413,6 @@ reference-implementation:
(let ([q ($fxquotient x y)])
($fx- x ($fx* q y)))))
(primitive-set! 'fxmodulo
(lambda (x y)
(unless (fixnum? x)
@ -425,7 +423,6 @@ reference-implementation:
(error 'fxmodulo "zero dividend ~s" y))
($fxmodulo x y)))
(primitive-set! 'fxlogor
(lambda (x y)
(unless (fixnum? x)
@ -450,6 +447,7 @@ reference-implementation:
(error 'fxlogand "~s is not a fixnum" y))
($fxlogand x y)))
(primitive-set! 'fxsra
(lambda (x y)
(unless (fixnum? x)
@ -697,6 +695,14 @@ reference-implementation:
(err c2)))))
(err c1))])))
(primitive-set! '$memq
(lambda (x ls)
(let f ([x x] [ls ls])
(and (pair? ls)
(if (eq? x (car ls))
ls
(f x (cdr ls)))))))
(primitive-set! 'char-whitespace?
(lambda (c)
(cond
@ -765,16 +771,6 @@ reference-implementation:
(error 'vector-ref "index ~s is out of range for ~s" i v))
($vector-ref v i)))
(primitive-set! 'string-ref
(lambda (s i)
(unless (string? s)
(error 'string-ref "~s is not a string" s))
(unless (fixnum? i)
(error 'string-ref "~s is not a valid index" i))
(unless (and ($fx< i ($string-length s))
($fx<= 0 i))
(error 'string-ref "index ~s is out of range for ~s" i s))
($string-ref s i)))
(primitive-set! 'vector-set!
(lambda (v i c)
@ -788,18 +784,6 @@ reference-implementation:
($vector-set! v i c)))
(primitive-set! 'string-set!
(lambda (s i c)
(unless (string? s)
(error 'string-set! "~s is not a string" s))
(unless (fixnum? i)
(error 'string-set! "~s is not a valid index" i))
(unless (and ($fx< i ($string-length s))
($fx>= i 0))
(error 'string-set! "index ~s is out of range for ~s" i s))
(unless (char? c)
(error 'string-set! "~s is not a character" c))
($string-set! s i c)))
(primitive-set! 'vector
;;; FIXME: add case-lambda
@ -889,15 +873,6 @@ reference-implementation:
(race d d x x))
(error 'last-pair "~s is not a pair" x)))))
(primitive-set! '$memq
(lambda (x ls)
(let f ([x x] [ls ls])
(and (pair? ls)
(if (eq? x (car ls))
ls
(f x (cdr ls)))))))
(primitive-set! 'memq
(letrec ([race
(lambda (h t ls x)
@ -1033,43 +1008,9 @@ reference-implementation:
(f list index)))
(primitive-set! 'apply
(let ()
(define (err f ls)
(if (procedure? f)
(error 'apply "not a list")
(error 'apply "~s is not a procedure" f)))
(define (fixandgo f a0 a1 ls p d)
(cond
[(null? ($cdr d))
(let ([last ($car d)])
($set-cdr! p last)
(if (and (procedure? f) (list? last))
($$apply f a0 a1 ls)
(err f last)))]
[else (fixandgo f a0 a1 ls d ($cdr d))]))
(define apply
(case-lambda
[(f ls)
(if (and (procedure? f) (list? ls))
($$apply f ls)
(err f ls))]
[(f a0 ls)
(if (and (procedure? f) (list? ls))
($$apply f a0 ls)
(err f ls))]
[(f a0 a1 ls)
(if (and (procedure? f) (list? ls))
($$apply f a0 a1 ls)
(err f ls))]
[(f a0 a1 . ls)
(fixandgo f a0 a1 ls ls ($cdr ls))]))
apply))
(primitive-set! 'assq
(letrec ([race
(lambda (x h t ls)
@ -1224,7 +1165,6 @@ reference-implementation:
(f ($symbol-plist x) '()))))
(let ()
(define vector-loop
(lambda (x y i n)
@ -1259,6 +1199,41 @@ reference-implementation:
(primitive-set! 'equal? equal?))
(primitive-set! 'apply
(let ()
(define (err f ls)
(if (procedure? f)
(error 'apply "not a list")
(error 'apply "~s is not a procedure" f)))
(define (fixandgo f a0 a1 ls p d)
(cond
[(null? ($cdr d))
(let ([last ($car d)])
($set-cdr! p last)
(if (and (procedure? f) (list? last))
($$apply f a0 a1 ls)
(err f last)))]
[else (fixandgo f a0 a1 ls d ($cdr d))]))
(define apply
(case-lambda
[(f ls)
(if (and (procedure? f) (list? ls))
($$apply f ls)
(err f ls))]
[(f a0 ls)
(if (and (procedure? f) (list? ls))
($$apply f a0 ls)
(err f ls))]
[(f a0 a1 ls)
(if (and (procedure? f) (list? ls))
($$apply f a0 a1 ls)
(err f ls))]
[(f a0 a1 . ls)
(fixandgo f a0 a1 ls ls ($cdr ls))]))
apply))
(let ()
(define who 'map)
(define len
@ -1712,7 +1687,7 @@ reference-implementation:
(let ([us ($symbol-unique-string x)])
(cond
[(string? us) us]
[(eq? us #t)
[(not us)
(error 'gensym->unique-string "~s is not a gensym" x)]
[else
(let f ([x x])
@ -1722,6 +1697,9 @@ reference-implementation:
[(foreign-call "ikrt_intern_gensym" x) id]
[else (f x)])))]))))
(primitive-set! 'gensym-prefix
(make-parameter
"g"
@ -1746,21 +1724,6 @@ reference-implementation:
(error 'print-gensym "~s is not in #t|#f|pretty" x))
x)))
;; X (primitive-set! 'make-hash-table
;; X (lambda ()
;; X (make-hash-table)))
;; X
;; X (primitive-set! 'hash-table?
;; X (lambda (x)
;; X (hash-table? x)))
;; X
;; X (primitive-set! 'get-hash-table
;; X (lambda (h k v)
;; X (foreign-call "ik_get_hash_table" h k v)))
;; X
;; X (primitive-set! 'put-hash-table!
;; X (lambda (h k v)
;; X (foreign-call "ik_put_hash_table" h k v)))
(primitive-set! 'bwp-object?
(lambda (x)
@ -1804,6 +1767,55 @@ reference-implementation:
x
(error 'command-list "invalid command-line-arguments ~s\n" x)))))
(let ()
(define f
(lambda (n i j)
(cond
[($fxzero? n)
(values (make-string i) j)]
[else
(let ([q ($fxquotient n 10)])
(call-with-values
(lambda () (f q ($fxadd1 i) j))
(lambda (str j)
(let ([r ($fx- n ($fx* q 10))])
(string-set! str j
($fixnum->char ($fx+ r ($char->fixnum #\0))))
(values str ($fxadd1 j))))))])))
(primitive-set! 'fixnum->string
(lambda (x)
(unless (fixnum? x) (error 'fixnum->string "~s is not a fixnum" x))
(cond
[($fxzero? x) "0"]
[($fx> x 0)
(call-with-values
(lambda () (f x 0 0))
(lambda (str j) str))]
[($fx= x -536870912) "-536870912"]
[else
(call-with-values
(lambda () (f ($fx- 0 x) 1 1))
(lambda (str j)
($string-set! str 0 #\-)
str))]))))
(primitive-set! 'symbol->string
(lambda (x)
(unless (symbol? x)
(error 'symbol->string "~s is not a symbol" x))
(let ([str ($symbol-string x)])
(or str
(let ([ct (gensym-count)])
(let ([str (string-append (gensym-prefix) (fixnum->string ct))])
($set-symbol-string! x str)
(gensym-count ($fxadd1 ct))
str))))))
(primitive-set! 'string->number
(lambda (x)
(define (convert-data str len pos? idx ac)
@ -1849,3 +1861,4 @@ reference-implementation:
(convert-sign x ($string-length x))]
[else (error 'string->number "~s is not a string" x)])))
#!eof

View File

@ -374,6 +374,8 @@
(cond
[(and (imm8? a0) (reg? a1))
(CODE c (ModRM 1 /d a1 (IMM8 a0 ac)))]
[(and (imm8? a1) (reg? a0))
(CODE c (ModRM 1 /d a0 (IMM8 a1 ac)))]
[(and (reg? a0) (reg? a1))
(CODE c (ModRM 1 /d '/4 (SIB 0 a0 a1 (IMM8 0 ac))))]
[else (error 'CODE/digit "unhandled ~s ~s" a0 a1)])))]
@ -536,6 +538,8 @@
(CODE #x29 (ModRM 3 src dst ac))]
[(and (mem? src) (reg? dst))
(CODErd #x2B dst src ac)]
[(and (reg? src) (mem? dst))
((CODE/digit #x29 src) dst ac)]
[else (error who "invalid ~s" instr)])]
[(sall src dst)
(cond
@ -872,6 +876,7 @@
(lambda (thunk?-label code vec)
(define reloc-idx 0)
(lambda (r)
;(printf "r=~s\n" r)
(let ([idx (car r)] [type (cadr r)]
[v
(let ([v (cddr r)])