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
9 ! Outputs f to mean no change
10 GENERIC: rewrite ( insn -- insn/f )
12 M: insn rewrite drop f ;
15 GENERIC: insn>integer ( insn -- n )
17 M: ##load-integer insn>integer val>> ;
19 : vreg>integer ( vreg -- n ) vreg>insn insn>integer ; inline
21 : vreg-immediate-arithmetic? ( vreg -- ? )
24 [ val>> immediate-arithmetic? ]
27 : vreg-immediate-bitwise? ( vreg -- ? )
30 [ val>> immediate-bitwise? ]
33 UNION: literal-insn ##load-integer ##load-reference ;
35 GENERIC: insn>literal ( insn -- n )
37 M: ##load-integer insn>literal val>> >fixnum ;
39 M: ##load-reference insn>literal obj>> ;
41 : vreg>literal ( vreg -- n ) vreg>insn insn>literal ; inline
43 : vreg-immediate-comparand? ( vreg -- ? )
45 { [ dup ##load-integer? ] [ val>> tag-fixnum immediate-comparand? ] }
46 { [ dup ##load-reference? ] [ obj>> immediate-comparand? ] }