compiler.cfg.gvn: merge in applicable changes from compiler.cfg.value-numbering
parent
2456f90eaf
commit
f2638c99dd
|
@ -34,7 +34,7 @@ M: ##box-displaced-alien rewrite
|
|||
[ dst>> ]
|
||||
[ [ base>> ] [ base-class>> ] [ displacement>> ] tri ] bi*
|
||||
[ ^^unbox-c-ptr ] dip
|
||||
##add
|
||||
##add,
|
||||
] { } make ;
|
||||
|
||||
: rewrite-unbox-any-c-ptr ( insn -- insn/f )
|
||||
|
@ -99,8 +99,8 @@ M: ##store-memory-imm alien-insn-value src>> ;
|
|||
|
||||
GENERIC: new-alien-insn ( value base displacement scale offset rep c-type insn -- insn )
|
||||
|
||||
M: ##load-memory-imm new-alien-insn drop \ ##load-memory new-insn ;
|
||||
M: ##store-memory-imm new-alien-insn drop \ ##store-memory new-insn ;
|
||||
M: ##load-memory-imm new-alien-insn drop ##load-memory new-insn ;
|
||||
M: ##store-memory-imm new-alien-insn drop ##store-memory new-insn ;
|
||||
|
||||
: fuse-displacement ( insn -- insn' )
|
||||
{
|
||||
|
|
|
@ -87,15 +87,15 @@ UNION: general-compare-insn scalar-compare-insn ##test-vector ;
|
|||
|
||||
: rewrite-boolean-comparison ( insn -- insn )
|
||||
src1>> vreg>insn {
|
||||
{ [ dup ##compare? ] [ >compare< \ ##compare-branch new-insn ] }
|
||||
{ [ dup ##compare-imm? ] [ >compare< \ ##compare-imm-branch new-insn ] }
|
||||
{ [ dup ##compare-integer? ] [ >compare< \ ##compare-integer-branch new-insn ] }
|
||||
{ [ dup ##compare-integer-imm? ] [ >compare< \ ##compare-integer-imm-branch new-insn ] }
|
||||
{ [ dup ##test? ] [ >compare< \ ##test-branch new-insn ] }
|
||||
{ [ dup ##test-imm? ] [ >compare< \ ##test-imm-branch new-insn ] }
|
||||
{ [ dup ##compare-float-unordered? ] [ >compare< \ ##compare-float-unordered-branch new-insn ] }
|
||||
{ [ dup ##compare-float-ordered? ] [ >compare< \ ##compare-float-ordered-branch new-insn ] }
|
||||
{ [ dup ##test-vector? ] [ >test-vector< \ ##test-vector-branch new-insn ] }
|
||||
{ [ dup ##compare? ] [ >compare< ##compare-branch new-insn ] }
|
||||
{ [ dup ##compare-imm? ] [ >compare< ##compare-imm-branch new-insn ] }
|
||||
{ [ dup ##compare-integer? ] [ >compare< ##compare-integer-branch new-insn ] }
|
||||
{ [ dup ##compare-integer-imm? ] [ >compare< ##compare-integer-imm-branch new-insn ] }
|
||||
{ [ dup ##test? ] [ >compare< ##test-branch new-insn ] }
|
||||
{ [ dup ##test-imm? ] [ >compare< ##test-imm-branch new-insn ] }
|
||||
{ [ dup ##compare-float-unordered? ] [ >compare< ##compare-float-unordered-branch new-insn ] }
|
||||
{ [ dup ##compare-float-ordered? ] [ >compare< ##compare-float-ordered-branch new-insn ] }
|
||||
{ [ dup ##test-vector? ] [ >test-vector< ##test-vector-branch new-insn ] }
|
||||
} cond ;
|
||||
|
||||
: fold-branch ( ? -- insn )
|
||||
|
@ -103,13 +103,13 @@ UNION: general-compare-insn scalar-compare-insn ##test-vector ;
|
|||
0 1 ?
|
||||
basic-block get [ nth 1vector ] change-successors drop
|
||||
] [ drop ] if
|
||||
\ ##branch new-insn ;
|
||||
##branch new-insn ;
|
||||
|
||||
: fold-compare-imm-branch ( insn -- insn/f )
|
||||
evaluate-compare-imm fold-branch ;
|
||||
|
||||
: >test-branch ( insn -- insn )
|
||||
[ src1>> ] [ src1>> ] [ cc>> ] tri \ ##test-branch new-insn ;
|
||||
[ src1>> ] [ src1>> ] [ cc>> ] tri ##test-branch new-insn ;
|
||||
|
||||
M: ##compare-imm-branch rewrite
|
||||
{
|
||||
|
@ -146,12 +146,12 @@ M: ##test-imm-branch rewrite
|
|||
: >compare-imm-branch ( insn swap? -- insn' )
|
||||
(>compare-imm-branch)
|
||||
[ vreg>literal ] dip
|
||||
\ ##compare-imm-branch new-insn ; inline
|
||||
##compare-imm-branch new-insn ; inline
|
||||
|
||||
: >compare-integer-imm-branch ( insn swap? -- insn' )
|
||||
(>compare-imm-branch)
|
||||
[ vreg>integer ] dip
|
||||
\ ##compare-integer-imm-branch new-insn ; inline
|
||||
##compare-integer-imm-branch new-insn ; inline
|
||||
|
||||
: evaluate-self-compare ( insn -- ? )
|
||||
cc>> { cc= cc<= cc>= } member-eq? ;
|
||||
|
@ -182,15 +182,15 @@ M: ##compare-integer-branch rewrite
|
|||
: >compare-imm ( insn swap? -- insn' )
|
||||
(>compare-imm)
|
||||
[ vreg>literal ] dip
|
||||
next-vreg \ ##compare-imm new-insn ; inline
|
||||
next-vreg ##compare-imm new-insn ; inline
|
||||
|
||||
: >compare-integer-imm ( insn swap? -- insn' )
|
||||
(>compare-imm)
|
||||
[ vreg>integer ] dip
|
||||
next-vreg \ ##compare-integer-imm new-insn ; inline
|
||||
next-vreg ##compare-integer-imm new-insn ; inline
|
||||
|
||||
: >boolean-insn ( insn ? -- insn' )
|
||||
[ dst>> ] dip \ ##load-reference new-insn ;
|
||||
[ dst>> ] dip ##load-reference new-insn ;
|
||||
|
||||
: rewrite-self-compare ( insn -- insn' )
|
||||
dup evaluate-self-compare >boolean-insn ;
|
||||
|
@ -220,14 +220,14 @@ M: ##compare-integer rewrite
|
|||
|
||||
: rewrite-redundant-comparison ( insn -- insn' )
|
||||
[ cc>> ] [ dst>> ] [ src1>> vreg>insn ] tri {
|
||||
{ [ dup ##compare? ] [ >compare< next-vreg \ ##compare new-insn ] }
|
||||
{ [ dup ##compare-imm? ] [ >compare< next-vreg \ ##compare-imm new-insn ] }
|
||||
{ [ dup ##compare-integer? ] [ >compare< next-vreg \ ##compare-integer new-insn ] }
|
||||
{ [ dup ##compare-integer-imm? ] [ >compare< next-vreg \ ##compare-integer-imm new-insn ] }
|
||||
{ [ dup ##test? ] [ >compare< next-vreg \ ##test new-insn ] }
|
||||
{ [ dup ##test-imm? ] [ >compare< next-vreg \ ##test-imm new-insn ] }
|
||||
{ [ dup ##compare-float-unordered? ] [ >compare< next-vreg \ ##compare-float-unordered new-insn ] }
|
||||
{ [ dup ##compare-float-ordered? ] [ >compare< next-vreg \ ##compare-float-ordered new-insn ] }
|
||||
{ [ dup ##compare? ] [ >compare< next-vreg ##compare new-insn ] }
|
||||
{ [ dup ##compare-imm? ] [ >compare< next-vreg ##compare-imm new-insn ] }
|
||||
{ [ dup ##compare-integer? ] [ >compare< next-vreg ##compare-integer new-insn ] }
|
||||
{ [ dup ##compare-integer-imm? ] [ >compare< next-vreg ##compare-integer-imm new-insn ] }
|
||||
{ [ dup ##test? ] [ >compare< next-vreg ##test new-insn ] }
|
||||
{ [ dup ##test-imm? ] [ >compare< next-vreg ##test-imm new-insn ] }
|
||||
{ [ dup ##compare-float-unordered? ] [ >compare< next-vreg ##compare-float-unordered new-insn ] }
|
||||
{ [ dup ##compare-float-ordered? ] [ >compare< next-vreg ##compare-float-ordered new-insn ] }
|
||||
} cond
|
||||
swap cc= eq? [ [ negate-cc ] change-cc ] when ;
|
||||
|
||||
|
@ -246,7 +246,7 @@ M: ##compare-imm rewrite
|
|||
|
||||
: >test ( insn -- insn' )
|
||||
{ [ dst>> ] [ src1>> ] [ src1>> ] [ cc>> ] [ temp>> ] } cleave
|
||||
\ ##test new-insn ;
|
||||
##test new-insn ;
|
||||
|
||||
M: ##compare-integer-imm rewrite
|
||||
{
|
||||
|
@ -262,10 +262,10 @@ M: ##compare-integer-imm rewrite
|
|||
[ src1>> vreg>insn [ src1>> ] [ src2>> ] bi ] [ cc>> ] bi ; inline
|
||||
|
||||
: simplify-test ( insn -- insn )
|
||||
[ dst>> ] [ (simplify-test) ] [ temp>> ] tri \ ##test new-insn ; inline
|
||||
[ dst>> ] [ (simplify-test) ] [ temp>> ] tri ##test new-insn ; inline
|
||||
|
||||
: simplify-test-branch ( insn -- insn )
|
||||
(simplify-test) \ ##test-branch new-insn ; inline
|
||||
(simplify-test) ##test-branch new-insn ; inline
|
||||
|
||||
: simplify-test-imm? ( insn -- ? )
|
||||
src1>> vreg>insn [ ##and-imm? ] with-available-uses? ;
|
||||
|
@ -274,18 +274,18 @@ M: ##compare-integer-imm rewrite
|
|||
[ src1>> vreg>insn [ src1>> ] [ src2>> ] bi ] [ cc>> ] bi ; inline
|
||||
|
||||
: simplify-test-imm ( insn -- insn )
|
||||
[ dst>> ] [ (simplify-test-imm) ] [ temp>> ] tri \ ##test-imm new-insn ; inline
|
||||
[ dst>> ] [ (simplify-test-imm) ] [ temp>> ] tri ##test-imm new-insn ; inline
|
||||
|
||||
: simplify-test-imm-branch ( insn -- insn )
|
||||
(simplify-test-imm) \ ##test-imm-branch new-insn ; inline
|
||||
(simplify-test-imm) ##test-imm-branch new-insn ; inline
|
||||
|
||||
: >test-imm ( insn ? -- insn' )
|
||||
(>compare-imm) [ vreg>integer ] dip next-vreg
|
||||
\ ##test-imm new-insn ; inline
|
||||
##test-imm new-insn ; inline
|
||||
|
||||
: >test-imm-branch ( insn ? -- insn' )
|
||||
(>compare-imm-branch) [ vreg>integer ] dip
|
||||
\ ##test-imm-branch new-insn ; inline
|
||||
##test-imm-branch new-insn ; inline
|
||||
|
||||
M: ##test rewrite
|
||||
{
|
||||
|
|
|
@ -91,4 +91,4 @@ M: ##load-reference >expr obj>> <reference-expr> ;
|
|||
M: ##phi >expr
|
||||
inputs>> values [ vreg>vn ] map
|
||||
basic-block get number>> prefix
|
||||
\ ##phi prefix ;
|
||||
##phi prefix ;
|
||||
|
|
|
@ -24,7 +24,7 @@ M: ##shl-imm binary-constant-fold* drop shift ;
|
|||
: binary-constant-fold ( insn -- insn' )
|
||||
[ dst>> ]
|
||||
[ [ src1>> vreg>integer ] [ src2>> ] [ ] tri binary-constant-fold* ] bi
|
||||
\ ##load-integer new-insn ; inline
|
||||
##load-integer new-insn ; inline
|
||||
|
||||
: unary-constant-fold? ( insn -- ? )
|
||||
src>> vreg>insn ##load-integer? ; inline
|
||||
|
@ -36,4 +36,4 @@ M: ##neg unary-constant-fold* drop neg ;
|
|||
|
||||
: unary-constant-fold ( insn -- insn' )
|
||||
[ dst>> ] [ [ src>> vreg>integer ] [ ] bi unary-constant-fold* ] bi
|
||||
\ ##load-integer new-insn ; inline
|
||||
##load-integer new-insn ; inline
|
||||
|
|
|
@ -20,8 +20,8 @@ IN: compiler.cfg.gvn.math
|
|||
|
||||
M: ##tagged>integer rewrite
|
||||
[ dst>> ] [ src>> vreg>insn ] bi {
|
||||
{ [ dup ##load-integer? ] [ val>> tag-fixnum \ ##load-integer new-insn ] }
|
||||
{ [ dup f-insn? ] [ drop \ f type-number \ ##load-integer new-insn ] }
|
||||
{ [ dup ##load-integer? ] [ val>> tag-fixnum ##load-integer new-insn ] }
|
||||
{ [ dup f-insn? ] [ drop \ f type-number ##load-integer new-insn ] }
|
||||
[ 2drop f ]
|
||||
} cond ;
|
||||
|
||||
|
@ -81,14 +81,14 @@ M: ##add-imm rewrite
|
|||
{
|
||||
{ [ dup src2>> 0 = ] [ identity ] }
|
||||
{ [ dup binary-constant-fold? ] [ binary-constant-fold ] }
|
||||
{ [ dup src1>> vreg>insn ##add-imm? ] [ \ ##add-imm reassociate-arithmetic ] }
|
||||
{ [ dup src1>> vreg>insn ##add-imm? ] [ ##add-imm reassociate-arithmetic ] }
|
||||
[ drop f ]
|
||||
} cond ;
|
||||
|
||||
: sub-imm>add-imm ( insn -- insn' )
|
||||
[ dst>> ] [ src1>> ] [ src2>> neg ] tri
|
||||
dup immediate-arithmetic?
|
||||
\ ##add-imm ?new-insn ;
|
||||
##add-imm ?new-insn ;
|
||||
|
||||
M: ##sub-imm rewrite sub-imm>add-imm ;
|
||||
|
||||
|
@ -97,14 +97,14 @@ M: ##sub-imm rewrite sub-imm>add-imm ;
|
|||
src2>> -1 = ;
|
||||
|
||||
: mul-to-neg ( insn -- insn' )
|
||||
[ dst>> ] [ src1>> ] bi \ ##neg new-insn ;
|
||||
[ dst>> ] [ src1>> ] bi ##neg new-insn ;
|
||||
|
||||
! Convert ##mul-imm 2^X => ##shl-imm X
|
||||
: mul-to-shl? ( insn -- ? )
|
||||
src2>> power-of-2? ;
|
||||
|
||||
: mul-to-shl ( insn -- insn' )
|
||||
[ [ dst>> ] [ src1>> ] bi ] [ src2>> log2 ] bi \ ##shl-imm new-insn ;
|
||||
[ [ dst>> ] [ src1>> ] bi ] [ src2>> log2 ] bi ##shl-imm new-insn ;
|
||||
|
||||
! Distribution converts
|
||||
! ##+-imm 2 1 X
|
||||
|
@ -145,17 +145,17 @@ M: ##mul-imm rewrite
|
|||
{ [ dup binary-constant-fold? ] [ binary-constant-fold ] }
|
||||
{ [ dup mul-to-neg? ] [ mul-to-neg ] }
|
||||
{ [ dup mul-to-shl? ] [ mul-to-shl ] }
|
||||
{ [ dup src1>> vreg>insn ##mul-imm? ] [ \ ##mul-imm reassociate-arithmetic ] }
|
||||
{ [ dup distribute-over-add? ] [ \ ##add-imm \ ##mul-imm distribute ] }
|
||||
{ [ dup distribute-over-sub? ] [ \ ##sub-imm \ ##mul-imm distribute ] }
|
||||
{ [ dup src1>> vreg>insn ##mul-imm? ] [ ##mul-imm reassociate-arithmetic ] }
|
||||
{ [ dup distribute-over-add? ] [ \ ##add-imm, \ ##mul-imm, distribute ] }
|
||||
{ [ dup distribute-over-sub? ] [ \ ##sub-imm, \ ##mul-imm, distribute ] }
|
||||
[ drop f ]
|
||||
} cond ;
|
||||
|
||||
M: ##and-imm rewrite
|
||||
{
|
||||
{ [ dup binary-constant-fold? ] [ binary-constant-fold ] }
|
||||
{ [ dup src1>> vreg>insn ##and-imm? ] [ \ ##and-imm reassociate-bitwise ] }
|
||||
{ [ dup src2>> 0 = ] [ dst>> 0 \ ##load-integer new-insn ] }
|
||||
{ [ dup src1>> vreg>insn ##and-imm? ] [ ##and-imm reassociate-bitwise ] }
|
||||
{ [ dup src2>> 0 = ] [ dst>> 0 ##load-integer new-insn ] }
|
||||
{ [ dup src2>> -1 = ] [ identity ] }
|
||||
[ drop f ]
|
||||
} cond ;
|
||||
|
@ -163,18 +163,18 @@ M: ##and-imm rewrite
|
|||
M: ##or-imm rewrite
|
||||
{
|
||||
{ [ dup src2>> 0 = ] [ identity ] }
|
||||
{ [ dup src2>> -1 = ] [ dst>> -1 \ ##load-integer new-insn ] }
|
||||
{ [ dup src2>> -1 = ] [ dst>> -1 ##load-integer new-insn ] }
|
||||
{ [ dup binary-constant-fold? ] [ binary-constant-fold ] }
|
||||
{ [ dup src1>> vreg>insn ##or-imm? ] [ \ ##or-imm reassociate-bitwise ] }
|
||||
{ [ dup src1>> vreg>insn ##or-imm? ] [ ##or-imm reassociate-bitwise ] }
|
||||
[ drop f ]
|
||||
} cond ;
|
||||
|
||||
M: ##xor-imm rewrite
|
||||
{
|
||||
{ [ dup src2>> 0 = ] [ identity ] }
|
||||
{ [ dup src2>> -1 = ] [ [ dst>> ] [ src1>> ] bi \ ##not new-insn ] }
|
||||
{ [ dup src2>> -1 = ] [ [ dst>> ] [ src1>> ] bi ##not new-insn ] }
|
||||
{ [ dup binary-constant-fold? ] [ binary-constant-fold ] }
|
||||
{ [ dup src1>> vreg>insn ##xor-imm? ] [ \ ##xor-imm reassociate-bitwise ] }
|
||||
{ [ dup src1>> vreg>insn ##xor-imm? ] [ ##xor-imm reassociate-bitwise ] }
|
||||
[ drop f ]
|
||||
} cond ;
|
||||
|
||||
|
@ -182,9 +182,9 @@ M: ##shl-imm rewrite
|
|||
{
|
||||
{ [ dup src2>> 0 = ] [ identity ] }
|
||||
{ [ dup binary-constant-fold? ] [ binary-constant-fold ] }
|
||||
{ [ dup src1>> vreg>insn ##shl-imm? ] [ \ ##shl-imm reassociate-shift ] }
|
||||
{ [ dup distribute-over-add? ] [ \ ##add-imm \ ##shl-imm distribute ] }
|
||||
{ [ dup distribute-over-sub? ] [ \ ##sub-imm \ ##shl-imm distribute ] }
|
||||
{ [ dup src1>> vreg>insn ##shl-imm? ] [ ##shl-imm reassociate-shift ] }
|
||||
{ [ dup distribute-over-add? ] [ \ ##add-imm, \ ##shl-imm, distribute ] }
|
||||
{ [ dup distribute-over-sub? ] [ \ ##sub-imm, \ ##shl-imm, distribute ] }
|
||||
[ drop f ]
|
||||
} cond ;
|
||||
|
||||
|
@ -192,7 +192,7 @@ M: ##shr-imm rewrite
|
|||
{
|
||||
{ [ dup src2>> 0 = ] [ identity ] }
|
||||
{ [ dup binary-constant-fold? ] [ binary-constant-fold ] }
|
||||
{ [ dup src1>> vreg>insn ##shr-imm? ] [ \ ##shr-imm reassociate-shift ] }
|
||||
{ [ dup src1>> vreg>insn ##shr-imm? ] [ ##shr-imm reassociate-shift ] }
|
||||
[ drop f ]
|
||||
} cond ;
|
||||
|
||||
|
@ -200,7 +200,7 @@ M: ##sar-imm rewrite
|
|||
{
|
||||
{ [ dup src2>> 0 = ] [ identity ] }
|
||||
{ [ dup binary-constant-fold? ] [ binary-constant-fold ] }
|
||||
{ [ dup src1>> vreg>insn ##sar-imm? ] [ \ ##sar-imm reassociate-shift ] }
|
||||
{ [ dup src1>> vreg>insn ##sar-imm? ] [ ##sar-imm reassociate-shift ] }
|
||||
[ drop f ]
|
||||
} cond ;
|
||||
|
||||
|
@ -217,8 +217,8 @@ M: ##sar-imm rewrite
|
|||
|
||||
M: ##add rewrite
|
||||
{
|
||||
{ [ dup src2>> vreg-immediate-arithmetic? ] [ \ ##add-imm f insn>imm-insn ] }
|
||||
{ [ dup src1>> vreg-immediate-arithmetic? ] [ \ ##add-imm t insn>imm-insn ] }
|
||||
{ [ dup src2>> vreg-immediate-arithmetic? ] [ ##add-imm f insn>imm-insn ] }
|
||||
{ [ dup src1>> vreg-immediate-arithmetic? ] [ ##add-imm t insn>imm-insn ] }
|
||||
[ drop f ]
|
||||
} cond ;
|
||||
|
||||
|
@ -227,7 +227,7 @@ M: ##add rewrite
|
|||
|
||||
! ##sub 2 1 1 => ##load-integer 2 0
|
||||
: rewrite-subtraction-identity ( insn -- insn' )
|
||||
dst>> 0 \ ##load-integer new-insn ;
|
||||
dst>> 0 ##load-integer new-insn ;
|
||||
|
||||
! ##load-integer 1 0
|
||||
! ##sub 3 1 2
|
||||
|
@ -237,61 +237,61 @@ M: ##add rewrite
|
|||
src1>> vreg>insn zero-insn? ;
|
||||
|
||||
: sub-to-neg ( ##sub -- insn )
|
||||
[ dst>> ] [ src2>> ] bi \ ##neg new-insn ;
|
||||
[ dst>> ] [ src2>> ] bi ##neg new-insn ;
|
||||
|
||||
M: ##sub rewrite
|
||||
{
|
||||
{ [ dup sub-to-neg? ] [ sub-to-neg ] }
|
||||
{ [ dup diagonal? ] [ rewrite-subtraction-identity ] }
|
||||
{ [ dup src2>> vreg-immediate-arithmetic? ] [ \ ##sub-imm f insn>imm-insn ] }
|
||||
{ [ dup src2>> vreg-immediate-arithmetic? ] [ ##sub-imm f insn>imm-insn ] }
|
||||
[ drop f ]
|
||||
} cond ;
|
||||
|
||||
M: ##mul rewrite
|
||||
{
|
||||
{ [ dup src2>> vreg-immediate-arithmetic? ] [ \ ##mul-imm f insn>imm-insn ] }
|
||||
{ [ dup src1>> vreg-immediate-arithmetic? ] [ \ ##mul-imm t insn>imm-insn ] }
|
||||
{ [ dup src2>> vreg-immediate-arithmetic? ] [ ##mul-imm f insn>imm-insn ] }
|
||||
{ [ dup src1>> vreg-immediate-arithmetic? ] [ ##mul-imm t insn>imm-insn ] }
|
||||
[ drop f ]
|
||||
} cond ;
|
||||
|
||||
M: ##and rewrite
|
||||
{
|
||||
{ [ dup diagonal? ] [ identity ] }
|
||||
{ [ dup src2>> vreg-immediate-bitwise? ] [ \ ##and-imm f insn>imm-insn ] }
|
||||
{ [ dup src1>> vreg-immediate-bitwise? ] [ \ ##and-imm t insn>imm-insn ] }
|
||||
{ [ dup src2>> vreg-immediate-bitwise? ] [ ##and-imm f insn>imm-insn ] }
|
||||
{ [ dup src1>> vreg-immediate-bitwise? ] [ ##and-imm t insn>imm-insn ] }
|
||||
[ drop f ]
|
||||
} cond ;
|
||||
|
||||
M: ##or rewrite
|
||||
{
|
||||
{ [ dup diagonal? ] [ identity ] }
|
||||
{ [ dup src2>> vreg-immediate-bitwise? ] [ \ ##or-imm f insn>imm-insn ] }
|
||||
{ [ dup src1>> vreg-immediate-bitwise? ] [ \ ##or-imm t insn>imm-insn ] }
|
||||
{ [ dup src2>> vreg-immediate-bitwise? ] [ ##or-imm f insn>imm-insn ] }
|
||||
{ [ dup src1>> vreg-immediate-bitwise? ] [ ##or-imm t insn>imm-insn ] }
|
||||
[ drop f ]
|
||||
} cond ;
|
||||
|
||||
M: ##xor rewrite
|
||||
{
|
||||
{ [ dup diagonal? ] [ dst>> 0 \ ##load-integer new-insn ] }
|
||||
{ [ dup src2>> vreg-immediate-bitwise? ] [ \ ##xor-imm f insn>imm-insn ] }
|
||||
{ [ dup src1>> vreg-immediate-bitwise? ] [ \ ##xor-imm t insn>imm-insn ] }
|
||||
{ [ dup diagonal? ] [ dst>> 0 ##load-integer new-insn ] }
|
||||
{ [ dup src2>> vreg-immediate-bitwise? ] [ ##xor-imm f insn>imm-insn ] }
|
||||
{ [ dup src1>> vreg-immediate-bitwise? ] [ ##xor-imm t insn>imm-insn ] }
|
||||
[ drop f ]
|
||||
} cond ;
|
||||
|
||||
M: ##shl rewrite
|
||||
{
|
||||
{ [ dup src2>> vreg-immediate-bitwise? ] [ \ ##shl-imm f insn>imm-insn ] }
|
||||
{ [ dup src2>> vreg-immediate-bitwise? ] [ ##shl-imm f insn>imm-insn ] }
|
||||
[ drop f ]
|
||||
} cond ;
|
||||
|
||||
M: ##shr rewrite
|
||||
{
|
||||
{ [ dup src2>> vreg-immediate-bitwise? ] [ \ ##shr-imm f insn>imm-insn ] }
|
||||
{ [ dup src2>> vreg-immediate-bitwise? ] [ ##shr-imm f insn>imm-insn ] }
|
||||
[ drop f ]
|
||||
} cond ;
|
||||
|
||||
M: ##sar rewrite
|
||||
{
|
||||
{ [ dup src2>> vreg-immediate-bitwise? ] [ \ ##sar-imm f insn>imm-insn ] }
|
||||
{ [ dup src2>> vreg-immediate-bitwise? ] [ ##sar-imm f insn>imm-insn ] }
|
||||
[ drop f ]
|
||||
} cond ;
|
||||
|
|
|
@ -11,5 +11,5 @@ M: ##replace rewrite
|
|||
[ loc>> ] [ src>> vreg>insn ] bi
|
||||
dup literal-insn? [
|
||||
insn>literal dup immediate-store?
|
||||
[ swap \ ##replace-imm new-insn ] [ 2drop f ] if
|
||||
[ swap ##replace-imm new-insn ] [ 2drop f ] if
|
||||
] [ 2drop f ] if ;
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
USING: accessors combinators combinators.short-circuit arrays
|
||||
fry kernel layouts math namespaces sequences cpu.architecture
|
||||
math.bitwise math.order classes generalizations
|
||||
combinators.smart locals make alien.c-types io.binary grouping
|
||||
locals make alien.c-types io.binary grouping
|
||||
math.vectors.simd.intrinsics
|
||||
compiler.cfg
|
||||
compiler.cfg.registers
|
||||
|
@ -27,7 +27,7 @@ IN: compiler.cfg.gvn.simd
|
|||
[ [ dst>> ] [ src>> ] bi* ]
|
||||
[ [ shuffle>> ] bi@ nths ]
|
||||
[ drop rep>> ]
|
||||
2tri \ ##shuffle-vector-imm new-insn
|
||||
2tri ##shuffle-vector-imm new-insn
|
||||
] [ 2drop f ] if ;
|
||||
|
||||
: (fold-shuffle-vector-imm) ( shuffle bytes -- bytes' )
|
||||
|
@ -35,7 +35,7 @@ IN: compiler.cfg.gvn.simd
|
|||
|
||||
: fold-shuffle-vector-imm ( outer inner -- insn' )
|
||||
[ [ dst>> ] [ shuffle>> ] bi ] [ obj>> ] bi*
|
||||
(fold-shuffle-vector-imm) \ ##load-reference new-insn ;
|
||||
(fold-shuffle-vector-imm) ##load-reference new-insn ;
|
||||
|
||||
M: ##shuffle-vector-imm rewrite
|
||||
dup src>> vreg>insn {
|
||||
|
@ -54,7 +54,7 @@ M: ##shuffle-vector-imm rewrite
|
|||
|
||||
: (fold-scalar>vector) ( insn bytes -- insn' )
|
||||
[ [ dst>> ] [ rep>> rep-length ] bi ] dip <repetition> concat
|
||||
\ ##load-reference new-insn ;
|
||||
##load-reference new-insn ;
|
||||
|
||||
: fold-scalar>vector ( outer inner -- insn' )
|
||||
over rep>> scalar-value (fold-scalar>vector) ;
|
||||
|
@ -69,7 +69,7 @@ M: ##scalar>vector rewrite
|
|||
:: fold-gather-vector-2 ( insn src1 src2 -- insn )
|
||||
insn dst>>
|
||||
src1 src2 [ insn rep>> scalar-value ] bi@ append
|
||||
\ ##load-reference new-insn ;
|
||||
##load-reference new-insn ;
|
||||
|
||||
: rewrite-gather-vector-2 ( insn -- insn/f )
|
||||
dup [ src1>> vreg>insn ] [ src2>> vreg>insn ] bi {
|
||||
|
@ -85,9 +85,9 @@ M: ##gather-int-vector-2 rewrite rewrite-gather-vector-2 ;
|
|||
insn dst>>
|
||||
[
|
||||
src1 src2 src3 src4
|
||||
[ insn rep>> scalar-value ] 4 napply
|
||||
] B{ } append-outputs-as
|
||||
\ ##load-reference new-insn ;
|
||||
[ insn rep>> scalar-value % ] 4 napply
|
||||
] B{ } make
|
||||
##load-reference new-insn ;
|
||||
|
||||
: rewrite-gather-vector-4 ( insn -- insn/f )
|
||||
dup { [ src1>> ] [ src2>> ] [ src3>> ] [ src4>> ] } cleave [ vreg>insn ] 4 napply
|
||||
|
@ -102,7 +102,7 @@ M: ##gather-int-vector-4 rewrite rewrite-gather-vector-4 ;
|
|||
|
||||
: fold-shuffle-vector ( insn src1 src2 -- insn )
|
||||
[ dst>> ] [ obj>> ] [ obj>> ] tri*
|
||||
swap nths \ ##load-reference new-insn ;
|
||||
swap nths ##load-reference new-insn ;
|
||||
|
||||
M: ##shuffle-vector rewrite
|
||||
dup [ src>> vreg>insn ] [ shuffle>> vreg>insn ] bi
|
||||
|
@ -113,7 +113,7 @@ M: ##shuffle-vector rewrite
|
|||
|
||||
M: ##xor-vector rewrite
|
||||
dup diagonal?
|
||||
[ [ dst>> ] [ rep>> ] bi \ ##zero-vector new-insn ] [ drop f ] if ;
|
||||
[ [ dst>> ] [ rep>> ] bi ##zero-vector new-insn ] [ drop f ] if ;
|
||||
|
||||
: vector-not? ( insn -- ? )
|
||||
{
|
||||
|
@ -140,7 +140,7 @@ M: ##and-vector rewrite
|
|||
[ src1>> vreg>insn vector-not-src ]
|
||||
[ src2>> ]
|
||||
[ rep>> ]
|
||||
} cleave \ ##andn-vector new-insn
|
||||
} cleave ##andn-vector new-insn
|
||||
] }
|
||||
{ [ dup src2>> vreg>insn vector-not? ] [
|
||||
{
|
||||
|
@ -148,7 +148,7 @@ M: ##and-vector rewrite
|
|||
[ src2>> vreg>insn vector-not-src ]
|
||||
[ src1>> ]
|
||||
[ rep>> ]
|
||||
} cleave \ ##andn-vector new-insn
|
||||
} cleave ##andn-vector new-insn
|
||||
] }
|
||||
[ drop f ]
|
||||
} cond ;
|
||||
|
@ -160,5 +160,5 @@ M: ##andn-vector rewrite
|
|||
[ src1>> vreg>insn vector-not-src ]
|
||||
[ src2>> ]
|
||||
[ rep>> ]
|
||||
} cleave \ ##and-vector new-insn
|
||||
} cleave ##and-vector new-insn
|
||||
] [ drop f ] if ;
|
||||
|
|
Loading…
Reference in New Issue