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 IN: compiler.cfg.representations.preferred
10 GENERIC: defs-vreg-rep ( insn -- rep/f )
11 GENERIC: temp-vreg-reps ( insn -- reps )
12 GENERIC: uses-vreg-reps ( insn -- reps )
14 M: insn defs-vreg-rep drop f ;
15 M: insn temp-vreg-reps drop { } ;
16 M: insn uses-vreg-reps drop { } ;
20 : rep-getter-quot ( rep -- quot )
23 { scalar-rep [ [ rep>> scalar-rep-of ] ] }
24 [ [ drop ] swap suffix ]
27 : define-defs-vreg-rep-method ( insn -- )
28 dup insn-def-slot dup [
29 [ \ defs-vreg-rep create-method ]
30 [ rep>> rep-getter-quot ]
34 : reps-getter-quot ( reps -- quot )
35 dup [ rep>> { f scalar-rep } member-eq? not ] all? [
36 [ rep>> ] map [ drop ] swap suffix
38 [ rep>> rep-getter-quot ] map dup length {
39 { 0 [ drop [ drop f ] ] }
40 { 1 [ first [ 1array ] compose ] }
41 { 2 [ first2 '[ _ _ bi 2array ] ] }
42 [ '[ _ cleave _ narray ] ]
46 : define-uses-vreg-reps-method ( insn -- )
47 dup insn-use-slots [ drop ] [
48 [ \ uses-vreg-reps create-method ]
53 : define-temp-vreg-reps-method ( insn -- )
54 dup insn-temp-slots [ drop ] [
55 [ \ temp-vreg-reps create-method ]
64 [ [ define-defs-vreg-rep-method ] each ]
65 [ { ##phi } diff [ define-uses-vreg-reps-method ] each ]
66 [ [ define-temp-vreg-reps-method ] each ]
68 ] with-compilation-unit
70 : each-def-rep ( insn vreg-quot: ( vreg rep -- ) -- )
71 [ [ defs-vreg ] [ defs-vreg-rep ] bi ] dip with when* ; inline
73 : each-use-rep ( insn vreg-quot: ( vreg rep -- ) -- )
74 [ [ uses-vregs ] [ uses-vreg-reps ] bi ] dip 2each ; inline
76 : each-temp-rep ( insn vreg-quot: ( vreg rep -- ) -- )
77 [ [ temp-vregs ] [ temp-vreg-reps ] bi ] dip 2each ; inline
79 : with-vreg-reps ( cfg vreg-quot: ( vreg rep -- ) -- )
86 [ each-temp-rep ] 2tri
89 ] each-basic-block ; inline