1 ! Copyright (C) 2008, 2010 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: accessors classes.parser classes.tuple combinators
4 effects fry kernel lexer make namespaces parser sequences
6 IN: compiler.cfg.instructions.syntax
8 SYMBOLS: def use temp literal ;
12 TUPLE: insn-slot-spec type name rep ;
14 : parse-rep ( str/f -- rep )
17 { [ dup "scalar-rep" = ] [ drop scalar-rep ] }
18 [ "cpu.architecture" lookup-word ]
21 : parse-insn-slot-spec ( type string -- spec )
22 over [ "Missing type" throw ] unless
26 : parse-insn-slot-specs ( seq -- specs )
30 { "def:" [ drop def ] }
31 { "use:" [ drop use ] }
32 { "temp:" [ drop temp ] }
33 { "literal:" [ drop literal ] }
34 [ dupd parse-insn-slot-spec , ]
39 : insn-def-slots ( class -- slot/f )
40 "insn-slots" word-prop [ type>> def eq? ] filter ;
42 : insn-use-slots ( class -- slots )
43 "insn-slots" word-prop [ type>> use eq? ] filter ;
45 : insn-temp-slots ( class -- slots )
46 "insn-slots" word-prop [ type>> temp eq? ] filter ;
48 ! We cannot reference words in compiler.cfg.instructions directly
49 ! since that would create circularity.
50 : insn-classes-word ( -- word )
51 "insn-classes" "compiler.cfg.instructions" lookup-word ;
53 : insn-word ( -- word )
54 "insn" "compiler.cfg.instructions" lookup-word ;
56 : vreg-insn-word ( -- word )
57 "vreg-insn" "compiler.cfg.instructions" lookup-word ;
59 : flushable-insn-word ( -- word )
60 "flushable-insn" "compiler.cfg.instructions" lookup-word ;
62 : foldable-insn-word ( -- word )
63 "foldable-insn" "compiler.cfg.instructions" lookup-word ;
65 : insn-effect ( word -- effect )
66 boa-effect in>> but-last { } <effect> ;
68 : uses-vregs? ( specs -- ? )
69 [ type>> { def use temp } member-eq? ] any? ;
71 : define-insn-tuple ( class superclass specs -- )
72 [ name>> ] map "insn#" suffix define-tuple-class ;
74 : insn-ctor-name ( word -- name )
77 : define-insn-ctor ( class specs -- )
78 [ [ insn-ctor-name create-in ] [ '[ _ ] [ f ] [ boa , ] surround ] bi ] dip
79 [ name>> ] map { } <effect> define-declared ;
81 : define-insn ( class superclass specs -- )
84 [ nip "insn-slots" set-word-prop ]
85 [ 2drop insn-classes-word get push ]
87 [ 2drop save-location ]
88 [ nip define-insn-ctor ]
92 scan-new-class insn-word ";" parse-tokens define-insn ;
95 scan-new-class vreg-insn-word ";" parse-tokens define-insn ;
97 SYNTAX: FLUSHABLE-INSN:
98 scan-new-class flushable-insn-word ";" parse-tokens define-insn ;
100 SYNTAX: FOLDABLE-INSN:
101 scan-new-class foldable-insn-word ";" parse-tokens define-insn ;