2005-05-06 18:33:40 -04:00
|
|
|
! Copyright (C) 2004, 2005 Slava Pestov.
|
|
|
|
! See http://factor.sf.net/license.txt for BSD license.
|
2005-05-09 02:34:15 -04:00
|
|
|
IN: compiler-backend
|
2005-05-16 17:01:39 -04:00
|
|
|
USING: errors generic hashtables kernel lists math namespaces
|
2005-07-27 20:13:11 -04:00
|
|
|
parser sequences vectors words ;
|
2005-05-06 18:33:40 -04:00
|
|
|
|
|
|
|
! The linear IR is the second of the two intermediate
|
|
|
|
! representations used by Factor. It is basically a high-level
|
|
|
|
! assembly language. Linear IR operations are called VOPs.
|
|
|
|
|
2005-05-08 20:30:38 -04:00
|
|
|
! This file defines all the types of VOPs. A linear IR program
|
|
|
|
! is then just a list of VOPs.
|
|
|
|
|
2005-05-09 02:34:15 -04:00
|
|
|
: <label> ( -- label )
|
|
|
|
#! Make a label.
|
|
|
|
gensym dup t "label" set-word-prop ;
|
|
|
|
|
|
|
|
: label? ( obj -- ? )
|
|
|
|
dup word? [ "label" word-prop ] [ drop f ] ifte ;
|
|
|
|
|
2005-09-08 22:23:54 -04:00
|
|
|
! A location is a virtual register or a stack slot. We can
|
|
|
|
! ask a VOP if it reads or writes a location.
|
|
|
|
|
2005-05-06 18:33:40 -04:00
|
|
|
! A virtual register
|
|
|
|
TUPLE: vreg n ;
|
|
|
|
|
2005-06-14 05:01:07 -04:00
|
|
|
! Register classes
|
|
|
|
TUPLE: int-regs ;
|
2005-06-14 20:54:11 -04:00
|
|
|
TUPLE: float-regs size ;
|
2005-06-14 05:01:07 -04:00
|
|
|
|
2005-09-08 22:23:54 -04:00
|
|
|
! A data stack location.
|
|
|
|
TUPLE: ds-loc n ;
|
|
|
|
|
|
|
|
! A call stack location.
|
|
|
|
TUPLE: cs-loc n ;
|
|
|
|
|
2005-05-06 18:33:40 -04:00
|
|
|
! A virtual operation
|
2005-05-16 17:01:39 -04:00
|
|
|
TUPLE: vop inputs outputs label ;
|
2005-09-08 22:23:54 -04:00
|
|
|
: vop-in ( vop n -- input ) swap vop-inputs nth ;
|
|
|
|
: set-vop-in ( input vop n -- ) swap vop-inputs set-nth ;
|
|
|
|
: vop-out ( vop n -- input ) swap vop-outputs nth ;
|
|
|
|
: set-vop-out ( input vop n -- ) swap vop-outputs set-nth ;
|
2005-05-06 18:33:40 -04:00
|
|
|
|
2005-05-16 17:01:39 -04:00
|
|
|
GENERIC: basic-block? ( vop -- ? )
|
|
|
|
M: vop basic-block? drop f ;
|
|
|
|
! simplifies some code
|
|
|
|
M: f basic-block? drop f ;
|
2005-05-09 02:34:15 -04:00
|
|
|
|
2005-05-16 17:01:39 -04:00
|
|
|
: make-vop ( inputs outputs label vop -- vop )
|
2005-05-06 18:33:40 -04:00
|
|
|
[ >r <vop> r> set-delegate ] keep ;
|
|
|
|
|
2005-05-16 17:01:39 -04:00
|
|
|
: empty-vop f f f ;
|
|
|
|
: label-vop ( label) >r f f r> ;
|
2005-07-27 20:13:11 -04:00
|
|
|
: label/src-vop ( label src) 1vector swap f swap ;
|
2005-08-22 15:33:18 -04:00
|
|
|
: src-vop ( src) 1vector f f ;
|
|
|
|
: dest-vop ( dest) 1vector dup f ;
|
2005-07-27 20:13:11 -04:00
|
|
|
: src/dest-vop ( src dest) >r 1vector r> 1vector f ;
|
|
|
|
: 2-in-vop ( in1 in2) 2vector f f ;
|
|
|
|
: 3-in-vop ( in1 in2 in3) 3vector f f ;
|
|
|
|
: 2-in/label-vop ( in1 in2 label) >r 2vector f r> ;
|
|
|
|
: 2-vop ( in dest) [ 2vector ] keep 1vector f ;
|
|
|
|
: 3-vop ( in1 in2 dest) >r 2vector r> 1vector f ;
|
2005-05-06 18:33:40 -04:00
|
|
|
|
|
|
|
! miscellanea
|
2005-06-12 03:38:57 -04:00
|
|
|
TUPLE: %prologue ;
|
|
|
|
C: %prologue make-vop ;
|
2005-05-06 18:33:40 -04:00
|
|
|
: %prologue empty-vop <%prologue> ;
|
2005-05-16 17:01:39 -04:00
|
|
|
|
2005-06-12 03:38:57 -04:00
|
|
|
TUPLE: %label ;
|
|
|
|
C: %label make-vop ;
|
2005-05-06 18:33:40 -04:00
|
|
|
: %label label-vop <%label> ;
|
2005-05-09 02:34:15 -04:00
|
|
|
|
|
|
|
! Return vops take a label that is ignored, to have the
|
|
|
|
! same stack effect as jumps. This is needed for the
|
|
|
|
! simplifier.
|
2005-06-12 03:38:57 -04:00
|
|
|
TUPLE: %return ;
|
|
|
|
C: %return make-vop ;
|
2005-05-09 02:34:15 -04:00
|
|
|
: %return ( label) label-vop <%return> ;
|
|
|
|
|
2005-06-12 03:38:57 -04:00
|
|
|
TUPLE: %return-to ;
|
|
|
|
C: %return-to make-vop ;
|
2005-05-06 18:33:40 -04:00
|
|
|
: %return-to label-vop <%return-to> ;
|
2005-05-16 17:01:39 -04:00
|
|
|
|
2005-06-12 03:38:57 -04:00
|
|
|
TUPLE: %jump ;
|
|
|
|
C: %jump make-vop ;
|
2005-05-06 18:33:40 -04:00
|
|
|
: %jump label-vop <%jump> ;
|
2005-05-16 17:01:39 -04:00
|
|
|
|
2005-06-12 03:38:57 -04:00
|
|
|
TUPLE: %jump-label ;
|
|
|
|
C: %jump-label make-vop ;
|
2005-05-06 18:33:40 -04:00
|
|
|
: %jump-label label-vop <%jump-label> ;
|
2005-05-16 17:01:39 -04:00
|
|
|
|
2005-06-12 03:38:57 -04:00
|
|
|
TUPLE: %call ;
|
|
|
|
C: %call make-vop ;
|
2005-05-06 18:33:40 -04:00
|
|
|
: %call label-vop <%call> ;
|
2005-05-16 17:01:39 -04:00
|
|
|
|
2005-06-12 03:38:57 -04:00
|
|
|
TUPLE: %call-label ;
|
|
|
|
C: %call-label make-vop ;
|
2005-05-06 18:33:40 -04:00
|
|
|
: %call-label label-vop <%call-label> ;
|
2005-05-16 17:01:39 -04:00
|
|
|
|
2005-06-12 03:38:57 -04:00
|
|
|
TUPLE: %jump-t ;
|
|
|
|
C: %jump-t make-vop ;
|
2005-05-06 18:33:40 -04:00
|
|
|
: %jump-t <vreg> label/src-vop <%jump-t> ;
|
2005-05-16 17:01:39 -04:00
|
|
|
|
2005-06-12 03:38:57 -04:00
|
|
|
TUPLE: %jump-f ;
|
|
|
|
C: %jump-f make-vop ;
|
2005-05-06 18:33:40 -04:00
|
|
|
: %jump-f <vreg> label/src-vop <%jump-f> ;
|
|
|
|
|
|
|
|
! dispatch tables
|
2005-06-12 03:38:57 -04:00
|
|
|
TUPLE: %dispatch ;
|
|
|
|
C: %dispatch make-vop ;
|
2005-05-06 19:49:07 -04:00
|
|
|
: %dispatch <vreg> src-vop <%dispatch> ;
|
2005-05-16 17:01:39 -04:00
|
|
|
|
2005-06-12 03:38:57 -04:00
|
|
|
TUPLE: %target-label ;
|
|
|
|
C: %target-label make-vop ;
|
2005-05-06 18:33:40 -04:00
|
|
|
: %target-label label-vop <%target-label> ;
|
2005-05-16 17:01:39 -04:00
|
|
|
|
2005-06-12 03:38:57 -04:00
|
|
|
TUPLE: %target ;
|
|
|
|
C: %target make-vop ;
|
2005-05-06 18:33:40 -04:00
|
|
|
: %target label-vop <%target> ;
|
2005-05-16 17:01:39 -04:00
|
|
|
|
2005-06-12 03:38:57 -04:00
|
|
|
TUPLE: %end-dispatch ;
|
|
|
|
C: %end-dispatch make-vop ;
|
2005-05-06 18:33:40 -04:00
|
|
|
: %end-dispatch empty-vop <%end-dispatch> ;
|
|
|
|
|
|
|
|
! stack operations
|
2005-06-12 03:38:57 -04:00
|
|
|
TUPLE: %peek-d ;
|
|
|
|
C: %peek-d make-vop ;
|
2005-09-08 22:23:54 -04:00
|
|
|
|
|
|
|
: %peek-d ( vreg n -- vop )
|
|
|
|
<ds-loc> swap <vreg> src/dest-vop <%peek-d> ;
|
|
|
|
|
2005-05-16 17:01:39 -04:00
|
|
|
M: %peek-d basic-block? drop t ;
|
|
|
|
|
2005-06-12 03:38:57 -04:00
|
|
|
TUPLE: %replace-d ;
|
|
|
|
C: %replace-d make-vop ;
|
2005-09-08 22:23:54 -04:00
|
|
|
|
|
|
|
: %replace-d ( vreg n -- vop )
|
|
|
|
<ds-loc> swap <vreg> swap src/dest-vop <%replace-d> ;
|
|
|
|
|
2005-05-16 17:01:39 -04:00
|
|
|
M: %replace-d basic-block? drop t ;
|
|
|
|
|
2005-06-12 03:38:57 -04:00
|
|
|
TUPLE: %inc-d ;
|
|
|
|
C: %inc-d make-vop ;
|
2005-09-04 17:07:59 -04:00
|
|
|
: %inc-d ( n -- node ) src-vop <%inc-d> ;
|
2005-05-16 17:01:39 -04:00
|
|
|
|
2005-09-08 22:23:54 -04:00
|
|
|
M: %inc-d basic-block? drop t ;
|
2005-09-04 17:07:59 -04:00
|
|
|
|
2005-06-12 03:38:57 -04:00
|
|
|
TUPLE: %immediate ;
|
|
|
|
C: %immediate make-vop ;
|
2005-09-08 22:23:54 -04:00
|
|
|
|
2005-09-07 22:50:08 -04:00
|
|
|
: %immediate ( vreg obj -- vop )
|
2005-05-16 17:01:39 -04:00
|
|
|
swap <vreg> src/dest-vop <%immediate> ;
|
2005-09-08 22:23:54 -04:00
|
|
|
|
2005-05-16 17:01:39 -04:00
|
|
|
M: %immediate basic-block? drop t ;
|
|
|
|
|
2005-06-12 03:38:57 -04:00
|
|
|
TUPLE: %peek-r ;
|
|
|
|
C: %peek-r make-vop ;
|
2005-09-08 22:23:54 -04:00
|
|
|
|
|
|
|
: %peek-r ( vreg n -- vop )
|
|
|
|
<cs-loc> swap <vreg> src/dest-vop <%peek-r> ;
|
|
|
|
|
|
|
|
M: %peek-r basic-block? drop t ;
|
2005-05-16 17:01:39 -04:00
|
|
|
|
2005-06-12 03:38:57 -04:00
|
|
|
TUPLE: %replace-r ;
|
|
|
|
C: %replace-r make-vop ;
|
2005-09-08 22:23:54 -04:00
|
|
|
|
|
|
|
: %replace-r ( vreg n -- vop )
|
|
|
|
<cs-loc> swap <vreg> swap src/dest-vop <%replace-r> ;
|
|
|
|
|
|
|
|
M: %replace-r basic-block? drop t ;
|
2005-05-16 17:01:39 -04:00
|
|
|
|
2005-06-12 03:38:57 -04:00
|
|
|
TUPLE: %inc-r ;
|
2005-09-08 22:23:54 -04:00
|
|
|
|
2005-06-12 03:38:57 -04:00
|
|
|
C: %inc-r make-vop ;
|
2005-09-04 17:07:59 -04:00
|
|
|
|
2005-05-16 17:01:39 -04:00
|
|
|
: %inc-r ( n -- ) src-vop <%inc-r> ;
|
|
|
|
|
2005-09-08 22:23:54 -04:00
|
|
|
M: %inc-r basic-block? drop t ;
|
2005-05-06 18:33:40 -04:00
|
|
|
|
|
|
|
: in-1 0 0 %peek-d , ;
|
2005-05-07 22:39:00 -04:00
|
|
|
: in-2 0 1 %peek-d , 1 0 %peek-d , ;
|
|
|
|
: in-3 0 2 %peek-d , 1 1 %peek-d , 2 0 %peek-d , ;
|
2005-05-06 18:33:40 -04:00
|
|
|
: out-1 0 0 %replace-d , ;
|
|
|
|
|
|
|
|
! indirect load of a literal through a table
|
2005-06-12 03:38:57 -04:00
|
|
|
TUPLE: %indirect ;
|
|
|
|
C: %indirect make-vop ;
|
2005-05-16 17:01:39 -04:00
|
|
|
: %indirect ( vreg obj -- )
|
|
|
|
swap <vreg> src/dest-vop <%indirect> ;
|
|
|
|
M: %indirect basic-block? drop t ;
|
2005-05-06 18:33:40 -04:00
|
|
|
|
|
|
|
! object slot accessors
|
2005-05-08 00:21:00 -04:00
|
|
|
! mask off a tag (see also %untag-fixnum)
|
2005-06-12 03:38:57 -04:00
|
|
|
TUPLE: %untag ;
|
|
|
|
C: %untag make-vop ;
|
2005-05-07 22:39:00 -04:00
|
|
|
: %untag <vreg> dest-vop <%untag> ;
|
2005-05-16 17:01:39 -04:00
|
|
|
M: %untag basic-block? drop t ;
|
|
|
|
|
2005-06-12 03:38:57 -04:00
|
|
|
TUPLE: %slot ;
|
|
|
|
C: %slot make-vop ;
|
2005-06-03 00:47:00 -04:00
|
|
|
: %slot ( n vreg ) >r <vreg> r> <vreg> 2-vop <%slot> ;
|
2005-05-16 17:01:39 -04:00
|
|
|
M: %slot basic-block? drop t ;
|
2005-05-06 18:33:40 -04:00
|
|
|
|
2005-06-12 03:38:57 -04:00
|
|
|
TUPLE: %set-slot ;
|
|
|
|
C: %set-slot make-vop ;
|
2005-05-16 17:01:39 -04:00
|
|
|
: %set-slot ( value obj n )
|
|
|
|
#! %set-slot writes to vreg n.
|
2005-07-27 20:13:11 -04:00
|
|
|
>r >r <vreg> r> <vreg> r> <vreg> 3vector dup second f
|
2005-05-16 17:01:39 -04:00
|
|
|
<%set-slot> ;
|
|
|
|
M: %set-slot basic-block? drop t ;
|
2005-05-06 18:33:40 -04:00
|
|
|
|
2005-05-06 19:49:07 -04:00
|
|
|
! in the 'fast' versions, the object's type and slot number is
|
2005-05-06 18:33:40 -04:00
|
|
|
! known at compile time, so these become a single instruction
|
2005-06-12 03:38:57 -04:00
|
|
|
TUPLE: %fast-slot ;
|
|
|
|
C: %fast-slot make-vop ;
|
2005-05-16 17:01:39 -04:00
|
|
|
: %fast-slot ( vreg n )
|
2005-06-03 00:47:00 -04:00
|
|
|
swap <vreg> 2-vop <%fast-slot> ;
|
2005-05-16 17:01:39 -04:00
|
|
|
M: %fast-slot basic-block? drop t ;
|
|
|
|
|
2005-06-12 03:38:57 -04:00
|
|
|
TUPLE: %fast-set-slot ;
|
|
|
|
C: %fast-set-slot make-vop ;
|
2005-05-16 17:01:39 -04:00
|
|
|
: %fast-set-slot ( value obj n )
|
|
|
|
#! %fast-set-slot writes to vreg obj.
|
2005-08-22 15:33:18 -04:00
|
|
|
>r >r <vreg> r> <vreg> r> over >r 3vector r> 1vector f
|
2005-05-16 17:01:39 -04:00
|
|
|
<%fast-set-slot> ;
|
|
|
|
M: %fast-set-slot basic-block? drop t ;
|
2005-05-06 19:49:07 -04:00
|
|
|
|
2005-06-12 03:38:57 -04:00
|
|
|
TUPLE: %write-barrier ;
|
|
|
|
C: %write-barrier make-vop ;
|
2005-08-22 15:33:18 -04:00
|
|
|
: %write-barrier ( ptr ) <vreg> dest-vop <%write-barrier> ;
|
2005-06-04 02:20:54 -04:00
|
|
|
|
2005-05-06 19:49:07 -04:00
|
|
|
! fixnum intrinsics
|
2005-06-12 03:38:57 -04:00
|
|
|
TUPLE: %fixnum+ ;
|
|
|
|
C: %fixnum+ make-vop ; : %fixnum+ 3-vop <%fixnum+> ;
|
|
|
|
TUPLE: %fixnum- ;
|
|
|
|
C: %fixnum- make-vop ; : %fixnum- 3-vop <%fixnum-> ;
|
|
|
|
TUPLE: %fixnum* ;
|
|
|
|
C: %fixnum* make-vop ; : %fixnum* 3-vop <%fixnum*> ;
|
|
|
|
TUPLE: %fixnum-mod ;
|
|
|
|
C: %fixnum-mod make-vop ; : %fixnum-mod 3-vop <%fixnum-mod> ;
|
|
|
|
TUPLE: %fixnum/i ;
|
|
|
|
C: %fixnum/i make-vop ; : %fixnum/i 3-vop <%fixnum/i> ;
|
|
|
|
TUPLE: %fixnum/mod ;
|
|
|
|
C: %fixnum/mod make-vop ; : %fixnum/mod f <%fixnum/mod> ;
|
2005-09-08 22:23:54 -04:00
|
|
|
|
2005-06-12 03:38:57 -04:00
|
|
|
TUPLE: %fixnum-bitand ;
|
|
|
|
C: %fixnum-bitand make-vop ; : %fixnum-bitand 3-vop <%fixnum-bitand> ;
|
2005-09-08 22:23:54 -04:00
|
|
|
M: %fixnum-bitand basic-block? drop t ;
|
|
|
|
|
2005-06-12 03:38:57 -04:00
|
|
|
TUPLE: %fixnum-bitor ;
|
|
|
|
C: %fixnum-bitor make-vop ; : %fixnum-bitor 3-vop <%fixnum-bitor> ;
|
2005-09-08 22:23:54 -04:00
|
|
|
M: %fixnum-bitor basic-block? drop t ;
|
|
|
|
|
2005-06-12 03:38:57 -04:00
|
|
|
TUPLE: %fixnum-bitxor ;
|
|
|
|
C: %fixnum-bitxor make-vop ; : %fixnum-bitxor 3-vop <%fixnum-bitxor> ;
|
2005-09-08 22:23:54 -04:00
|
|
|
M: %fixnum-bitxor basic-block? drop t ;
|
|
|
|
|
2005-06-12 03:38:57 -04:00
|
|
|
TUPLE: %fixnum-bitnot ;
|
|
|
|
C: %fixnum-bitnot make-vop ; : %fixnum-bitnot 2-vop <%fixnum-bitnot> ;
|
2005-09-08 22:23:54 -04:00
|
|
|
M: %fixnum-bitnot basic-block? drop t ;
|
2005-06-12 03:38:57 -04:00
|
|
|
|
|
|
|
TUPLE: %fixnum<= ;
|
|
|
|
C: %fixnum<= make-vop ; : %fixnum<= 3-vop <%fixnum<=> ;
|
|
|
|
TUPLE: %fixnum< ;
|
|
|
|
C: %fixnum< make-vop ; : %fixnum< 3-vop <%fixnum<> ;
|
|
|
|
TUPLE: %fixnum>= ;
|
|
|
|
C: %fixnum>= make-vop ; : %fixnum>= 3-vop <%fixnum>=> ;
|
|
|
|
TUPLE: %fixnum> ;
|
|
|
|
C: %fixnum> make-vop ; : %fixnum> 3-vop <%fixnum>> ;
|
|
|
|
TUPLE: %eq? ;
|
|
|
|
C: %eq? make-vop ; : %eq? 3-vop <%eq?> ;
|
2005-05-07 22:39:00 -04:00
|
|
|
|
2005-05-09 22:34:47 -04:00
|
|
|
! At the VOP level, the 'shift' operation is split into five
|
|
|
|
! distinct operations:
|
|
|
|
! - shifts with a large positive count: calls runtime to make
|
|
|
|
! a bignum
|
|
|
|
! - shifts with a small positive count: %fixnum<<
|
|
|
|
! - shifts with a small negative count: %fixnum>>
|
|
|
|
! - shifts with a small negative count: %fixnum>>
|
|
|
|
! - shifts with a large negative count: %fixnum-sgn
|
2005-06-12 03:38:57 -04:00
|
|
|
TUPLE: %fixnum<< ;
|
|
|
|
C: %fixnum<< make-vop ; : %fixnum<< 3-vop <%fixnum<<> ;
|
2005-09-08 22:23:54 -04:00
|
|
|
|
2005-06-12 03:38:57 -04:00
|
|
|
TUPLE: %fixnum>> ;
|
|
|
|
C: %fixnum>> make-vop ; : %fixnum>> 3-vop <%fixnum>>> ;
|
2005-09-08 22:23:54 -04:00
|
|
|
M: %fixnum>> basic-block? drop t ;
|
|
|
|
|
2005-05-09 22:34:47 -04:00
|
|
|
! due to x86 limitations the destination of this VOP must be
|
|
|
|
! vreg 2 (EDX), and the source must be vreg 0 (EAX).
|
2005-06-12 03:38:57 -04:00
|
|
|
TUPLE: %fixnum-sgn ;
|
|
|
|
C: %fixnum-sgn make-vop ; : %fixnum-sgn src/dest-vop <%fixnum-sgn> ;
|
2005-09-08 22:23:54 -04:00
|
|
|
M: %fixnum-sgn basic-block? drop t ;
|
|
|
|
|
2005-05-09 22:34:47 -04:00
|
|
|
|
|
|
|
! Integer comparison followed by a conditional branch is
|
|
|
|
! optimized
|
2005-06-12 03:38:57 -04:00
|
|
|
TUPLE: %jump-fixnum<= ;
|
|
|
|
C: %jump-fixnum<= make-vop ;
|
2005-05-16 17:01:39 -04:00
|
|
|
: %jump-fixnum<= 2-in/label-vop <%jump-fixnum<=> ;
|
|
|
|
|
2005-06-12 03:38:57 -04:00
|
|
|
TUPLE: %jump-fixnum< ;
|
|
|
|
C: %jump-fixnum< make-vop ;
|
2005-05-16 17:01:39 -04:00
|
|
|
: %jump-fixnum< 2-in/label-vop <%jump-fixnum<> ;
|
|
|
|
|
2005-06-12 03:38:57 -04:00
|
|
|
TUPLE: %jump-fixnum>= ;
|
|
|
|
C: %jump-fixnum>= make-vop ;
|
2005-05-16 17:01:39 -04:00
|
|
|
: %jump-fixnum>= 2-in/label-vop <%jump-fixnum>=> ;
|
|
|
|
|
2005-06-12 03:38:57 -04:00
|
|
|
TUPLE: %jump-fixnum> ;
|
|
|
|
C: %jump-fixnum> make-vop ;
|
2005-05-16 17:01:39 -04:00
|
|
|
: %jump-fixnum> 2-in/label-vop <%jump-fixnum>> ;
|
|
|
|
|
2005-06-12 03:38:57 -04:00
|
|
|
TUPLE: %jump-eq? ;
|
|
|
|
C: %jump-eq? make-vop ;
|
2005-05-16 17:01:39 -04:00
|
|
|
: %jump-eq? 2-in/label-vop <%jump-eq?> ;
|
2005-05-09 02:34:15 -04:00
|
|
|
|
|
|
|
: fast-branch ( class -- class )
|
|
|
|
{{
|
|
|
|
[[ %fixnum<= %jump-fixnum<= ]]
|
|
|
|
[[ %fixnum< %jump-fixnum< ]]
|
|
|
|
[[ %fixnum>= %jump-fixnum>= ]]
|
|
|
|
[[ %fixnum> %jump-fixnum> ]]
|
|
|
|
[[ %eq? %jump-eq? ]]
|
|
|
|
}} hash ;
|
|
|
|
|
2005-05-10 00:30:48 -04:00
|
|
|
PREDICATE: tuple fast-branch
|
|
|
|
#! Class of VOPs whose class is a key in fast-branch
|
|
|
|
#! hashtable.
|
|
|
|
class fast-branch ;
|
|
|
|
|
2005-05-07 22:39:00 -04:00
|
|
|
! some slightly optimized inline assembly
|
2005-06-12 03:38:57 -04:00
|
|
|
TUPLE: %type ;
|
|
|
|
C: %type make-vop ;
|
2005-05-07 22:39:00 -04:00
|
|
|
: %type ( vreg ) <vreg> dest-vop <%type> ;
|
2005-05-16 17:01:39 -04:00
|
|
|
M: %type basic-block? drop t ;
|
2005-05-07 22:39:00 -04:00
|
|
|
|
2005-08-15 15:34:00 -04:00
|
|
|
TUPLE: %tag ;
|
|
|
|
C: %tag make-vop ;
|
|
|
|
: %tag ( vreg ) <vreg> dest-vop <%tag> ;
|
|
|
|
M: %tag basic-block? drop t ;
|
|
|
|
|
|
|
|
TUPLE: %retag-fixnum ;
|
|
|
|
C: %retag-fixnum make-vop ;
|
|
|
|
: %retag-fixnum <vreg> dest-vop <%retag-fixnum> ;
|
|
|
|
M: %retag-fixnum basic-block? drop t ;
|
2005-05-07 22:39:00 -04:00
|
|
|
|
2005-06-12 03:38:57 -04:00
|
|
|
TUPLE: %untag-fixnum ;
|
|
|
|
C: %untag-fixnum make-vop ;
|
2005-05-08 00:21:00 -04:00
|
|
|
: %untag-fixnum <vreg> dest-vop <%untag-fixnum> ;
|
2005-05-16 17:01:39 -04:00
|
|
|
M: %untag-fixnum basic-block? drop t ;
|
2005-05-08 00:21:00 -04:00
|
|
|
|
2005-05-07 22:39:00 -04:00
|
|
|
: check-dest ( vop reg -- )
|
2005-09-08 22:23:54 -04:00
|
|
|
swap 0 vop-out = [ "bad VOP destination" throw ] unless ;
|
2005-05-30 03:37:22 -04:00
|
|
|
|
|
|
|
: check-src ( vop reg -- )
|
2005-09-08 22:23:54 -04:00
|
|
|
swap 0 vop-in = [ "bad VOP source" throw ] unless ;
|
2005-05-08 20:30:38 -04:00
|
|
|
|
2005-06-12 03:38:57 -04:00
|
|
|
TUPLE: %getenv ;
|
|
|
|
C: %getenv make-vop ;
|
2005-05-16 17:01:39 -04:00
|
|
|
: %getenv swap src/dest-vop <%getenv> ;
|
|
|
|
M: %getenv basic-block? drop t ;
|
2005-05-13 20:37:28 -04:00
|
|
|
|
2005-06-12 03:38:57 -04:00
|
|
|
TUPLE: %setenv ;
|
|
|
|
C: %setenv make-vop ;
|
2005-05-16 17:01:39 -04:00
|
|
|
: %setenv 2-in-vop <%setenv> ;
|
|
|
|
M: %setenv basic-block? drop t ;
|
2005-05-13 20:37:28 -04:00
|
|
|
|
2005-05-08 20:30:38 -04:00
|
|
|
! alien operations
|
2005-06-12 03:38:57 -04:00
|
|
|
TUPLE: %parameters ;
|
|
|
|
C: %parameters make-vop ;
|
2005-05-16 17:01:39 -04:00
|
|
|
: %parameters ( n -- vop ) src-vop <%parameters> ;
|
2005-05-08 20:30:38 -04:00
|
|
|
|
2005-06-12 03:38:57 -04:00
|
|
|
TUPLE: %parameter ;
|
|
|
|
C: %parameter make-vop ;
|
2005-06-14 19:10:48 -04:00
|
|
|
: %parameter ( n reg reg-class -- vop ) 3-in-vop <%parameter> ;
|
2005-05-08 20:30:38 -04:00
|
|
|
|
2005-06-12 03:38:57 -04:00
|
|
|
TUPLE: %cleanup ;
|
|
|
|
C: %cleanup make-vop ;
|
2005-05-16 17:01:39 -04:00
|
|
|
: %cleanup ( n -- vop ) src-vop <%cleanup> ;
|
2005-05-08 20:30:38 -04:00
|
|
|
|
2005-06-12 03:38:57 -04:00
|
|
|
TUPLE: %unbox ;
|
|
|
|
C: %unbox make-vop ;
|
2005-06-14 05:01:07 -04:00
|
|
|
: %unbox ( n func reg-class -- vop ) 3-in-vop <%unbox> ;
|
2005-05-08 20:30:38 -04:00
|
|
|
|
2005-06-12 03:38:57 -04:00
|
|
|
TUPLE: %box ;
|
|
|
|
C: %box make-vop ;
|
2005-06-14 05:01:07 -04:00
|
|
|
: %box ( func reg-class -- vop ) 2-in-vop <%box> ;
|
2005-05-08 20:30:38 -04:00
|
|
|
|
2005-06-12 03:38:57 -04:00
|
|
|
TUPLE: %alien-invoke ;
|
|
|
|
C: %alien-invoke make-vop ;
|
2005-06-14 05:01:07 -04:00
|
|
|
: %alien-invoke ( func lib -- vop ) 2-in-vop <%alien-invoke> ;
|