1 /* Copyright (C) 1998 - 2000 by Universitaet Karlsruhe
2 ** All rights reserved.
4 ** Authors: Christian Schaefer
17 ir_mode *mymode, *op1mode, *op2mode, *op3mode;
18 int op_is_symmetric = 1; /* 0: asymmetric
19 1: operands have identical modes
20 2: modes of operands == mode of this node */
24 opcode = get_irn_opcode (n);
25 mymode = get_irn_mode (n);
28 // IR_OP_VRFY (opcode);
29 // IR_MODE_VRFY (mymode);
35 /* Start: BB --> X x M x P x data1 x ... x datan */
46 op1mode = get_irn_mode(in[1]);
48 /* Cond: BB x b --> X x X */
50 /* Cond: BB x Iu --> X^n */
53 assert (mymode == mode_T);
56 op1mode = get_irn_mode(in[1]);
57 /* Return: BB x M x data1 x ... x datan --> X */
58 //printf("mode: %s, code %s\n", ID_TO_STR(n->mode->name), ID_TO_STR(n->op->name));
59 assert ( op1mode == mode_M ); /* operand M */
60 for (i=2; i < get_irn_arity(n); i++) {
61 assert ( mode_is_data(get_irn_mode(in[i])) ); /* operand datai */
63 assert ( mymode == mode_X ); /* result X */
66 op1mode = get_irn_mode(in[1]);
67 op2mode = get_irn_mode(in[2]);
69 /* Sel: BB x M x P --> X x M */
70 op1mode == mode_M && op2mode == mode_p
76 /* Const: BB --> data */
77 mode_is_data (mymode) ||
78 mymode == mode_b /* we want boolean constants for static evaluation
84 /* SymConst: BB --> Iu or
86 (mymode == mode_I) || (mymode == mode_p)
90 op1mode = get_irn_mode(in[1]);
91 op2mode = get_irn_mode(in[2]);
93 /* Sel: BB x M x P x Iu^n --> P */
94 op1mode == mode_M && op2mode == mode_p
97 for (i=3; i < get_irn_arity(n); i++) {
98 assert (get_irn_mode(in[i]) == mode_I); }
101 op1mode = get_irn_mode(in[1]);
102 op2mode = get_irn_mode(in[2]);
103 /* Call: BB x M x P x data1 x ... x datan
104 --> M x datan+1 x ... x data n+m */
105 assert ( op1mode == mode_M && op2mode == mode_p ); /* operand M x P */
106 for (i=3; i < get_irn_arity(n); i++) {
107 assert ( mode_is_data(get_irn_mode(in[i])) ); /* operand datai */
109 assert ( mymode == mode_T ); /* result T */
112 op1mode = get_irn_mode(in[1]);
113 op2mode = get_irn_mode(in[2]);
115 /* common Add: BB x num x num --> num */
116 (mymode == op1mode && mymode == op2mode
117 && mode_is_num(mymode))
118 || /* Pointer Add: BB x P x Is --> P */
119 (op1mode == mode_p && op2mode == mode_i && mymode == mode_p)
120 || /* Pointer Add: BB x Is x P --> P */
121 (op1mode == mode_i && op2mode == mode_p && mymode == mode_p)
123 if (op1mode == mode_p || op2mode == mode_p) {
124 /* BB x P x Is --> P or BB x Is x P --> P */
125 op_is_symmetric = 0; /* ArmRoq */
127 /* BB x num x num --> num */
132 op1mode = get_irn_mode(in[1]);
133 op2mode = get_irn_mode(in[2]);
135 /* common Sub: BB x num x num --> num */
136 (mymode ==op1mode && mymode == op2mode
137 && mode_is_num(op1mode))
138 || /* Pointer Sub: BB x P x Is --> P */
139 (op1mode == mode_p && op2mode == mode_i && mymode == mode_p)
140 || /* Pointer Sub: BB x Is x P --> P */
141 (op1mode == mode_i && op2mode == mode_p && mymode == mode_p)
142 || /* Pointer Sub: BB x P x P --> Is */
143 (op1mode == mode_p && op2mode == mode_p && mymode == mode_i)
145 if (op1mode == mode_p && op2mode == mode_p) {
146 op_is_symmetric = 1; /* ArmRoq */
147 } else if (op1mode == mode_p || op2mode == mode_p) {
148 op_is_symmetric = 0; /* ArmRoq */
154 op1mode = get_irn_mode(in[1]);
156 /* Minus: BB x float --> float */
157 op1mode == mymode && mode_is_float (op1mode)
162 op1mode = get_irn_mode(in[1]);
163 op2mode = get_irn_mode(in[2]);
165 /* Mul: BB x num x num --> num */
166 mymode == op1mode && mymode == op2mode
167 && mode_is_num (op1mode)
172 op1mode = get_irn_mode(in[1]);
173 op2mode = get_irn_mode(in[2]);
174 op3mode = get_irn_mode(in[3]);
176 /* Quot: BB x M x float x float --> M x X x float */
177 op1mode == mode_M && op2mode == op3mode
178 && mode_is_float(op2mode) && mymode == mode_T
183 op1mode = get_irn_mode(in[1]);
184 op2mode = get_irn_mode(in[2]);
185 op3mode = get_irn_mode(in[3]);
187 /* DivMod: BB x M x num x num --> M x X x Is x Is */
188 op1mode == mode_M && op2mode == op3mode
189 && mode_is_num (op2mode) && mymode == mode_T
195 op1mode = get_irn_mode(in[1]);
196 op2mode = get_irn_mode(in[2]);
197 op3mode = get_irn_mode(in[3]);
199 /* Div or Mod: BB x M x num x num --> M x X x Is */
200 op1mode == mode_M && op2mode == op3mode &&
201 mode_is_num (op2mode) && mymode == mode_T
206 op1mode = get_irn_mode(in[1]);
208 /* Abs: BB x num --> num */
209 op1mode == mymode && mode_is_num (op1mode)
216 op1mode = get_irn_mode(in[1]);
217 op2mode = get_irn_mode(in[2]);
219 /* And or Or or Eor: BB x int x int --> int */
220 mymode == op1mode && mymode == op2mode
221 && mode_is_int (mymode)
226 op1mode = get_irn_mode(in[1]);
228 /* Not: BB x int --> int */
230 && mode_is_int (mymode)
236 op1mode = get_irn_mode(in[1]);
237 op2mode = get_irn_mode(in[2]);
239 /* Cmp: BB x datab x datab --> b16 */
240 op1mode == op2mode && mode_is_data (op1mode)
248 op1mode = get_irn_mode(in[1]);
249 op2mode = get_irn_mode(in[2]);
251 /* Shl, Shr, Shrs or Rot: BB x int x Iu --> int */
252 mode_is_int (op1mode) && op2mode == mode_I
257 op1mode = get_irn_mode(in[1]);
259 /* Conv: BB x datab1 --> datab2 */
260 mode_is_datab (op1mode)
261 && mode_is_data (mymode)
265 /* Phi: BB x dataM^n --> dataM */
266 /* for some reason "<=" aborts. Is there a problem with get_store? */
267 for (i=1; i < get_irn_arity(n); i++) {
268 assert ( get_irn_mode(in[i]) == mymode );
270 assert ( mode_is_dataM(mymode) );
273 op1mode = get_irn_mode(in[1]);
274 op2mode = get_irn_mode(in[2]);
276 /* Load: BB x M x P --> M x X x data */
277 op1mode == mode_M && op2mode == mode_p
279 assert ( mymode == mode_T );
282 op1mode = get_irn_mode(in[1]);
283 op2mode = get_irn_mode(in[2]);
284 op3mode = get_irn_mode(in[3]);
286 /* Load: BB x M x P x data --> M x X */
287 op1mode == mode_M && op2mode == mode_p
288 && mode_is_data (op3mode)
290 assert(mymode == mode_T);
293 op1mode = get_irn_mode(in[1]);
294 op2mode = get_irn_mode(in[2]);
296 /* Alloc: BB x M x Iu --> M x X x P */
297 op1mode == mode_M && op2mode == mode_I
302 op1mode = get_irn_mode(in[1]);
303 op2mode = get_irn_mode(in[2]);
304 op3mode = get_irn_mode(in[3]);
306 /* Free: BB x M x P x Iu --> M */
307 op1mode == mode_M && op2mode == mode_p && op3mode == mode_I
312 /* Sync: BB x M^n --> M */
313 for (i=1; i < get_irn_arity(n); i++) {
314 assert ( get_irn_mode(in[i]) == mode_M );
316 assert ( mymode == mode_M );
323 /*******************************************************************/
324 /* Verify the whole graph. */
325 /*******************************************************************/
328 vrfy_wrap (ir_node *node, void *env) {
333 vrfy_graph (ir_graph *irg)
335 irg_walk(irg->end, vrfy_wrap, NULL, NULL);