Extend the NOT+ADC-trick (sic) for SUB to SBB.
[libfirm] / ir / be / ia32 / ia32_spec.pl
index cf51d61..bc39460 100644 (file)
 
 $arch = "ia32";
 
-# The node description is done as a perl hash initializer with the
-# following structure:
-#
-# %nodes = (
-#
-# <op-name> => {
-#   op_flags  => "N|L|C|X|I|F|Y|H|c|K|n",
-#   irn_flags => "R|N"
-#   arity     => "0|1|2|3 ... |variable|dynamic|any",
-#   state     => "floats|pinned|mem_pinned|exc_pinned",
-#   args      => [
-#                    { type => "type 1", name => "name 1" },
-#                    { type => "type 2", name => "name 2" },
-#                    ...
-#                  ],
-#   comment   => "any comment for constructor",
-#   reg_req   => { in => [ "reg_class|register" ], out => [ "reg_class|register|in_rX" ] },
-#   cmp_attr  => "c source code for comparing node attributes",
-#   outs      => { "out1", "out2" } # optional, creates pn_op_out1, ... consts
-#   ins       => { "in1", "in2" }   # optional, creates n_op_in1, ... consts
-#   mode      => "mode_Iu"          # optional, predefines the mode
-#   emit      => "emit code with templates",
-#   attr      => "additional attribute arguments for constructor",
-#   init_attr => "emit attribute initialization template",
-#   hash_func => "name of the hash function for this operation",
-#   latency   => "latency of this operation (can be float)"
-#   attr_type => "name of the attribute struct",
-#   modified_flags =>  [ "CF", ... ] # optional, list of modified flags
-# },
-#
-# ... # (all nodes you need to describe)
-#
-# ); # close the %nodes initializer
-
-# op_flags: flags for the operation, OPTIONAL (default is "N")
-# the op_flags correspond to the firm irop_flags:
-#   N   irop_flag_none
-#   L   irop_flag_labeled
-#   C   irop_flag_commutative
-#   X   irop_flag_cfopcode
-#   I   irop_flag_ip_cfopcode
-#   F   irop_flag_fragile
-#   Y   irop_flag_forking
-#   H   irop_flag_highlevel
-#   c   irop_flag_constlike
-#   K   irop_flag_keep
-#   NB  irop_flag_dump_noblock
-#   NI  irop_flag_dump_noinput
-#
-# irn_flags: special node flags, OPTIONAL (default is 0)
-# following irn_flags are supported:
-#   R   rematerializeable
-#   N   not spillable
-#
-# state: state of the operation, OPTIONAL (default is "floats")
-#
-# arity: arity of the operation, MUST NOT BE OMITTED
-#
-# args:  the OPTIONAL arguments of the node constructor (debug, irg and block
-#        are always the first 3 arguments and are always autmatically
-#        created)
-#        If this key is missing the following arguments will be created:
-#        for i = 1 .. arity: ir_node *op_i
-#        ir_mode *mode
-#
-# outs:  if a node defines more than one output, the names of the projections
-#        nodes having outs having automatically the mode mode_T
-#        example: [ "frame", "stack", "M" ]
-#
-# comment: OPTIONAL comment for the node constructor
-#
-# rd_constructor: for every operation there will be a
-#      new_rd_<arch>_<op-name> function with the arguments from above
-#      which creates the ir_node corresponding to the defined operation
-#      you can either put the complete source code of this function here
-#
-#      This key is OPTIONAL. If omitted, the following constructor will
-#      be created:
-#      if (!op_<arch>_<op-name>) assert(0);
-#      for i = 1 to arity
-#         set in[i] = op_i
-#      done
-#      res = new_ir_node(db, irg, block, op_<arch>_<op-name>, mode, arity, in)
-#      return res
-#
-# NOTE: rd_constructor and args are only optional if and only if arity is 0,1,2 or 3
-#
-
 # register types:
