<magnus--> http://www.caddr.com/macho/archives/sbcl-devel/2005-3/4764.html\r
<magnus--> http://clozure.com/cgi-bin/viewcvs.cgi/ccl/lisp-kernel/lisp-exceptions.c?rev=1.9&content-type=text/vnd.viewcvs-markup\r
\r
+- make head? tail? more efficient with slices\r
- fix ceiling\r
- single-stepper and variable access: wrong namespace?\r
- investigate if COPYING_GEN needs a fix\r
- faster layout\r
- keep alive\r
- sleep word\r
-- redo new compiler backend for PowerPC\r
+- fix fixnum<< overflow on PowerPC\r
- fix i/o on generic x86/ppc unix\r
- alien primitives need a more general input type\r
- 2map slow with lists\r
+ compiler:\r
\r
- simplifier:\r
- - kill tag-fixnum/untag-fixnum\r
- kill replace after a peek\r
- merge inc-d's across VOPs that don't touch the stack\r
- [ EAX 0 ] --> [ EAX ]\r
1 %dec-d ,
] "intrinsic" set-word-prop
-: binary-op-reg ( op out -- )
- >r in-2
- 1 %dec-d ,
- >r 1 <vreg> 0 <vreg> 0 <vreg> r> execute ,
- r> 0 %replace-d , ;
+GENERIC: load-value ( vreg n value -- )
+
+M: computed load-value ( vreg n value -- )
+ drop %peek-d , ;
+
+M: literal load-value ( vreg n value -- )
+ nip literal-value %immediate , ;
+
+: value/vreg-list ( in -- list )
+ [ 0 swap length 1 - ] keep
+ [ >r 2dup r> 3list >r 1 - >r 1 + r> r> ] map 2nip ;
+
+: values>vregs ( in -- in )
+ value/vreg-list
+ dup [ 3unlist load-value ] each
+ [ car <vreg> ] map ;
+
+: load-inputs ( node -- in )
+ dup node-in-d values>vregs
+ [ length swap node-out-d length - %dec-d , ] keep ;
+
+: binary-op-reg ( node op -- )
+ >r load-inputs 2unlist swap dup r> execute ,
+ 0 0 %replace-d , ; inline
: literal-fixnum? ( value -- ? )
dup literal? [ literal-value fixnum? ] [ drop f ] ifte ;
-: binary-op-imm ( node imm op out -- )
- >r >r 1 %dec-d ,
- in-1
- 0 <vreg> dup r> execute ,
- r> 0 %replace-d , ;
+: binary-op-imm ( imm op -- )
+ 1 %dec-d , in-1
+ >r 0 <vreg> dup r> execute ,
+ 0 0 %replace-d , ; inline
-: binary-op ( node op out -- )
+: binary-op ( node op -- )
#! out is a vreg where the vop stores the result.
fixnum-imm? [
- >r >r node-peek dup literal-fixnum? [
- literal-value r> r> binary-op-imm
+ >r dup node-peek dup literal-fixnum? [
+ literal-value r> binary-op-imm drop
] [
- drop r> r> binary-op-reg
+ drop r> binary-op-reg
] ifte
] [
- binary-op-reg drop
+ binary-op-reg
] ifte ;
[
[[ fixnum> %fixnum> ]]
[[ eq? %eq? ]]
] [
- uncons [ literal, 0 , \ binary-op , ] make-list
+ uncons [ literal, \ binary-op , ] make-list
"intrinsic" set-word-prop
] each
-: slow-fixnum* \ %fixnum* 0 binary-op-reg ;
+: fast-fixnum* ( n -- )
+ 1 %dec-d ,
+ in-1
+ log2 0 <vreg> 0 <vreg> %fixnum<< ,
+ 0 0 %replace-d , ;
+
+: slow-fixnum* ( node -- ) \ %fixnum* binary-op-reg ;
\ fixnum* [
! Turn multiplication by a power of two into a left shift.
- node-peek dup literal-fixnum? [
+ dup node-peek dup literal-fixnum? [
literal-value dup power-of-2? [
- 1 %dec-d ,
- in-1
- log2 0 <vreg> 0 <vreg> %fixnum<< ,
- 0 0 %replace-d ,
+ nip fast-fixnum*
] [
drop slow-fixnum*
] ifte
\ fixnum/i t "intrinsic" set-word-prop
\ fixnum/i [
- drop \ %fixnum/i 0 binary-op-reg
+ \ %fixnum/i binary-op-reg
] "intrinsic" set-word-prop
\ fixnum/mod [
] ifte
] ifte ;
+: operands= ( vop vop -- ? )
+ over vop-inputs over vop-inputs =
+ >r swap vop-outputs swap vop-outputs = r> and ;
+
+: cancel ( linear class -- linear ? )
+ dupd next-physical?
+ [ over first operands= [ cdr cdr t ] [ f ] ifte ]
+ [ drop f ] ifte ;
+
+M: %tag-fixnum simplify-node ( linear vop -- linear ? )
+ drop \ %untag-fixnum cancel ;
+
: basic-block ( linear quot -- | quot: vop -- ? )
#! Keep applying the quotation to each VOP until either a
#! VOP answering f to basic-block?, or the quotation answers