no unnecessary and cryptic abreviations: rename vrfy to verify
[libfirm] / scripts / ir_spec.py
index 3d7681c..d887f5f 100755 (executable)
@@ -28,7 +28,12 @@ class Add(Binop):
 
 class Alloc(Op):
        ins   = [ "mem", "count" ]
-       outs  = [ "M", "X_regular", "X_except", "res" ]
+       outs  = [
+               ("M",         "memory result",                         "pn_Generic_M"),
+               ("X_regular", "control flow when no exception occurs", "pn_Generic_X_regular"),
+               ("X_except",  "control flow when exception occured",   "pn_Generic_X_except"),
+               ("res",       "pointer to newly allocated memory",     "pn_Generic_other"),
+       ]
        flags = [ "fragile", "uses_memory" ]
        attrs = [
                dict(
@@ -42,9 +47,6 @@ class Alloc(Op):
        ]
        pinned      = "yes"
        attr_struct = "alloc_attr"
-       d_post = '''
-       firm_alloc_frag_arr(res, op_Alloc, &res->attr.alloc.exc.frag_arr);
-       '''
 
 class Anchor(Op):
        mode        = "mode_ANY"
@@ -61,9 +63,10 @@ class ASM(Op):
        mode          = "mode_T"
        arity         = "variable"
        flags         = [ "keep", "uses_memory" ]
-       attr_struct   = "asm_attr"
        pinned        = "memory"
        pinned_init   = "op_pin_state_pinned"
+       attr_struct   = "asm_attr"
+       attrs_name    = "assem"
        attrs = [
                dict(
                        name = "input_constraints",
@@ -72,6 +75,7 @@ class ASM(Op):
                dict(
                        name = "n_output_constraints",
                        type = "int",
+                       noprop = True,
                ),
                dict(
                        name = "output_constraints",
@@ -80,6 +84,7 @@ class ASM(Op):
                dict(
                        name = "n_clobbers",
                        type = "int",
+                       noprop = True,
                ),
                dict(
                        name = "clobbers",
@@ -94,7 +99,7 @@ class ASM(Op):
 
 class Bad(Op):
        mode        = "mode_Bad"
-       flags       = [ "cfopcode", "fragile", "start_block", "dump_noblock" ]
+       flags       = [ "cfopcode", "start_block", "dump_noblock" ]
        pinned      = "yes"
        knownBlock  = True
        singleton   = True
@@ -165,29 +170,27 @@ class Block(Op):
        }
        '''
 
-class Borrow(Binop):
-       flags = []
-
 class Bound(Op):
        ins    = [ "mem", "index", "lower", "upper" ]
-       outs   = [ "M", "X_regular", "X_except", "res" ]
+       outs  = [
+               ("M",         "memory result",                         "pn_Generic_M"),
+               ("X_regular", "control flow when no exception occurs", "pn_Generic_X_regular"),
+               ("X_except",  "control flow when exception occured",   "pn_Generic_X_except"),
+               ("res",       "the checked index",                     "pn_Generic_other"),
+       ]
        flags  = [ "fragile", "highlevel" ]
        pinned = "exception"
        pinned_init = "op_pin_state_pinned"
        attr_struct = "bound_attr"
-       d_post = '''
-       firm_alloc_frag_arr(res, op_Bound, &res->attr.bound.exc.frag_arr);
-       '''
-
-class Break(Op):
-       mode   = "mode_X"
-       flags  = [ "cfopcode" ]
-       pinned = "yes"
+       attrs_name  = "bound"
 
 class Builtin(Op):
        ins      = [ "mem" ]
        arity    = "variable"
-       outs     = [ "M", "X_regular", "X_except", "T_result", "P_value_res_base" ]
+       outs     = [
+               ("M",        "memory result", "pn_Generic_M"),
+               ("1_result", "first result",  "pn_Generic_other"),
+       ]
        flags    = [ "uses_memory" ]
        attrs    = [
                dict(
@@ -209,7 +212,13 @@ class Builtin(Op):
 class Call(Op):
        ins      = [ "mem", "ptr" ]
        arity    = "variable"
-       outs     = [ "M", "X_regular", "X_except", "T_result", "P_value_res_base" ]
+       outs     = [
+               ("M",                "memory result",                         "pn_Generic_M"),
+               ("X_regular",        "control flow when no exception occurs", "pn_Generic_X_regular"),
+               ("X_except",         "control flow when exception occured",   "pn_Generic_X_except"),
+               ("T_result",         "tuple containing all results",          "pn_Generic_other"),
+               ("P_value_res_base", "pointer to memory register containing copied results passed by value"),
+       ]
        flags    = [ "fragile", "uses_memory" ]
        attrs    = [
                dict(
@@ -229,27 +238,6 @@ class Call(Op):
        init = '''
        assert((get_unknown_type() == type) || is_Method_type(type));
        '''
-       d_post = '''
-       firm_alloc_frag_arr(res, op_Call, &res->attr.call.exc.frag_arr);
-       '''
-
-class CallBegin(Op):
-       ins   = [ "ptr" ]
-       outs  = [ "" ] # TODO
-       flags         = [ "cfopcode", "ip_cfopcode" ]
-       pinned        = "yes"
-       # TODO: attribute with call...
-       attr_struct   = "callbegin_attr"
-       attrs         = [
-               dict(
-                       type = "ir_node*",
-                       name = "call"
-               )
-       ]
-       java_noconstr = True
-
-class Carry(Binop):
-       flags = [ "commutative" ]
 
 class Cast(Unop):
        mode     = "get_irn_mode(irn_op)"
@@ -264,12 +252,32 @@ class Cast(Unop):
        init     = "assert(is_atomic_type(type));"
 
 class Cmp(Binop):
-       outs  = [ "False", "Eq", "Lt", "Le", "Gt", "Ge", "Lg", "Leg", "Uo", "Ue", "Ul", "Ule", "Ug", "Uge", "Ne", "True" ]
+       outs  = [
+               ("False", "always false",                            "0"),
+               ("Eq",    "equal",                                   "1"),
+               ("Lt",    "less",                                    "2"),
+               ("Le",    "less or equal",                           "pn_Cmp_Eq|pn_Cmp_Lt"),
+               ("Gt",    "greater",                                 "4"),
+               ("Ge",    "greater or equal",                        "pn_Cmp_Eq|pn_Cmp_Gt"),
+               ("Lg",    "less or greater ('not equal' for integer numbers)", "pn_Cmp_Lt|pn_Cmp_Gt"),
+               ("Leg",   "less, equal or greater ('not unordered')", "pn_Cmp_Lt|pn_Cmp_Eq|pn_Cmp_Gt"),
+               ("Uo",    "unordered",                               "8"),
+               ("Ue",    "unordered or equal",                      "pn_Cmp_Uo|pn_Cmp_Eq"),
+               ("Ul",    "unordered or less",                       "pn_Cmp_Uo|pn_Cmp_Lt"),
+               ("Ule",   "unordered, less or equal",                "pn_Cmp_Uo|pn_Cmp_Lt|pn_Cmp_Eq"),
+               ("Ug",    "unordered or greater",                    "pn_Cmp_Uo|pn_Cmp_Gt"),
+               ("Uge",   "onordered, greater or equal",             "pn_Cmp_Uo|pn_Cmp_Gt|pn_Cmp_Eq"),
+               ("Ne",    "unordered, less or greater ('not equal' for floatingpoint numbers)", "pn_Cmp_Uo|pn_Cmp_Lt|pn_Cmp_Gt"),
+               ("True",  "always true",                             "15"),
+       ]
        flags = []
 
 class Cond(Op):
        ins      = [ "selector" ]
-       outs     = [ "false", "true" ]
+       outs     = [
+               ("false", "control flow if operand is \"false\""),
+               ("true",  "control flow if operand is \"true\""),
+       ]
        flags    = [ "cfopcode", "forking" ]
        pinned   = "yes"
        attrs    = [
@@ -298,6 +306,7 @@ class Confirm(Op):
                ),
        ]
        attr_struct = "confirm_attr"
+       attrs_name  = "confirm"
 
 class Const(Op):
        mode       = ""
@@ -327,10 +336,15 @@ class Conv(Unop):
                )
        ]
        attr_struct = "conv_attr"
+       attrs_name  = "conv"
 
 class CopyB(Op):
        ins   = [ "mem", "dst", "src" ]
-       outs  = [ "M", "X_regular", "X_except" ]
+       outs  = [
+               ("M",         "memory result",                         "pn_Generic_M"),
+               ("X_regular", "control flow when no exception occurs", "pn_Generic_X_regular"),
+               ("X_except",  "control flow when exception occured",   "pn_Generic_X_except"),
+       ]
        flags = [ "fragile", "highlevel", "uses_memory" ]
        attrs = [
                dict(
@@ -339,15 +353,18 @@ class CopyB(Op):
                )
        ]
        attr_struct = "copyb_attr"
+       attrs_name  = "copyb"
        pinned      = "memory"
        pinned_init = "op_pin_state_pinned"
-       d_post = '''
-       firm_alloc_frag_arr(res, op_CopyB, &res->attr.copyb.exc.frag_arr);
-       '''
 
 class Div(Op):
        ins   = [ "mem", "left", "right" ]
-       outs  = [ "M", "X_regular", "X_except", "res" ]
+       outs  = [
+               ("M",         "memory result",                         "pn_Generic_M"),
+               ("X_regular", "control flow when no exception occurs", "pn_Generic_X_regular"),
+               ("X_except",  "control flow when exception occured",   "pn_Generic_X_except"),
+               ("res",       "result of computation",                 "pn_Generic_other"),
+       ]
        flags = [ "fragile", "uses_memory" ]
        attrs_name = "divmod"
        attrs = [
@@ -369,13 +386,16 @@ class Div(Op):
        pinned      = "exception"
        op_index    = 1
        arity_override = "oparity_binary"
-       d_post = '''
-       firm_alloc_frag_arr(res, op_Div, &res->attr.except.frag_arr);
-       '''
 
 class DivMod(Op):
        ins   = [ "mem", "left", "right" ]
-       outs  = [ "M", "X_regular", "X_except", "res_div", "res_mod" ]
+       outs  = [
+               ("M",         "memory result",                         "pn_Generic_M"),
+               ("X_regular", "control flow when no exception occurs", "pn_Generic_X_regular"),
+               ("X_except",  "control flow when exception occured",   "pn_Generic_X_except"),
+               ("res_div",   "result of computation a/b",             "pn_Generic_other"),
+               ("res_mod",   "result of computation a%b"),
+       ]
        flags = [ "fragile", "uses_memory" ]
        attrs_name = "divmod"
        attrs = [
@@ -388,14 +408,10 @@ class DivMod(Op):
        pinned      = "exception"
        op_index    = 1
        arity_override = "oparity_binary"
-       d_post = '''
-       firm_alloc_frag_arr(res, op_DivMod, &res->attr.except.frag_arr);
-       '''
 
 class Dummy(Op):
        ins   = []
-       flags = [ "cfopcode", "fragile", "start_block", "constlike",
-                 "dump_noblock" ]
+       flags = [ "cfopcode", "start_block", "constlike", "dump_noblock" ]
        knownBlock = True
        pinned     = "yes"
        block      = "get_irg_start_block(irg)"
@@ -407,36 +423,9 @@ class End(Op):
        flags      = [ "cfopcode" ]
        singleton  = True
 
-class EndExcept(Op):
-       mode      = "mode_X"
-       pinned    = "yes"
-       arity     = "dynamic"
-       flags     = [ "cfopcode", "ip_cfopcode" ]
-       singleton = True
-
-class EndReg(Op):
-       mode      = "mode_X"
-       pinned    = "yes"
-       arity     = "dynamic"
-       flags     = [ "cfopcode", "ip_cfopcode" ]
-       singleton = True
-
 class Eor(Binop):
        flags    = [ "commutative" ]
 
-class Filter(Op):
-       ins   = [ "pred" ]
-       flags = []
-       attrs = [
-               dict(
-                       name = "proj",
-                       type = "long"
-               )
-       ]
-       pinned      = "yes"
-       attr_struct = "filter_attr"
-       java_noconstr = True
-
 class Free(Op):
        ins    = [ "mem", "ptr", "size" ]
        mode   = "mode_M"
@@ -467,7 +456,12 @@ class IJmp(Op):
 
 class InstOf(Op):
        ins   = [ "store", "obj" ]
-       outs  = [ "M", "X_regular", "X_except", "res" ]
+       outs  = [
+               ("M",         "memory result",                         "pn_Generic_M"),
+               ("X_regular", "control flow when no exception occurs", "pn_Generic_X_regular"),
+               ("X_except",  "control flow when exception occured",   "pn_Generic_X_except"),
+               ("res",       "checked object pointer",                "pn_Generic_other"),
+       ]
        flags = [ "highlevel" ]
        attrs = [
                dict(
@@ -487,7 +481,12 @@ class Jmp(Op):
 
 class Load(Op):
        ins      = [ "mem", "ptr" ]
-       outs     = [ "M", "X_regular", "X_except", "res" ]
+       outs  = [
+               ("M",         "memory result",                         "pn_Generic_M"),
+               ("X_regular", "control flow when no exception occurs", "pn_Generic_X_regular"),
+               ("X_except",  "control flow when exception occured",   "pn_Generic_X_except"),
+               ("res",       "result of load operation",              "pn_Generic_other"),
+       ]
        flags    = [ "fragile", "uses_memory" ]
        pinned   = "exception"
        pinned_init = "flags & cons_floats ? op_pin_state_floats : op_pin_state_pinned"
@@ -505,16 +504,18 @@ class Load(Op):
                        name = "flags",
                ),
        ]
-       d_post = '''
-       firm_alloc_frag_arr(res, op_Load, &res->attr.load.exc.frag_arr);
-       '''
 
 class Minus(Unop):
        flags = []
 
 class Mod(Op):
        ins   = [ "mem", "left", "right" ]
-       outs  = [ "M", "X_regular", "X_except", "res" ]
+       outs  = [
+               ("M",         "memory result",                         "pn_Generic_M"),
+               ("X_regular", "control flow when no exception occurs", "pn_Generic_X_regular"),
+               ("X_except",  "control flow when exception occured",   "pn_Generic_X_except"),
+               ("res",       "result of computation",                 "pn_Generic_other"),
+       ]
        flags = [ "fragile", "uses_memory" ]
        attrs_name = "divmod"
        attrs = [
@@ -527,9 +528,6 @@ class Mod(Op):
        pinned      = "exception"
        op_index    = 1
        arity_override = "oparity_binary"
-       d_post = '''
-       firm_alloc_frag_arr(res, op_Mod, &res->attr.except.frag_arr);
-       '''
 
 class Mul(Binop):
        flags = [ "commutative" ]
@@ -560,7 +558,6 @@ class Phi(Op):
        arity         = "variable"
        flags         = []
        attr_struct   = "phi_attr"
-       custom_is     = True
        java_noconstr = True
        init = '''
        /* Memory Phis in endless loops must be kept alive.
@@ -587,15 +584,20 @@ class Proj(Op):
                dict(
                        type = "long",
                        name = "proj",
-                       initname = ""
+                       initname = "",
+                       noprop = False,
                )
        ]
        attr_struct = "long"
-       custom_is   = True
 
 class Quot(Op):
        ins   = [ "mem", "left", "right" ]
-       outs  = [ "M", "X_regular", "X_except", "res" ]
+       outs  = [
+               ("M",         "memory result",                         "pn_Generic_M"),
+               ("X_regular", "control flow when no exception occurs", "pn_Generic_X_regular"),
+               ("X_except",  "control flow when exception occured",   "pn_Generic_X_except"),
+               ("res",       "result of computation",                 "pn_Generic_other"),
+       ]
        flags = [ "fragile", "uses_memory" ]
        attrs_name = "divmod"
        attrs = [
@@ -608,13 +610,13 @@ class Quot(Op):
        pinned      = "exception"
        op_index    = 1
        arity_override = "oparity_binary"
-       d_post = '''
-       firm_alloc_frag_arr(res, op_Quot, &res->attr.except.frag_arr);
-       '''
 
 class Raise(Op):
        ins    = [ "mem", "exo_ptr" ]
-       outs   = [ "M", "X" ]
+       outs  = [
+               ("M", "memory result",                     "pn_Generic_M"),
+               ("X", "control flow to exception handler", "pn_Generic_X_regular"),
+       ]
        flags  = [ "highlevel", "cfopcode" ]
        pinned = "yes"
 
@@ -652,6 +654,13 @@ class Shrs(Binop):
        flags = []
 
 class Start(Op):
+       outs       = [
+               ("X_initial_exec", "control flow"),
+               ("M",              "initial memory"),
+               ("P_frame_base",   "frame base pointer"),
+               ("P_tls",          "pointer to thread local storage segment"),
+               ("T_args",         "function arguments")
+       ]
        mode       = "mode_T"
        pinned     = "yes"
        flags      = [ "cfopcode" ]
@@ -659,7 +668,11 @@ class Start(Op):
 
 class Store(Op):
        ins      = [ "mem", "ptr", "value" ]
-       outs     = [ "M", "X_regular", "X_except" ]
+       outs  = [
+               ("M",         "memory result",                         "pn_Generic_M"),
+               ("X_regular", "control flow when no exception occurs", "pn_Generic_X_regular"),
+               ("X_except",  "control flow when exception occured",   "pn_Generic_X_except"),
+       ]
        flags    = [ "fragile", "uses_memory" ]
        pinned   = "exception"
        attr_struct = "store_attr"
@@ -670,9 +683,6 @@ class Store(Op):
                        name = "flags",
                ),
        ]
-       d_post = '''
-       firm_alloc_frag_arr(res, op_Store, &res->attr.store.exc.frag_arr);
-       '''
 
 class Sub(Binop):
        flags = []
@@ -685,7 +695,8 @@ class SymConst(Op):
        attrs      = [
                dict(
                        type = "ir_entity*",
-                       name = "entity"
+                       name = "entity",
+                       noprop = True
                )
        ]
        attr_struct = "symconst_attr"
@@ -709,8 +720,7 @@ class Unknown(Op):
        knownBlock = True
        pinned     = "yes"
        block      = "get_irg_start_block(irg)"
-       flags      = [ "cfopcode", "fragile", "start_block", "constlike",
-                      "dump_noblock" ]
+       flags      = [ "cfopcode", "start_block", "constlike", "dump_noblock" ]
 
 # Prepare node list