2008-09-10 23:11:03 -04:00
|
|
|
! Copyright (C) 2008 Slava Pestov.
|
|
|
|
! See http://factorcode.org/license.txt for BSD license.
|
2008-10-17 16:35:04 -04:00
|
|
|
USING: assocs accessors arrays kernel sequences namespaces words
|
2008-10-20 02:56:28 -04:00
|
|
|
math math.order layouts classes.algebra alien byte-arrays
|
|
|
|
combinators compiler.cfg.registers
|
|
|
|
compiler.cfg.instructions.syntax ;
|
2008-09-15 02:54:48 -04:00
|
|
|
IN: compiler.cfg.instructions
|
2008-09-10 23:11:03 -04:00
|
|
|
|
|
|
|
! Virtual CPU instructions, used by CFG and machine IRs
|
|
|
|
|
2008-10-20 02:56:28 -04:00
|
|
|
! Instruction with no side effects; if 'out' is never read, we
|
|
|
|
! can eliminate it.
|
|
|
|
TUPLE: ##flushable < insn { dst vreg } ;
|
|
|
|
|
|
|
|
! Instruction which is referentially transparent; we can replace
|
|
|
|
! repeated computation with a reference to a previous value
|
|
|
|
TUPLE: ##pure < ##flushable ;
|
|
|
|
|
|
|
|
TUPLE: ##unary < ##pure { src vreg } ;
|
|
|
|
TUPLE: ##boxer < ##unary { temp vreg } ;
|
|
|
|
TUPLE: ##binary < ##pure { src1 vreg } { src2 vreg } ;
|
|
|
|
TUPLE: ##binary-imm < ##pure { src1 vreg } { src2 integer } ;
|
|
|
|
TUPLE: ##commutative < ##binary ;
|
|
|
|
|
|
|
|
! Instruction only used for its side effect, produces no values
|
|
|
|
TUPLE: ##effect < insn { src vreg } ;
|
|
|
|
|
|
|
|
! Read/write ops: candidates for alias analysis
|
|
|
|
TUPLE: ##read < ##flushable ;
|
|
|
|
TUPLE: ##write < ##effect ;
|
|
|
|
|
|
|
|
TUPLE: ##alien-getter < ##read { src vreg } ;
|
|
|
|
TUPLE: ##alien-setter < ##effect { value vreg } ;
|
2008-09-10 23:11:03 -04:00
|
|
|
|
|
|
|
! Stack operations
|
2008-10-20 02:56:28 -04:00
|
|
|
INSN: ##load-immediate < ##pure { val integer } ;
|
|
|
|
INSN: ##load-indirect < ##pure obj ;
|
|
|
|
|
|
|
|
GENERIC: ##load-literal ( dst value -- )
|
|
|
|
|
|
|
|
M: fixnum ##load-literal tag-fixnum ##load-immediate ;
|
|
|
|
M: f ##load-literal drop \ f tag-number ##load-immediate ;
|
|
|
|
M: object ##load-literal ##load-indirect ;
|
|
|
|
|
|
|
|
INSN: ##peek < ##read { loc loc } ;
|
|
|
|
INSN: ##replace < ##write { loc loc } ;
|
2008-10-17 16:35:04 -04:00
|
|
|
INSN: ##inc-d { n integer } ;
|
|
|
|
INSN: ##inc-r { n integer } ;
|
2008-09-10 23:11:03 -04:00
|
|
|
|
|
|
|
! Subroutine calls
|
2008-10-07 17:13:29 -04:00
|
|
|
TUPLE: stack-frame
|
|
|
|
{ params integer }
|
|
|
|
{ return integer }
|
2008-10-19 02:10:21 -04:00
|
|
|
{ total-size integer }
|
|
|
|
spill-counts ;
|
2008-10-07 17:13:29 -04:00
|
|
|
|
|
|
|
INSN: ##stack-frame stack-frame ;
|
|
|
|
: ##simple-stack-frame ( -- ) T{ stack-frame } ##stack-frame ;
|
2008-09-17 01:46:38 -04:00
|
|
|
INSN: ##call word ;
|
|
|
|
INSN: ##jump word ;
|
2008-10-07 17:13:29 -04:00
|
|
|
INSN: ##return ;
|
|
|
|
|
2008-09-10 23:11:03 -04:00
|
|
|
! Jump tables
|
2008-09-17 19:52:11 -04:00
|
|
|
INSN: ##dispatch src temp ;
|
2008-10-17 16:35:04 -04:00
|
|
|
INSN: ##dispatch-label label ;
|
2008-09-10 23:11:03 -04:00
|
|
|
|
2008-10-20 02:56:28 -04:00
|
|
|
! Slot access
|
|
|
|
INSN: ##slot < ##read { obj vreg } { slot vreg } { tag integer } ;
|
|
|
|
INSN: ##slot-imm < ##read { obj vreg } { slot integer } { tag integer } ;
|
|
|
|
INSN: ##set-slot < ##write { obj vreg } { slot vreg } { tag integer } ;
|
|
|
|
INSN: ##set-slot-imm < ##write { obj vreg } { slot integer } { tag integer } ;
|
|
|
|
|
|
|
|
! Integer arithmetic
|
|
|
|
INSN: ##add < ##commutative ;
|
|
|
|
INSN: ##add-imm < ##binary-imm ;
|
|
|
|
INSN: ##sub < ##binary ;
|
|
|
|
INSN: ##sub-imm < ##binary-imm ;
|
|
|
|
INSN: ##mul < ##commutative ;
|
|
|
|
INSN: ##mul-imm < ##binary-imm ;
|
|
|
|
INSN: ##and < ##commutative ;
|
|
|
|
INSN: ##and-imm < ##binary-imm ;
|
|
|
|
INSN: ##or < ##commutative ;
|
|
|
|
INSN: ##or-imm < ##binary-imm ;
|
|
|
|
INSN: ##xor < ##commutative ;
|
|
|
|
INSN: ##xor-imm < ##binary-imm ;
|
|
|
|
INSN: ##shl-imm < ##binary-imm ;
|
|
|
|
INSN: ##shr-imm < ##binary-imm ;
|
|
|
|
INSN: ##sar-imm < ##binary-imm ;
|
|
|
|
INSN: ##not < ##unary ;
|
|
|
|
|
|
|
|
! Bignum/integer conversion
|
|
|
|
INSN: ##integer>bignum < ##boxer ;
|
|
|
|
INSN: ##bignum>integer < ##unary ;
|
|
|
|
|
|
|
|
! Float arithmetic
|
|
|
|
INSN: ##add-float < ##commutative ;
|
|
|
|
INSN: ##sub-float < ##binary ;
|
|
|
|
INSN: ##mul-float < ##commutative ;
|
|
|
|
INSN: ##div-float < ##binary ;
|
|
|
|
|
|
|
|
! Float/integer conversion
|
|
|
|
INSN: ##float>integer < ##unary ;
|
|
|
|
INSN: ##integer>float < ##unary ;
|
|
|
|
|
2008-09-10 23:11:03 -04:00
|
|
|
! Boxing and unboxing
|
2008-09-17 01:46:38 -04:00
|
|
|
INSN: ##copy < ##unary ;
|
|
|
|
INSN: ##copy-float < ##unary ;
|
|
|
|
INSN: ##unbox-float < ##unary ;
|
|
|
|
INSN: ##unbox-f < ##unary ;
|
|
|
|
INSN: ##unbox-alien < ##unary ;
|
|
|
|
INSN: ##unbox-byte-array < ##unary ;
|
|
|
|
INSN: ##unbox-any-c-ptr < ##unary ;
|
2008-10-20 02:56:28 -04:00
|
|
|
INSN: ##box-float < ##boxer ;
|
|
|
|
INSN: ##box-alien < ##boxer ;
|
|
|
|
|
|
|
|
: ##unbox-c-ptr ( dst src class -- )
|
|
|
|
{
|
|
|
|
{ [ dup \ f class<= ] [ drop ##unbox-f ] }
|
|
|
|
{ [ dup simple-alien class<= ] [ drop ##unbox-alien ] }
|
|
|
|
{ [ dup byte-array class<= ] [ drop ##unbox-byte-array ] }
|
|
|
|
[ drop ##unbox-any-c-ptr ]
|
|
|
|
} cond ; inline
|
|
|
|
|
|
|
|
! Alien accessors
|
|
|
|
INSN: ##alien-unsigned-1 < ##alien-getter ;
|
|
|
|
INSN: ##alien-unsigned-2 < ##alien-getter ;
|
|
|
|
INSN: ##alien-unsigned-4 < ##alien-getter ;
|
|
|
|
INSN: ##alien-signed-1 < ##alien-getter ;
|
|
|
|
INSN: ##alien-signed-2 < ##alien-getter ;
|
|
|
|
INSN: ##alien-signed-3 < ##alien-getter ;
|
|
|
|
INSN: ##alien-cell < ##alien-getter ;
|
|
|
|
INSN: ##alien-float < ##alien-getter ;
|
|
|
|
INSN: ##alien-double < ##alien-getter ;
|
|
|
|
|
|
|
|
INSN: ##set-alien-integer-1 < ##alien-setter ;
|
|
|
|
INSN: ##set-alien-integer-2 < ##alien-setter ;
|
|
|
|
INSN: ##set-alien-integer-4 < ##alien-setter ;
|
|
|
|
INSN: ##set-alien-cell < ##alien-getter ;
|
|
|
|
INSN: ##set-alien-float < ##alien-setter ;
|
|
|
|
INSN: ##set-alien-double < ##alien-setter ;
|
2008-09-17 01:46:38 -04:00
|
|
|
|
2008-09-17 19:52:11 -04:00
|
|
|
! Memory allocation
|
2008-10-20 02:56:28 -04:00
|
|
|
INSN: ##allot < ##flushable size type tag { temp vreg } ;
|
|
|
|
INSN: ##write-barrier < ##effect card# table ;
|
2008-09-17 01:46:38 -04:00
|
|
|
INSN: ##gc ;
|
2008-09-10 23:11:03 -04:00
|
|
|
|
|
|
|
! FFI
|
2008-09-17 01:46:38 -04:00
|
|
|
INSN: ##alien-invoke params ;
|
|
|
|
INSN: ##alien-indirect params ;
|
|
|
|
INSN: ##alien-callback params ;
|
2008-10-13 00:32:14 -04:00
|
|
|
INSN: ##callback-return params ;
|
2008-09-10 23:11:03 -04:00
|
|
|
|
2008-09-17 01:46:38 -04:00
|
|
|
! Instructions used by CFG IR only.
|
|
|
|
INSN: ##prologue ;
|
|
|
|
INSN: ##epilogue ;
|
2008-09-15 02:54:48 -04:00
|
|
|
|
2008-09-17 01:46:38 -04:00
|
|
|
INSN: ##branch ;
|
2008-09-15 02:54:48 -04:00
|
|
|
|
2008-10-20 02:56:28 -04:00
|
|
|
! Condition codes
|
|
|
|
SYMBOL: cc<
|
|
|
|
SYMBOL: cc<=
|
|
|
|
SYMBOL: cc=
|
|
|
|
SYMBOL: cc>
|
|
|
|
SYMBOL: cc>=
|
|
|
|
SYMBOL: cc/=
|
|
|
|
|
|
|
|
: evaluate-cc ( result cc -- ? )
|
|
|
|
H{
|
|
|
|
{ cc< { +lt+ } }
|
|
|
|
{ cc<= { +lt+ +eq+ } }
|
|
|
|
{ cc= { +eq+ } }
|
|
|
|
{ cc>= { +eq+ +gt+ } }
|
|
|
|
{ cc> { +gt+ } }
|
|
|
|
{ cc/= { +lt+ +gt+ } }
|
|
|
|
} at memq? ;
|
|
|
|
|
|
|
|
INSN: ##binary-branch { src1 vreg } { src2 vreg } cc ;
|
|
|
|
INSN: ##binary-imm-branch { src1 vreg } { src2 integer } cc ;
|
|
|
|
|
|
|
|
INSN: ##boolean < ##binary cc ;
|
|
|
|
INSN: ##boolean-imm < ##binary-imm cc ;
|
2008-09-11 03:05:22 -04:00
|
|
|
|
|
|
|
! Instructions used by machine IR only.
|
2008-10-07 17:13:29 -04:00
|
|
|
INSN: _prologue stack-frame ;
|
|
|
|
INSN: _epilogue stack-frame ;
|
2008-09-11 03:05:22 -04:00
|
|
|
|
2008-09-17 01:46:38 -04:00
|
|
|
INSN: _label id ;
|
2008-09-11 03:05:22 -04:00
|
|
|
|
|
|
|
INSN: _branch label ;
|
2008-09-17 01:46:38 -04:00
|
|
|
|
2008-10-20 02:56:28 -04:00
|
|
|
INSN: _binary-branch label { src1 vreg } { src2 vreg } cc ;
|
|
|
|
INSN: _binary-imm-branch label { src1 vreg } { src2 integer } cc ;
|
2008-09-15 03:59:24 -04:00
|
|
|
|
2008-10-19 02:10:21 -04:00
|
|
|
! These instructions operate on machine registers and not
|
|
|
|
! virtual registers
|
|
|
|
INSN: _spill src class n ;
|
|
|
|
INSN: _reload dst class n ;
|
|
|
|
INSN: _spill-counts counts ;
|