rewrite rules for add/sub/mul/and/or/xor-imm, rewrite load-immediate/add to be add-imm

db4
Doug Coleman 2009-07-02 11:35:31 -05:00
parent 04cb320c55
commit 86901eb01e
1 changed files with 61 additions and 19 deletions

View File

@ -5,16 +5,12 @@ compiler.cfg.hats compiler.cfg.instructions
compiler.cfg.value-numbering.expressions compiler.cfg.value-numbering.expressions
compiler.cfg.value-numbering.graph compiler.cfg.value-numbering.graph
compiler.cfg.value-numbering.simplify fry kernel layouts math compiler.cfg.value-numbering.simplify fry kernel layouts math
namespaces sequences ; namespaces sequences cpu.architecture math.bitwise locals ;
IN: compiler.cfg.value-numbering.rewrite IN: compiler.cfg.value-numbering.rewrite
GENERIC: rewrite ( insn -- insn' ) GENERIC: rewrite ( insn -- insn' )
M: ##mul-imm rewrite M: insn rewrite ;
dup src2>> dup power-of-2? [
[ [ dst>> ] [ src1>> ] bi ] [ log2 ] bi* \ ##shl-imm new-insn
dup number-values
] [ drop ] if ;
: ##branch-t? ( insn -- ? ) : ##branch-t? ( insn -- ? )
dup ##compare-imm-branch? [ dup ##compare-imm-branch? [
@ -80,7 +76,7 @@ M: ##compare-imm-branch rewrite
: flip-comparison ( insn -- insn' ) : flip-comparison ( insn -- insn' )
[ dst>> ] [ dst>> ]
[ src2>> ] [ src2>> ]
[ src1>> vreg>vn vn>constant ] tri [ src1>> vreg>constant ] tri
cc= i \ ##compare-imm new-insn ; cc= i \ ##compare-imm new-insn ;
M: ##compare rewrite M: ##compare rewrite
@ -117,20 +113,66 @@ M: ##compare-imm rewrite
] when ] when
] when ; ] when ;
: combine-add-imm? ( insn -- ? ) : combine-imm? ( insn op -- ? )
{ [ src1>> vreg>expr op>> ] dip = ;
[ src1>> vreg>expr op>> \ ##add-imm = ]
[ src2>> number? ]
} 1&& ;
: combine-add-imm ( dst src n -- insn ) :: combine-imm ( insn quot op -- insn )
[ vreg>expr [ in1>> vn>vreg ] [ in2>> vn>constant ] bi ] dip insn
+ \ ##add-imm new-insn ; [ dst>> ]
[ src1>> vreg>expr [ in1>> vn>vreg ] [ in2>> vn>constant ] bi ]
[ src2>> ] tri
quot call cell-bits bits
dup small-enough? [
op new-insn dup number-values
] [
3drop insn
] if ; inline
M: ##add-imm rewrite M: ##add-imm rewrite
dup combine-add-imm? [ {
[ dst>> ] [ src1>> ] [ src2>> ] tri combine-add-imm { [ dup \ ##add-imm combine-imm? ]
[ [ + ] \ ##add-imm combine-imm ] }
{ [ dup \ ##sub-imm combine-imm? ]
[ [ - ] \ ##sub-imm combine-imm ] }
[ ]
} cond ;
M: ##sub-imm rewrite
{
{ [ dup \ ##add-imm combine-imm? ]
[ [ - ] \ ##add-imm combine-imm ] }
{ [ dup \ ##sub-imm combine-imm? ]
[ [ + ] \ ##sub-imm combine-imm ] }
[ ]
} cond ;
M: ##mul-imm rewrite
dup src2>> dup power-of-2? [
[ [ dst>> ] [ src1>> ] bi ] [ log2 ] bi* \ ##shl-imm new-insn
dup number-values
] [
drop dup \ ##mul-imm combine-imm?
[ [ * ] \ ##mul-imm combine-imm ] when
] if ;
M: ##and-imm rewrite
dup \ ##and-imm combine-imm?
[ [ bitand ] \ ##and-imm combine-imm ] when ;
M: ##or-imm rewrite
dup \ ##or-imm combine-imm?
[ [ bitor ] \ ##or-imm combine-imm ] when ;
M: ##xor-imm rewrite
dup \ ##xor-imm combine-imm?
[ [ bitxor ] \ ##xor-imm combine-imm ] when ;
M: ##add rewrite
dup src2>> vreg>expr constant-expr? [
[ dst>> ]
[ src1>> ]
[ src2>> vreg>constant ] tri \ ##add-imm new-insn
dup number-values dup number-values
] when ; ] when ;
M: insn rewrite ;