]> gitweb.factorcode.org Git - factor.git/blob - extra/compiler/cfg/gvn/rewrite/rewrite.factor
Switch to https urls
[factor.git] / extra / compiler / cfg / gvn / 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 kernel
4 layouts math cpu.architecture
5 compiler.cfg.instructions
6 compiler.cfg.gvn.graph ;
7 IN: compiler.cfg.gvn.rewrite
8
9 ! Outputs f to mean no change
10 GENERIC: rewrite ( insn -- insn/f )
11
12 M: insn rewrite drop f ;
13
14 ! Utilities
15 GENERIC: insn>integer ( insn -- n )
16
17 M: ##load-integer insn>integer val>> ;
18
19 : vreg>integer ( vreg -- n ) vreg>insn insn>integer ; inline
20
21 : vreg-immediate-arithmetic? ( vreg -- ? )
22     vreg>insn {
23         [ ##load-integer? ]
24         [ val>> immediate-arithmetic? ]
25     } 1&& ;
26
27 : vreg-immediate-bitwise? ( vreg -- ? )
28     vreg>insn {
29         [ ##load-integer? ]
30         [ val>> immediate-bitwise? ]
31     } 1&& ;
32
33 UNION: literal-insn ##load-integer ##load-reference ;
34
35 GENERIC: insn>literal ( insn -- n )
36
37 M: ##load-integer insn>literal val>> >fixnum ;
38
39 M: ##load-reference insn>literal obj>> ;
40
41 : vreg>literal ( vreg -- n ) vreg>insn insn>literal ; inline
42
43 : vreg-immediate-comparand? ( vreg -- ? )
44     vreg>insn {
45         { [ dup ##load-integer? ] [ val>> tag-fixnum immediate-comparand? ] }
46         { [ dup ##load-reference? ] [ obj>> immediate-comparand? ] }
47         [ drop f ]
48     } cond ;