-#   0 - no special type
-#   1 - caller save (register must be saved by the caller of a function)
-#   2 - callee save (register must be saved by the called function)
-#   4 - ignore (do not automatically assign this register)
-#   8 - emitter can choose an arbitrary register of this class
-#  16 - the register is a virtual one
-#  32 - register represents a state
+$normal      =  0; # no special type
+$ignore      =  1; # ignore (do not assign this register)
+$arbitrary   =  2; # emitter can choose an arbitrary register of this class
+$virtual     =  4; # the register is a virtual one
+$state       =  8; # register represents a state
 # NOTE: Last entry of each class is the largest Firm-Mode a register can hold
 %reg_classes = (
        gp => [
-               { name => "edx", type => 1 },
-               { name => "ecx", type => 1 },
-               { name => "eax", type => 1 },
-               { name => "ebx", type => 2 },
-               { name => "esi", type => 2 },
-               { name => "edi", type => 2 },
-               { name => "ebp", type => 2 },
-               { name => "esp", type => 4 },
-               { name => "gp_NOREG", type => 4 | 8 | 16 }, # we need a dummy register for NoReg nodes
+               { name => "edx" },
+               { name => "ecx" },
+               { name => "eax" },
+               { name => "ebx" },
+               { name => "esi" },
+               { name => "edi" },
+               { name => "ebp" },
+               { name => "esp", type => $ignore },
+               { name => "gp_NOREG", type => $ignore | $arbitrary | $virtual }, # we need a dummy register for NoReg nodes
                { mode => "mode_Iu" }
        ],
        mmx => [
-               { name => "mm0", type => 4 },
-               { name => "mm1", type => 4 },
-               { name => "mm2", type => 4 },
-               { name => "mm3", type => 4 },
-               { name => "mm4", type => 4 },
-               { name => "mm5", type => 4 },
-               { name => "mm6", type => 4 },
-               { name => "mm7", type => 4 },
+               { name => "mm0", type => $ignore },
+               { name => "mm1", type => $ignore },
+               { name => "mm2", type => $ignore },
+               { name => "mm3", type => $ignore },
+               { name => "mm4", type => $ignore },
+               { name => "mm5", type => $ignore },
+               { name => "mm6", type => $ignore },
+               { name => "mm7", type => $ignore },
                { mode => "mode_E", flags => "manual_ra" }
        ],
        xmm => [
-               { name => "xmm0", type => 1 },
-               { name => "xmm1", type => 1 },
-               { name => "xmm2", type => 1 },
-               { name => "xmm3", type => 1 },
-               { name => "xmm4", type => 1 },
-               { name => "xmm5", type => 1 },
-               { name => "xmm6", type => 1 },
-               { name => "xmm7", type => 1 },
-               { name => "xmm_NOREG", type => 4 | 16 },     # we need a dummy register for NoReg nodes
+               { name => "xmm0" },
+               { name => "xmm1" },
+               { name => "xmm2" },
+               { name => "xmm3" },
+               { name => "xmm4" },
+               { name => "xmm5" },
+               { name => "xmm6" },
+               { name => "xmm7" },
+               { name => "xmm_NOREG", type => $ignore | $virtual },     # we need a dummy register for NoReg nodes
                { mode => "mode_E" }
        ],
        vfp => [
-               { name => "vf0", type => 1 },
-               { name => "vf1", type => 1 },
-               { name => "vf2", type => 1 },
-               { name => "vf3", type => 1 },
-               { name => "vf4", type => 1 },
-               { name => "vf5", type => 1 },
-               { name => "vf6", type => 1 },
-               { name => "vf7", type => 1 },
-               { name => "vfp_NOREG", type => 4 | 8 | 16 }, # we need a dummy register for NoReg nodes
+               { name => "vf0" },
+               { name => "vf1" },
+               { name => "vf2" },
+               { name => "vf3" },
+               { name => "vf4" },
+               { name => "vf5" },
+               { name => "vf6" },
+               { name => "vf7" },
+               { name => "vfp_NOREG", type => $ignore | $arbitrary | $virtual }, # we need a dummy register for NoReg nodes
                { mode => "mode_E" }
        ],
        st => [
-               { name => "st0", realname => "st",    type => 4 },
-               { name => "st1", realname => "st(1)", type => 4 },
-               { name => "st2", realname => "st(2)", type => 4 },
-               { name => "st3", realname => "st(3)", type => 4 },
-               { name => "st4", realname => "st(4)", type => 4 },
-               { name => "st5", realname => "st(5)", type => 4 },
-               { name => "st6", realname => "st(6)", type => 4 },
-               { name => "st7", realname => "st(7)", type => 4 },
+               { name => "st0", realname => "st",    type => $ignore },
+               { name => "st1", realname => "st(1)", type => $ignore },
+               { name => "st2", realname => "st(2)", type => $ignore },
+               { name => "st3", realname => "st(3)", type => $ignore },
+               { name => "st4", realname => "st(4)", type => $ignore },
+               { name => "st5", realname => "st(5)", type => $ignore },
+               { name => "st6", realname => "st(6)", type => $ignore },
+               { name => "st7", realname => "st(7)", type => $ignore },
                { mode => "mode_E", flags => "manual_ra" }
        ],
        fp_cw => [      # the floating point control word
-               { name => "fpcw", type => 4|32 },
-               { mode => "mode_fpcw", flags => "manual_ra|state" }
+               { name => "fpcw", type => $ignore | $state },
+               { mode => "ia32_mode_fpcw", flags => "manual_ra|state" }
        ],
        flags => [
                { name => "eflags", type => 0 },
@@ -265,7 +175,10 @@ $custom_init_attr_func = \&ia32_custom_init_attr;
                "\tinit_ia32_call_attributes(res, pop, call_tp);",
        ia32_condcode_attr_t =>
                "\tinit_ia32_attributes(res, flags, in_reqs, exec_units, n_res);\n".
-               "\tinit_ia32_condcode_attributes(res, pnc);",
+               "\tinit_ia32_condcode_attributes(res, condition_code);",
+       ia32_switch_attr_t =>
+               "\tinit_ia32_attributes(res, flags, in_reqs, exec_units, n_res);\n".
+               "\tinit_ia32_switch_attributes(res, default_pn);",
        ia32_copyb_attr_t =>
                "\tinit_ia32_attributes(res, flags, in_reqs, exec_units, n_res);\n".
                "\tinit_ia32_copyb_attributes(res, size);",
@@ -281,10 +194,11 @@ $custom_init_attr_func = \&ia32_custom_init_attr;
 );
 
 %compare_attr = (
-       ia32_asm_attr_t       => "ia32_compare_asm_attr",
+       ia32_asm_attr_t        => "ia32_compare_asm_attr",
        ia32_attr_t            => "ia32_compare_nodes_attr",
        ia32_call_attr_t       => "ia32_compare_call_attr",
        ia32_condcode_attr_t   => "ia32_compare_condcode_attr",
+       ia32_switch_attr_t     => "ia32_compare_switch_attr",
        ia32_copyb_attr_t      => "ia32_compare_copyb_attr",
        ia32_immediate_attr_t  => "ia32_compare_immediate_attr",
        ia32_x87_attr_t        => "ia32_compare_x87_attr",
@@ -297,7 +211,7 @@ $custom_init_attr_func = \&ia32_custom_init_attr;
 $mode_xmm           = "mode_E";
 $mode_gp            = "mode_Iu";
 $mode_flags         = "mode_Iu";
-$mode_fpcw          = "mode_fpcw";
+$mode_fpcw          = "ia32_mode_fpcw";
 $status_flags       = [ "CF", "PF", "AF", "ZF", "SF", "OF" ];
 $status_flags_wo_cf = [       "PF", "AF", "ZF", "SF", "OF" ];
 $fpcw_flags         = [ "FP_IM", "FP_DM", "FP_ZM", "FP_OM", "FP_UM", "FP_PM",
@@ -307,7 +221,8 @@ $fpcw_flags         = [ "FP_IM", "FP_DM", "FP_ZM", "FP_OM", "FP_UM", "FP_PM",
 
 Immediate => {
        state     => "pinned",
-       op_flags  => "c",
+       op_flags  => [ "constlike" ],
+       irn_flags => [ "not_scheduled" ],
        reg_req   => { out => [ "gp_NOREG:I" ] },
        attr      => "ir_entity *symconst, int symconst_sign, int no_pic_adjust, long offset",
        attr_type => "ia32_immediate_attr_t",
@@ -330,8 +245,8 @@ Asm => {
 
 # "allocates" a free register
 ProduceVal => {
-       op_flags  => "c|n",
-       irn_flags => "R",
+       op_flags  => [ "constlike", "cse_neutral" ],
+       irn_flags => [ "rematerializable" ],
        reg_req   => { out => [ "gp" ] },
        emit      => "",
        units     => [ ],
@@ -341,7 +256,7 @@ ProduceVal => {
 },
 
 Add => {
-       irn_flags => "R",
+       irn_flags => [ "rematerializable" ],
        state     => "exc_pinned",
        reg_req   => { in  => [ "gp", "gp", "none", "gp", "gp" ],
                       out => [ "in_r4 in_r5", "flags", "none" ] },
@@ -356,7 +271,7 @@ Add => {
 },
 
 AddMem => {
-       irn_flags => "R",
+       irn_flags => [ "rematerializable" ],
        state     => "exc_pinned",
        reg_req   => { in => [ "gp", "gp", "none", "gp" ], out => [ "none" ] },
        ins       => [ "base", "index", "mem", "val" ],
@@ -368,7 +283,7 @@ AddMem => {
 },
 
 AddMem8Bit => {
-       irn_flags => "R",
+       irn_flags => [ "rematerializable" ],
        state     => "exc_pinned",
        reg_req   => { in => [ "gp", "gp", "none", "eax ebx ecx edx" ], out => [ "none" ] },
        ins       => [ "base", "index", "mem", "val" ],
@@ -394,7 +309,7 @@ Adc => {
 },
 
 l_Add => {
-       op_flags  => "C",
+       op_flags  => [ "constlike" ],
        reg_req   => { in => [ "none", "none" ], out => [ "none" ] },
        ins       => [ "left", "right" ],
 },
@@ -422,7 +337,7 @@ Mul => {
 l_Mul => {
        # we should not rematrialize this node. It produces 2 results and has
        # very strict constraints
-       op_flags  => "C",
+       op_flags  => [ "constlike" ],
        cmp_attr  => "return 1;",
        reg_req   => { in => [ "none", "none" ],
                       out => [ "none", "none", "none", "none" ] },
@@ -431,7 +346,7 @@ l_Mul => {
 },
 
 IMul => {
-       irn_flags => "R",
+       irn_flags => [ "rematerializable" ],
        state     => "exc_pinned",
        # TODO: adjust out requirements for the 3 operand form
        # (no need for should_be_same then)
@@ -447,7 +362,7 @@ IMul => {
 },
 
 IMul1OP => {
-       irn_flags => "R",
+       irn_flags => [ "rematerializable" ],
        state     => "exc_pinned",
        reg_req   => { in => [ "gp", "gp", "none", "eax", "gp" ],
                       out => [ "eax", "flags", "none", "edx" ] },
@@ -461,7 +376,7 @@ IMul1OP => {
 },
 
 l_IMul => {
-       op_flags  => "C",
+       op_flags  => [ "constlike" ],
        cmp_attr  => "return 1;",
        reg_req   => { in => [ "none", "none" ],
                       out => [ "none", "none", "none", "none" ] },
@@ -470,7 +385,7 @@ l_IMul => {
 },
 
 And => {
-       irn_flags => "R",
+       irn_flags => [ "rematerializable" ],
        state     => "exc_pinned",
        reg_req   => { in => [ "gp", "gp", "none", "gp", "gp" ],
                           out => [ "in_r4 in_r5", "flags", "none" ] },
@@ -485,7 +400,7 @@ And => {
 },
 
 AndMem => {
-       irn_flags => "R",
+       irn_flags => [ "rematerializable" ],
        state     => "exc_pinned",
        reg_req   => { in => [ "gp", "gp", "none", "gp" ], out => [ "none" ] },
        ins       => [ "base", "index", "mem", "val" ],
@@ -497,7 +412,7 @@ AndMem => {
 },
 
 AndMem8Bit => {
-       irn_flags => "R",
+       irn_flags => [ "rematerializable" ],
        state     => "exc_pinned",
        reg_req   => { in => [ "gp", "gp", "none",  "eax ebx ecx edx" ], out => [ "none" ] },
        ins       => [ "base", "index", "mem", "val" ],
@@ -509,7 +424,7 @@ AndMem8Bit => {
 },
 
 Or => {
-       irn_flags => "R",
+       irn_flags => [ "rematerializable" ],
        state     => "exc_pinned",
        reg_req   => { in => [ "gp", "gp", "none", "gp", "gp" ],
                       out => [ "in_r4 in_r5", "flags", "none" ] },
@@ -524,7 +439,7 @@ Or => {
 },
 
 OrMem => {
-       irn_flags => "R",
+       irn_flags => [ "rematerializable" ],
        state     => "exc_pinned",
        reg_req   => { in => [ "gp", "gp", "none", "gp" ], out => [ "none" ] },
        ins       => [ "base", "index", "mem", "val" ],
@@ -536,7 +451,7 @@ OrMem => {
 },
 
 OrMem8Bit => {
-       irn_flags => "R",
+       irn_flags => [ "rematerializable" ],
        state     => "exc_pinned",
        reg_req   => { in => [ "gp", "gp", "none", "eax ebx ecx edx" ], out => [ "none" ] },
        ins       => [ "base", "index", "mem", "val" ],
@@ -548,7 +463,7 @@ OrMem8Bit => {
 },
 
 Xor => {
-       irn_flags => "R",
+       irn_flags => [ "rematerializable" ],
        state     => "exc_pinned",
        reg_req   => { in => [ "gp", "gp", "none", "gp", "gp" ],
                       out => [ "in_r4 in_r5", "flags", "none" ] },
@@ -563,8 +478,8 @@ Xor => {
 },
 
 Xor0 => {
-       op_flags  => "c",
-       irn_flags => "R",
+       op_flags  => [ "constlike" ],
+       irn_flags => [ "rematerializable" ],
        reg_req   => { out => [ "gp", "flags" ] },
        outs      => [ "res", "flags" ],
        emit      => ". xor%M %D0, %D0",
@@ -575,7 +490,7 @@ Xor0 => {
 },
 
 XorMem => {
-       irn_flags => "R",
+       irn_flags => [ "rematerializable" ],
        state     => "exc_pinned",
        reg_req   => { in => [ "gp", "gp", "none", "gp" ], out => [ "none" ] },
        ins       => [ "base", "index", "mem", "val" ],
@@ -587,7 +502,7 @@ XorMem => {
 },
 
 XorMem8Bit => {
-       irn_flags => "R",
+       irn_flags => [ "rematerializable" ],
        state     => "exc_pinned",
        reg_req   => { in => [ "gp", "gp", "none", "eax ebx ecx edx" ], out => [ "none" ] },
        ins       => [ "base", "index", "mem", "val" ],
@@ -599,7 +514,7 @@ XorMem8Bit => {
 },
 
 Sub => {
-       irn_flags => "R",
+       irn_flags => [ "rematerializable" ],
        state     => "exc_pinned",
        reg_req   => { in => [ "gp", "gp", "none", "gp", "gp" ],
                       out => [ "in_r4", "flags", "none" ] },
@@ -614,7 +529,7 @@ Sub => {
 },
 
 SubMem => {
-       irn_flags => "R",
+       irn_flags => [ "rematerializable" ],
        state     => "exc_pinned",
        reg_req   => { in => [ "gp", "gp", "none", "gp" ], out => [ "none" ] },
        ins       => [ "base", "index", "mem", "subtrahend" ],
@@ -626,7 +541,7 @@ SubMem => {
 },
 
 SubMem8Bit => {
-       irn_flags => "R",
+       irn_flags => [ "rematerializable" ],
        state     => "exc_pinned",
        reg_req   => { in => [ "gp", "gp", "none", "eax ebx ecx edx" ], out => [ "none" ] },
        ins       => [ "base", "index", "mem", "subtrahend" ],
@@ -640,7 +555,7 @@ SubMem8Bit => {
 Sbb => {
        state     => "exc_pinned",
        reg_req   => { in => [ "gp", "gp", "none", "gp", "gp", "flags" ],
-                      out => [ "in_r4 !in_r5", "flags", "none" ] },
+                      out => [ "in_r4", "flags", "none" ] },
        ins       => [ "base", "index", "mem", "minuend", "subtrahend", "eflags" ],
        outs      => [ "res", "flags", "M" ],
        am        => "source,binary",
@@ -653,7 +568,7 @@ Sbb => {
 
 Sbb0 => {
        # Spiller currently fails when rematerializing flag consumers
-       # irn_flags => "R",
+       # irn_flags => [ "rematerializable" ],
        reg_req   => { in => [ "flags" ], out => [ "gp", "flags" ] },
        outs      => [ "res", "flags" ],
        emit      => ". sbb%M %D0, %D0",
@@ -674,12 +589,12 @@ l_Sbb => {
 },
 
 IDiv => {
-       op_flags  => "F|L",
+       op_flags  => [ "fragile", "labeled" ],
        state     => "exc_pinned",
        reg_req   => { in => [ "gp", "gp", "none", "gp", "eax", "edx" ],
-                      out => [ "eax", "flags", "none", "edx", "none" ] },
+                      out => [ "eax", "flags", "none", "edx", "none", "none" ] },
        ins       => [ "base", "index", "mem", "divisor", "dividend_low", "dividend_high" ],
-       outs      => [ "div_res", "flags", "M", "mod_res", "X_exc" ],
+       outs      => [ "div_res", "flags", "M", "mod_res", "X_regular", "X_except" ],
        am        => "source,unary",
        emit      => ". idiv%M %unop3",
        latency   => 25,
@@ -688,12 +603,12 @@ IDiv => {
 },
 
 Div => {
-       op_flags  => "F|L",
+       op_flags  => [ "fragile", "labeled" ],
        state     => "exc_pinned",
        reg_req   => { in => [ "gp", "gp", "none", "gp", "eax", "edx" ],
-                      out => [ "eax", "flags", "none", "edx", "none" ] },
+                      out => [ "eax", "flags", "none", "edx", "none", "none" ] },
        ins       => [ "base", "index", "mem", "divisor", "dividend_low", "dividend_high" ],
-       outs      => [ "div_res", "flags", "M", "mod_res", "X_exc" ],
+       outs      => [ "div_res", "flags", "M", "mod_res", "X_regular", "X_except" ],
        am        => "source,unary",
        emit      => ". div%M %unop3",
        latency   => 25,
@@ -702,7 +617,7 @@ Div => {
 },
 
 Shl => {
-       irn_flags => "R",
+       irn_flags => [ "rematerializable" ],
        reg_req   => { in => [ "gp", "ecx" ],
                       out => [ "in_r1 !in_r2", "flags" ] },
        ins       => [ "val", "count" ],
@@ -715,7 +630,7 @@ Shl => {
 },
 
 ShlMem => {
-       irn_flags => "R",
+       irn_flags => [ "rematerializable" ],
        state     => "exc_pinned",
        reg_req   => { in => [ "gp", "gp", "none", "ecx" ], out => [ "none" ] },
        ins       => [ "base", "index", "mem", "count" ],
@@ -726,14 +641,8 @@ ShlMem => {
        modified_flags => $status_flags
 },
 
-l_ShlDep => {
-       cmp_attr => "return 1;",
-       reg_req  => { in => [ "none", "none", "none" ], out => [ "none" ] },
-       ins      => [ "val", "count", "dep" ],
-},
-
 ShlD => {
-       irn_flags => "R",
+       irn_flags => [ "rematerializable" ],
        reg_req   => { in => [ "gp", "gp", "ecx" ],
                       out => [ "in_r1 !in_r2 !in_r3", "flags" ] },
        ins       => [ "val_high", "val_low", "count" ],
@@ -745,14 +654,8 @@ ShlD => {
        modified_flags => $status_flags
 },
 
-l_ShlD => {
-       cmp_attr  => "return 1;",
-       reg_req  => { in => [ "none", "none", "none" ], out => [ "none" ] },
-       ins       => [ "val_high", "val_low", "count" ],
-},
-
 Shr => {
-       irn_flags => "R",
+       irn_flags => [ "rematerializable" ],
        reg_req   => { in => [ "gp", "ecx" ],
                       out => [ "in_r1 !in_r2", "flags" ] },
        ins       => [ "val", "count" ],
@@ -765,7 +668,7 @@ Shr => {
 },
 
 ShrMem => {
-       irn_flags => "R",
+       irn_flags => [ "rematerializable" ],
        state     => "exc_pinned",
        reg_req   => { in => [ "gp", "gp", "none", "ecx" ], out => [ "none" ] },
        ins       => [ "base", "index", "mem", "count" ],
@@ -776,14 +679,8 @@ ShrMem => {
        modified_flags => $status_flags
 },
 
-l_ShrDep => {
-       cmp_attr  => "return 1;",
-       reg_req   => { in => [ "none", "none", "none" ], out => [ "none" ] },
-       ins       => [ "val", "count", "dep" ],
-},
-
 ShrD => {
-       irn_flags => "R",
+       irn_flags => [ "rematerializable" ],
        reg_req   => { in => [ "gp", "gp", "ecx" ],
                       out => [ "in_r1 !in_r2 !in_r3", "flags" ] },
        ins       => [ "val_high", "val_low", "count" ],
@@ -795,14 +692,8 @@ ShrD => {
        modified_flags => $status_flags
 },
 
-l_ShrD => {
-       cmp_attr  => "return 1;",
-       reg_req   => { in => [ "none", "none", "none" ], out => [ "none" ] },
-       ins       => [ "val_high", "val_low", "count" ],
-},
-
 Sar => {
-       irn_flags => "R",
+       irn_flags => [ "rematerializable" ],
        reg_req   => { in => [ "gp", "ecx" ],
                       out => [ "in_r1 !in_r2", "flags" ] },
        ins       => [ "val", "count" ],
@@ -815,7 +706,7 @@ Sar => {
 },
 
 SarMem => {
-       irn_flags => "R",
+       irn_flags => [ "rematerializable" ],
        state     => "exc_pinned",
        reg_req   => { in => [ "gp", "gp", "none", "ecx" ], out => [ "none" ] },
        ins       => [ "base", "index", "mem", "count" ],
@@ -826,14 +717,8 @@ SarMem => {
        modified_flags => $status_flags
 },
 
-l_SarDep => {
-       cmp_attr  => "return 1;",
-       ins       => [ "val", "count", "dep" ],
-       reg_req   => { in => [ "none", "none", "none" ], out => [ "none" ] },
-},
-
 Ror => {
-       irn_flags => "R",
+       irn_flags => [ "rematerializable" ],
        reg_req   => { in => [ "gp", "ecx" ],
                       out => [ "in_r1 !in_r2", "flags" ] },
        ins       => [ "val", "count" ],
@@ -846,7 +731,7 @@ Ror => {
 },
 
 RorMem => {
-       irn_flags => "R",
+       irn_flags => [ "rematerializable" ],
        state     => "exc_pinned",
        reg_req   => { in => [ "gp", "gp", "none", "ecx" ], out => [ "none" ] },
        ins       => [ "base", "index", "mem", "count" ],
@@ -858,7 +743,7 @@ RorMem => {
 },
 
 Rol => {
-       irn_flags => "R",
+       irn_flags => [ "rematerializable" ],
        reg_req   => { in => [ "gp", "ecx" ],
                       out => [ "in_r1 !in_r2", "flags" ] },
        ins       => [ "val", "count" ],
@@ -871,7 +756,7 @@ Rol => {
 },
 
 RolMem => {
-       irn_flags => "R",
+       irn_flags => [ "rematerializable" ],
        state     => "exc_pinned",
        reg_req   => { in => [ "gp", "gp", "none", "ecx" ], out => [ "none" ] },
        ins       => [ "base", "index", "mem", "count" ],
@@ -883,7 +768,7 @@ RolMem => {
 },
 
 Neg => {
-       irn_flags => "R",
+       irn_flags => [ "rematerializable" ],
        reg_req   => { in => [ "gp" ],
                       out => [ "in_r1", "flags" ] },
        emit      => '. neg%M %S0',
@@ -896,7 +781,7 @@ Neg => {
 },
 
 NegMem => {
-       irn_flags => "R",
+       irn_flags => [ "rematerializable" ],
        state     => "exc_pinned",
        reg_req   => { in => [ "gp", "gp", "none" ], out => [ "none" ] },
        ins       => [ "base", "index", "mem" ],
@@ -908,7 +793,7 @@ NegMem => {
 },
 
 Minus64Bit => {
-       irn_flags => "R",
+       irn_flags => [ "rematerializable" ],
        reg_req   => { in => [ "gp", "gp" ], out => [ "in_r1", "in_r2" ] },
        outs      => [ "low_res", "high_res" ],
        units     => [ "GP" ],
@@ -918,7 +803,7 @@ Minus64Bit => {
 
 
 Inc => {
-       irn_flags => "R",
+       irn_flags => [ "rematerializable" ],
        reg_req   => { in => [ "gp" ],
                       out => [ "in_r1", "flags" ] },
        ins       => [ "val" ],
@@ -931,7 +816,7 @@ Inc => {
 },
 
 IncMem => {
-       irn_flags => "R",
+       irn_flags => [ "rematerializable" ],
        state     => "exc_pinned",
        reg_req   => { in => [ "gp", "gp", "none" ], out => [ "none" ] },
        ins       => [ "base", "index", "mem" ],
@@ -943,7 +828,7 @@ IncMem => {
 },
 
 Dec => {
-       irn_flags => "R",
+       irn_flags => [ "rematerializable" ],
        reg_req   => { in => [ "gp" ],
                       out => [ "in_r1", "flags" ] },
        ins       => [ "val" ],
@@ -956,7 +841,7 @@ Dec => {
 },
 
 DecMem => {
-       irn_flags => "R",
+       irn_flags => [ "rematerializable" ],
        state     => "exc_pinned",
        reg_req   => { in => [ "gp", "gp", "none" ], out => [ "none" ] },
        ins       => [ "base", "index", "mem" ],
@@ -968,7 +853,7 @@ DecMem => {
 },
 
 Not => {
-       irn_flags => "R",
+       irn_flags => [ "rematerializable" ],
        reg_req   => { in => [ "gp" ],
                       out => [ "in_r1" ] },
        ins       => [ "val" ],
@@ -981,7 +866,7 @@ Not => {
 },
 
 NotMem => {
-       irn_flags => "R",
+       irn_flags => [ "rematerializable" ],
        state     => "exc_pinned",
        reg_req   => { in => [ "gp", "gp", "none" ], out => [ "none" ] },
        ins       => [ "base", "index", "mem" ],
@@ -1011,7 +896,7 @@ Stc => {
 },
 
 Cmp => {
-       irn_flags => "R",
+       irn_flags => [ "rematerializable" ],
        state     => "exc_pinned",
        reg_req   => { in  => [ "gp", "gp", "none", "gp", "gp" ],
                       out => [ "flags", "none", "none" ] },
@@ -1019,9 +904,8 @@ Cmp => {
        outs      => [ "eflags", "unused", "M" ],
        am        => "source,binary",
        emit      => '. cmp%M %binop',
-       attr      => "int ins_permuted, int cmp_unsigned",
-       init_attr => "attr->data.ins_permuted   = ins_permuted;\n".
-                    "\tattr->data.cmp_unsigned = cmp_unsigned;\n",
+       attr      => "bool ins_permuted",
+       init_attr => "attr->data.ins_permuted   = ins_permuted;",
        latency   => 1,
        units     => [ "GP" ],
        mode      => $mode_flags,
@@ -1029,7 +913,7 @@ Cmp => {
 },
 
 Cmp8Bit => {
-       irn_flags => "R",
+       irn_flags => [ "rematerializable" ],
        state     => "exc_pinned",
        reg_req   => { in => [ "gp", "gp", "none", "eax ebx ecx edx", "eax ebx ecx edx" ] ,
                       out => [ "flags", "none", "none" ] },
@@ -1037,17 +921,30 @@ Cmp8Bit => {
        outs      => [ "eflags", "unused", "M" ],
        am        => "source,binary",
        emit      => '. cmpb %binop',
-       attr      => "int ins_permuted, int cmp_unsigned",
-       init_attr => "attr->data.ins_permuted   = ins_permuted;\n".
-                    "\tattr->data.cmp_unsigned = cmp_unsigned;\n",
+       attr      => "bool ins_permuted",
+       init_attr => "attr->data.ins_permuted   = ins_permuted;",
        latency   => 1,
        units     => [ "GP" ],
        mode      => $mode_flags,
        modified_flags => $status_flags
 },
 
+XorHighLow => {
+       irn_flags => [ "rematerializable" ],
+       state     => "exc_pinned",
+       reg_req   => { in => [ "eax ebx ecx edx" ],
+                      out => [ "in_r1", "flags" ] },
+       emit      => '. xorb %SH0, %SB0',
+       ins       => [ "value" ],
+       outs      => [ "res", "flags" ],
+       units     => [ "GP" ],
+       latency   => 1,
+       mode      => $mode_gp,
+       modified_flags => $status_flags,
+},
+
 Test => {
-       irn_flags => "R",
+       irn_flags => [ "rematerializable" ],
        state     => "exc_pinned",
        reg_req   => { in => [ "gp", "gp", "none", "gp", "gp" ] ,
                       out => [ "flags", "none", "none" ] },
@@ -1055,9 +952,8 @@ Test => {
        outs      => [ "eflags", "unused", "M" ],
        am        => "source,binary",
        emit      => '. test%M %binop',
-       attr      => "int ins_permuted, int cmp_unsigned",
-       init_attr => "attr->data.ins_permuted = ins_permuted;\n".
-                    "\tattr->data.cmp_unsigned = cmp_unsigned;\n",
+       attr      => "bool ins_permuted",
+       init_attr => "attr->data.ins_permuted = ins_permuted;",
        latency   => 1,
        units     => [ "GP" ],
        mode      => $mode_flags,
@@ -1065,7 +961,7 @@ Test => {
 },
 
 Test8Bit => {
-       irn_flags => "R",
+       irn_flags => [ "rematerializable" ],
        state     => "exc_pinned",
        reg_req   => { in => [ "gp", "gp", "none", "eax ebx ecx edx", "eax ebx ecx edx" ] ,
                       out => [ "flags", "none", "none" ] },
@@ -1073,9 +969,8 @@ Test8Bit => {
        outs      => [ "eflags", "unused", "M" ],
        am        => "source,binary",
        emit      => '. testb %binop',
-       attr      => "int ins_permuted, int cmp_unsigned",
-       init_attr => "attr->data.ins_permuted = ins_permuted;\n".
-                    "\tattr->data.cmp_unsigned = cmp_unsigned;\n",
+       attr      => "bool ins_permuted",
+       init_attr => "attr->data.ins_permuted = ins_permuted;",
        latency   => 1,
        units     => [ "GP" ],
        mode      => $mode_flags,
@@ -1083,16 +978,16 @@ Test8Bit => {
 },
 
 Setcc => {
-       #irn_flags => "R",
+       #irn_flags => [ "rematerializable" ],
        reg_req   => { in => [ "eflags" ], out => [ "eax ebx ecx edx" ] },
        ins       => [ "eflags" ],
        outs      => [ "res" ],
        attr_type => "ia32_condcode_attr_t",
-       attr      => "pn_Cmp pnc",
+       attr      => "ia32_condition_code_t condition_code",
        # The way we handle Setcc with float nodes (potentially) destroys the flags
        # (when we emit the setX; setp; orb and the setX;setnp;andb sequences)
        init_attr => "set_ia32_ls_mode(res, mode_Bu);\n"
-               . "\tif ((pnc & ia32_pn_Cmp_float) && ((pnc & 0xf) != pn_Cmp_Uo) && ((pnc & 0xf) != pn_Cmp_Leg)) {\n"
+               . "\tif (condition_code & ia32_cc_additional_float_cases) {\n"
                . "\t\tarch_irn_add_flags(res, arch_irn_flags_modify_flags);\n"
                . "\t\t/* attr->latency = 3; */\n"
                . "\t}\n",
@@ -1102,12 +997,12 @@ Setcc => {
 },
 
 SetccMem => {
-       #irn_flags => "R",
+       #irn_flags => [ "rematerializable" ],
        state     => "exc_pinned",
        reg_req   => { in => [ "gp", "gp", "none", "eflags" ], out => [ "none" ] },
        ins       => [ "base", "index", "mem","eflags" ],
        attr_type => "ia32_condcode_attr_t",
-       attr      => "pn_Cmp pnc",
+       attr      => "ia32_condition_code_t condition_code",
        init_attr => "set_ia32_ls_mode(res, mode_Bu);\n",
        emit      => '. set%CMP3 %AM',
        latency   => 1,
@@ -1116,7 +1011,7 @@ SetccMem => {
 },
 
 CMovcc => {
-       #irn_flags => "R",
+       #irn_flags => [ "rematerializable" ],
        state     => "exc_pinned",
        # (note: leave the false,true order intact to make it compatible with other
        #  ia32_binary ops)
@@ -1126,7 +1021,7 @@ CMovcc => {
        outs      => [ "res", "flags", "M" ],
        am        => "source,binary",
        attr_type => "ia32_condcode_attr_t",
-       attr      => "pn_Cmp pnc",
+       attr      => "ia32_condition_code_t condition_code",
        latency   => 1,
        units     => [ "GP" ],
        mode      => $mode_gp,
@@ -1134,33 +1029,33 @@ CMovcc => {
 
 Jcc => {
        state     => "pinned",
-       op_flags  => "L|X|Y",
+       op_flags  => [ "labeled", "cfopcode", "forking" ],
        reg_req   => { in  => [ "eflags" ], out => [ "none", "none" ] },
        ins       => [ "eflags" ],
        outs      => [ "false", "true" ],
        attr_type => "ia32_condcode_attr_t",
-       attr      => "pn_Cmp pnc",
+       attr      => "ia32_condition_code_t condition_code",
        latency   => 2,
        units     => [ "BRANCH" ],
 },
 
 SwitchJmp => {
        state     => "pinned",
-       op_flags  => "L|X|Y",
-       reg_req   => { in => [ "gp" ] },
+       op_flags  => [ "labeled", "cfopcode", "forking" ],
+       reg_req   => { in => [ "gp", "gp" ] },
+       ins       => [ "base", "index" ],
        mode      => "mode_T",
-       attr_type => "ia32_condcode_attr_t",
-       attr      => "long pnc",
-       latency   => 3,
+       attr_type => "ia32_switch_attr_t",
+       attr      => "long default_pn",
+       latency   => 2,
        units     => [ "BRANCH" ],
-       modified_flags => $status_flags,
        init_attr => "info->out_infos = NULL;", # XXX ugly hack for out requirements
 },
 
 Jmp => {
        state     => "pinned",
-       irn_flags => "J",
-       op_flags  => "X",
+       irn_flags => [ "simple_jump" ],
+       op_flags  => [ "cfopcode" ],
        reg_req   => { out => [ "none" ] },
        latency   => 1,
        units     => [ "BRANCH" ],
@@ -1169,7 +1064,7 @@ Jmp => {
 
 IJmp => {
        state     => "pinned",
-       op_flags  => "X",
+       op_flags  => [ "cfopcode", "unknown_jump" ],
        reg_req   => { in => [ "gp", "gp", "none", "gp" ] },
        ins       => [ "base", "index", "mem", "target" ],
        am        => "source,unary",
@@ -1181,8 +1076,8 @@ IJmp => {
 },
 
 Const => {
-       op_flags  => "c",
-       irn_flags => "R",
+       op_flags  => [ "constlike" ],
+       irn_flags => [ "rematerializable" ],
        reg_req   => { out => [ "gp" ] },
        units     => [ "GP" ],
        attr      => "ir_entity *symconst, int symconst_sign, int no_pic_adjust, long offset",
@@ -1192,8 +1087,8 @@ Const => {
 },
 
 Unknown => {
-       op_flags  => "c",
-       irn_flags => "R",
+       op_flags  => [ "constlike" ],
+       irn_flags => [ "rematerializable" ],
        reg_req   => { out => [ "gp" ] },
        latency   => 0,
        emit      => '',
@@ -1201,7 +1096,7 @@ Unknown => {
 },
 
 GetEIP => {
-       op_flags => "c",
+       op_flags => [ "constlike" ],
        reg_req  => { out => [ "gp" ] },
        units    => [ "GP" ],
        latency  => 5,
@@ -1211,7 +1106,8 @@ GetEIP => {
 
 NoReg_GP => {
        state     => "pinned",
-       op_flags  => "c|NB|NI",
+       op_flags  => [ "constlike", "dump_noblock", "dump_noinput" ],
+       irn_flags => [ "not_scheduled" ],
        reg_req   => { out => [ "gp_NOREG:I" ] },
        units     => [],
        emit      => "",
@@ -1221,7 +1117,8 @@ NoReg_GP => {
 
 NoReg_VFP => {
        state     => "pinned",
-       op_flags  => "c|NB|NI",
+       op_flags  => [ "constlike", "dump_noblock", "dump_noinput" ],
+       irn_flags => [ "not_scheduled" ],
        reg_req   => { out => [ "vfp_NOREG:I" ] },
        units     => [],
        emit      => "",
@@ -1232,7 +1129,8 @@ NoReg_VFP => {
 
 NoReg_XMM => {
        state     => "pinned",
-       op_flags  => "c|NB|NI",
+       op_flags  => [ "constlike", "dump_noblock", "dump_noinput" ],
+       irn_flags => [ "not_scheduled" ],
        reg_req   => { out => [ "xmm_NOREG:I" ] },
        units     => [],
        emit      => "",
@@ -1242,7 +1140,8 @@ NoReg_XMM => {
 
 ChangeCW => {
        state     => "pinned",
-       op_flags  => "c",
+       op_flags  => [ "constlike" ],
+       irn_flags => [ "not_scheduled" ],
        reg_req   => { out => [ "fpcw:I" ] },
        mode      => $mode_fpcw,
        latency   => 3,
@@ -1251,7 +1150,7 @@ ChangeCW => {
 },
 
 FldCW => {
-       op_flags  => "L|F",
+       op_flags  => [ "labeled" ],
        state     => "pinned",
        reg_req   => { in => [ "gp", "gp", "none" ], out => [ "fpcw:I" ] },
        ins       => [ "base", "index", "mem" ],
@@ -1263,7 +1162,7 @@ FldCW => {
 },
 
 FnstCW => {
-       op_flags  => "L|F",
+       op_flags  => [ "labeled" ],
        state     => "pinned",
        reg_req   => { in => [ "gp", "gp", "none", "fp_cw" ], out => [ "none" ] },
        ins       => [ "base", "index", "mem", "fpcw" ],
@@ -1274,7 +1173,7 @@ FnstCW => {
 },
 
 FnstCWNOP => {
-       op_flags  => "L|F",
+       op_flags  => [ "labeled" ],
        state     => "pinned",
        reg_req   => { in => [ "fp_cw" ], out => [ "none" ] },
        ins       => [ "fpcw" ],
@@ -1299,43 +1198,43 @@ Cltd => {
 # lateny of 0 for load is correct
 
 Load => {
-       op_flags  => "L|F",
+       op_flags  => [ "fragile", "labeled" ],
        state     => "exc_pinned",
        reg_req   => { in => [ "gp", "gp", "none" ],
-                      out => [ "gp", "none", "none", "none" ] },
+                      out => [ "gp", "none", "none", "none", "none" ] },
        ins       => [ "base", "index", "mem" ],
-       outs      => [ "res", "unused", "M", "X_exc" ],
+       outs      => [ "res", "unused", "M", "X_regular", "X_except" ],
        latency   => 0,
        emit      => ". mov%EX%.l %AM, %D0",
        units     => [ "GP" ],
 },
 
 Store => {
-       op_flags  => "L|F",
+       op_flags  => [ "fragile", "labeled" ],
        state     => "exc_pinned",
-       reg_req   => { in => [ "gp", "gp", "none", "gp" ], out => [ "none", "none" ] },
+       reg_req   => { in => [ "gp", "gp", "none", "gp" ],
+                      out => [ "none", "none", "none" ] },
        ins       => [ "base", "index", "mem", "val" ],
-       outs      => [ "M", "X_exc" ],
+       outs      => [ "M", "X_regular", "X_except" ],
        emit      => '. mov%M %SI3, %AM',
        latency   => 2,
        units     => [ "GP" ],
-       mode      => "mode_M",
 },
 
 Store8Bit => {
-       op_flags  => "L|F",
+       op_flags  => [ "fragile", "labeled" ],
        state     => "exc_pinned",
-       reg_req   => { in => [ "gp", "gp", "none", "eax ebx ecx edx" ], out => ["none", "none" ] },
+       reg_req   => { in => [ "gp", "gp", "none", "eax ebx ecx edx" ],
+                      out => ["none", "none", "none" ] },
        ins       => [ "base", "index", "mem", "val" ],
-       outs      => [ "M", "X_exc" ],
+       outs      => [ "M", "X_regular", "X_except" ],
        emit      => '. mov%M %SB3, %AM',
        latency   => 2,
        units     => [ "GP" ],
-       mode      => "mode_M",
 },
 
 Lea => {
-       irn_flags => "R",
+       irn_flags => [ "rematerializable" ],
        reg_req   => { in => [ "gp", "gp" ], out => [ "gp" ] },
        ins       => [ "base", "index" ],
        emit      => '. leal %AM, %D0',
@@ -1389,6 +1288,17 @@ PopEbp => {
        units     => [ "GP" ],
 },
 
+CopyEbpEsp => {
+       state     => "exc_pinned",
+       reg_req   => { in => [ "ebp" ], out => [ "esp:I|S" ] },
+       ins       => [ "ebp" ],
+       outs      => [ "esp" ],
+       emit      => '. movl %S0, %D0',
+       latency   => 1,
+       units     => [ "GP" ],
+       mode      => $mode_gp,
+},
+
 PopMem => {
        state     => "exc_pinned",
        reg_req   => { in => [ "gp", "gp", "none", "esp" ], out => [ "none", "none", "none", "esp:I|S" ] },
@@ -1413,6 +1323,7 @@ Leave => {
        outs      => [ "frame", "stack" ],
        latency   => 3,
        units     => [ "GP" ],
+       state     => "exc_pinned",
 },
 
 AddSP => {
@@ -1441,7 +1352,7 @@ SubSP => {
 },
 
 RepPrefix => {
-       op_flags  => "K",
+       op_flags  => [ "keep" ],
        state     => "pinned",
        mode      => "mode_M",
        emit      => ". rep",
@@ -1449,9 +1360,11 @@ RepPrefix => {
 },
 
 LdTls => {
-       irn_flags => "R",
+       irn_flags => [ "rematerializable" ],
        reg_req   => { out => [ "gp" ] },
        units     => [ "GP" ],
+       emit      => ". movl %%gs:0, %D0",
+       mode      => $mode_gp,
        latency   => 1,
 },
 
@@ -1459,7 +1372,7 @@ LdTls => {
 # BT supports source address mode, but this is unused yet
 #
 Bt => {
-       irn_flags => "R",
+       irn_flags => [ "rematerializable" ],
        state     => "exc_pinned",
        reg_req   => { in => [ "gp", "gp" ], out => [ "flags" ] },
        ins       => [ "left", "right" ],
@@ -1471,7 +1384,7 @@ Bt => {
 },
 
 Bsf => {
-       irn_flags => "R",
+       irn_flags => [ "rematerializable" ],
        state     => "exc_pinned",
        reg_req   => { in => [ "gp", "gp", "none", "gp" ],
                       out => [ "gp", "flags", "none" ] },
@@ -1486,7 +1399,7 @@ Bsf => {
 },
 
 Bsr => {
-       irn_flags => "R",
+       irn_flags => [ "rematerializable" ],
        state     => "exc_pinned",
        reg_req   => { in => [ "gp", "gp", "none", "gp" ],
                       out => [ "gp", "flags", "none" ] },
@@ -1504,7 +1417,7 @@ Bsr => {
 # SSE4.2 or SSE4a popcnt instruction
 #
 Popcnt => {
-       irn_flags => "R",
+       irn_flags => [ "rematerializable" ],
        state     => "exc_pinned",
        reg_req   => { in => [ "gp", "gp", "none", "gp" ],
                       out => [ "gp", "flags", "none" ] },
@@ -1519,13 +1432,14 @@ Popcnt => {
 },
 
 Call => {
+       op_flags  => [ "fragile" ],
        state     => "exc_pinned",
        reg_req   => {
                in  => [ "gp", "gp", "none", "gp", "esp", "fpcw", "eax", "ecx", "edx" ],
-               out => [ "esp:I|S", "fpcw:I", "none", "eax", "ecx", "edx", "vf0", "vf1", "vf2", "vf3", "vf4", "vf5", "vf6", "vf7", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7" ]
+               out => [ "esp:I|S", "fpcw:I", "none", "eax", "ecx", "edx", "vf0", "vf1", "vf2", "vf3", "vf4", "vf5", "vf6", "vf7", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7", "none", "none" ]
        },
        ins       => [ "base", "index", "mem", "addr", "stack", "fpcw", "eax", "ecx", "edx" ],
-       outs      => [ "stack", "fpcw", "M", "eax", "ecx", "edx", "vf0", "vf1", "vf2", "vf3", "vf4", "vf5", "vf6", "vf7", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7" ],
+       outs      => [ "stack", "fpcw", "M", "eax", "ecx", "edx", "vf0", "vf1", "vf2", "vf3", "vf4", "vf5", "vf6", "vf7", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7", "X_regular", "X_except" ],
        attr_type => "ia32_call_attr_t",
        attr      => "unsigned pop, ir_type *call_tp",
        am        => "source,unary",
@@ -1554,7 +1468,7 @@ ClimbFrame => {
 # bswap
 #
 Bswap => {
-       irn_flags => "R",
+       irn_flags => [ "rematerializable" ],
        reg_req   => { in => [ "gp" ],
                       out => [ "in_r1" ] },
        emit      => '. bswap%M %S0',
@@ -1568,7 +1482,7 @@ Bswap => {
 # bswap16, use xchg here
 #
 Bswap16 => {
-       irn_flags => "R",
+       irn_flags => [ "rematerializable" ],
        reg_req   => { in => [ "eax ebx ecx edx" ],
                       out => [ "in_r1" ] },
        emit      => '. xchg %SB0, %SH0',
@@ -1608,7 +1522,7 @@ UD2 => {
 # outport
 #
 Outport => {
-       irn_flags => "R",
+       irn_flags => [ "rematerializable" ],
        state     => "pinned",
        reg_req   => { in => [ "edx", "eax", "none" ], out => [ "none" ] },
        ins       => [ "port", "value", "mem" ],
@@ -1623,7 +1537,7 @@ Outport => {
 # inport
 #
 Inport => {
-       irn_flags => "R",
+       irn_flags => [ "rematerializable" ],
        state     => "pinned",
        reg_req   => { in => [ "edx", "none" ], out => [ "eax", "none" ] },
        ins       => [ "port", "mem" ],
@@ -1639,7 +1553,7 @@ Inport => {
 # Intel style prefetching
 #
 Prefetch0 => {
-       op_flags  => "L|F",
+       op_flags  => [ "labeled" ],
        state     => "exc_pinned",
        reg_req   => { in => [ "gp", "gp", "none" ], out => [ "none" ] },
        ins       => [ "base", "index", "mem" ],
@@ -1650,7 +1564,7 @@ Prefetch0 => {
 },
 
 Prefetch1 => {
-       op_flags  => "L|F",
+       op_flags  => [ "labeled" ],
        state     => "exc_pinned",
        reg_req   => { in => [ "gp", "gp", "none" ], out => [ "none" ] },
        ins       => [ "base", "index", "mem" ],
@@ -1661,7 +1575,7 @@ Prefetch1 => {
 },
 
 Prefetch2 => {
-       op_flags  => "L|F",
+       op_flags  => [ "labeled" ],
        state     => "exc_pinned",
        reg_req   => { in => [ "gp", "gp", "none" ], out => [ "none" ] },
        ins       => [ "base", "index", "mem" ],
@@ -1672,7 +1586,7 @@ Prefetch2 => {
 },
 
 PrefetchNTA => {
-       op_flags  => "L|F",
+       op_flags  => [ "labeled" ],
        state     => "exc_pinned",
        reg_req   => { in => [ "gp", "gp", "none" ], out => [ "none" ] },
        ins       => [ "base", "index", "mem" ],
@@ -1686,7 +1600,7 @@ PrefetchNTA => {
 # 3DNow! prefetch instructions
 #
 Prefetch => {
-       op_flags  => "L|F",
+       op_flags  => [ "labeled" ],
        state     => "exc_pinned",
        reg_req   => { in => [ "gp", "gp", "none" ], out => [ "none" ] },
        ins       => [ "base", "index", "mem" ],
@@ -1697,7 +1611,7 @@ Prefetch => {
 },
 
 PrefetchW => {
-       op_flags  => "L|F",
+       op_flags  => [ "labeled" ],
        state     => "exc_pinned",
        reg_req   => { in => [ "gp", "gp", "none" ], out => [ "none" ] },
        ins       => [ "base", "index", "mem" ],
@@ -1709,7 +1623,7 @@ PrefetchW => {
 
 # produces a 0/+0.0
 xZero => {
-       irn_flags => "R",
+       irn_flags => [ "rematerializable" ],
        reg_req   => { out => [ "xmm" ] },
        emit      => '. xorp%XSD %D0, %D0',
        latency   => 3,
@@ -1718,8 +1632,8 @@ xZero => {
 },
 
 xUnknown => {
-       op_flags  => "c",
-       irn_flags => "R",
+       op_flags  => [ "constlike" ],
+       irn_flags => [ "rematerializable" ],
        reg_req   => { out => [ "xmm" ] },
        emit      => '',
        latency   => 0,
@@ -1727,7 +1641,7 @@ xUnknown => {
 },
 
 xPzero => {
-       irn_flags => "R",
+       irn_flags => [ "rematerializable" ],
        reg_req   => { out => [ "xmm" ] },
        emit      => '. pxor %D0, %D0',
        latency   => 3,
@@ -1737,7 +1651,7 @@ xPzero => {
 
 # produces all 1 bits
 xAllOnes => {
-       irn_flags => "R",
+       irn_flags => [ "rematerializable" ],
        reg_req   => { out => [ "xmm" ] },
        emit      => '. pcmpeqb %D0, %D0',
        latency   => 3,
@@ -1747,7 +1661,7 @@ xAllOnes => {
 
 # integer shift left, dword
 xPslld => {
-       irn_flags => "R",
+       irn_flags => [ "rematerializable" ],
        reg_req   => { in => [ "xmm", "xmm" ], out => [ "in_r1 !in_r2" ] },
        emit      => '. pslld %SI1, %D0',
        latency   => 3,
@@ -1757,7 +1671,7 @@ xPslld => {
 
 # integer shift left, qword
 xPsllq => {
-       irn_flags => "R",
+       irn_flags => [ "rematerializable" ],
        reg_req   => { in => [ "xmm", "xmm" ], out => [ "in_r1 !in_r2" ] },
        emit      => '. psllq %SI1, %D0',
        latency   => 3,
@@ -1767,7 +1681,7 @@ xPsllq => {
 
 # integer shift right, dword
 xPsrld => {
-       irn_flags => "R",
+       irn_flags => [ "rematerializable" ],
        reg_req   => { in => [ "xmm", "xmm" ], out => [ "in_r1 !in_r2" ] },
        emit      => '. psrld %SI1, %D0',
        latency   => 1,
@@ -1777,7 +1691,7 @@ xPsrld => {
 
 # mov from integer to SSE register
 xMovd  => {
-       irn_flags => "R",
+       irn_flags => [ "rematerializable" ],
        reg_req   => { in => [ "gp" ], out => [ "xmm" ] },
        emit      => '. movd %S0, %D0',
        latency   => 1,
@@ -1786,7 +1700,7 @@ xMovd  => {
 },
 
 xAdd => {
-       irn_flags => "R",
+       irn_flags => [ "rematerializable" ],
        state     => "exc_pinned",
        reg_req   => { in => [ "gp", "gp", "none", "xmm", "xmm" ],
                       out => [ "in_r4 in_r5", "flags", "none" ] },
@@ -1800,7 +1714,7 @@ xAdd => {
 },
 
 xMul => {
-       irn_flags => "R",
+       irn_flags => [ "rematerializable" ],
        state     => "exc_pinned",
        reg_req   => { in => [ "gp", "gp", "none", "xmm", "xmm" ],
                       out => [ "in_r4 in_r5", "flags", "none" ] },
@@ -1814,7 +1728,7 @@ xMul => {
 },
 
 xMax => {
-       irn_flags => "R",
+       irn_flags => [ "rematerializable" ],
        state     => "exc_pinned",
        reg_req   => { in => [ "gp", "gp", "none", "xmm", "xmm" ],
                       out => [ "in_r4 in_r5", "flags", "none" ] },
@@ -1828,7 +1742,7 @@ xMax => {
 },
 
 xMin => {
-       irn_flags => "R",
+       irn_flags => [ "rematerializable" ],
        state     => "exc_pinned",
        reg_req   => { in => [ "gp", "gp", "none", "xmm", "xmm" ],
                       out => [ "in_r4 in_r5", "flags", "none" ] },
@@ -1842,7 +1756,7 @@ xMin => {
 },
 
 xAnd => {
-       irn_flags => "R",
+       irn_flags => [ "rematerializable" ],
        state     => "exc_pinned",
        reg_req   => { in => [ "gp", "gp", "none", "xmm", "xmm" ],
                       out => [ "in_r4 in_r5", "flags", "none" ] },
@@ -1856,7 +1770,7 @@ xAnd => {
 },
 
 xOr => {
-       irn_flags => "R",
+       irn_flags => [ "rematerializable" ],
        state     => "exc_pinned",
        reg_req   => { in => [ "gp", "gp", "none", "xmm", "xmm" ],
                       out => [ "in_r4 in_r5", "flags", "none" ] },
@@ -1870,7 +1784,7 @@ xOr => {
 },
 
 xXor => {
-       irn_flags => "R",
+       irn_flags => [ "rematerializable" ],
        state     => "exc_pinned",
        reg_req   => { in => [ "gp", "gp", "none", "xmm", "xmm" ],
                       out => [ "in_r4 in_r5", "flags", "none" ] },
@@ -1884,7 +1798,7 @@ xXor => {
 },
 
 xAndNot => {
-       irn_flags => "R",
+       irn_flags => [ "rematerializable" ],
        state     => "exc_pinned",
        reg_req   => { in => [ "gp", "gp", "none", "xmm", "xmm" ],
                       out => [ "in_r4 !in_r5", "flags", "none" ] },
@@ -1898,7 +1812,7 @@ xAndNot => {
 },
 
 xSub => {
-       irn_flags => "R",
+       irn_flags => [ "rematerializable" ],
        state     => "exc_pinned",
        reg_req   => { in => [ "gp", "gp", "none", "xmm", "xmm" ],
                       out => [ "in_r4", "flags", "none" ] },
@@ -1912,7 +1826,7 @@ xSub => {
 },
 
 xDiv => {
-       irn_flags => "R",
+       irn_flags => [ "rematerializable" ],
        state     => "exc_pinned",
        reg_req   => { in => [ "gp", "gp", "none", "xmm", "xmm" ],
                       out => [ "in_r4 !in_r5", "flags", "none" ] },
@@ -1925,14 +1839,14 @@ xDiv => {
 },
 
 Ucomi => {
-       irn_flags => "R",
+       irn_flags => [ "rematerializable" ],
        state     => "exc_pinned",
        reg_req   => { in => [ "gp", "gp", "none", "xmm", "xmm" ],
                       out => [ "eflags" ] },
        ins       => [ "base", "index", "mem", "left", "right" ],
        outs      => [ "flags" ],
        am        => "source,binary",
-       attr      => "int ins_permuted",
+       attr      => "bool ins_permuted",
        init_attr => "attr->data.ins_permuted = ins_permuted;",
        emit      => ' .ucomi%XXM %binop',
        latency   => 3,
@@ -1942,12 +1856,12 @@ Ucomi => {
 },
 
 xLoad => {
-       op_flags  => "L|F",
+       op_flags  => [ "fragile", "labeled" ],
        state     => "exc_pinned",
        reg_req   => { in => [ "gp", "gp", "none" ],
-                      out => [ "xmm", "none", "none", "none" ] },
+                      out => [ "xmm", "none", "none", "none", "none" ] },
        ins       => [ "base", "index", "mem" ],
-       outs      => [ "res", "unused", "M", "X_exc" ],
+       outs      => [ "res", "unused", "M", "X_regular", "X_except" ],
        emit      => '. mov%XXM %AM, %D0',
        attr      => "ir_mode *load_mode",
        init_attr => "attr->ls_mode = load_mode;",
@@ -1956,31 +1870,31 @@ xLoad => {
 },
 
 xStore => {
-       op_flags => "L|F",
+       op_flags => [ "fragile", "labeled" ],
        state    => "exc_pinned",
-       reg_req  => { in => [ "gp", "gp", "none", "xmm" ], out => [ "none", "none" ] },
+       reg_req  => { in => [ "gp", "gp", "none", "xmm" ],
+                     out => [ "none", "none", "none" ] },
        ins       => [ "base", "index", "mem", "val" ],
-       outs      => [ "M", "X_exc" ],
+       outs      => [ "M", "X_regular", "X_except" ],
        emit     => '. mov%XXM %S3, %AM',
        latency  => 0,
        units    => [ "SSE" ],
-       mode     => "mode_M",
 },
 
 xStoreSimple => {
-       op_flags => "L|F",
+       op_flags => [ "fragile", "labeled" ],
        state    => "exc_pinned",
-       reg_req  => { in => [ "gp", "gp", "none", "xmm" ], out => [ "none" ] },
+       reg_req  => { in => [ "gp", "gp", "none", "xmm" ],
+                     out => [ "none", "none", "none" ] },
        ins      => [ "base", "index", "mem", "val" ],
-       outs     => [ "M" ],
+       outs     => [ "M", "X_regular", "X_except" ],
        emit     => '. mov%XXM %S3, %AM',
        latency  => 0,
        units    => [ "SSE" ],
-       mode     => "mode_M",
 },
 
 CvtSI2SS => {
-       op_flags => "L|F",
+       op_flags => [ "labeled" ],
        state     => "exc_pinned",
        reg_req  => { in => [ "gp", "gp", "none", "gp" ], out => [ "xmm" ] },
        ins      => [ "base", "index", "mem", "val" ],
@@ -1992,7 +1906,7 @@ CvtSI2SS => {
 },
 
 CvtSI2SD => {
-       op_flags => "L|F",
+       op_flags => [ "labeled" ],
        state     => "exc_pinned",
        reg_req  => { in => [ "gp", "gp", "none", "gp" ], out => [ "xmm" ] },
        ins      => [ "base", "index", "mem", "val" ],
@@ -2005,14 +1919,14 @@ CvtSI2SD => {
 
 
 l_LLtoFloat => {
-       op_flags => "L|F",
+       op_flags => [ "labeled" ],
        cmp_attr => "return 1;",
        ins      => [ "val_high", "val_low" ],
        reg_req  => { in => [ "none", "none" ], out => [ "none" ] }
 },
 
 l_FloattoLL => {
-       op_flags => "L|F",
+       op_flags => [ "labeled" ],
        cmp_attr => "return 1;",
        ins      => [ "val" ],
        outs     => [ "res_high", "res_low" ],
@@ -2020,27 +1934,31 @@ l_FloattoLL => {
 },
 
 CopyB => {
-       op_flags  => "F|H",
+       op_flags  => [ "fragile" ],
        state     => "pinned",
-       reg_req   => { in => [ "edi", "esi", "ecx", "none" ], out => [ "edi", "esi", "ecx", "none" ] },
-       outs      => [ "DST", "SRC", "CNT", "M" ],
+       reg_req   => { in => [ "edi", "esi", "ecx", "none" ],
+                      out => [ "edi", "esi", "ecx", "none", "none", "none" ] },
+       ins       => [ "dest", "source", "count", "mem" ],
+       outs      => [ "dest", "source", "count", "M", "X_regular", "X_except" ],
        attr_type => "ia32_copyb_attr_t",
        attr      => "unsigned size",
        units     => [ "GP" ],
-       latency  => 3,
+       latency   => 3,
 # we don't care about this flag, so no need to mark this node
 #      modified_flags => [ "DF" ]
 },
 
 CopyB_i => {
-       op_flags  => "F|H",
+       op_flags  => [ "fragile" ],
        state     => "pinned",
-       reg_req   => { in => [ "edi", "esi", "none" ], out => [  "edi", "esi", "none" ] },
-       outs      => [ "DST", "SRC", "M" ],
+       reg_req   => { in => [ "edi", "esi", "none" ],
+                      out => [  "edi", "esi", "none", "none", "none" ] },
+       ins       => [ "dest", "source", "mem" ],
+       outs      => [ "dest", "source", "M", "X_regular", "X_except" ],
        attr_type => "ia32_copyb_attr_t",
        attr      => "unsigned size",
        units     => [ "GP" ],
-       latency  => 3,
+       latency   => 3,
 # we don't care about this flag, so no need to mark this node
 #      modified_flags => [ "DF" ]
 },
@@ -2057,11 +1975,12 @@ Cwtl => {
 },
 
 Conv_I2I => {
+       op_flags  => [ "fragile" ],
        state     => "exc_pinned",
        reg_req   => { in => [ "gp", "gp", "none", "gp" ],
-                      out => [ "gp", "none", "none" ] },
+                      out => [ "gp", "none", "none", "none", "none" ] },
        ins       => [ "base", "index", "mem", "val" ],
-       outs      => [ "res", "flags", "M" ],
+       outs      => [ "res", "flags", "M", "X_regular", "X_except" ],
        am        => "source,unary",
        units     => [ "GP" ],
        latency   => 1,
@@ -2071,11 +1990,12 @@ Conv_I2I => {
 },
 
 Conv_I2I8Bit => {
+       op_flags  => [ "fragile" ],
        state     => "exc_pinned",
        reg_req   => { in => [ "gp", "gp", "none", "eax ebx ecx edx" ],
-                      out => [ "gp", "none", "none" ] },
+                      out => [ "gp", "none", "none", "none", "none" ] },
        ins       => [ "base", "index", "mem", "val" ],
-       outs      => [ "res", "flags", "M" ],
+       outs      => [ "res", "flags", "M", "X_regular", "X_except" ],
        am        => "source,unary",
        units     => [ "GP" ],
        latency   => 1,
@@ -2118,7 +2038,7 @@ Conv_FP2FP => {
 # handler runs before spilling and we might end up with wrong fpcw then
 
 vfadd => {
-#      irn_flags => "R",
+#      irn_flags => [ "rematerializable" ],
        state     => "exc_pinned",
        reg_req   => { in => [ "gp", "gp", "none", "vfp", "vfp", "fpcw" ],
                       out => [ "vfp", "none", "none" ] },
@@ -2132,7 +2052,7 @@ vfadd => {
 },
 
 vfmul => {
-#      irn_flags => "R",
+#      irn_flags => [ "rematerializable" ],
        state     => "exc_pinned",
        reg_req   => { in => [ "gp", "gp", "none", "vfp", "vfp", "fpcw" ],
                       out => [ "vfp", "none", "none" ] },
@@ -2146,7 +2066,7 @@ vfmul => {
 },
 
 vfsub => {
-#      irn_flags => "R",
+#      irn_flags => [ "rematerializable" ],
        state     => "exc_pinned",
        reg_req   => { in => [ "gp", "gp", "none", "vfp", "vfp", "fpcw" ],
                       out => [ "vfp", "none", "none" ] },
@@ -2181,7 +2101,7 @@ vfprem => {
 },
 
 vfabs => {
-       irn_flags => "R",
+       irn_flags => [ "rematerializable" ],
        reg_req   => { in => [ "vfp"], out => [ "vfp" ] },
        ins       => [ "value" ],
        latency   => 2,
@@ -2191,7 +2111,7 @@ vfabs => {
 },
 
 vfchs => {
-       irn_flags => "R",
+       irn_flags => [ "rematerializable" ],
        reg_req   => { in => [ "vfp"], out => [ "vfp" ] },
        ins       => [ "value" ],
        latency   => 2,
@@ -2201,13 +2121,13 @@ vfchs => {
 },
 
 vfld => {
-       irn_flags => "R",
-       op_flags  => "L|F",
+       irn_flags => [ "rematerializable" ],
+       op_flags  => [ "fragile", "labeled" ],
        state     => "exc_pinned",
        reg_req   => { in => [ "gp", "gp", "none" ],
-                      out => [ "vfp", "none", "none", "none" ] },
+                      out => [ "vfp", "none", "none", "none", "none" ] },
        ins       => [ "base", "index", "mem" ],
-       outs      => [ "res", "unused", "M", "X_exc" ],
+       outs      => [ "res", "unused", "M", "X_regular", "X_except" ],
        attr      => "ir_mode *load_mode",
        init_attr => "attr->attr.ls_mode = load_mode;",
        latency   => 2,
@@ -2216,18 +2136,17 @@ vfld => {
 },
 
 vfst => {
-       irn_flags => "R",
-       op_flags  => "L|F",
+       irn_flags => [ "rematerializable" ],
+       op_flags  => [ "fragile", "labeled" ],
        state     => "exc_pinned",
        reg_req   => { in => [ "gp", "gp", "none", "vfp" ],
-                      out => [ "none", "none" ] },
+                      out => [ "none", "none", "none" ] },
        ins       => [ "base", "index", "mem", "val" ],
-       outs      => [ "M", "X_exc" ],
+       outs      => [ "M", "X_regular", "X_except" ],
        attr      => "ir_mode *store_mode",
        init_attr => "attr->attr.ls_mode = store_mode;",
        latency   => 2,
        units     => [ "VFP" ],
-       mode      => "mode_M",
        attr_type => "ia32_x87_attr_t",
 },
 
@@ -2243,29 +2162,32 @@ vfild => {
 },
 
 vfist => {
+       op_flags  => [ "fragile" ],
        state     => "exc_pinned",
-       reg_req   => { in => [ "gp", "gp", "none", "vfp", "fpcw" ], out => [ "none" ] },
+       reg_req   => { in => [ "gp", "gp", "none", "vfp", "fpcw" ],
+                      out => [ "none", "none", "none", "none" ] },
        ins       => [ "base", "index", "mem", "val", "fpcw" ],
-       outs      => [ "M" ],
+       outs      => [ "dummy", "M", "X_regular", "X_except" ],
        latency   => 4,
        units     => [ "VFP" ],
-       mode      => "mode_M",
        attr_type => "ia32_x87_attr_t",
 },
 
 # SSE3 fisttp instruction
 vfisttp => {
+       op_flags  => [ "fragile" ],
        state     => "exc_pinned",
-       reg_req   => { in => [ "gp", "gp", "none", "vfp" ], out => [ "in_r4", "none" ]},
+       reg_req   => { in => [ "gp", "gp", "none", "vfp" ],
+                      out => [ "in_r4", "none", "none", "none" ]},
        ins       => [ "base", "index", "mem", "val" ],
-       outs      => [ "res", "M" ],
+       outs      => [ "res", "M", "X_regular", "X_except" ],
        latency   => 4,
        units     => [ "VFP" ],
        attr_type => "ia32_x87_attr_t",
 },
 
 vfldz => {
-       irn_flags => "R",
+       irn_flags => [ "rematerializable" ],
        reg_req   => { out => [ "vfp" ] },
        outs      => [ "res" ],
        latency   => 4,
@@ -2275,7 +2197,7 @@ vfldz => {
 },
 
 vfld1 => {
-       irn_flags => "R",
+       irn_flags => [ "rematerializable" ],
        reg_req   => { out => [ "vfp" ] },
        outs      => [ "res" ],
        latency   => 4,
@@ -2285,7 +2207,7 @@ vfld1 => {
 },
 
 vfldpi => {
-       irn_flags => "R",
+       irn_flags => [ "rematerializable" ],
        reg_req   => { out => [ "vfp" ] },
        outs      => [ "res" ],
        latency   => 4,
@@ -2295,7 +2217,7 @@ vfldpi => {
 },
 
 vfldln2 => {
-       irn_flags => "R",
+       irn_flags => [ "rematerializable" ],
        reg_req   => { out => [ "vfp" ] },
        outs      => [ "res" ],
        latency   => 4,
@@ -2305,7 +2227,7 @@ vfldln2 => {
 },
 
 vfldlg2 => {
-       irn_flags => "R",
+       irn_flags => [ "rematerializable" ],
        reg_req   => { out => [ "vfp" ] },
        outs      => [ "res" ],
        latency   => 4,
@@ -2315,7 +2237,7 @@ vfldlg2 => {
 },
 
 vfldl2t => {
-       irn_flags => "R",
+       irn_flags => [ "rematerializable" ],
        reg_req   => { out => [ "vfp" ] },
        outs      => [ "res" ],
        latency   => 4,
@@ -2325,7 +2247,7 @@ vfldl2t => {
 },
 
 vfldl2e => {
-       irn_flags => "R",
+       irn_flags => [ "rematerializable" ],
        reg_req   => { out => [ "vfp" ] },
        outs      => [ "res" ],
        latency   => 4,
@@ -2337,11 +2259,11 @@ vfldl2e => {
 vFucomFnstsw => {
 # we can't allow to rematerialize this node so we don't
 #  accidently produce Phi(Fucom, Fucom(ins_permuted))
-#      irn_flags => "R",
+#      irn_flags => [ "rematerializable" ],
        reg_req   => { in => [ "vfp", "vfp" ], out => [ "eax" ] },
        ins       => [ "left", "right" ],
        outs      => [ "flags" ],
-       attr      => "int ins_permuted",
+       attr      => "bool ins_permuted",
        init_attr => "attr->attr.data.ins_permuted = ins_permuted;",
        latency   => 3,
        units     => [ "VFP" ],
@@ -2350,11 +2272,11 @@ vFucomFnstsw => {
 },
 
 vFucomi => {
-       irn_flags => "R",
+       irn_flags => [ "rematerializable" ],
        reg_req   => { in => [ "vfp", "vfp" ], out => [ "eflags" ] },
        ins       => [ "left", "right" ],
        outs      => [ "flags" ],
-       attr      => "int ins_permuted",
+       attr      => "bool ins_permuted",
        init_attr => "attr->attr.data.ins_permuted = ins_permuted;",
        latency   => 3,
        units     => [ "VFP" ],
@@ -2363,11 +2285,11 @@ vFucomi => {
 },
 
 vFtstFnstsw => {
-#      irn_flags => "R",
+#      irn_flags => [ "rematerializable" ],
        reg_req   => { in => [ "vfp" ], out => [ "eax" ] },
        ins       => [ "left" ],
        outs      => [ "flags" ],
-       attr      => "int ins_permuted",
+       attr      => "bool ins_permuted",
        init_attr => "attr->attr.data.ins_permuted = ins_permuted;",
        latency   => 3,
        units     => [ "VFP" ],
@@ -2376,7 +2298,7 @@ vFtstFnstsw => {
 },
 
 Sahf => {
-       irn_flags => "R",
+       irn_flags => [ "rematerializable" ],
        reg_req   => { in => [ "eax" ], out => [ "eflags" ] },
        ins       => [ "val" ],
        outs      => [ "flags" ],
@@ -2440,7 +2362,7 @@ fsubp => {
 
 fsubr => {
        state     => "exc_pinned",
-       irn_flags => "R",
+       irn_flags => [ "rematerializable" ],
        emit      => '. fsubr%XM %x87_binop',
        latency   => 4,
        attr_type => "ia32_x87_attr_t",
@@ -2449,7 +2371,7 @@ fsubr => {
 
 fsubrp => {
        state     => "exc_pinned",
-       irn_flags => "R",
+       irn_flags => [ "rematerializable" ],
 # see note about gas bugs before fsubp
        emit      => '. fsubp%XM %x87_binop',
        latency   => 4,
@@ -2516,7 +2438,8 @@ fabs => {
 },
 
 fchs => {
-       op_flags  => "R|K",
+       op_flags  => [ "keep" ],
+       irn_flags => [ "rematerializable" ],
        emit      => '. fchs',
        latency   => 4,
        attr_type => "ia32_x87_attr_t",
@@ -2524,7 +2447,8 @@ fchs => {
 },
 
 fld => {
-       op_flags  => "R|L|F",
+       irn_flags => [ "rematerializable" ],
+       op_flags  => [ "labeled" ],
        state     => "exc_pinned",
        emit      => '. fld%XM %AM',
        attr_type => "ia32_x87_attr_t",
@@ -2533,7 +2457,8 @@ fld => {
 },
 
 fst => {
-       op_flags  => "R|L|F",
+       irn_flags => [ "rematerializable" ],
+       op_flags  => [ "labeled" ],
        state     => "exc_pinned",
        emit      => '. fst%XM %AM',
        mode      => "mode_M",
@@ -2543,7 +2468,8 @@ fst => {
 },
 
 fstp => {
-       op_flags  => "R|L|F",
+       irn_flags => [ "rematerializable" ],
+       op_flags  => [ "labeled" ],
        state     => "exc_pinned",
        emit      => '. fstp%XM %AM',
        mode      => "mode_M",
@@ -2589,8 +2515,8 @@ fisttp => {
 },
 
 fldz => {
-       op_flags  => "R|c|K",
-       irn_flags => "R",
+       op_flags  =>  [ "constlike", "keep" ],
+       irn_flags => [ "rematerializable" ],
        reg_req   => { out => [ "vfp" ] },
        emit      => '. fldz',
        attr_type => "ia32_x87_attr_t",
@@ -2598,8 +2524,8 @@ fldz => {
 },
 
 fld1 => {
-       op_flags  => "R|c|K",
-       irn_flags => "R",
+       op_flags  => [ "constlike", "keep" ],
+       irn_flags => [ "rematerializable" ],
        reg_req   => { out => [ "vfp" ] },
        emit      => '. fld1',
        attr_type => "ia32_x87_attr_t",
@@ -2607,8 +2533,8 @@ fld1 => {
 },
 
 fldpi => {
-       op_flags  => "R|c|K",
-       irn_flags => "R",
+       op_flags  => [ "constlike", "keep" ],
+       irn_flags => [ "rematerializable" ],
        reg_req   => { out => [ "vfp" ] },
        emit      => '. fldpi',
        attr_type => "ia32_x87_attr_t",
@@ -2616,8 +2542,8 @@ fldpi => {
 },
 
 fldln2 => {
-       op_flags  => "R|c|K",
-       irn_flags => "R",
+       op_flags  => [ "constlike", "keep" ],
+       irn_flags => [ "rematerializable" ],
        reg_req   => { out => [ "vfp" ] },
        emit      => '. fldln2',
        attr_type => "ia32_x87_attr_t",
@@ -2625,8 +2551,8 @@ fldln2 => {
 },
 
 fldlg2 => {
-       op_flags  => "R|c|K",
-       irn_flags => "R",
+       op_flags  => [ "constlike", "keep" ],
+       irn_flags => [ "rematerializable" ],
        reg_req   => { out => [ "vfp" ] },
        emit      => '. fldlg2',
        attr_type => "ia32_x87_attr_t",
@@ -2634,8 +2560,8 @@ fldlg2 => {
 },
 
 fldl2t => {
-       op_flags  => "R|c|K",
-       irn_flags => "R",
+       op_flags  => [ "constlike", "keep" ],
+       irn_flags => [ "rematerializable" ],
        reg_req   => { out => [ "vfp" ] },
        emit      => '. fldll2t',
        attr_type => "ia32_x87_attr_t",
@@ -2643,8 +2569,8 @@ fldl2t => {
 },
 
 fldl2e => {
-       op_flags  => "R|c|K",
-       irn_flags => "R",
+       op_flags  => [ "constlike", "keep" ],
+       irn_flags => [ "rematerializable" ],
        reg_req   => { out => [ "vfp" ] },
        emit      => '. fldl2e',
        attr_type => "ia32_x87_attr_t",
@@ -2656,7 +2582,7 @@ fldl2e => {
 # Moreover, note the virtual register requierements!
 
 fxch => {
-       op_flags  => "R|K",
+       op_flags  => [ "keep" ],
        reg_req   => { out => [ "none" ] },
        cmp_attr  => "return 1;",
        emit      => '. fxch %X0',
@@ -2666,7 +2592,7 @@ fxch => {
 },
 
 fpush => {
-       op_flags  => "R|K",
+       op_flags  => [ "keep" ],
        reg_req   => { out => [ "none" ] },
        cmp_attr  => "return 1;",
        emit      => '. fld %X0',
@@ -2684,7 +2610,7 @@ fpushCopy => {
 },
 
 fpop => {
-       op_flags  => "K",
+       op_flags  => [ "keep" ],
        reg_req   => { out => [ "none" ] },
        cmp_attr  => "return 1;",
        emit      => '. fstp %X0',
@@ -2694,7 +2620,7 @@ fpop => {
 },
 
 ffreep => {
-       op_flags  => "K",
+       op_flags  => [ "keep" ],
        reg_req   => { out => [ "none" ] },
        cmp_attr  => "return 1;",
        emit      => '. ffreep %X0',
@@ -2704,7 +2630,7 @@ ffreep => {
 },
 
 emms => {
-       op_flags  => "K",
+       op_flags  => [ "keep" ],
        reg_req   => { out => [ "none" ] },
        cmp_attr  => "return 1;",
        emit      => '. emms',
@@ -2714,7 +2640,7 @@ emms => {
 },
 
 femms => {
-       op_flags  => "K",
+       op_flags  => [ "keep" ],
        reg_req   => { out => [ "none" ] },
        cmp_attr  => "return 1;",
        emit      => '. femms',
@@ -2772,24 +2698,27 @@ FtstFnstsw => {
 # Spilling and reloading of SSE registers, hardcoded, not generated #
 
 xxLoad => {
-       op_flags  => "L|F",
+       op_flags  => [ "fragile", "labeled" ],
        state     => "exc_pinned",
-       reg_req   => { in => [ "gp", "gp", "none" ], out => [ "xmm", "none" ] },
+       reg_req   => { in => [ "gp", "gp", "none" ],
+                      out => [ "xmm", "none", "none", "none" ] },
        emit      => '. movdqu %D0, %AM',
-       outs      => [ "res", "M" ],
+       ins       => [ "base", "index", "mem" ],
+       outs      => [ "res", "M", "X_regular", "X_except" ],
        units     => [ "SSE" ],
        latency   => 1,
 },
 
 xxStore => {
-       op_flags => "L|F",
+       op_flags => [ "fragile", "labeled" ],
        state    => "exc_pinned",
-       reg_req  => { in => [ "gp", "gp", "none", "xmm" ] },
+       reg_req  => { in => [ "gp", "gp", "none", "xmm" ],
+                     out => [ "none", "none", "none" ] },
        ins      => [ "base", "index", "mem", "val" ],
+       outs     => [ "M", "X_regular", "X_except" ],
        emit     => '. movdqu %binop',
        units    => [ "SSE" ],
-       latency   => 1,
-       mode     => "mode_M",
+       latency  => 1,
 },
 
 ); # end of %nodes