! Copyright (C) 2010 Slava Pestov. ! See http://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 ;