1 /* Copyright (C) 1998 - 2000 by Universitaet Karlsruhe
2 ** All rights reserved.
4 ** Authors: Christian Schaefer
9 # include "irgraph_t.h"
18 ir_mode *mymode, *op1mode, *op2mode, *op3mode;
19 int op_is_symmetric = 1; /* 0: asymmetric
20 1: operands have identical modes
21 2: modes of operands == mode of this node */
25 opcode = get_irn_opcode (n);
26 mymode = get_irn_mode (n);
33 /* Start: BB --> X x M x P x data1 x ... x datan */
44 op1mode = get_irn_mode(in[1]);
46 /* Cond: BB x b --> X x X */
48 /* Cond: BB x Iu --> X^n */
51 assert (mymode == mode_T);
54 op1mode = get_irn_mode(in[1]);
55 /* Return: BB x M x data1 x ... x datan --> X */
56 //printf("mode: %s, code %s\n", ID_TO_STR(n->mode->name), ID_TO_STR(n->op->name));
57 assert ( op1mode == mode_M ); /* operand M */
58 for (i=2; i < get_irn_arity(n); i++) {
59 assert ( mode_is_data(get_irn_mode(in[i])) ); /* operand datai */
61 assert ( mymode == mode_X ); /* result X */
64 op1mode = get_irn_mode(in[1]);
65 op2mode = get_irn_mode(in[2]);
67 /* Sel: BB x M x P --> X x M */
68 op1mode == mode_M && op2mode == mode_p
74 /* Const: BB --> data */
75 mode_is_data (mymode) ||
76 mymode == mode_b /* we want boolean constants for static evaluation
82 /* SymConst: BB --> Iu or
84 (mymode == mode_I) || (mymode == mode_p)
88 op1mode = get_irn_mode(in[1]);
89 op2mode = get_irn_mode(in[2]);
91 /* Sel: BB x M x P x Iu^n --> P */
92 op1mode == mode_M && op2mode == mode_p
95 for (i=3; i < get_irn_arity(n); i++) {
96 assert (get_irn_mode(in[i]) == mode_I); }
99 op1mode = get_irn_mode(in[1]);
100 op2mode = get_irn_mode(in[2]);
101 /* Call: BB x M x P x data1 x ... x datan
102 --> M x datan+1 x ... x data n+m */
103 assert ( op1mode == mode_M && op2mode == mode_p ); /* operand M x P */
104 for (i=3; i < get_irn_arity(n); i++) {
105 assert ( mode_is_data(get_irn_mode(in[i])) ); /* operand datai */
107 assert ( mymode == mode_T ); /* result T */
110 op1mode = get_irn_mode(in[1]);
111 op2mode = get_irn_mode(in[2]);
113 /* common Add: BB x num x num --> num */
114 (mymode == op1mode && mymode == op2mode
115 && mode_is_num(mymode))
116 || /* Pointer Add: BB x P x Is --> P */
117 (op1mode == mode_p && op2mode == mode_i && mymode == mode_p)
118 || /* Pointer Add: BB x Is x P --> P */
119 (op1mode == mode_i && op2mode == mode_p && mymode == mode_p)
121 if (op1mode == mode_p || op2mode == mode_p) {
122 /* BB x P x Is --> P or BB x Is x P --> P */
123 op_is_symmetric = 0; /* ArmRoq */
125 /* BB x num x num --> num */
130 op1mode = get_irn_mode(in[1]);
131 op2mode = get_irn_mode(in[2]);
133 /* common Sub: BB x num x num --> num */
134 (mymode ==op1mode && mymode == op2mode
135 && mode_is_num(op1mode))
136 || /* Pointer Sub: BB x P x Is --> P */
137 (op1mode == mode_p && op2mode == mode_i && mymode == mode_p)
138 || /* Pointer Sub: BB x Is x P --> P */
139 (op1mode == mode_i && op2mode == mode_p && mymode == mode_p)
140 || /* Pointer Sub: BB x P x P --> Is */
141 (op1mode == mode_p && op2mode == mode_p && mymode == mode_i)
143 if (op1mode == mode_p && op2mode == mode_p) {
144 op_is_symmetric = 1; /* ArmRoq */
145 } else if (op1mode == mode_p || op2mode == mode_p) {
146 op_is_symmetric = 0; /* ArmRoq */
152 op1mode = get_irn_mode(in[1]);
154 /* Minus: BB x float --> float */
155 op1mode == mymode && mode_is_float (op1mode)
160 op1mode = get_irn_mode(in[1]);
161 op2mode = get_irn_mode(in[2]);
163 /* Mul: BB x num x num --> num */
164 mymode == op1mode && mymode == op2mode
165 && mode_is_num (op1mode)
170 op1mode = get_irn_mode(in[1]);
171 op2mode = get_irn_mode(in[2]);
172 op3mode = get_irn_mode(in[3]);
174 /* Quot: BB x M x float x float --> M x X x float */
175 op1mode == mode_M && op2mode == op3mode
176 && mode_is_float(op2mode) && mymode == mode_T
181 op1mode = get_irn_mode(in[1]);
182 op2mode = get_irn_mode(in[2]);
183 op3mode = get_irn_mode(in[3]);
185 /* DivMod: BB x M x num x num --> M x X x Is x Is */
186 op1mode == mode_M && op2mode == op3mode
187 && mode_is_num (op2mode) && mymode == mode_T
193 op1mode = get_irn_mode(in[1]);
194 op2mode = get_irn_mode(in[2]);
195 op3mode = get_irn_mode(in[3]);
197 /* Div or Mod: BB x M x num x num --> M x X x Is */
198 op1mode == mode_M && op2mode == op3mode &&
199 mode_is_num (op2mode) && mymode == mode_T
204 op1mode = get_irn_mode(in[1]);
206 /* Abs: BB x num --> num */
207 op1mode == mymode && mode_is_num (op1mode)
214 op1mode = get_irn_mode(in[1]);
215 op2mode = get_irn_mode(in[2]);
217 /* And or Or or Eor: BB x int x int --> int */
218 mymode == op1mode && mymode == op2mode
219 && mode_is_int (mymode)
224 op1mode = get_irn_mode(in[1]);
226 /* Not: BB x int --> int */
228 && mode_is_int (mymode)
234 op1mode = get_irn_mode(in[1]);
235 op2mode = get_irn_mode(in[2]);
237 /* Cmp: BB x datab x datab --> b16 */
238 op1mode == op2mode && mode_is_data (op1mode)
246 op1mode = get_irn_mode(in[1]);
247 op2mode = get_irn_mode(in[2]);
249 /* Shl, Shr, Shrs or Rot: BB x int x Iu --> int */
250 mode_is_int (op1mode) && op2mode == mode_I
255 op1mode = get_irn_mode(in[1]);
257 /* Conv: BB x datab1 --> datab2 */
258 mode_is_datab (op1mode)
259 && mode_is_data (mymode)
263 /* Phi: BB x dataM^n --> dataM */
264 /* for some reason "<=" aborts. Is there a problem with get_store? */
265 for (i=1; i < get_irn_arity(n); i++) {
267 assert ( get_irn_mode(in[i]) == mymode );
269 assert ( mode_is_dataM(mymode) );
272 op1mode = get_irn_mode(in[1]);
273 op2mode = get_irn_mode(in[2]);
275 /* Load: BB x M x P --> M x X x data */
276 op1mode == mode_M && op2mode == mode_p
278 assert ( mymode == mode_T );
281 op1mode = get_irn_mode(in[1]);
282 op2mode = get_irn_mode(in[2]);
283 op3mode = get_irn_mode(in[3]);
285 /* Load: BB x M x P x data --> M x X */
286 op1mode == mode_M && op2mode == mode_p
287 && mode_is_data (op3mode)
289 assert(mymode == mode_T);
292 op1mode = get_irn_mode(in[1]);
293 op2mode = get_irn_mode(in[2]);
295 /* Alloc: BB x M x Iu --> M x X x P */
296 op1mode == mode_M && op2mode == mode_I
301 op1mode = get_irn_mode(in[1]);
302 op2mode = get_irn_mode(in[2]);
303 op3mode = get_irn_mode(in[3]);
305 /* Free: BB x M x P x Iu --> M */
306 op1mode == mode_M && op2mode == mode_p && op3mode == mode_I
311 /* Sync: BB x M^n --> M */
312 for (i=1; i < get_irn_arity(n); i++) {
313 assert ( get_irn_mode(in[i]) == mode_M );
315 assert ( mymode == mode_M );
322 /*******************************************************************/
323 /* Verify the whole graph. */
324 /*******************************************************************/
327 vrfy_wrap (ir_node *node, void *env) {
332 irg_vrfy (ir_graph *irg)
334 irg_walk(irg->end, vrfy_wrap, NULL, NULL);