Clean up direct literal code and make a first attempt at PowerPC support
parent
030501d6ef
commit
ab689c098b
|
@ -124,7 +124,6 @@ SYMBOL: jit-primitive-word
|
||||||
SYMBOL: jit-primitive
|
SYMBOL: jit-primitive
|
||||||
SYMBOL: jit-word-jump
|
SYMBOL: jit-word-jump
|
||||||
SYMBOL: jit-word-call
|
SYMBOL: jit-word-call
|
||||||
SYMBOL: jit-push-literal
|
|
||||||
SYMBOL: jit-push-immediate
|
SYMBOL: jit-push-immediate
|
||||||
SYMBOL: jit-if-word
|
SYMBOL: jit-if-word
|
||||||
SYMBOL: jit-if-1
|
SYMBOL: jit-if-1
|
||||||
|
@ -156,9 +155,9 @@ SYMBOL: undefined-quot
|
||||||
{ jit-primitive 25 }
|
{ jit-primitive 25 }
|
||||||
{ jit-word-jump 26 }
|
{ jit-word-jump 26 }
|
||||||
{ jit-word-call 27 }
|
{ jit-word-call 27 }
|
||||||
{ jit-push-literal 28 }
|
{ jit-if-word 28 }
|
||||||
{ jit-if-word 29 }
|
{ jit-if-1 29 }
|
||||||
{ jit-if-1 30 }
|
{ jit-if-2 30 }
|
||||||
{ jit-dispatch-word 31 }
|
{ jit-dispatch-word 31 }
|
||||||
{ jit-dispatch 32 }
|
{ jit-dispatch 32 }
|
||||||
{ jit-epilog 33 }
|
{ jit-epilog 33 }
|
||||||
|
@ -173,7 +172,6 @@ SYMBOL: undefined-quot
|
||||||
{ jit-2dip 47 }
|
{ jit-2dip 47 }
|
||||||
{ jit-3dip-word 48 }
|
{ jit-3dip-word 48 }
|
||||||
{ jit-3dip 49 }
|
{ jit-3dip 49 }
|
||||||
{ jit-if-2 50 }
|
|
||||||
{ undefined-quot 60 }
|
{ undefined-quot 60 }
|
||||||
} ; inline
|
} ; inline
|
||||||
|
|
||||||
|
@ -471,7 +469,6 @@ M: quotation '
|
||||||
jit-primitive
|
jit-primitive
|
||||||
jit-word-jump
|
jit-word-jump
|
||||||
jit-word-call
|
jit-word-call
|
||||||
jit-push-literal
|
|
||||||
jit-push-immediate
|
jit-push-immediate
|
||||||
jit-if-word
|
jit-if-word
|
||||||
jit-if-1
|
jit-if-1
|
||||||
|
|
|
@ -12,9 +12,12 @@ M: ##write-barrier defs-vregs [ card#>> ] [ table>> ] bi 2array ;
|
||||||
M: ##unary/temp defs-vregs dst/tmp-vregs ;
|
M: ##unary/temp defs-vregs dst/tmp-vregs ;
|
||||||
M: ##allot defs-vregs dst/tmp-vregs ;
|
M: ##allot defs-vregs dst/tmp-vregs ;
|
||||||
M: ##dispatch defs-vregs temp>> 1array ;
|
M: ##dispatch defs-vregs temp>> 1array ;
|
||||||
M: ##slot defs-vregs [ dst>> ] [ temp>> ] bi 2array ;
|
M: ##slot defs-vregs dst/tmp-vregs ;
|
||||||
M: ##set-slot defs-vregs temp>> 1array ;
|
M: ##set-slot defs-vregs temp>> 1array ;
|
||||||
M: ##string-nth defs-vregs [ dst>> ] [ temp>> ] bi 2array ;
|
M: ##string-nth defs-vregs dst/tmp-vregs ;
|
||||||
|
M: ##compare defs-vregs dst/tmp-vregs ;
|
||||||
|
M: ##compare-imm defs-vregs dst/tmp-vregs ;
|
||||||
|
M: ##compare-float defs-vregs dst/tmp-vregs ;
|
||||||
M: insn defs-vregs drop f ;
|
M: insn defs-vregs drop f ;
|
||||||
|
|
||||||
M: ##unary uses-vregs src>> 1array ;
|
M: ##unary uses-vregs src>> 1array ;
|
||||||
|
|
|
@ -65,9 +65,9 @@ IN: compiler.cfg.hats
|
||||||
: ^^alien-cell ( src -- dst ) ^^i1 ##alien-cell ; inline
|
: ^^alien-cell ( src -- dst ) ^^i1 ##alien-cell ; inline
|
||||||
: ^^alien-float ( src -- dst ) ^^d1 ##alien-float ; inline
|
: ^^alien-float ( src -- dst ) ^^d1 ##alien-float ; inline
|
||||||
: ^^alien-double ( src -- dst ) ^^d1 ##alien-double ; inline
|
: ^^alien-double ( src -- dst ) ^^d1 ##alien-double ; inline
|
||||||
: ^^compare ( src1 src2 cc -- dst ) ^^i3 ##compare ; inline
|
: ^^compare ( src1 src2 cc -- dst ) ^^i3 i ##compare ; inline
|
||||||
: ^^compare-imm ( src1 src2 cc -- dst ) ^^i3 ##compare-imm ; inline
|
: ^^compare-imm ( src1 src2 cc -- dst ) ^^i3 i ##compare-imm ; inline
|
||||||
: ^^compare-float ( src1 src2 cc -- dst ) ^^i3 ##compare-float ; inline
|
: ^^compare-float ( src1 src2 cc -- dst ) ^^i3 i ##compare-float ; inline
|
||||||
: ^^offset>slot ( vreg -- vreg' ) cell 4 = [ 1 ^^shr-imm ] when ; inline
|
: ^^offset>slot ( vreg -- vreg' ) cell 4 = [ 1 ^^shr-imm ] when ; inline
|
||||||
: ^^tag-fixnum ( src -- dst ) ^^i1 ##tag-fixnum ; inline
|
: ^^tag-fixnum ( src -- dst ) ^^i1 ##tag-fixnum ; inline
|
||||||
: ^^untag-fixnum ( src -- dst ) ^^i1 ##untag-fixnum ; inline
|
: ^^untag-fixnum ( src -- dst ) ^^i1 ##untag-fixnum ; inline
|
||||||
|
|
|
@ -198,11 +198,11 @@ TUPLE: ##conditional-branch < insn { src1 vreg } { src2 vreg } cc ;
|
||||||
INSN: ##compare-branch < ##conditional-branch ;
|
INSN: ##compare-branch < ##conditional-branch ;
|
||||||
INSN: ##compare-imm-branch { src1 vreg } { src2 integer } cc ;
|
INSN: ##compare-imm-branch { src1 vreg } { src2 integer } cc ;
|
||||||
|
|
||||||
INSN: ##compare < ##binary cc ;
|
INSN: ##compare < ##binary cc temp ;
|
||||||
INSN: ##compare-imm < ##binary-imm cc ;
|
INSN: ##compare-imm < ##binary-imm cc temp ;
|
||||||
|
|
||||||
INSN: ##compare-float-branch < ##conditional-branch ;
|
INSN: ##compare-float-branch < ##conditional-branch ;
|
||||||
INSN: ##compare-float < ##binary cc ;
|
INSN: ##compare-float < ##binary cc temp ;
|
||||||
|
|
||||||
! Instructions used by machine IR only.
|
! Instructions used by machine IR only.
|
||||||
INSN: _prologue stack-frame ;
|
INSN: _prologue stack-frame ;
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
! See http://factorcode.org/license.txt for BSD license.
|
! See http://factorcode.org/license.txt for BSD license.
|
||||||
USING: kernel sequences layouts accessors combinators namespaces
|
USING: kernel sequences layouts accessors combinators namespaces
|
||||||
math fry
|
math fry
|
||||||
|
compiler.cfg.hats
|
||||||
compiler.cfg.instructions
|
compiler.cfg.instructions
|
||||||
compiler.cfg.value-numbering.graph
|
compiler.cfg.value-numbering.graph
|
||||||
compiler.cfg.value-numbering.simplify
|
compiler.cfg.value-numbering.simplify
|
||||||
|
@ -63,7 +64,7 @@ M: ##compare-imm-branch rewrite-tagged-comparison
|
||||||
|
|
||||||
M: ##compare-imm rewrite-tagged-comparison
|
M: ##compare-imm rewrite-tagged-comparison
|
||||||
[ dst>> ] [ (rewrite-tagged-comparison) ] bi
|
[ dst>> ] [ (rewrite-tagged-comparison) ] bi
|
||||||
f \ ##compare-imm boa ;
|
i f \ ##compare-imm boa ;
|
||||||
|
|
||||||
M: ##compare-imm-branch rewrite
|
M: ##compare-imm-branch rewrite
|
||||||
dup rewrite-boolean-comparison? [ rewrite-boolean-comparison ] when
|
dup rewrite-boolean-comparison? [ rewrite-boolean-comparison ] when
|
||||||
|
@ -78,7 +79,7 @@ M: ##compare-imm-branch rewrite
|
||||||
[ dst>> ]
|
[ dst>> ]
|
||||||
[ src2>> ]
|
[ src2>> ]
|
||||||
[ src1>> vreg>vn vn>constant ] tri
|
[ src1>> vreg>vn vn>constant ] tri
|
||||||
cc= f \ ##compare-imm boa ;
|
cc= f i \ ##compare-imm boa ;
|
||||||
|
|
||||||
M: ##compare rewrite
|
M: ##compare rewrite
|
||||||
dup flip-comparison? [
|
dup flip-comparison? [
|
||||||
|
@ -95,9 +96,9 @@ M: ##compare rewrite
|
||||||
|
|
||||||
: rewrite-redundant-comparison ( insn -- insn' )
|
: rewrite-redundant-comparison ( insn -- insn' )
|
||||||
[ cc>> ] [ dst>> ] [ src1>> vreg>expr dup op>> ] tri {
|
[ cc>> ] [ dst>> ] [ src1>> vreg>expr dup op>> ] tri {
|
||||||
{ \ ##compare [ >compare-expr< f \ ##compare boa ] }
|
{ \ ##compare [ >compare-expr< i f \ ##compare boa ] }
|
||||||
{ \ ##compare-imm [ >compare-imm-expr< f \ ##compare-imm boa ] }
|
{ \ ##compare-imm [ >compare-imm-expr< i f \ ##compare-imm boa ] }
|
||||||
{ \ ##compare-float [ >compare-expr< f \ ##compare-float boa ] }
|
{ \ ##compare-float [ >compare-expr< i f \ ##compare-float boa ] }
|
||||||
} case
|
} case
|
||||||
swap cc= eq? [ [ negate-cc ] change-cc ] when ;
|
swap cc= eq? [ [ negate-cc ] change-cc ] when ;
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,17 @@
|
||||||
IN: compiler.cfg.value-numbering.tests
|
IN: compiler.cfg.value-numbering.tests
|
||||||
USING: compiler.cfg.value-numbering compiler.cfg.instructions
|
USING: compiler.cfg.value-numbering compiler.cfg.instructions
|
||||||
compiler.cfg.registers cpu.architecture tools.test kernel math ;
|
compiler.cfg.registers cpu.architecture tools.test kernel math
|
||||||
|
combinators.short-circuit accessors sequences ;
|
||||||
|
|
||||||
|
: trim-temps ( insns -- insns )
|
||||||
|
[
|
||||||
|
dup {
|
||||||
|
[ ##compare? ]
|
||||||
|
[ ##compare-imm? ]
|
||||||
|
[ ##compare-float? ]
|
||||||
|
} 1|| [ f >>temp ] when
|
||||||
|
] map ;
|
||||||
|
|
||||||
[
|
[
|
||||||
{
|
{
|
||||||
T{ ##peek f V int-regs 45 D 1 }
|
T{ ##peek f V int-regs 45 D 1 }
|
||||||
|
@ -82,7 +93,7 @@ compiler.cfg.registers cpu.architecture tools.test kernel math ;
|
||||||
T{ ##compare f V int-regs 4 V int-regs 2 V int-regs 1 cc> }
|
T{ ##compare f V int-regs 4 V int-regs 2 V int-regs 1 cc> }
|
||||||
T{ ##compare-imm f V int-regs 6 V int-regs 4 7 cc/= }
|
T{ ##compare-imm f V int-regs 6 V int-regs 4 7 cc/= }
|
||||||
T{ ##replace f V int-regs 6 D 0 }
|
T{ ##replace f V int-regs 6 D 0 }
|
||||||
} value-numbering
|
} value-numbering trim-temps
|
||||||
] unit-test
|
] unit-test
|
||||||
|
|
||||||
[
|
[
|
||||||
|
@ -100,7 +111,7 @@ compiler.cfg.registers cpu.architecture tools.test kernel math ;
|
||||||
T{ ##compare f V int-regs 4 V int-regs 2 V int-regs 1 cc<= }
|
T{ ##compare f V int-regs 4 V int-regs 2 V int-regs 1 cc<= }
|
||||||
T{ ##compare-imm f V int-regs 6 V int-regs 4 7 cc= }
|
T{ ##compare-imm f V int-regs 6 V int-regs 4 7 cc= }
|
||||||
T{ ##replace f V int-regs 6 D 0 }
|
T{ ##replace f V int-regs 6 D 0 }
|
||||||
} value-numbering
|
} value-numbering trim-temps
|
||||||
] unit-test
|
] unit-test
|
||||||
|
|
||||||
[
|
[
|
||||||
|
@ -122,7 +133,7 @@ compiler.cfg.registers cpu.architecture tools.test kernel math ;
|
||||||
T{ ##compare-float f V int-regs 12 V double-float-regs 10 V double-float-regs 11 cc< }
|
T{ ##compare-float f V int-regs 12 V double-float-regs 10 V double-float-regs 11 cc< }
|
||||||
T{ ##compare-imm f V int-regs 14 V int-regs 12 7 cc= }
|
T{ ##compare-imm f V int-regs 14 V int-regs 12 7 cc= }
|
||||||
T{ ##replace f V int-regs 14 D 0 }
|
T{ ##replace f V int-regs 14 D 0 }
|
||||||
} value-numbering
|
} value-numbering trim-temps
|
||||||
] unit-test
|
] unit-test
|
||||||
|
|
||||||
[
|
[
|
||||||
|
@ -138,5 +149,5 @@ compiler.cfg.registers cpu.architecture tools.test kernel math ;
|
||||||
T{ ##peek f V int-regs 30 D -2 }
|
T{ ##peek f V int-regs 30 D -2 }
|
||||||
T{ ##compare f V int-regs 33 V int-regs 29 V int-regs 30 cc<= }
|
T{ ##compare f V int-regs 33 V int-regs 29 V int-regs 30 cc<= }
|
||||||
T{ ##compare-imm-branch f V int-regs 33 7 cc/= }
|
T{ ##compare-imm-branch f V int-regs 33 7 cc/= }
|
||||||
} value-numbering
|
} value-numbering trim-temps
|
||||||
] unit-test
|
] unit-test
|
||||||
|
|
|
@ -491,9 +491,10 @@ M: _label generate-insn
|
||||||
M: _branch generate-insn
|
M: _branch generate-insn
|
||||||
label>> lookup-label %jump-label ;
|
label>> lookup-label %jump-label ;
|
||||||
|
|
||||||
: >compare< ( insn -- label cc src1 src2 )
|
: >compare< ( insn -- dst temp cc src1 src2 )
|
||||||
{
|
{
|
||||||
[ dst>> register ]
|
[ dst>> register ]
|
||||||
|
[ temp>> register ]
|
||||||
[ cc>> ]
|
[ cc>> ]
|
||||||
[ src1>> register ]
|
[ src1>> register ]
|
||||||
[ src2>> ?register ]
|
[ src2>> ?register ]
|
||||||
|
|
|
@ -66,9 +66,6 @@ SYMBOL: literal-table
|
||||||
: rel-primitive ( word class -- )
|
: rel-primitive ( word class -- )
|
||||||
>r def>> first r> rt-primitive rel-fixup ;
|
>r def>> first r> rt-primitive rel-fixup ;
|
||||||
|
|
||||||
: rel-literal ( literal class -- )
|
|
||||||
>r add-literal r> rt-literal rel-fixup ;
|
|
||||||
|
|
||||||
: rel-immediate ( literal class -- )
|
: rel-immediate ( literal class -- )
|
||||||
>r add-literal r> rt-immediate rel-fixup ;
|
>r add-literal r> rt-immediate rel-fixup ;
|
||||||
|
|
||||||
|
|
|
@ -39,13 +39,12 @@ IN: compiler.constants
|
||||||
! Relocation types
|
! Relocation types
|
||||||
: rt-primitive 0 ; inline
|
: rt-primitive 0 ; inline
|
||||||
: rt-dlsym 1 ; inline
|
: rt-dlsym 1 ; inline
|
||||||
: rt-literal 2 ; inline
|
: rt-dispatch 2 ; inline
|
||||||
: rt-dispatch 3 ; inline
|
: rt-xt 3 ; inline
|
||||||
: rt-xt 4 ; inline
|
: rt-here 4 ; inline
|
||||||
: rt-here 5 ; inline
|
: rt-label 5 ; inline
|
||||||
: rt-label 6 ; inline
|
: rt-immediate 6 ; inline
|
||||||
: rt-immediate 7 ; inline
|
: rt-stack-chain 7 ; inline
|
||||||
: rt-stack-chain 8 ; inline
|
|
||||||
|
|
||||||
: rc-absolute? ( n -- ? )
|
: rc-absolute? ( n -- ? )
|
||||||
[ rc-absolute-ppc-2/2 = ]
|
[ rc-absolute-ppc-2/2 = ]
|
||||||
|
|
|
@ -119,9 +119,9 @@ HOOK: %gc cpu ( -- )
|
||||||
HOOK: %prologue cpu ( n -- )
|
HOOK: %prologue cpu ( n -- )
|
||||||
HOOK: %epilogue cpu ( n -- )
|
HOOK: %epilogue cpu ( n -- )
|
||||||
|
|
||||||
HOOK: %compare cpu ( dst cc src1 src2 -- )
|
HOOK: %compare cpu ( dst temp cc src1 src2 -- )
|
||||||
HOOK: %compare-imm cpu ( dst cc src1 src2 -- )
|
HOOK: %compare-imm cpu ( dst temp cc src1 src2 -- )
|
||||||
HOOK: %compare-float cpu ( dst cc src1 src2 -- )
|
HOOK: %compare-float cpu ( dst temp cc src1 src2 -- )
|
||||||
|
|
||||||
HOOK: %compare-branch cpu ( label cc src1 src2 -- )
|
HOOK: %compare-branch cpu ( label cc src1 src2 -- )
|
||||||
HOOK: %compare-imm-branch cpu ( label cc src1 src2 -- )
|
HOOK: %compare-imm-branch cpu ( label cc src1 src2 -- )
|
||||||
|
|
|
@ -24,7 +24,6 @@ big-endian on
|
||||||
|
|
||||||
[
|
[
|
||||||
0 6 LOAD32
|
0 6 LOAD32
|
||||||
6 dup 0 LWZ
|
|
||||||
11 6 profile-count-offset LWZ
|
11 6 profile-count-offset LWZ
|
||||||
11 11 1 tag-fixnum ADDI
|
11 11 1 tag-fixnum ADDI
|
||||||
11 6 profile-count-offset STW
|
11 6 profile-count-offset STW
|
||||||
|
@ -32,7 +31,7 @@ big-endian on
|
||||||
11 11 compiled-header-size ADDI
|
11 11 compiled-header-size ADDI
|
||||||
11 MTCTR
|
11 MTCTR
|
||||||
BCTR
|
BCTR
|
||||||
] rc-absolute-ppc-2/2 rt-literal 1 jit-profiling jit-define
|
] rc-absolute-ppc-2/2 rt-immediate 1 jit-profiling jit-define
|
||||||
|
|
||||||
[
|
[
|
||||||
0 6 LOAD32
|
0 6 LOAD32
|
||||||
|
@ -44,12 +43,6 @@ big-endian on
|
||||||
0 1 lr-save stack-frame + STW
|
0 1 lr-save stack-frame + STW
|
||||||
] rc-absolute-ppc-2/2 rt-label 1 jit-prolog jit-define
|
] rc-absolute-ppc-2/2 rt-label 1 jit-prolog jit-define
|
||||||
|
|
||||||
[
|
|
||||||
0 6 LOAD32
|
|
||||||
6 dup 0 LWZ
|
|
||||||
6 ds-reg 4 STWU
|
|
||||||
] rc-absolute-ppc-2/2 rt-literal 1 jit-push-literal jit-define
|
|
||||||
|
|
||||||
[
|
[
|
||||||
0 6 LOAD32
|
0 6 LOAD32
|
||||||
6 ds-reg 4 STWU
|
6 ds-reg 4 STWU
|
||||||
|
@ -90,14 +83,13 @@ big-endian on
|
||||||
|
|
||||||
[
|
[
|
||||||
0 3 LOAD32
|
0 3 LOAD32
|
||||||
3 3 0 LWZ
|
|
||||||
6 ds-reg 0 LWZ
|
6 ds-reg 0 LWZ
|
||||||
6 6 1 SRAWI
|
6 6 1 SRAWI
|
||||||
3 3 6 ADD
|
3 3 6 ADD
|
||||||
3 3 array-start-offset LWZ
|
3 3 array-start-offset LWZ
|
||||||
ds-reg dup 4 SUBI
|
ds-reg dup 4 SUBI
|
||||||
jit-jump-quot
|
jit-jump-quot
|
||||||
] rc-absolute-ppc-2/2 rt-literal 1 jit-dispatch jit-define
|
] rc-absolute-ppc-2/2 rt-immediate 1 jit-dispatch jit-define
|
||||||
|
|
||||||
: jit->r ( -- )
|
: jit->r ( -- )
|
||||||
4 ds-reg 0 LWZ
|
4 ds-reg 0 LWZ
|
||||||
|
@ -317,7 +309,6 @@ big-endian on
|
||||||
! Comparisons
|
! Comparisons
|
||||||
: jit-compare ( insn -- )
|
: jit-compare ( insn -- )
|
||||||
0 3 LOAD32
|
0 3 LOAD32
|
||||||
3 3 0 LWZ
|
|
||||||
4 ds-reg 0 LWZ
|
4 ds-reg 0 LWZ
|
||||||
5 ds-reg -4 LWZU
|
5 ds-reg -4 LWZU
|
||||||
5 0 4 CMP
|
5 0 4 CMP
|
||||||
|
@ -326,7 +317,7 @@ big-endian on
|
||||||
3 ds-reg 0 STW ;
|
3 ds-reg 0 STW ;
|
||||||
|
|
||||||
: define-jit-compare ( insn word -- )
|
: define-jit-compare ( insn word -- )
|
||||||
[ [ jit-compare ] curry rc-absolute-ppc-2/2 rt-literal 1 ] dip
|
[ [ jit-compare ] curry rc-absolute-ppc-2/2 rt-immediate 1 ] dip
|
||||||
define-sub-primitive ;
|
define-sub-primitive ;
|
||||||
|
|
||||||
\ BEQ \ eq? define-jit-compare
|
\ BEQ \ eq? define-jit-compare
|
||||||
|
|
|
@ -34,10 +34,8 @@ M: ppc two-operand? f ;
|
||||||
|
|
||||||
M: ppc %load-immediate ( reg n -- ) swap LOAD ;
|
M: ppc %load-immediate ( reg n -- ) swap LOAD ;
|
||||||
|
|
||||||
M:: ppc %load-indirect ( reg obj -- )
|
M: ppc %load-indirect ( reg obj -- )
|
||||||
0 reg LOAD32
|
[ 0 swap LOAD32 ] [ rc-absolute-ppc-2/2 rel-immediate ] bi* ;
|
||||||
obj rc-absolute-ppc-2/2 rel-literal
|
|
||||||
reg reg 0 LWZ ;
|
|
||||||
|
|
||||||
: ds-reg 29 ; inline
|
: ds-reg 29 ; inline
|
||||||
: rs-reg 30 ; inline
|
: rs-reg 30 ; inline
|
||||||
|
|
|
@ -88,8 +88,6 @@ M: float-regs store-return-reg
|
||||||
[ [ align-sub ] [ call ] bi* ]
|
[ [ align-sub ] [ call ] bi* ]
|
||||||
[ [ align-add ] [ drop ] bi* ] 2bi ; inline
|
[ [ align-add ] [ drop ] bi* ] 2bi ; inline
|
||||||
|
|
||||||
M: x86.32 rel-literal-x86 rc-absolute-cell rel-literal ;
|
|
||||||
|
|
||||||
M: x86.32 %prologue ( n -- )
|
M: x86.32 %prologue ( n -- )
|
||||||
dup PUSH
|
dup PUSH
|
||||||
0 PUSH rc-absolute-cell rel-this
|
0 PUSH rc-absolute-cell rel-this
|
||||||
|
|
|
@ -44,8 +44,6 @@ M:: x86.64 %dispatch ( src temp offset -- )
|
||||||
M: int-regs return-reg drop RAX ;
|
M: int-regs return-reg drop RAX ;
|
||||||
M: float-regs return-reg drop XMM0 ;
|
M: float-regs return-reg drop XMM0 ;
|
||||||
|
|
||||||
M: x86.64 rel-literal-x86 rc-relative rel-literal ;
|
|
||||||
|
|
||||||
M: x86.64 %prologue ( n -- )
|
M: x86.64 %prologue ( n -- )
|
||||||
temp-reg-1 0 MOV rc-absolute-cell rel-this
|
temp-reg-1 0 MOV rc-absolute-cell rel-this
|
||||||
dup PUSH
|
dup PUSH
|
||||||
|
|
|
@ -30,13 +30,6 @@ big-endian off
|
||||||
stack-reg stack-frame-size 3 bootstrap-cells - SUB ! alignment
|
stack-reg stack-frame-size 3 bootstrap-cells - SUB ! alignment
|
||||||
] rc-absolute-cell rt-label 1 rex-length + jit-prolog jit-define
|
] rc-absolute-cell rt-label 1 rex-length + jit-prolog jit-define
|
||||||
|
|
||||||
[
|
|
||||||
arg0 0 MOV ! load literal
|
|
||||||
arg0 dup [] MOV
|
|
||||||
ds-reg bootstrap-cell ADD ! increment datastack pointer
|
|
||||||
ds-reg [] arg0 MOV ! store literal on datastack
|
|
||||||
] rc-absolute-cell rt-literal 1 rex-length + jit-push-literal jit-define
|
|
||||||
|
|
||||||
[
|
[
|
||||||
arg0 0 MOV ! load literal
|
arg0 0 MOV ! load literal
|
||||||
ds-reg bootstrap-cell ADD ! increment datastack pointer
|
ds-reg bootstrap-cell ADD ! increment datastack pointer
|
||||||
|
@ -294,9 +287,8 @@ big-endian off
|
||||||
|
|
||||||
! Comparisons
|
! Comparisons
|
||||||
: jit-compare ( insn -- )
|
: jit-compare ( insn -- )
|
||||||
arg1 0 MOV ! load t
|
temp-reg 0 MOV ! load t
|
||||||
arg1 dup [] MOV
|
arg1 \ f tag-number MOV ! load f
|
||||||
temp-reg \ f tag-number MOV ! load f
|
|
||||||
arg0 ds-reg [] MOV ! load first value
|
arg0 ds-reg [] MOV ! load first value
|
||||||
ds-reg bootstrap-cell SUB ! adjust stack pointer
|
ds-reg bootstrap-cell SUB ! adjust stack pointer
|
||||||
ds-reg [] arg0 CMP ! compare with second value
|
ds-reg [] arg0 CMP ! compare with second value
|
||||||
|
@ -305,14 +297,14 @@ big-endian off
|
||||||
;
|
;
|
||||||
|
|
||||||
: define-jit-compare ( insn word -- )
|
: define-jit-compare ( insn word -- )
|
||||||
[ [ jit-compare ] curry rc-absolute-cell rt-literal 1 rex-length + ] dip
|
[ [ jit-compare ] curry rc-absolute-cell rt-immediate 1 rex-length + ] dip
|
||||||
define-sub-primitive ;
|
define-sub-primitive ;
|
||||||
|
|
||||||
\ CMOVNE \ eq? define-jit-compare
|
\ CMOVE \ eq? define-jit-compare
|
||||||
\ CMOVL \ fixnum>= define-jit-compare
|
\ CMOVGE \ fixnum>= define-jit-compare
|
||||||
\ CMOVG \ fixnum<= define-jit-compare
|
\ CMOVLE \ fixnum<= define-jit-compare
|
||||||
\ CMOVLE \ fixnum> define-jit-compare
|
\ CMOVG \ fixnum> define-jit-compare
|
||||||
\ CMOVGE \ fixnum< define-jit-compare
|
\ CMOVL \ fixnum< define-jit-compare
|
||||||
|
|
||||||
! Math
|
! Math
|
||||||
: jit-math ( insn -- )
|
: jit-math ( insn -- )
|
||||||
|
|
|
@ -16,8 +16,6 @@ HOOK: temp-reg-2 cpu ( -- reg )
|
||||||
|
|
||||||
M: x86 %load-immediate MOV ;
|
M: x86 %load-immediate MOV ;
|
||||||
|
|
||||||
HOOK: rel-literal-x86 cpu ( literal -- )
|
|
||||||
|
|
||||||
M: x86 %load-indirect swap 0 MOV rc-absolute-cell rel-immediate ;
|
M: x86 %load-indirect swap 0 MOV rc-absolute-cell rel-immediate ;
|
||||||
|
|
||||||
HOOK: ds-reg cpu ( -- reg )
|
HOOK: ds-reg cpu ( -- reg )
|
||||||
|
@ -401,12 +399,12 @@ HOOK: stack-reg cpu ( -- reg )
|
||||||
|
|
||||||
M: x86 %epilogue ( n -- ) cell - incr-stack-reg ;
|
M: x86 %epilogue ( n -- ) cell - incr-stack-reg ;
|
||||||
|
|
||||||
: %boolean ( dst word -- )
|
:: %boolean ( dst temp word -- )
|
||||||
over \ f tag-number MOV
|
dst \ f tag-number MOV
|
||||||
0 [] swap execute
|
temp 0 MOV \ t rc-absolute-cell rel-immediate
|
||||||
\ t rel-literal-x86 ; inline
|
dst temp word execute ; inline
|
||||||
|
|
||||||
M: x86 %compare ( dst cc src1 src2 -- )
|
M: x86 %compare ( dst temp cc src1 src2 -- )
|
||||||
CMP {
|
CMP {
|
||||||
{ cc< [ \ CMOVL %boolean ] }
|
{ cc< [ \ CMOVL %boolean ] }
|
||||||
{ cc<= [ \ CMOVLE %boolean ] }
|
{ cc<= [ \ CMOVLE %boolean ] }
|
||||||
|
@ -416,10 +414,10 @@ M: x86 %compare ( dst cc src1 src2 -- )
|
||||||
{ cc/= [ \ CMOVNE %boolean ] }
|
{ cc/= [ \ CMOVNE %boolean ] }
|
||||||
} case ;
|
} case ;
|
||||||
|
|
||||||
M: x86 %compare-imm ( dst cc src1 src2 -- )
|
M: x86 %compare-imm ( dst temp cc src1 src2 -- )
|
||||||
%compare ;
|
%compare ;
|
||||||
|
|
||||||
M: x86 %compare-float ( dst cc src1 src2 -- )
|
M: x86 %compare-float ( dst temp cc src1 src2 -- )
|
||||||
UCOMISD {
|
UCOMISD {
|
||||||
{ cc< [ \ CMOVB %boolean ] }
|
{ cc< [ \ CMOVB %boolean ] }
|
||||||
{ cc<= [ \ CMOVBE %boolean ] }
|
{ cc<= [ \ CMOVBE %boolean ] }
|
||||||
|
|
|
@ -61,8 +61,6 @@ INLINE CELL compute_code_rel(F_REL *rel,
|
||||||
return (CELL)primitives[REL_ARGUMENT(rel)];
|
return (CELL)primitives[REL_ARGUMENT(rel)];
|
||||||
case RT_DLSYM:
|
case RT_DLSYM:
|
||||||
return (CELL)get_rel_symbol(rel,literals_start);
|
return (CELL)get_rel_symbol(rel,literals_start);
|
||||||
case RT_LITERAL:
|
|
||||||
return CREF(literals_start,REL_ARGUMENT(rel));
|
|
||||||
case RT_IMMEDIATE:
|
case RT_IMMEDIATE:
|
||||||
return get(CREF(literals_start,REL_ARGUMENT(rel)));
|
return get(CREF(literals_start,REL_ARGUMENT(rel)));
|
||||||
case RT_XT:
|
case RT_XT:
|
||||||
|
|
|
@ -3,8 +3,6 @@ typedef enum {
|
||||||
RT_PRIMITIVE,
|
RT_PRIMITIVE,
|
||||||
/* arg is a literal table index, holding an array pair (symbol/dll) */
|
/* arg is a literal table index, holding an array pair (symbol/dll) */
|
||||||
RT_DLSYM,
|
RT_DLSYM,
|
||||||
/* an indirect literal from the word's literal table */
|
|
||||||
RT_LITERAL,
|
|
||||||
/* a pointer to a compiled word reference */
|
/* a pointer to a compiled word reference */
|
||||||
RT_DISPATCH,
|
RT_DISPATCH,
|
||||||
/* a compiled word reference */
|
/* a compiled word reference */
|
||||||
|
|
|
@ -232,7 +232,7 @@ void jit_compile(CELL quot, bool relocate)
|
||||||
case WRAPPER_TYPE:
|
case WRAPPER_TYPE:
|
||||||
wrapper = untag_object(obj);
|
wrapper = untag_object(obj);
|
||||||
GROWABLE_ARRAY_ADD(literals,wrapper->object);
|
GROWABLE_ARRAY_ADD(literals,wrapper->object);
|
||||||
EMIT(userenv[JIT_PUSH_LITERAL],literals_count - 1);
|
EMIT(userenv[JIT_PUSH_IMMEDIATE],literals_count - 1);
|
||||||
break;
|
break;
|
||||||
case FIXNUM_TYPE:
|
case FIXNUM_TYPE:
|
||||||
if(jit_primitive_call_p(untag_object(array),i))
|
if(jit_primitive_call_p(untag_object(array),i))
|
||||||
|
@ -404,7 +404,7 @@ F_FIXNUM quot_code_offset_to_scan(CELL quot, F_FIXNUM offset)
|
||||||
COUNT(userenv[JIT_WORD_CALL],i)
|
COUNT(userenv[JIT_WORD_CALL],i)
|
||||||
break;
|
break;
|
||||||
case WRAPPER_TYPE:
|
case WRAPPER_TYPE:
|
||||||
COUNT(userenv[JIT_PUSH_LITERAL],i)
|
COUNT(userenv[JIT_PUSH_IMMEDIATE],i)
|
||||||
break;
|
break;
|
||||||
case FIXNUM_TYPE:
|
case FIXNUM_TYPE:
|
||||||
if(jit_primitive_call_p(untag_object(array),i))
|
if(jit_primitive_call_p(untag_object(array),i))
|
||||||
|
@ -470,7 +470,7 @@ F_FIXNUM quot_code_offset_to_scan(CELL quot, F_FIXNUM offset)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
COUNT(userenv[immediate_p(obj) ? JIT_PUSH_IMMEDIATE : JIT_PUSH_LITERAL],i)
|
COUNT(userenv[JIT_PUSH_IMMEDIATE],i)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
3
vm/run.h
3
vm/run.h
|
@ -39,9 +39,9 @@ typedef enum {
|
||||||
JIT_PRIMITIVE,
|
JIT_PRIMITIVE,
|
||||||
JIT_WORD_JUMP,
|
JIT_WORD_JUMP,
|
||||||
JIT_WORD_CALL,
|
JIT_WORD_CALL,
|
||||||
JIT_PUSH_LITERAL,
|
|
||||||
JIT_IF_WORD,
|
JIT_IF_WORD,
|
||||||
JIT_IF_1,
|
JIT_IF_1,
|
||||||
|
JIT_IF_2,
|
||||||
JIT_DISPATCH_WORD,
|
JIT_DISPATCH_WORD,
|
||||||
JIT_DISPATCH,
|
JIT_DISPATCH,
|
||||||
JIT_EPILOG,
|
JIT_EPILOG,
|
||||||
|
@ -56,7 +56,6 @@ typedef enum {
|
||||||
JIT_2DIP,
|
JIT_2DIP,
|
||||||
JIT_3DIP_WORD,
|
JIT_3DIP_WORD,
|
||||||
JIT_3DIP,
|
JIT_3DIP,
|
||||||
JIT_IF_2,
|
|
||||||
|
|
||||||
STACK_TRACES_ENV = 59,
|
STACK_TRACES_ENV = 59,
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue