1 from spec_util import abstract, setnodedefaults
4 "Base class for firm nodes"
8 "Unary nodes have exactly 1 input"
16 "Binary nodes have exactly 2 inputs"
18 ins = [ "left", "right" ]
24 flags = ["commutative"]
27 ins = [ "mem", "count" ]
29 ("M", "memory result", "pn_Generic_M"),
30 ("X_regular", "control flow when no exception occurs", "pn_Generic_X_regular"),
31 ("X_except", "control flow when exception occured", "pn_Generic_X_except"),
32 ("res", "pointer to newly allocated memory", "pn_Generic_other"),
34 flags = [ "fragile", "uses_memory" ]
42 type = "ir_where_alloc"
46 attr_struct = "alloc_attr"
51 flags = [ "dump_noblock" ]
53 attr_struct = "irg_attr"
57 customSerializer = True
60 flags = [ "commutative" ]
65 flags = [ "keep", "uses_memory" ]
67 pinned_init = "op_pin_state_pinned"
68 attr_struct = "asm_attr"
70 customSerializer = True
73 name = "input_constraints",
74 type = "ir_asm_constraint*",
77 name = "n_output_constraints",
82 name = "output_constraints",
83 type = "ir_asm_constraint*",
102 flags = [ "cfopcode", "start_block", "dump_noblock" ]
105 block = "get_irg_start_block(irg)"
107 attr_struct = "bad_attr"
109 res->attr.bad.irg.irg = irg;
117 customSerializer = True
125 flags = [ "labeled" ]
126 attr_struct = "block_attr"
127 customSerializer = True
130 res->attr.block.irg.irg = irg;
131 res->attr.block.backedge = new_backedge_arr(irg->obst, arity);
132 set_Block_matured(res, 1);
134 /* Create and initialize array for Phi-node construction. */
135 if (get_irg_phase_state(irg) == phase_building) {
136 res->attr.block.graph_arr = NEW_ARR_D(ir_node *, irg->obst, irg->n_loc);
137 memset(res->attr.block.graph_arr, 0, irg->n_loc * sizeof(ir_node*));
145 ins = [ "mem", "index", "lower", "upper" ]
147 ("M", "memory result", "pn_Generic_M"),
148 ("X_regular", "control flow when no exception occurs", "pn_Generic_X_regular"),
149 ("X_except", "control flow when exception occured", "pn_Generic_X_except"),
150 ("res", "the checked index", "pn_Generic_other"),
152 flags = [ "fragile", "highlevel" ]
154 pinned_init = "op_pin_state_pinned"
155 attr_struct = "bound_attr"
162 ("M", "memory result", "pn_Generic_M"),
163 ("1_result", "first result", "pn_Generic_other"),
165 flags = [ "uses_memory" ]
168 type = "ir_builtin_kind",
177 pinned_init = "op_pin_state_pinned"
178 attr_struct = "builtin_attr"
180 assert((get_unknown_type() == type) || is_Method_type(type));
184 ins = [ "mem", "ptr" ]
187 ("M", "memory result", "pn_Generic_M"),
188 ("X_regular", "control flow when no exception occurs", "pn_Generic_X_regular"),
189 ("X_except", "control flow when exception occured", "pn_Generic_X_except"),
190 ("T_result", "tuple containing all results", "pn_Generic_other"),
191 ("P_value_res_base", "pointer to memory register containing copied results passed by value"),
193 flags = [ "fragile", "uses_memory" ]
202 # the tail call attribute can only be set by analysis
206 attr_struct = "call_attr"
208 pinned_init = "op_pin_state_pinned"
210 assert((get_unknown_type() == type) || is_Method_type(type));
214 flags = [ "commutative" ]
217 mode = "get_irn_mode(irn_op)"
218 flags = [ "highlevel" ]
225 attr_struct = "cast_attr"
226 init = "assert(is_atomic_type(type));"
230 ("False", "always false", "0"),
231 ("Eq", "equal", "1"),
233 ("Le", "less or equal", "pn_Cmp_Eq|pn_Cmp_Lt"),
234 ("Gt", "greater", "4"),
235 ("Ge", "greater or equal", "pn_Cmp_Eq|pn_Cmp_Gt"),
236 ("Lg", "less or greater ('not equal' for integer numbers)", "pn_Cmp_Lt|pn_Cmp_Gt"),
237 ("Leg", "less, equal or greater ('not unordered')", "pn_Cmp_Lt|pn_Cmp_Eq|pn_Cmp_Gt"),
238 ("Uo", "unordered", "8"),
239 ("Ue", "unordered or equal", "pn_Cmp_Uo|pn_Cmp_Eq"),
240 ("Ul", "unordered or less", "pn_Cmp_Uo|pn_Cmp_Lt"),
241 ("Ule", "unordered, less or equal", "pn_Cmp_Uo|pn_Cmp_Lt|pn_Cmp_Eq"),
242 ("Ug", "unordered or greater", "pn_Cmp_Uo|pn_Cmp_Gt"),
243 ("Uge", "onordered, greater or equal", "pn_Cmp_Uo|pn_Cmp_Gt|pn_Cmp_Eq"),
244 ("Ne", "unordered, less or greater ('not equal' for floatingpoint numbers)", "pn_Cmp_Uo|pn_Cmp_Lt|pn_Cmp_Gt"),
245 ("True", "always true", "15"),
252 ("false", "control flow if operand is \"false\""),
253 ("true", "control flow if operand is \"true\""),
255 flags = [ "cfopcode", "forking" ]
259 name = "default_proj",
265 type = "cond_jmp_predicate",
266 init = "COND_JMP_PRED_NONE"
269 attr_struct = "cond_attr"
272 ins = [ "value", "bound" ]
273 mode = "get_irn_mode(irn_value)"
274 flags = [ "highlevel" ]
282 attr_struct = "confirm_attr"
283 attrs_name = "confirm"
287 flags = [ "constlike", "start_block" ]
297 attr_struct = "const_attr"
312 attr_struct = "conv_attr"
316 ins = [ "mem", "dst", "src" ]
318 ("M", "memory result", "pn_Generic_M"),
319 ("X_regular", "control flow when no exception occurs", "pn_Generic_X_regular"),
320 ("X_except", "control flow when exception occured", "pn_Generic_X_except"),
322 flags = [ "fragile", "highlevel", "uses_memory" ]
329 attr_struct = "copyb_attr"
332 pinned_init = "op_pin_state_pinned"
335 ins = [ "mem", "left", "right" ]
337 ("M", "memory result", "pn_Generic_M"),
338 ("X_regular", "control flow when no exception occurs", "pn_Generic_X_regular"),
339 ("X_except", "control flow when exception occured", "pn_Generic_X_except"),
340 ("res", "result of computation", "pn_Generic_other"),
342 flags = [ "fragile", "uses_memory" ]
343 attrs_name = "divmod"
350 name = "no_remainder",
359 attr_struct = "divmod_attr"
362 arity_override = "oparity_binary"
365 ins = [ "mem", "left", "right" ]
367 ("M", "memory result", "pn_Generic_M"),
368 ("X_regular", "control flow when no exception occurs", "pn_Generic_X_regular"),
369 ("X_except", "control flow when exception occured", "pn_Generic_X_except"),
370 ("res_div", "result of computation a/b", "pn_Generic_other"),
371 ("res_mod", "result of computation a%b"),
373 flags = [ "fragile", "uses_memory" ]
374 attrs_name = "divmod"
381 attr_struct = "divmod_attr"
384 arity_override = "oparity_binary"
388 flags = [ "cfopcode", "start_block", "constlike", "dump_noblock" ]
391 block = "get_irg_start_block(irg)"
397 flags = [ "cfopcode" ]
399 block = "get_irg_end_block(irg)"
401 customSerializer = True
404 flags = [ "commutative" ]
407 ins = [ "mem", "ptr", "size" ]
409 flags = [ "uses_memory" ]
418 type = "ir_where_alloc"
421 attr_struct = "free_attr"
432 flags = [ "cfopcode", "forking", "keep" ]
435 ins = [ "store", "obj" ]
437 ("M", "memory result", "pn_Generic_M"),
438 ("X_regular", "control flow when no exception occurs", "pn_Generic_X_regular"),
439 ("X_except", "control flow when exception occured", "pn_Generic_X_except"),
440 ("res", "checked object pointer", "pn_Generic_other"),
442 flags = [ "highlevel" ]
449 attr_struct = "io_attr"
451 pinned_init = "op_pin_state_floats"
457 flags = [ "cfopcode" ]
460 ins = [ "mem", "ptr" ]
462 ("M", "memory result", "pn_Generic_M"),
463 ("X_regular", "control flow when no exception occurs", "pn_Generic_X_regular"),
464 ("X_except", "control flow when exception occured", "pn_Generic_X_except"),
465 ("res", "result of load operation", "pn_Generic_other"),
467 flags = [ "fragile", "uses_memory" ]
469 pinned_init = "flags & cons_floats ? op_pin_state_floats : op_pin_state_pinned"
474 java_name = "load_mode"
477 attr_struct = "load_attr"
480 type = "ir_cons_flags",
489 ins = [ "mem", "left", "right" ]
491 ("M", "memory result", "pn_Generic_M"),
492 ("X_regular", "control flow when no exception occurs", "pn_Generic_X_regular"),
493 ("X_except", "control flow when exception occured", "pn_Generic_X_except"),
494 ("res", "result of computation", "pn_Generic_other"),
496 flags = [ "fragile", "uses_memory" ]
497 attrs_name = "divmod"
504 attr_struct = "divmod_attr"
507 arity_override = "oparity_binary"
510 flags = [ "commutative" ]
513 flags = [ "commutative" ]
516 ins = [ "sel", "false", "true" ]
522 flags = [ "dump_noblock", "dump_noinput" ]
525 block = "get_irg_start_block(irg)"
532 flags = [ "commutative" ]
538 attr_struct = "phi_attr"
540 /* Memory Phis in endless loops must be kept alive.
541 As we can't distinguish these easily we keep all of them alive. */
542 if (is_Phi(res) && mode == mode_M)
543 add_End_keepalive(get_irg_end(irg), res);
548 mode = "get_irn_mode(irn_op)"
549 flags = [ "highlevel" ]
558 block = "get_nodes_block(irn_pred)"
559 graph = "get_irn_irg(irn_pred)"
560 customSerializer = True
572 ins = [ "mem", "left", "right" ]
574 ("M", "memory result", "pn_Generic_M"),
575 ("X_regular", "control flow when no exception occurs", "pn_Generic_X_regular"),
576 ("X_except", "control flow when exception occured", "pn_Generic_X_except"),
577 ("res", "result of computation", "pn_Generic_other"),
579 flags = [ "fragile", "uses_memory" ]
580 attrs_name = "divmod"
587 attr_struct = "divmod_attr"
590 arity_override = "oparity_binary"
593 ins = [ "mem", "exo_ptr" ]
595 ("M", "memory result", "pn_Generic_M"),
596 ("X", "control flow to exception handler", "pn_Generic_X_regular"),
598 flags = [ "highlevel", "cfopcode" ]
605 flags = [ "cfopcode" ]
612 ins = [ "mem", "ptr" ]
615 mode = "is_Method_type(get_entity_type(entity)) ? mode_P_code : mode_P_data"
623 attr_struct = "sel_attr"
636 ("X_initial_exec", "control flow"),
637 ("M", "initial memory"),
638 ("P_frame_base", "frame base pointer"),
639 ("P_tls", "pointer to thread local storage segment"),
640 ("T_args", "function arguments")
644 flags = [ "cfopcode" ]
647 customSerializer = True
648 block = "get_irg_start_block(irg)"
651 ins = [ "mem", "ptr", "value" ]
653 ("M", "memory result", "pn_Generic_M"),
654 ("X_regular", "control flow when no exception occurs", "pn_Generic_X_regular"),
655 ("X_except", "control flow when exception occured", "pn_Generic_X_except"),
657 flags = [ "fragile", "uses_memory" ]
659 attr_struct = "store_attr"
660 pinned_init = "flags & cons_floats ? op_pin_state_floats : op_pin_state_pinned"
663 type = "ir_cons_flags",
673 flags = [ "constlike", "start_block" ]
683 attr_struct = "symconst_attr"
684 customSerializer = True
696 flags = [ "labeled" ]
701 block = "get_irg_start_block(irg)"
702 flags = [ "cfopcode", "start_block", "constlike", "dump_noblock" ]
706 def getOpList(namespace):
708 for t in namespace.values():
712 if issubclass(t, Op):
717 nodes = getOpList(globals())
718 nodes = sorted(nodes, lambda x,y: cmp(x.name, y.name))