1 ///////////////////////////////////////////////////////////////////////////////
2 // This file is generated automatically using Prop (version 2.2.7),
3 // last updated on Mar 20, 1996.
4 // The original source file is "sparc3.pC".
5 ///////////////////////////////////////////////////////////////////////////////
7 #define PROP_REWRITING_USED
8 #define PROP_EQUALITY_USED
9 #define PROP_QUARK_USED
11 ///////////////////////////////////////////////////////////////////////////////
12 // Forward class definition for Inst
13 ///////////////////////////////////////////////////////////////////////////////
14 #ifndef datatype_Inst_defined
15 #define datatype_Inst_defined
16 typedef class a_Inst * Inst;
19 ///////////////////////////////////////////////////////////////////////////////
20 // Class hierarchy for datatype Inst
21 ///////////////////////////////////////////////////////////////////////////////
22 class a_Inst; // base class for datatype Inst
23 class Inst_INT; // subclass for 'INT int'
24 class Inst_LOAD; // subclass for 'LOAD Inst'
25 class Inst_ADD; // subclass for 'ADD (Inst, Inst)'
26 class Inst_SUB; // subclass for 'SUB (Inst, Inst)'
27 class Inst_DIV; // subclass for 'DIV (Inst, Inst)'
28 class Inst_MUL; // subclass for 'MUL (Inst, Inst)'
30 ///////////////////////////////////////////////////////////////////////////////
31 // Base class for datatype 'Inst'
32 ///////////////////////////////////////////////////////////////////////////////
33 class a_Inst : public TermObj {
36 tag_INT = 0, tag_LOAD = 1, tag_ADD = 2, tag_SUB = 3,
37 tag_DIV = 4, tag_MUL = 5
42 inline a_Inst(Tag_Inst _t_) : _tag_(_t_) {}
44 inline int untag() const { return _tag_; }
45 inline friend int boxed(const a_Inst * x) { return 1; }
46 inline friend int untag(const a_Inst * x) { return x->_tag_; }
47 ////////////////////////////////////////////////////////////////////////////
48 // Downcasting functions for Inst
49 ////////////////////////////////////////////////////////////////////////////
50 inline friend Inst_INT * _INT(Inst _x_) { return (Inst_INT *)_x_; }
51 inline friend Inst_LOAD * _LOAD(Inst _x_) { return (Inst_LOAD *)_x_; }
52 inline friend Inst_ADD * _ADD(Inst _x_) { return (Inst_ADD *)_x_; }
53 inline friend Inst_SUB * _SUB(Inst _x_) { return (Inst_SUB *)_x_; }
54 inline friend Inst_DIV * _DIV(Inst _x_) { return (Inst_DIV *)_x_; }
55 inline friend Inst_MUL * _MUL(Inst _x_) { return (Inst_MUL *)_x_; }
58 ///////////////////////////////////////////////////////////////////////////////
59 // class for constructor 'Inst::INT int'
60 ///////////////////////////////////////////////////////////////////////////////
61 class Inst_INT : public a_Inst {
64 inline Inst_INT (int _xINT)
65 : a_Inst(a_Inst::tag_INT), INT(_xINT) {}
66 inline friend a_Inst * INT (int _xINT)
67 { return new Inst_INT (_xINT); }
70 ///////////////////////////////////////////////////////////////////////////////
71 // class for constructor 'Inst::LOAD Inst'
72 ///////////////////////////////////////////////////////////////////////////////
73 class Inst_LOAD : public a_Inst {
76 inline Inst_LOAD (Inst _xLOAD)
77 : a_Inst(a_Inst::tag_LOAD), LOAD(_xLOAD) {}
78 inline friend a_Inst * LOAD (Inst _xLOAD)
79 { return new Inst_LOAD (_xLOAD); }
82 ///////////////////////////////////////////////////////////////////////////////
83 // class for constructor 'Inst::ADD (Inst, Inst)'
84 ///////////////////////////////////////////////////////////////////////////////
85 class Inst_ADD : public a_Inst {
88 inline Inst_ADD (Inst _x1, Inst _x2)
89 : a_Inst(a_Inst::tag_ADD), _1(_x1), _2(_x2) {}
90 inline friend a_Inst * ADD (Inst _x1, Inst _x2)
91 { return new Inst_ADD (_x1, _x2); }
94 ///////////////////////////////////////////////////////////////////////////////
95 // class for constructor 'Inst::SUB (Inst, Inst)'
96 ///////////////////////////////////////////////////////////////////////////////
97 class Inst_SUB : public a_Inst {
100 inline Inst_SUB (Inst _x1, Inst _x2)
101 : a_Inst(a_Inst::tag_SUB), _1(_x1), _2(_x2) {}
102 inline friend a_Inst * SUB (Inst _x1, Inst _x2)
103 { return new Inst_SUB (_x1, _x2); }
106 ///////////////////////////////////////////////////////////////////////////////
107 // class for constructor 'Inst::DIV (Inst, Inst)'
108 ///////////////////////////////////////////////////////////////////////////////
109 class Inst_DIV : public a_Inst {
112 inline Inst_DIV (Inst _x1, Inst _x2)
113 : a_Inst(a_Inst::tag_DIV), _1(_x1), _2(_x2) {}
114 inline friend a_Inst * DIV (Inst _x1, Inst _x2)
115 { return new Inst_DIV (_x1, _x2); }
118 ///////////////////////////////////////////////////////////////////////////////
119 // class for constructor 'Inst::MUL (Inst, Inst)'
120 ///////////////////////////////////////////////////////////////////////////////
121 class Inst_MUL : public a_Inst {
124 inline Inst_MUL (Inst _x1, Inst _x2)
125 : a_Inst(a_Inst::tag_MUL), _1(_x1), _2(_x2) {}
126 inline friend a_Inst * MUL (Inst _x1, Inst _x2)
127 { return new Inst_MUL (_x1, _x2); }
132 void compile (Inst e)
134 extern void _s_p_a_r_c_3co_X1_rewrite(Inst & );
135 _s_p_a_r_c_3co_X1_rewrite(e);
137 class _s_p_a_r_c_3co_X1 : public BURS {
139 _s_p_a_r_c_3co_X1(const _s_p_a_r_c_3co_X1&); // no copy constructor
140 void operator = (const _s_p_a_r_c_3co_X1&); // no assignment
142 struct _s_p_a_r_c_3co_X1_StateRec * stack__, * stack_top__;
143 void labeler(Inst & redex);
144 inline virtual void operator () (Inst & redex) { labeler(redex); }
145 void reduce(Inst redex);
148 inline _s_p_a_r_c_3co_X1() {}
150 void _s_p_a_r_c_3co_X1_rewrite(Inst & _x_)
151 { _s_p_a_r_c_3co_X1 _r_;
152 _r_(_x_); return _r_.reduce(_x_);
156 ///////////////////////////////////////////////////////////////////////////////
157 // State record for rewrite class _s_p_a_r_c_3co_X1
158 ///////////////////////////////////////////////////////////////////////////////
159 struct _s_p_a_r_c_3co_X1_StateRec {
160 TreeTables::Cost cost[3]; // cost for each non-terminal
161 struct { // accept rule number
162 unsigned int _exp : 3;
163 unsigned int _reg : 3;
167 ///////////////////////////////////////////////////////////////////////////////
168 // Accept rules tables for rewrite class _s_p_a_r_c_3co_X1
169 ///////////////////////////////////////////////////////////////////////////////
170 const char _s_p_a_r_c_3co_X1_exp_accept[] = { -1, 8, 7, 6, 5, 4 };
172 const char _s_p_a_r_c_3co_X1_reg_accept[] = { -1, 3, 2, 1, 0 };
174 ///////////////////////////////////////////////////////////////////////////////
175 // Closure methods for rewrite class _s_p_a_r_c_3co_X1
176 ///////////////////////////////////////////////////////////////////////////////
177 static void _s_p_a_r_c_3co_X1_reg_closure(Inst redex,int cost);
179 static void _s_p_a_r_c_3co_X1_reg_closure(Inst redex,int cost__)
181 _s_p_a_r_c_3co_X1_StateRec * _state_rec = (_s_p_a_r_c_3co_X1_StateRec *)(redex->get_state_rec());
182 if (cost__ + 0 < _state_rec->cost[2])
183 { _state_rec->cost[2] = cost__ + 0;
184 _state_rec->rule._exp = 1;
188 void _s_p_a_r_c_3co_X1::labeler (Inst redex)
191 _s_p_a_r_c_3co_X1_StateRec * _state_rec = (_s_p_a_r_c_3co_X1_StateRec *)mem[sizeof(_s_p_a_r_c_3co_X1_StateRec)];
192 redex->set_state_rec(_state_rec);
193 _state_rec->cost[0] = 0;
194 _state_rec->cost[1] =
195 _state_rec->cost[2] = 32767;
197 switch (redex->untag()) {
198 case a_Inst::tag_INT: {
200 if (cost__ + 1 < state_rec->cost[1])
201 { _state_rec->cost[1] = cost__ + 1;
202 _state_rec->rule._reg = 4;
203 _s_p_a_r_c_3co_X1_reg_closure(redex, cost__ + 1);
205 case a_Inst::tag_LOAD: {
207 switch (_LOAD(redex)->LOAD->untag()) {
208 case a_Inst::tag_INT: {
209 if (cost__ + 2 < state_rec->cost[1])
210 { _state_rec->cost[1] = cost__ + 2;
211 _state_rec->rule._reg = 3;
212 _s_p_a_r_c_3co_X1_reg_closure(redex, cost__ + 2);
214 case a_Inst::tag_ADD: {
215 if (cost__ + 3 < state_rec->cost[1])
216 { _state_rec->cost[1] = cost__ + 3;
217 _state_rec->rule._reg = 2;
218 _s_p_a_r_c_3co_X1_reg_closure(redex, cost__ + 3);
222 int _X2 = cost(_LOAD(redex)->LOAD);
223 if (cost__ + _X2 < state_rec->cost[1])
224 { _state_rec->cost[1] = cost__ + _X2;
225 _state_rec->rule._reg = 1;
226 _s_p_a_r_c_3co_X1_reg_closure(redex, cost__ + _X2);
228 case a_Inst::tag_ADD: {
230 if (cost__ + 1 < state_rec->cost[2])
231 { _state_rec->cost[2] = cost__ + 1;
232 _state_rec->rule._exp = 4;
233 _s_p_a_r_c_3co_X1_exp_closure(redex, cost__ + 1);
235 case a_Inst::tag_SUB: {
237 if (cost__ + 1 < state_rec->cost[2])
238 { _state_rec->cost[2] = cost__ + 1;
239 _state_rec->rule._exp = 3;
240 _s_p_a_r_c_3co_X1_exp_closure(redex, cost__ + 1);
242 case a_Inst::tag_DIV: {
244 int _X3 = notarget(a);
245 if (cost__ + _X3 < state_rec->cost[2])
246 { _state_rec->cost[2] = cost__ + _X3;
247 _state_rec->rule._exp = 1;
248 _s_p_a_r_c_3co_X1_exp_closure(redex, cost__ + _X3);
252 if (cost__ + 2 < state_rec->cost[2])
253 { _state_rec->cost[2] = cost__ + 2;
254 _state_rec->rule._exp = 2;
255 _s_p_a_r_c_3co_X1_exp_closure(redex, cost__ + 2);
262 void _s_p_a_r_c_3co_X1::reduce(Inst redex)
264 int r__ = (_s_p_a_r_c_3co_X1_StateRec *)(redex->get_state_rec());
266 case 8: { // DIV (exp, exp)
267 reduce(_DIV(redex)->_1);
268 reduce(_DIV(redex)->_2);
270 case 7: { // MUL (exp, exp)
271 reduce(_MUL(redex)->_1);
272 reduce(_MUL(redex)->_2);
274 case 6: { // SUB (exp, exp)
275 reduce(_SUB(redex)->_1);
276 reduce(_SUB(redex)->_2);
278 case 5: { // ADD (exp, exp)
279 reduce(_ADD(redex)->_1);
280 reduce(_ADD(redex)->_2);
285 case 3: { // LOAD reg
286 reduce(_LOAD(redex)->LOAD);
288 case 2: { // LOAD ADD (reg, reg)
289 reduce(_ADD(_LOAD(redex)->LOAD)->_1);
290 reduce(_ADD(_LOAD(redex)->LOAD)->_2);
292 case 1: { // LOAD INT addr
300 ------------------------------- Statistics -------------------------------
301 Merge matching rules = yes
302 Number of DFA nodes merged = 4
303 Number of ifs generated = 0
304 Number of switches generated = 2
307 Adaptive matching = disabled
308 Fast string matching = disabled
309 Inline downcasts = disabled
310 --------------------------------------------------------------------------