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