1 ! Copyright (C) 2009 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: kernel accessors sequences arrays fry namespaces generic
4 words sets combinators generalizations cpu.architecture compiler.units
5 compiler.cfg.utilities compiler.cfg compiler.cfg.rpo
6 compiler.cfg.instructions compiler.cfg.def-use ;
7 FROM: compiler.cfg.instructions.syntax => insn-def-slot insn-use-slots insn-temp-slots scalar-rep ;
8 FROM: namespaces => set ;
9 IN: compiler.cfg.representations.preferred
11 GENERIC: defs-vreg-rep ( insn -- rep/f )
12 GENERIC: temp-vreg-reps ( insn -- reps )
13 GENERIC: uses-vreg-reps ( insn -- reps )
15 M: insn defs-vreg-rep drop f ;
16 M: insn temp-vreg-reps drop { } ;
17 M: insn uses-vreg-reps drop { } ;
21 : rep-getter-quot ( rep -- quot )
24 { scalar-rep [ [ rep>> scalar-rep-of ] ] }
25 [ [ drop ] swap suffix ]
28 : define-defs-vreg-rep-method ( insn -- )
29 dup insn-def-slot dup [
30 [ \ defs-vreg-rep create-method ]
31 [ rep>> rep-getter-quot ]
35 : reps-getter-quot ( reps -- quot )
36 dup [ rep>> { f scalar-rep } member-eq? not ] all? [
37 [ rep>> ] map [ drop ] swap suffix
39 [ rep>> rep-getter-quot ] map dup length {
40 { 0 [ drop [ drop f ] ] }
41 { 1 [ first [ 1array ] compose ] }
42 { 2 [ first2 '[ _ _ bi 2array ] ] }
43 [ '[ _ cleave _ narray ] ]
47 : define-uses-vreg-reps-method ( insn -- )
48 dup insn-use-slots [ drop ] [
49 [ \ uses-vreg-reps create-method ]
54 : define-temp-vreg-reps-method ( insn -- )
55 dup insn-temp-slots [ drop ] [
56 [ \ temp-vreg-reps create-method ]
65 [ [ define-defs-vreg-rep-method ] each ]
66 [ { ##phi } diff [ define-uses-vreg-reps-method ] each ]
67 [ [ define-temp-vreg-reps-method ] each ]
69 ] with-compilation-unit
71 : each-def-rep ( ... insn vreg-quot: ( ... vreg rep -- ... ) -- ... )
72 [ [ defs-vreg ] [ defs-vreg-rep ] bi ] dip with when* ; inline
74 : each-use-rep ( ... insn vreg-quot: ( ... vreg rep -- ... ) -- ... )
75 [ [ uses-vregs ] [ uses-vreg-reps ] bi ] dip 2each ; inline
77 : each-temp-rep ( ... insn vreg-quot: ( ... vreg rep -- ... ) -- ... )
78 [ [ temp-vregs ] [ temp-vreg-reps ] bi ] dip 2each ; inline
80 : with-vreg-reps ( ..a cfg vreg-quot: ( ..a vreg rep -- ..b ) -- ..b )
87 [ each-temp-rep ] 2tri
90 ] each-basic-block ; inline