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*));
142 public void addPred(Node node) {
143 binding_ircons.add_immBlock_pred(ptr, node.ptr);
146 public void mature() {
147 binding_ircons.mature_immBlock(ptr);
151 public Block getBlock() {
155 public boolean blockVisited() {
156 return 0 != binding_irnode.Block_block_visited(ptr);
159 public void markBlockVisited() {
160 binding_irnode.mark_Block_block_visited(ptr);
163 public boolean isBad() {
164 return binding_irnode.is_Bad(ptr) != 0;
172 ins = [ "mem", "index", "lower", "upper" ]
174 ("M", "memory result", "pn_Generic_M"),
175 ("X_regular", "control flow when no exception occurs", "pn_Generic_X_regular"),
176 ("X_except", "control flow when exception occured", "pn_Generic_X_except"),
177 ("res", "the checked index", "pn_Generic_other"),
179 flags = [ "fragile", "highlevel" ]
181 pinned_init = "op_pin_state_pinned"
182 attr_struct = "bound_attr"
189 ("M", "memory result", "pn_Generic_M"),
190 ("1_result", "first result", "pn_Generic_other"),
192 flags = [ "uses_memory" ]
195 type = "ir_builtin_kind",
204 pinned_init = "op_pin_state_pinned"
205 attr_struct = "builtin_attr"
207 assert((get_unknown_type() == type) || is_Method_type(type));
211 ins = [ "mem", "ptr" ]
214 ("M", "memory result", "pn_Generic_M"),
215 ("X_regular", "control flow when no exception occurs", "pn_Generic_X_regular"),
216 ("X_except", "control flow when exception occured", "pn_Generic_X_except"),
217 ("T_result", "tuple containing all results", "pn_Generic_other"),
218 ("P_value_res_base", "pointer to memory register containing copied results passed by value"),
220 flags = [ "fragile", "uses_memory" ]
229 # the tail call attribute can only be set by analysis
233 attr_struct = "call_attr"
235 pinned_init = "op_pin_state_pinned"
237 assert((get_unknown_type() == type) || is_Method_type(type));
241 flags = [ "commutative" ]
244 mode = "get_irn_mode(irn_op)"
245 flags = [ "highlevel" ]
252 attr_struct = "cast_attr"
253 init = "assert(is_atomic_type(type));"
257 ("False", "always false", "0"),
258 ("Eq", "equal", "1"),
260 ("Le", "less or equal", "pn_Cmp_Eq|pn_Cmp_Lt"),
261 ("Gt", "greater", "4"),
262 ("Ge", "greater or equal", "pn_Cmp_Eq|pn_Cmp_Gt"),
263 ("Lg", "less or greater ('not equal' for integer numbers)", "pn_Cmp_Lt|pn_Cmp_Gt"),
264 ("Leg", "less, equal or greater ('not unordered')", "pn_Cmp_Lt|pn_Cmp_Eq|pn_Cmp_Gt"),
265 ("Uo", "unordered", "8"),
266 ("Ue", "unordered or equal", "pn_Cmp_Uo|pn_Cmp_Eq"),
267 ("Ul", "unordered or less", "pn_Cmp_Uo|pn_Cmp_Lt"),
268 ("Ule", "unordered, less or equal", "pn_Cmp_Uo|pn_Cmp_Lt|pn_Cmp_Eq"),
269 ("Ug", "unordered or greater", "pn_Cmp_Uo|pn_Cmp_Gt"),
270 ("Uge", "onordered, greater or equal", "pn_Cmp_Uo|pn_Cmp_Gt|pn_Cmp_Eq"),
271 ("Ne", "unordered, less or greater ('not equal' for floatingpoint numbers)", "pn_Cmp_Uo|pn_Cmp_Lt|pn_Cmp_Gt"),
272 ("True", "always true", "15"),
279 ("false", "control flow if operand is \"false\""),
280 ("true", "control flow if operand is \"true\""),
282 flags = [ "cfopcode", "forking" ]
286 name = "default_proj",
292 type = "cond_jmp_predicate",
293 init = "COND_JMP_PRED_NONE"
296 attr_struct = "cond_attr"
299 ins = [ "value", "bound" ]
300 mode = "get_irn_mode(irn_value)"
301 flags = [ "highlevel" ]
309 attr_struct = "confirm_attr"
310 attrs_name = "confirm"
314 flags = [ "constlike", "start_block" ]
324 attr_struct = "const_attr"
339 attr_struct = "conv_attr"
343 ins = [ "mem", "dst", "src" ]
345 ("M", "memory result", "pn_Generic_M"),
346 ("X_regular", "control flow when no exception occurs", "pn_Generic_X_regular"),
347 ("X_except", "control flow when exception occured", "pn_Generic_X_except"),
349 flags = [ "fragile", "highlevel", "uses_memory" ]
356 attr_struct = "copyb_attr"
359 pinned_init = "op_pin_state_pinned"
362 ins = [ "mem", "left", "right" ]
364 ("M", "memory result", "pn_Generic_M"),
365 ("X_regular", "control flow when no exception occurs", "pn_Generic_X_regular"),
366 ("X_except", "control flow when exception occured", "pn_Generic_X_except"),
367 ("res", "result of computation", "pn_Generic_other"),
369 flags = [ "fragile", "uses_memory" ]
370 attrs_name = "divmod"
377 name = "no_remainder",
386 attr_struct = "divmod_attr"
389 arity_override = "oparity_binary"
392 ins = [ "mem", "left", "right" ]
394 ("M", "memory result", "pn_Generic_M"),
395 ("X_regular", "control flow when no exception occurs", "pn_Generic_X_regular"),
396 ("X_except", "control flow when exception occured", "pn_Generic_X_except"),
397 ("res_div", "result of computation a/b", "pn_Generic_other"),
398 ("res_mod", "result of computation a%b"),
400 flags = [ "fragile", "uses_memory" ]
401 attrs_name = "divmod"
408 attr_struct = "divmod_attr"
411 arity_override = "oparity_binary"
415 flags = [ "cfopcode", "start_block", "constlike", "dump_noblock" ]
418 block = "get_irg_start_block(irg)"
424 flags = [ "cfopcode" ]
426 block = "get_irg_end_block(irg)"
428 customSerializer = True
431 flags = [ "commutative" ]
434 ins = [ "mem", "ptr", "size" ]
436 flags = [ "uses_memory" ]
445 type = "ir_where_alloc"
448 attr_struct = "free_attr"
459 flags = [ "cfopcode", "forking", "keep" ]
462 ins = [ "store", "obj" ]
464 ("M", "memory result", "pn_Generic_M"),
465 ("X_regular", "control flow when no exception occurs", "pn_Generic_X_regular"),
466 ("X_except", "control flow when exception occured", "pn_Generic_X_except"),
467 ("res", "checked object pointer", "pn_Generic_other"),
469 flags = [ "highlevel" ]
476 attr_struct = "io_attr"
478 pinned_init = "op_pin_state_floats"
484 flags = [ "cfopcode" ]
487 ins = [ "mem", "ptr" ]
489 ("M", "memory result", "pn_Generic_M"),
490 ("X_regular", "control flow when no exception occurs", "pn_Generic_X_regular"),
491 ("X_except", "control flow when exception occured", "pn_Generic_X_except"),
492 ("res", "result of load operation", "pn_Generic_other"),
494 flags = [ "fragile", "uses_memory" ]
496 pinned_init = "flags & cons_floats ? op_pin_state_floats : op_pin_state_pinned"
501 java_name = "load_mode"
504 attr_struct = "load_attr"
507 type = "ir_cons_flags",
516 ins = [ "mem", "left", "right" ]
518 ("M", "memory result", "pn_Generic_M"),
519 ("X_regular", "control flow when no exception occurs", "pn_Generic_X_regular"),
520 ("X_except", "control flow when exception occured", "pn_Generic_X_except"),
521 ("res", "result of computation", "pn_Generic_other"),
523 flags = [ "fragile", "uses_memory" ]
524 attrs_name = "divmod"
531 attr_struct = "divmod_attr"
534 arity_override = "oparity_binary"
537 flags = [ "commutative" ]
540 flags = [ "commutative" ]
543 ins = [ "sel", "false", "true" ]
549 flags = [ "dump_noblock", "dump_noinput" ]
552 block = "get_irg_start_block(irg)"
559 flags = [ "commutative" ]
565 attr_struct = "phi_attr"
567 /* Memory Phis in endless loops must be kept alive.
568 As we can't distinguish these easily we keep all of them alive. */
569 if (is_Phi(res) && mode == mode_M)
570 add_End_keepalive(get_irg_end(irg), res);
575 mode = "get_irn_mode(irn_op)"
576 flags = [ "highlevel" ]
585 block = "get_nodes_block(irn_pred)"
586 graph = "get_irn_irg(irn_pred)"
587 customSerializer = True
599 ins = [ "mem", "left", "right" ]
601 ("M", "memory result", "pn_Generic_M"),
602 ("X_regular", "control flow when no exception occurs", "pn_Generic_X_regular"),
603 ("X_except", "control flow when exception occured", "pn_Generic_X_except"),
604 ("res", "result of computation", "pn_Generic_other"),
606 flags = [ "fragile", "uses_memory" ]
607 attrs_name = "divmod"
614 attr_struct = "divmod_attr"
617 arity_override = "oparity_binary"
620 ins = [ "mem", "exo_ptr" ]
622 ("M", "memory result", "pn_Generic_M"),
623 ("X", "control flow to exception handler", "pn_Generic_X_regular"),
625 flags = [ "highlevel", "cfopcode" ]
632 flags = [ "cfopcode" ]
639 ins = [ "mem", "ptr" ]
642 mode = "is_Method_type(get_entity_type(entity)) ? mode_P_code : mode_P_data"
650 attr_struct = "sel_attr"
663 ("X_initial_exec", "control flow"),
664 ("M", "initial memory"),
665 ("P_frame_base", "frame base pointer"),
666 ("P_tls", "pointer to thread local storage segment"),
667 ("T_args", "function arguments")
671 flags = [ "cfopcode" ]
674 customSerializer = True
675 block = "get_irg_start_block(irg)"
678 ins = [ "mem", "ptr", "value" ]
680 ("M", "memory result", "pn_Generic_M"),
681 ("X_regular", "control flow when no exception occurs", "pn_Generic_X_regular"),
682 ("X_except", "control flow when exception occured", "pn_Generic_X_except"),
684 flags = [ "fragile", "uses_memory" ]
686 attr_struct = "store_attr"
687 pinned_init = "flags & cons_floats ? op_pin_state_floats : op_pin_state_pinned"
690 type = "ir_cons_flags",
700 flags = [ "constlike", "start_block" ]
710 attr_struct = "symconst_attr"
711 customSerializer = True
723 flags = [ "labeled" ]
728 block = "get_irg_start_block(irg)"
729 flags = [ "cfopcode", "start_block", "constlike", "dump_noblock" ]
733 def getOpList(namespace):
735 for t in namespace.values():
739 if issubclass(t, Op):
744 nodes = getOpList(globals())
745 nodes = sorted(nodes, lambda x,y: cmp(x.name, y.name))