compiler.cfg: fuse ##load-integer/##load-reference into ##replace to form ##replace-imm
parent
9788323d25
commit
428ba9fd0f
|
@ -51,6 +51,9 @@ INSN: ##replace
|
||||||
use: src/tagged-rep
|
use: src/tagged-rep
|
||||||
literal: loc ;
|
literal: loc ;
|
||||||
|
|
||||||
|
INSN: ##replace-imm
|
||||||
|
literal: src loc ;
|
||||||
|
|
||||||
INSN: ##inc-d
|
INSN: ##inc-d
|
||||||
literal: n ;
|
literal: n ;
|
||||||
|
|
||||||
|
|
|
@ -33,14 +33,19 @@ M: ##inc-r visit-insn n>> rs-loc handle-inc ;
|
||||||
|
|
||||||
ERROR: uninitialized-peek insn ;
|
ERROR: uninitialized-peek insn ;
|
||||||
|
|
||||||
M: ##peek visit-insn
|
: visit-peek ( ##peek -- )
|
||||||
dup loc>> [ n>> ] [ class get ] bi ?nth 0 =
|
dup loc>> [ n>> ] [ class get ] bi ?nth 0 =
|
||||||
[ uninitialized-peek ] [ drop ] if ;
|
[ uninitialized-peek ] [ drop ] if ; inline
|
||||||
|
|
||||||
M: ##replace visit-insn
|
M: ##peek visit-insn visit-peek ;
|
||||||
|
|
||||||
|
: visit-replace ( ##replace -- )
|
||||||
loc>> [ n>> ] [ class get ] bi
|
loc>> [ n>> ] [ class get ] bi
|
||||||
2dup length < [ [ 1 ] 2dip set-nth ] [ 2drop ] if ;
|
2dup length < [ [ 1 ] 2dip set-nth ] [ 2drop ] if ;
|
||||||
|
|
||||||
|
M: ##replace visit-insn visit-replace ;
|
||||||
|
M: ##replace-imm visit-insn visit-replace ;
|
||||||
|
|
||||||
M: insn visit-insn drop ;
|
M: insn visit-insn drop ;
|
||||||
|
|
||||||
: prepare ( pair -- )
|
: prepare ( pair -- )
|
||||||
|
|
|
@ -17,13 +17,11 @@ IN: compiler.cfg.value-numbering.comparisons
|
||||||
! 3) Folding comparisons where both inputs are congruent
|
! 3) Folding comparisons where both inputs are congruent
|
||||||
! 4) Converting compare instructions into compare-imm instructions
|
! 4) Converting compare instructions into compare-imm instructions
|
||||||
|
|
||||||
UNION: literal-insn ##load-integer ##load-reference ;
|
|
||||||
|
|
||||||
: fold-compare-imm? ( insn -- ? )
|
: fold-compare-imm? ( insn -- ? )
|
||||||
src1>> vreg>insn literal-insn? ;
|
src1>> vreg>insn literal-insn? ;
|
||||||
|
|
||||||
: evaluate-compare-imm ( insn -- ? )
|
: evaluate-compare-imm ( insn -- ? )
|
||||||
[ src1>> vreg>comparand ] [ src2>> ] [ cc>> ] tri
|
[ src1>> vreg>literal ] [ src2>> ] [ cc>> ] tri
|
||||||
{
|
{
|
||||||
{ cc= [ eq? ] }
|
{ cc= [ eq? ] }
|
||||||
{ cc/= [ eq? not ] }
|
{ cc/= [ eq? not ] }
|
||||||
|
@ -107,7 +105,7 @@ M: ##compare-integer-imm-branch rewrite
|
||||||
|
|
||||||
: >compare-imm-branch ( insn swap? -- insn' )
|
: >compare-imm-branch ( insn swap? -- insn' )
|
||||||
(>compare-imm-branch)
|
(>compare-imm-branch)
|
||||||
[ vreg>comparand ] dip
|
[ vreg>literal ] dip
|
||||||
\ ##compare-imm-branch new-insn ; inline
|
\ ##compare-imm-branch new-insn ; inline
|
||||||
|
|
||||||
: >compare-integer-imm-branch ( insn swap? -- insn' )
|
: >compare-integer-imm-branch ( insn swap? -- insn' )
|
||||||
|
@ -143,7 +141,7 @@ M: ##compare-integer-branch rewrite
|
||||||
|
|
||||||
: >compare-imm ( insn swap? -- insn' )
|
: >compare-imm ( insn swap? -- insn' )
|
||||||
(>compare-imm)
|
(>compare-imm)
|
||||||
[ vreg>comparand ] dip
|
[ vreg>literal ] dip
|
||||||
next-vreg \ ##compare-imm new-insn ; inline
|
next-vreg \ ##compare-imm new-insn ; inline
|
||||||
|
|
||||||
: >compare-integer-imm ( insn swap? -- insn' )
|
: >compare-integer-imm ( insn swap? -- insn' )
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
Slava Pestov
|
|
@ -0,0 +1,13 @@
|
||||||
|
! Copyright (C) 2010 Slava Pestov.
|
||||||
|
! See http://factorcode.org/license.txt for BSD license.
|
||||||
|
USING: accessors compiler.cfg.instructions
|
||||||
|
compiler.cfg.value-numbering.graph
|
||||||
|
compiler.cfg.value-numbering.rewrite cpu.architecture kernel ;
|
||||||
|
IN: compiler.cfg.value-numbering.misc
|
||||||
|
|
||||||
|
M: ##replace rewrite
|
||||||
|
object-immediates? [
|
||||||
|
[ loc>> ] [ src>> vreg>insn ] bi dup literal-insn?
|
||||||
|
[ insn>literal swap \ ##replace-imm new-insn ]
|
||||||
|
[ 2drop f ] if
|
||||||
|
] [ drop f ] if ;
|
|
@ -1,7 +1,7 @@
|
||||||
! Copyright (C) 2010 Slava Pestov.
|
! Copyright (C) 2010 Slava Pestov.
|
||||||
! See http://factorcode.org/license.txt for BSD license.
|
! See http://factorcode.org/license.txt for BSD license.
|
||||||
USING: accessors combinators combinators.short-circuit kernel layouts
|
USING: accessors combinators combinators.short-circuit kernel
|
||||||
cpu.architecture
|
layouts math cpu.architecture
|
||||||
compiler.cfg.instructions
|
compiler.cfg.instructions
|
||||||
compiler.cfg.value-numbering.graph ;
|
compiler.cfg.value-numbering.graph ;
|
||||||
IN: compiler.cfg.value-numbering.rewrite
|
IN: compiler.cfg.value-numbering.rewrite
|
||||||
|
@ -30,13 +30,15 @@ M: ##load-integer insn>integer val>> ;
|
||||||
[ val>> immediate-bitwise? ]
|
[ val>> immediate-bitwise? ]
|
||||||
} 1&& ;
|
} 1&& ;
|
||||||
|
|
||||||
GENERIC: insn>comparand ( expr -- n )
|
UNION: literal-insn ##load-integer ##load-reference ;
|
||||||
|
|
||||||
M: ##load-integer insn>comparand val>> tag-fixnum ;
|
GENERIC: insn>literal ( insn -- n )
|
||||||
|
|
||||||
M: ##load-reference insn>comparand obj>> ;
|
M: ##load-integer insn>literal val>> >fixnum ;
|
||||||
|
|
||||||
: vreg>comparand ( vreg -- n ) vreg>insn insn>comparand ; inline
|
M: ##load-reference insn>literal obj>> ;
|
||||||
|
|
||||||
|
: vreg>literal ( vreg -- n ) vreg>insn insn>literal ; inline
|
||||||
|
|
||||||
: vreg-immediate-comparand? ( vreg -- ? )
|
: vreg-immediate-comparand? ( vreg -- ? )
|
||||||
vreg>insn {
|
vreg>insn {
|
||||||
|
|
|
@ -15,6 +15,7 @@ compiler.cfg.value-numbering.graph
|
||||||
compiler.cfg.value-numbering.math
|
compiler.cfg.value-numbering.math
|
||||||
compiler.cfg.value-numbering.rewrite
|
compiler.cfg.value-numbering.rewrite
|
||||||
compiler.cfg.value-numbering.slots
|
compiler.cfg.value-numbering.slots
|
||||||
|
compiler.cfg.value-numbering.misc
|
||||||
compiler.cfg.value-numbering.expressions ;
|
compiler.cfg.value-numbering.expressions ;
|
||||||
IN: compiler.cfg.value-numbering
|
IN: compiler.cfg.value-numbering
|
||||||
|
|
||||||
|
|
|
@ -81,6 +81,7 @@ CODEGEN: ##load-double %load-double
|
||||||
CODEGEN: ##load-vector %load-vector
|
CODEGEN: ##load-vector %load-vector
|
||||||
CODEGEN: ##peek %peek
|
CODEGEN: ##peek %peek
|
||||||
CODEGEN: ##replace %replace
|
CODEGEN: ##replace %replace
|
||||||
|
CODEGEN: ##replace-imm %replace-imm
|
||||||
CODEGEN: ##inc-d %inc-d
|
CODEGEN: ##inc-d %inc-d
|
||||||
CODEGEN: ##inc-r %inc-r
|
CODEGEN: ##inc-r %inc-r
|
||||||
CODEGEN: ##call %call
|
CODEGEN: ##call %call
|
||||||
|
@ -193,7 +194,7 @@ CODEGEN: ##write-barrier-imm %write-barrier-imm
|
||||||
CODEGEN: ##compare %compare
|
CODEGEN: ##compare %compare
|
||||||
CODEGEN: ##compare-imm %compare-imm
|
CODEGEN: ##compare-imm %compare-imm
|
||||||
CODEGEN: ##compare-integer %compare
|
CODEGEN: ##compare-integer %compare
|
||||||
CODEGEN: ##compare-integer-imm %compare-imm
|
CODEGEN: ##compare-integer-imm %compare-integer-imm
|
||||||
CODEGEN: ##compare-float-ordered %compare-float-ordered
|
CODEGEN: ##compare-float-ordered %compare-float-ordered
|
||||||
CODEGEN: ##compare-float-unordered %compare-float-unordered
|
CODEGEN: ##compare-float-unordered %compare-float-unordered
|
||||||
CODEGEN: ##save-context %save-context
|
CODEGEN: ##save-context %save-context
|
||||||
|
@ -227,7 +228,7 @@ SYNTAX: CONDITIONAL:
|
||||||
CONDITIONAL: ##compare-branch %compare-branch
|
CONDITIONAL: ##compare-branch %compare-branch
|
||||||
CONDITIONAL: ##compare-imm-branch %compare-imm-branch
|
CONDITIONAL: ##compare-imm-branch %compare-imm-branch
|
||||||
CONDITIONAL: ##compare-integer-branch %compare-branch
|
CONDITIONAL: ##compare-integer-branch %compare-branch
|
||||||
CONDITIONAL: ##compare-integer-imm-branch %compare-imm-branch
|
CONDITIONAL: ##compare-integer-imm-branch %compare-integer-imm-branch
|
||||||
CONDITIONAL: ##compare-float-ordered-branch %compare-float-ordered-branch
|
CONDITIONAL: ##compare-float-ordered-branch %compare-float-ordered-branch
|
||||||
CONDITIONAL: ##compare-float-unordered-branch %compare-float-unordered-branch
|
CONDITIONAL: ##compare-float-unordered-branch %compare-float-unordered-branch
|
||||||
CONDITIONAL: ##test-vector-branch %test-vector-branch
|
CONDITIONAL: ##test-vector-branch %test-vector-branch
|
||||||
|
|
|
@ -221,12 +221,14 @@ generic-comparison-ops [
|
||||||
] "outputs" set-word-prop
|
] "outputs" set-word-prop
|
||||||
|
|
||||||
\ both-fixnums? [
|
\ both-fixnums? [
|
||||||
[ class>> ] bi@ {
|
node-input-infos first2 [ class>> ] bi@ {
|
||||||
{ [ 2dup [ fixnum classes-intersect? not ] either? ] [ f <literal-info> ] }
|
{ [ 2dup [ fixnum classes-intersect? not ] either? ] [ [ 2drop f ] ] }
|
||||||
{ [ 2dup [ fixnum class<= ] both? ] [ t <literal-info> ] }
|
{ [ 2dup [ fixnum class<= ] both? ] [ [ 2drop t ] ] }
|
||||||
[ object-info ]
|
{ [ dup fixnum class<= ] [ [ drop fixnum? ] ] }
|
||||||
|
{ [ over fixnum class<= ] [ [ nip fixnum? ] ] }
|
||||||
|
[ f ]
|
||||||
} cond 2nip
|
} cond 2nip
|
||||||
] "outputs" set-word-prop
|
] "custom-inlining" set-word-prop
|
||||||
|
|
||||||
{
|
{
|
||||||
{ >fixnum fixnum }
|
{ >fixnum fixnum }
|
||||||
|
|
|
@ -229,6 +229,7 @@ HOOK: %load-vector cpu ( reg val rep -- )
|
||||||
|
|
||||||
HOOK: %peek cpu ( vreg loc -- )
|
HOOK: %peek cpu ( vreg loc -- )
|
||||||
HOOK: %replace cpu ( vreg loc -- )
|
HOOK: %replace cpu ( vreg loc -- )
|
||||||
|
HOOK: %replace-imm cpu ( src loc -- )
|
||||||
HOOK: %inc-d cpu ( n -- )
|
HOOK: %inc-d cpu ( n -- )
|
||||||
HOOK: %inc-r cpu ( n -- )
|
HOOK: %inc-r cpu ( n -- )
|
||||||
|
|
||||||
|
@ -472,11 +473,13 @@ HOOK: %epilogue cpu ( n -- )
|
||||||
|
|
||||||
HOOK: %compare cpu ( dst temp cc src1 src2 -- )
|
HOOK: %compare cpu ( dst temp cc src1 src2 -- )
|
||||||
HOOK: %compare-imm cpu ( dst temp cc src1 src2 -- )
|
HOOK: %compare-imm cpu ( dst temp cc src1 src2 -- )
|
||||||
|
HOOK: %compare-integer-imm cpu ( dst temp cc src1 src2 -- )
|
||||||
HOOK: %compare-float-ordered cpu ( dst temp cc src1 src2 -- )
|
HOOK: %compare-float-ordered cpu ( dst temp cc src1 src2 -- )
|
||||||
HOOK: %compare-float-unordered cpu ( dst temp cc src1 src2 -- )
|
HOOK: %compare-float-unordered 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 -- )
|
||||||
|
HOOK: %compare-integer-imm-branch cpu ( label cc src1 src2 -- )
|
||||||
HOOK: %compare-float-ordered-branch cpu ( label cc src1 src2 -- )
|
HOOK: %compare-float-ordered-branch cpu ( label cc src1 src2 -- )
|
||||||
HOOK: %compare-float-unordered-branch cpu ( label cc src1 src2 -- )
|
HOOK: %compare-float-unordered-branch cpu ( label cc src1 src2 -- )
|
||||||
|
|
||||||
|
|
|
@ -24,11 +24,18 @@ M: x86.32 stack-reg ESP ;
|
||||||
M: x86.32 frame-reg EBP ;
|
M: x86.32 frame-reg EBP ;
|
||||||
M: x86.32 temp-reg ECX ;
|
M: x86.32 temp-reg ECX ;
|
||||||
|
|
||||||
M: x86.32 immediate-comparand? ( n -- ? )
|
|
||||||
[ call-next-method ] [ word? ] bi or ;
|
|
||||||
|
|
||||||
M: x86.32 object-immediates? ( -- ? ) t ;
|
M: x86.32 object-immediates? ( -- ? ) t ;
|
||||||
|
|
||||||
|
M: x86.32 immediate-comparand? ( obj -- ? ) drop t ;
|
||||||
|
|
||||||
|
M: x86.32 %replace-imm ( src loc -- )
|
||||||
|
loc>operand swap
|
||||||
|
{
|
||||||
|
{ [ dup not ] [ drop \ f type-number MOV ] }
|
||||||
|
{ [ dup fixnum? ] [ tag-fixnum MOV ] }
|
||||||
|
[ [ HEX: ffffffff MOV ] dip rc-absolute rel-literal ]
|
||||||
|
} cond ;
|
||||||
|
|
||||||
M: x86.32 %load-double ( dst val -- )
|
M: x86.32 %load-double ( dst val -- )
|
||||||
[ 0 [] MOVSD ] dip rc-absolute rel-float ;
|
[ 0 [] MOVSD ] dip rc-absolute rel-float ;
|
||||||
|
|
||||||
|
|
|
@ -531,12 +531,18 @@ M:: x86 %compare ( dst src1 src2 cc temp -- )
|
||||||
: (%compare-tagged) ( src1 src2 -- )
|
: (%compare-tagged) ( src1 src2 -- )
|
||||||
[ HEX: ffffffff CMP ] dip rc-absolute rel-literal ;
|
[ HEX: ffffffff CMP ] dip rc-absolute rel-literal ;
|
||||||
|
|
||||||
|
: (%compare-integer-imm) ( src1 src2 cc -- )
|
||||||
|
3dup use-test? [ 2drop dup TEST ] [ drop CMP ] if ;
|
||||||
|
|
||||||
|
M:: x86 %compare-integer-imm ( dst src1 src2 cc temp -- )
|
||||||
|
src1 src2 cc (%compare-integer-imm)
|
||||||
|
dst cc temp %boolean ;
|
||||||
|
|
||||||
: (%compare-imm) ( src1 src2 cc -- )
|
: (%compare-imm) ( src1 src2 cc -- )
|
||||||
{
|
{
|
||||||
{ [ 3dup use-test? ] [ 2drop dup TEST ] }
|
{ [ over fixnum? ] [ [ tag-fixnum ] dip (%compare-integer-imm) ] }
|
||||||
{ [ over integer? ] [ drop CMP ] }
|
|
||||||
{ [ over word? ] [ drop (%compare-tagged) ] }
|
|
||||||
{ [ over not ] [ 2drop \ f type-number CMP ] }
|
{ [ over not ] [ 2drop \ f type-number CMP ] }
|
||||||
|
[ drop (%compare-tagged) ]
|
||||||
} cond ;
|
} cond ;
|
||||||
|
|
||||||
M:: x86 %compare-imm ( dst src1 src2 cc temp -- )
|
M:: x86 %compare-imm ( dst src1 src2 cc temp -- )
|
||||||
|
@ -557,6 +563,10 @@ M:: x86 %compare-branch ( label src1 src2 cc -- )
|
||||||
src1 src2 CMP
|
src1 src2 CMP
|
||||||
label cc %branch ;
|
label cc %branch ;
|
||||||
|
|
||||||
|
M:: x86 %compare-integer-imm-branch ( label src1 src2 cc -- )
|
||||||
|
src1 src2 cc (%compare-integer-imm)
|
||||||
|
label cc %branch ;
|
||||||
|
|
||||||
M:: x86 %compare-imm-branch ( label src1 src2 cc -- )
|
M:: x86 %compare-imm-branch ( label src1 src2 cc -- )
|
||||||
src1 src2 cc (%compare-imm)
|
src1 src2 cc (%compare-imm)
|
||||||
label cc %branch ;
|
label cc %branch ;
|
||||||
|
|
Loading…
Reference in New Issue