2009-08-08 01:24:46 -04:00
|
|
|
! Copyright (C) 2009 Slava Pestov.
|
|
|
|
! See http://factorcode.org/license.txt for BSD license.
|
2009-09-02 07:22:37 -04:00
|
|
|
USING: kernel accessors sequences arrays fry namespaces generic
|
2009-09-03 03:33:07 -04:00
|
|
|
words sets combinators generalizations cpu.architecture compiler.units
|
2009-09-02 07:22:37 -04:00
|
|
|
compiler.cfg.utilities compiler.cfg compiler.cfg.rpo
|
2009-09-24 04:32:39 -04:00
|
|
|
compiler.cfg.instructions compiler.cfg.def-use ;
|
|
|
|
FROM: compiler.cfg.instructions.syntax => insn-def-slot insn-use-slots insn-temp-slots scalar-rep ;
|
2009-08-08 01:24:46 -04:00
|
|
|
IN: compiler.cfg.representations.preferred
|
|
|
|
|
|
|
|
GENERIC: defs-vreg-rep ( insn -- rep/f )
|
|
|
|
GENERIC: temp-vreg-reps ( insn -- reps )
|
|
|
|
GENERIC: uses-vreg-reps ( insn -- reps )
|
|
|
|
|
2009-09-02 07:22:37 -04:00
|
|
|
<PRIVATE
|
|
|
|
|
2009-09-03 03:33:07 -04:00
|
|
|
: rep-getter-quot ( rep -- quot )
|
|
|
|
{
|
|
|
|
{ f [ [ rep>> ] ] }
|
|
|
|
{ scalar-rep [ [ rep>> scalar-rep-of ] ] }
|
2009-09-04 04:01:18 -04:00
|
|
|
[ [ drop ] swap suffix ]
|
2009-09-03 03:33:07 -04:00
|
|
|
} case ;
|
|
|
|
|
2009-09-02 07:22:37 -04:00
|
|
|
: define-defs-vreg-rep-method ( insn -- )
|
|
|
|
[ \ defs-vreg-rep create-method ]
|
2009-09-03 03:33:07 -04:00
|
|
|
[ insn-def-slot [ rep>> rep-getter-quot ] [ [ drop f ] ] if* ]
|
|
|
|
bi define ;
|
|
|
|
|
|
|
|
: reps-getter-quot ( reps -- quot )
|
2009-10-28 16:02:00 -04:00
|
|
|
dup [ rep>> { f scalar-rep } member-eq? not ] all? [
|
2009-09-04 04:01:18 -04:00
|
|
|
[ rep>> ] map [ drop ] swap suffix
|
|
|
|
] [
|
|
|
|
[ rep>> rep-getter-quot ] map dup length {
|
|
|
|
{ 0 [ drop [ drop f ] ] }
|
|
|
|
{ 1 [ first [ 1array ] compose ] }
|
|
|
|
{ 2 [ first2 '[ _ _ bi 2array ] ] }
|
|
|
|
[ '[ _ cleave _ narray ] ]
|
|
|
|
} case
|
|
|
|
] if ;
|
2009-09-02 07:22:37 -04:00
|
|
|
|
|
|
|
: define-uses-vreg-reps-method ( insn -- )
|
|
|
|
[ \ uses-vreg-reps create-method ]
|
2009-09-03 03:33:07 -04:00
|
|
|
[ insn-use-slots reps-getter-quot ]
|
|
|
|
bi define ;
|
2009-09-02 07:22:37 -04:00
|
|
|
|
|
|
|
: define-temp-vreg-reps-method ( insn -- )
|
|
|
|
[ \ temp-vreg-reps create-method ]
|
2009-09-03 03:33:07 -04:00
|
|
|
[ insn-temp-slots reps-getter-quot ]
|
|
|
|
bi define ;
|
2009-08-08 01:24:46 -04:00
|
|
|
|
2009-09-02 07:22:37 -04:00
|
|
|
PRIVATE>
|
|
|
|
|
|
|
|
[
|
|
|
|
insn-classes get
|
2009-09-03 03:33:07 -04:00
|
|
|
[ [ define-defs-vreg-rep-method ] each ]
|
|
|
|
[ { ##phi } diff [ define-uses-vreg-reps-method ] each ]
|
2009-09-02 07:22:37 -04:00
|
|
|
[ [ define-temp-vreg-reps-method ] each ]
|
|
|
|
tri
|
|
|
|
] with-compilation-unit
|
|
|
|
|
2009-08-08 01:24:46 -04:00
|
|
|
: each-def-rep ( insn vreg-quot: ( vreg rep -- ) -- )
|
|
|
|
[ [ defs-vreg ] [ defs-vreg-rep ] bi ] dip with when* ; inline
|
|
|
|
|
|
|
|
: each-use-rep ( insn vreg-quot: ( vreg rep -- ) -- )
|
|
|
|
[ [ uses-vregs ] [ uses-vreg-reps ] bi ] dip 2each ; inline
|
|
|
|
|
|
|
|
: each-temp-rep ( insn vreg-quot: ( vreg rep -- ) -- )
|
|
|
|
[ [ temp-vregs ] [ temp-vreg-reps ] bi ] dip 2each ; inline
|
|
|
|
|
|
|
|
: with-vreg-reps ( cfg vreg-quot: ( vreg rep -- ) -- )
|
|
|
|
'[
|
|
|
|
[ basic-block set ] [
|
2009-08-08 05:02:18 -04:00
|
|
|
[
|
|
|
|
_
|
|
|
|
[ each-def-rep ]
|
|
|
|
[ each-use-rep ]
|
|
|
|
[ each-temp-rep ] 2tri
|
|
|
|
] each-non-phi
|
2009-08-08 01:24:46 -04:00
|
|
|
] bi
|
|
|
|
] each-basic-block ; inline
|