]> gitweb.factorcode.org Git - factor.git/blob - basis/compiler/cfg/value-numbering/rewrite/rewrite.factor
scryfall: parse mtga deck format
[factor.git] / basis / compiler / cfg / value-numbering / rewrite / rewrite.factor
1 ! Copyright (C) 2010 Slava Pestov.
2 ! See https://factorcode.org/license.txt for BSD license.
3 USING: accessors combinators combinators.short-circuit
4 compiler.cfg.instructions compiler.cfg.value-numbering.graph
5 cpu.architecture kernel layouts math ;
6 IN: compiler.cfg.value-numbering.rewrite
7
8 ! Outputs f to mean no change
9 GENERIC: rewrite ( insn -- insn/f )
10
11 M: insn rewrite drop f ;
12
13 ! Utilities
14 GENERIC: insn>integer ( insn -- n )
15
16 M: ##load-integer insn>integer val>> ;
17
18 : vreg>integer ( vreg -- n ) vreg>insn insn>integer ; inline
19
20 : vreg-immediate-arithmetic? ( vreg -- ? )
21     vreg>insn {
22         [ ##load-integer? ]
23         [ val>> immediate-arithmetic? ]
24     } 1&& ;
25
26 : vreg-immediate-bitwise? ( vreg -- ? )
27     vreg>insn {
28         [ ##load-integer? ]
29         [ val>> immediate-bitwise? ]
30     } 1&& ;
31
32 UNION: literal-insn ##load-integer ##load-reference ;
33
34 GENERIC: insn>literal ( insn -- n )
35
36 M: ##load-integer insn>literal val>> >fixnum ;
37
38 M: ##load-reference insn>literal obj>> ;
39
40 : vreg>literal ( vreg -- n ) vreg>insn insn>literal ; inline
41
42 : vreg-immediate-comparand? ( vreg -- ? )
43     vreg>insn {
44         { [ dup ##load-integer? ] [ val>> tag-fixnum immediate-comparand? ] }
45         { [ dup ##load-reference? ] [ obj>> immediate-comparand? ] }
46         [ drop f ]
47     } cond ;