arch_spec: Remove remnants of unused operands.
[libfirm] / ir / be / ia32 / ia32_spec.pl
index 2ccf12d..bedbeb1 100644 (file)
-# Creation: 2005/10/19
-# $Id$
 # This is the specification for the ia32 assembler Firm-operations
 
-use File::Basename;
-
-$new_emit_syntax = 1;
-my $myname = $0;
-
-# the cpu architecture (ia32, ia64, mips, sparc, ppc, ...)
 $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",
-#   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",
-#   rd_constructor => "c source code which constructs an ir_node",
-#   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
-#
+$mode_xmm           = "mode_D";
+$mode_mmx           = "mode_D";
+$mode_fp87          = "ia32_mode_E";
+$mode_gp            = "mode_Iu";
+$mode_flags         = "mode_Iu";
+$mode_fpcw          = "ia32_mode_fpcw";
 
-# 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 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
-# 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 => "gp_UKNWN", type => 4 | 8 | 16 },  # we need a dummy register for Unknown nodes
-               { mode => "mode_Iu" }
+               { name => "edx", dwarf => 2 },
+               { name => "ecx", dwarf => 1 },
+               { name => "eax", dwarf => 0 },
+               { name => "ebx", dwarf => 3 },
+               { name => "esi", dwarf => 6 },
+               { name => "edi", dwarf => 7 },
+               { name => "ebp", dwarf => 5 },
+               { name => "esp", dwarf => 4, type => "ignore" },
+               { name => "gp_NOREG", type => "ignore | virtual" }, # we need a dummy register for NoReg nodes
+               { mode => $mode_gp }
        ],
        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 },
-               { mode => "mode_E", flags => "manual_ra" }
+               { name => "mm0", dwarf => 29, type => "ignore" },
+               { name => "mm1", dwarf => 30, type => "ignore" },
+               { name => "mm2", dwarf => 31, type => "ignore" },
+               { name => "mm3", dwarf => 32, type => "ignore" },
+               { name => "mm4", dwarf => 33, type => "ignore" },
+               { name => "mm5", dwarf => 34, type => "ignore" },
+               { name => "mm6", dwarf => 35, type => "ignore" },
+               { name => "mm7", dwarf => 36, type => "ignore" },
+               { mode => $mode_mmx, 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 => "xmm_UKNWN", type => 4 | 8 | 16},  # we need a dummy register for Unknown 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 => "vfp_UKNWN", type => 4 | 8 | 16 },  # we need a dummy register for Unknown nodes
-               { mode => "mode_E" }
+               { name => "xmm0", dwarf => 21 },
+               { name => "xmm1", dwarf => 22 },
+               { name => "xmm2", dwarf => 23 },
+               { name => "xmm3", dwarf => 24 },
+               { name => "xmm4", dwarf => 25 },
+               { name => "xmm5", dwarf => 26 },
+               { name => "xmm6", dwarf => 27 },
+               { name => "xmm7", dwarf => 28 },
+               { name => "xmm_NOREG", type => "ignore | virtual" }, # we need a dummy register for NoReg nodes
+               { mode => $mode_xmm }
        ],
-       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 },
-               { mode => "mode_E", flags => "manual_ra" }
+       fp => [
+               { name => "st0", realname => "st",    dwarf => 11 },
+               { name => "st1", realname => "st(1)", dwarf => 12 },
+               { name => "st2", realname => "st(2)", dwarf => 13 },
+               { name => "st3", realname => "st(3)", dwarf => 14 },
+               { name => "st4", realname => "st(4)", dwarf => 15 },
+               { name => "st5", realname => "st(5)", dwarf => 16 },
+               { name => "st6", realname => "st(6)", dwarf => 17 },
+               { name => "st7", realname => "st(7)", dwarf => 18 },
+               { name => "fp_NOREG", type => "ignore | virtual" }, # we need a dummy register for NoReg nodes
+               { mode => $mode_fp87 }
        ],
        fp_cw => [      # the floating point control word
-               { name => "fpcw", type => 4|32 },
-               { mode => "mode_fpcw", flags => "manual_ra|state" }
+               { name => "fpcw", dwarf => 37, type => "ignore | state" },
+               { mode => $mode_fpcw, flags => "manual_ra | state" }
        ],
        flags => [
-               { name => "eflags", type => 0 },
+               { name => "eflags", dwarf => 9 },
                { mode => "mode_Iu", flags => "manual_ra" }
        ],
 ); # %reg_classes
@@ -192,59 +79,18 @@ $arch = "ia32";
        bundels_per_cycle => 1
 ); # vliw
 
-%emit_templates = (
-       S0 => "${arch}_emit_source_register(node, 0);",
-       S1 => "${arch}_emit_source_register(node, 1);",
-       S2 => "${arch}_emit_source_register(node, 2);",
-       S3 => "${arch}_emit_source_register(node, 3);",
-       SB0 => "${arch}_emit_8bit_source_register_or_immediate(node, 0);",
-       SB1 => "${arch}_emit_8bit_source_register_or_immediate(node, 1);",
-       SB2 => "${arch}_emit_8bit_source_register_or_immediate(node, 2);",
-       SB3 => "${arch}_emit_8bit_source_register_or_immediate(node, 3);",
-       SH0 => "${arch}_emit_8bit_high_source_register(node, 0);",
-       SI1 => "${arch}_emit_source_register_or_immediate(node, 1);",
-       SI3 => "${arch}_emit_source_register_or_immediate(node, 3);",
-       D0 => "${arch}_emit_dest_register(node, 0);",
-       D1 => "${arch}_emit_dest_register(node, 1);",
-       DB0 => "${arch}_emit_8bit_dest_register(node, 0);",
-       X0 => "${arch}_emit_x87_register(node, 0);",
-       X1 => "${arch}_emit_x87_register(node, 1);",
-       EX => "${arch}_emit_extend_suffix(node);",
-       M  => "${arch}_emit_mode_suffix(node);",
-       XM => "${arch}_emit_x87_mode_suffix(node);",
-       XXM => "${arch}_emit_xmm_mode_suffix(node);",
-       XSD => "${arch}_emit_xmm_mode_suffix_s(node);",
-       AM => "${arch}_emit_am(node);",
-       unop3 => "${arch}_emit_unop(node, n_ia32_unary_op);",
-       unop4 => "${arch}_emit_unop(node, n_ia32_binary_right);",
-       binop => "${arch}_emit_binop(node);",
-       x87_binop => "${arch}_emit_x87_binop(node);",
-       CMP0  => "${arch}_emit_cmp_suffix_node(node, 0);",
-       CMP3  => "${arch}_emit_cmp_suffix_node(node, 3);",
-);
-
-#--------------------------------------------------#
-#                        _                         #
-#                       (_)                        #
-#  _ __   _____      __  _ _ __    ___  _ __  ___  #
-# | '_ \ / _ \ \ /\ / / | | '__|  / _ \| '_ \/ __| #
-# | | | |  __/\ V  V /  | | |    | (_) | |_) \__ \ #
-# |_| |_|\___| \_/\_/   |_|_|     \___/| .__/|___/ #
-#                                      | |         #
-#                                      |_|         #
-#--------------------------------------------------#
-
 $default_op_attr_type = "ia32_op_attr_t";
 $default_attr_type    = "ia32_attr_t";
 $default_copy_attr    = "ia32_copy_attr";
 
 sub ia32_custom_init_attr {
-       my $node = shift;
-       my $name = shift;
-       my $res = "";
+       my $constr = shift;
+       my $node   = shift;
+       my $name   = shift;
+       my $res    = "";
 
        if(defined($node->{modified_flags})) {
-               $res .= "\tarch_irn_add_flags(res, arch_irn_flags_modify_flags);\n";
+               $res .= "\tarch_add_irn_flags(res, arch_irn_flags_modify_flags);\n";
        }
        if(defined($node->{am})) {
                my $am = $node->{am};
@@ -270,49 +116,46 @@ $custom_init_attr_func = \&ia32_custom_init_attr;
 
 %init_attr = (
        ia32_asm_attr_t =>
-               "\tinit_ia32_attributes(res, flags, in_reqs, out_reqs, exec_units, n_res);\n".
+               "\tinit_ia32_attributes(res, irn_flags_, in_reqs, n_res);\n".
                "\tinit_ia32_x87_attributes(res);".
                "\tinit_ia32_asm_attributes(res);",
        ia32_attr_t     =>
-               "\tinit_ia32_attributes(res, flags, in_reqs, out_reqs, exec_units, n_res);",
+               "\tinit_ia32_attributes(res, irn_flags_, in_reqs, n_res);",
        ia32_call_attr_t =>
-               "\tinit_ia32_attributes(res, flags, in_reqs, out_reqs, exec_units, n_res);\n".
+               "\tinit_ia32_attributes(res, irn_flags_, in_reqs, n_res);\n".
                "\tinit_ia32_call_attributes(res, pop, call_tp);",
        ia32_condcode_attr_t =>
-               "\tinit_ia32_attributes(res, flags, in_reqs, out_reqs, exec_units, n_res);\n".
-               "\tinit_ia32_condcode_attributes(res, pnc);",
+               "\tinit_ia32_attributes(res, irn_flags_, in_reqs, n_res);\n".
+               "\tinit_ia32_condcode_attributes(res, condition_code);",
+       ia32_switch_attr_t =>
+               "\tinit_ia32_attributes(res, irn_flags_, in_reqs, n_res);\n".
+               "\tinit_ia32_switch_attributes(res, switch_table);",
        ia32_copyb_attr_t =>
-               "\tinit_ia32_attributes(res, flags, in_reqs, out_reqs, exec_units, n_res);\n".
+               "\tinit_ia32_attributes(res, irn_flags_, in_reqs, n_res);\n".
                "\tinit_ia32_copyb_attributes(res, size);",
        ia32_immediate_attr_t =>
-               "\tinit_ia32_attributes(res, flags, in_reqs, out_reqs, exec_units, n_res);\n".
-               "\tinit_ia32_immediate_attributes(res, symconst, symconst_sign, offset);",
+               "\tinit_ia32_attributes(res, irn_flags_, in_reqs, n_res);\n".
+               "\tinit_ia32_immediate_attributes(res, symconst, symconst_sign, no_pic_adjust, offset);",
        ia32_x87_attr_t =>
-               "\tinit_ia32_attributes(res, flags, in_reqs, out_reqs, exec_units, n_res);\n".
+               "\tinit_ia32_attributes(res, irn_flags_, in_reqs, n_res);\n".
                "\tinit_ia32_x87_attributes(res);",
        ia32_climbframe_attr_t =>
-               "\tinit_ia32_attributes(res, flags, in_reqs, out_reqs, exec_units, n_res);\n".
+               "\tinit_ia32_attributes(res, irn_flags_, in_reqs, n_res);\n".
                "\tinit_ia32_climbframe_attributes(res, count);",
 );
 
 %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_copyb_attr_t      => "ia32_compare_copyb_attr",
+       ia32_switch_attr_t     => "ia32_compare_nodes_attr",
        ia32_immediate_attr_t  => "ia32_compare_immediate_attr",
        ia32_x87_attr_t        => "ia32_compare_x87_attr",
        ia32_climbframe_attr_t => "ia32_compare_climbframe_attr",
 );
 
-%operands = (
-);
-
-$mode_xmm           = "mode_E";
-$mode_gp            = "mode_Iu";
-$mode_flags         = "mode_Iu";
-$mode_fpcw          = "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",
@@ -322,9 +165,10 @@ $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, long offset",
+       attr      => "ir_entity *symconst, int symconst_sign, int no_pic_adjust, long offset",
        attr_type => "ia32_immediate_attr_t",
        hash_func => "ia32_hash_Immediate",
        latency   => 0,
@@ -345,8 +189,8 @@ Asm => {
 
 # "allocates" a free register
 ProduceVal => {
-       op_flags  => "c",
-       irn_flags => "R",
+       op_flags  => [ "constlike", "cse_neutral" ],
+       irn_flags => [ "rematerializable" ],
        reg_req   => { out => [ "gp" ] },
        emit      => "",
        units     => [ ],
@@ -355,27 +199,14 @@ ProduceVal => {
        cmp_attr  => "return 1;",
 },
 
-#-----------------------------------------------------------------#
-#  _       _                                         _            #
-# (_)     | |                                       | |           #
-#  _ _ __ | |_ ___  __ _  ___ _ __   _ __   ___   __| | ___  ___  #
-# | | '_ \| __/ _ \/ _` |/ _ \ '__| | '_ \ / _ \ / _` |/ _ \/ __| #
-# | | | | | ||  __/ (_| |  __/ |    | | | | (_) | (_| |  __/\__ \ #
-# |_|_| |_|\__\___|\__, |\___|_|    |_| |_|\___/ \__,_|\___||___/ #
-#                   __/ |                                         #
-#                  |___/                                          #
-#-----------------------------------------------------------------#
-
-# commutative operations
-
 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" ] },
        ins       => [ "base", "index", "mem", "left", "right" ],
        outs      => [ "res", "flags", "M" ],
-       emit      => '. add%M %binop',
+       emit      => 'add%M %B',
        am        => "source,binary",
        units     => [ "GP" ],
        latency   => 1,
@@ -384,11 +215,11 @@ 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" ],
-       emit      => ". add%M %SI3, %AM",
+       emit      => "add%M %#S3, %AM",
        units     => [ "GP" ],
        latency   => 1,
        mode      => "mode_M",
@@ -396,11 +227,11 @@ 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" ],
-       emit      => ". add%M %SB3, %AM",
+       emit      => "add%M %#S3, %AM",
        units     => [ "GP" ],
        latency   => 1,
        mode      => "mode_M",
@@ -413,7 +244,7 @@ Adc => {
                       out => [ "in_r4 in_r5", "flags", "none" ] },
        ins       => [ "base", "index", "mem", "left", "right", "eflags" ],
        outs      => [ "res", "flags", "M" ],
-       emit      => '. adc%M %binop',
+       emit      => 'adc%M %B',
        am        => "source,binary",
        units     => [ "GP" ],
        latency   => 1,
@@ -422,14 +253,15 @@ Adc => {
 },
 
 l_Add => {
-       op_flags  => "C",
-       reg_req   => { in => [ "none", "none" ], out => [ "none" ] },
        ins       => [ "left", "right" ],
+       attr_type => "",
+       dump_func => "NULL",
 },
 
 l_Adc => {
-       reg_req   => { in => [ "none", "none", "none" ], out => [ "none" ] },
        ins       => [ "left", "right", "eflags" ],
+       attr_type => "",
+       dump_func => "NULL",
 },
 
 Mul => {
@@ -437,10 +269,10 @@ Mul => {
        # very strict constraints
        state     => "exc_pinned",
        reg_req   => { in => [ "gp", "gp", "none", "eax", "gp" ],
-                      out => [ "eax", "flags", "edx", "none" ] },
+                      out => [ "eax", "flags", "none", "edx" ] },
        ins       => [ "base", "index", "mem", "left", "right" ],
-       emit      => '. mul%M %unop4',
-       outs      => [ "res_low", "flags", "res_high", "M" ],
+       emit      => 'mul%M %AS4',
+       outs      => [ "res_low", "flags", "M", "res_high" ],
        am        => "source,binary",
        latency   => 10,
        units     => [ "GP" ],
@@ -448,16 +280,14 @@ Mul => {
 },
 
 l_Mul => {
-       # we should not rematrialize this node. It produces 2 results and has
-       # very strict constraints
-       op_flags  => "C",
-       cmp_attr  => "return 1;",
-       outs      => [ "EAX", "flags", "EDX", "M" ],
-       arity     => 2
+       ins       => [ "left", "right" ],
+       outs      => [ "res_low", "flags", "M", "res_high" ],
+       attr_type => "",
+       dump_func => "NULL",
 },
 
 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)
@@ -473,13 +303,13 @@ IMul => {
 },
 
 IMul1OP => {
-       irn_flags => "R",
+       irn_flags => [ "rematerializable" ],
        state     => "exc_pinned",
        reg_req   => { in => [ "gp", "gp", "none", "eax", "gp" ],
-                      out => [ "eax", "flags", "edx", "none" ] },
+                      out => [ "eax", "flags", "none", "edx" ] },
        ins       => [ "base", "index", "mem", "left", "right" ],
-       emit      => '. imul%M %unop4',
-       outs      => [ "res_low", "flags", "res_high", "M" ],
+       emit      => 'imul%M %AS4',
+       outs      => [ "res_low", "flags", "M", "res_high" ],
        am        => "source,binary",
        latency   => 5,
        units     => [ "GP" ],
@@ -487,22 +317,21 @@ IMul1OP => {
 },
 
 l_IMul => {
-       op_flags  => "C",
-       cmp_attr  => "return 1;",
-       outs      => [ "res_low", "res_high", "M" ],
-       arity     => 2
+       ins       => [ "left", "right" ],
+       outs      => [ "res_low", "flags", "M", "res_high" ],
+       attr_type => "",
+       dump_func => "NULL",
 },
 
 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" ] },
        ins       => [ "base", "index", "mem", "left", "right" ],
        outs      => [ "res", "flags", "M" ],
-       op_modes  => "commutative | am | immediate | mode_neutral",
        am        => "source,binary",
-       emit      => '. and%M %binop',
+       emit      => 'and%M %B',
        units     => [ "GP" ],
        latency   => 1,
        mode      => $mode_gp,
@@ -510,11 +339,11 @@ 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" ],
-       emit      => '. and%M %SI3, %AM',
+       emit      => 'and%M %#S3, %AM',
        units     => [ "GP" ],
        latency   => 1,
        mode      => "mode_M",
@@ -522,11 +351,11 @@ 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" ],
-       emit      => '. and%M %SB3, %AM',
+       emit      => 'and%M %#S3, %AM',
        units     => [ "GP" ],
        latency   => 1,
        mode      => "mode_M",
@@ -534,14 +363,14 @@ 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" ] },
        ins       => [ "base", "index", "mem", "left", "right" ],
        outs      => [ "res", "flags", "M" ],
        am        => "source,binary",
-       emit      => '. or%M %binop',
+       emit      => 'or%M %B',
        units     => [ "GP" ],
        latency   => 1,
        mode      => $mode_gp,
@@ -549,11 +378,11 @@ 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" ],
-       emit      => '. or%M %SI3, %AM',
+       emit      => 'or%M %#S3, %AM',
        units     => [ "GP" ],
        latency   => 1,
        mode      => "mode_M",
@@ -561,11 +390,11 @@ 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" ],
-       emit      => '. or%M %SB3, %AM',
+       emit      => 'or%M %#S3, %AM',
        units     => [ "GP" ],
        latency   => 1,
        mode      => "mode_M",
@@ -573,14 +402,14 @@ 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" ] },
        ins       => [ "base", "index", "mem", "left", "right" ],
        outs      => [ "res", "flags", "M" ],
        am        => "source,binary",
-       emit      => '. xor%M %binop',
+       emit      => 'xor%M %B',
        units     => [ "GP" ],
        latency   => 1,
        mode      => $mode_gp,
@@ -588,11 +417,11 @@ 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",
+       emit      => "xor%M %D0, %D0",
        units     => [ "GP" ],
        latency   => 1,
        mode      => $mode_gp,
@@ -600,11 +429,11 @@ 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" ],
-       emit      => '. xor%M %SI3, %AM',
+       emit      => 'xor%M %#S3, %AM',
        units     => [ "GP" ],
        latency   => 1,
        mode      => "mode_M",
@@ -612,28 +441,26 @@ 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" ],
-       emit      => '. xor%M %SB3, %AM',
+       emit      => 'xor%M %#S3, %AM',
        units     => [ "GP" ],
        latency   => 1,
        mode      => "mode_M",
        modified_flags => $status_flags
 },
 
-# not commutative operations
-
 Sub => {
-       irn_flags => "R",
+       irn_flags => [ "rematerializable" ],
        state     => "exc_pinned",
        reg_req   => { in => [ "gp", "gp", "none", "gp", "gp" ],
                       out => [ "in_r4", "flags", "none" ] },
        ins       => [ "base", "index", "mem", "minuend", "subtrahend" ],
        outs      => [ "res", "flags", "M" ],
        am        => "source,binary",
-       emit      => '. sub%M %binop',
+       emit      => 'sub%M %B',
        units     => [ "GP" ],
        latency   => 1,
        mode      => $mode_gp,
@@ -641,11 +468,11 @@ 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" ],
-       emit      => '. sub%M %SI3, %AM',
+       emit      => 'sub%M %#S3, %AM',
        units     => [ "GP" ],
        latency   => 1,
        mode      => 'mode_M',
@@ -653,11 +480,11 @@ 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" ],
-       emit      => '. sub%M %SB3, %AM',
+       emit      => 'sub%M %#S3, %AM',
        units     => [ "GP" ],
        latency   => 1,
        mode      => 'mode_M',
@@ -667,11 +494,11 @@ 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",
-       emit      => '. sbb%M %binop',
+       emit      => 'sbb%M %B',
        units     => [ "GP" ],
        latency   => 1,
        mode      => $mode_gp,
@@ -679,10 +506,11 @@ Sbb => {
 },
 
 Sbb0 => {
-       irn_flags => "R",
+       # Spiller currently fails when rematerializing flag consumers
+       # irn_flags => [ "rematerializable" ],
        reg_req   => { in => [ "flags" ], out => [ "gp", "flags" ] },
        outs      => [ "res", "flags" ],
-       emit      => "sbb%M %D0, %D0",
+       emit      => "sbb%M %D0, %D0",
        units     => [ "GP" ],
        latency   => 1,
        mode      => $mode_gp,
@@ -690,50 +518,52 @@ Sbb0 => {
 },
 
 l_Sub => {
-       reg_req   => { in => [ "none", "none" ], out => [ "none" ] },
        ins       => [ "minuend", "subtrahend" ],
+       attr_type => "",
+       dump_func => "NULL",
 },
 
 l_Sbb => {
-       reg_req   => { in => [ "none", "none", "none" ], out => [ "none" ] },
        ins       => [ "minuend", "subtrahend", "eflags" ],
+       attr_type => "",
+       dump_func => "NULL",
 },
 
 IDiv => {
-       op_flags  => "F|L",
+       op_flags  => [ "fragile", "uses_memory" ],
        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",
+       emit      => "idiv%M %AS3",
        latency   => 25,
        units     => [ "GP" ],
        modified_flags => $status_flags
 },
 
 Div => {
-       op_flags  => "F|L",
+       op_flags  => [ "fragile", "uses_memory" ],
        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",
+       emit      => "div%M %AS3",
        latency   => 25,
        units     => [ "GP" ],
        modified_flags => $status_flags
 },
 
 Shl => {
-       irn_flags => "R",
+       irn_flags => [ "rematerializable" ],
        reg_req   => { in => [ "gp", "ecx" ],
                       out => [ "in_r1 !in_r2", "flags" ] },
        ins       => [ "val", "count" ],
        outs      => [ "res", "flags" ],
-       emit      => '. shl%M %SB1, %S0',
+       emit      => 'shl%M %<S1, %S0',
        units     => [ "GP" ],
        latency   => 1,
        mode      => $mode_gp,
@@ -741,49 +571,37 @@ 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" ],
-       emit      => '. shl%M %SB3, %AM',
+       emit      => 'shl%M %<S3, %AM',
        units     => [ "GP" ],
        latency   => 1,
        mode      => "mode_M",
        modified_flags => $status_flags
 },
 
-l_ShlDep => {
-       cmp_attr => "return 1;",
-       ins      => [ "val", "count", "dep" ],
-       arity    => 3
-},
-
 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" ],
        outs      => [ "res", "flags" ],
-       emit      => ". shld%M %SB2, %S1, %D0",
+       emit      => "shld%M %<S2, %S1, %D0",
        latency   => 6,
        units     => [ "GP" ],
        mode      => $mode_gp,
        modified_flags => $status_flags
 },
 
-l_ShlD => {
-       cmp_attr  => "return 1;",
-       ins       => [ "val_high", "val_low", "count" ],
-       arity     => 3,
-},
-
 Shr => {
-       irn_flags => "R",
+       irn_flags => [ "rematerializable" ],
        reg_req   => { in => [ "gp", "ecx" ],
                       out => [ "in_r1 !in_r2", "flags" ] },
        ins       => [ "val", "count" ],
        outs      => [ "res", "flags" ],
-       emit      => '. shr%M %SB1, %S0',
+       emit      => 'shr%M %<S1, %S0',
        units     => [ "GP" ],
        mode      => $mode_gp,
        latency   => 1,
@@ -791,49 +609,37 @@ 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" ],
-       emit      => '. shr%M %SB3, %AM',
+       emit      => 'shr%M %<S3, %AM',
        units     => [ "GP" ],
        mode      => "mode_M",
        latency   => 1,
        modified_flags => $status_flags
 },
 
-l_ShrDep => {
-       cmp_attr  => "return 1;",
-       ins       => [ "val", "count", "dep" ],
-       arity     => 3
-},
-
 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" ],
        outs      => [ "res", "flags" ],
-       emit      => ". shrd%M %SB2, %S1, %D0",
+       emit      => "shrd%M %<S2, %S1, %D0",
        latency   => 6,
        units     => [ "GP" ],
        mode      => $mode_gp,
        modified_flags => $status_flags
 },
 
-l_ShrD => {
-       cmp_attr  => "return 1;",
-       arity     => 3,
-       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" ],
        outs      => [ "res", "flags" ],
-       emit      => '. sar%M %SB1, %S0',
+       emit      => 'sar%M %<S1, %S0',
        units     => [ "GP" ],
        latency   => 1,
        mode      => $mode_gp,
@@ -841,30 +647,24 @@ 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" ],
-       emit      => '. sar%M %SB3, %AM',
+       emit      => 'sar%M %<S3, %AM',
        units     => [ "GP" ],
        latency   => 1,
        mode      => "mode_M",
        modified_flags => $status_flags
 },
 
-l_SarDep => {
-       cmp_attr  => "return 1;",
-       ins       => [ "val", "count", "dep" ],
-       arity     => 3
-},
-
 Ror => {
-       irn_flags => "R",
+       irn_flags => [ "rematerializable" ],
        reg_req   => { in => [ "gp", "ecx" ],
                       out => [ "in_r1 !in_r2", "flags" ] },
        ins       => [ "val", "count" ],
        outs      => [ "res", "flags" ],
-       emit      => '. ror%M %SB1, %S0',
+       emit      => 'ror%M %<S1, %S0',
        units     => [ "GP" ],
        latency   => 1,
        mode      => $mode_gp,
@@ -872,11 +672,11 @@ 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" ],
-       emit      => '. ror%M %SB3, %AM',
+       emit      => 'ror%M %<S3, %AM',
        units     => [ "GP" ],
        latency   => 1,
        mode      => "mode_M",
@@ -884,12 +684,12 @@ RorMem => {
 },
 
 Rol => {
-       irn_flags => "R",
+       irn_flags => [ "rematerializable" ],
        reg_req   => { in => [ "gp", "ecx" ],
                       out => [ "in_r1 !in_r2", "flags" ] },
        ins       => [ "val", "count" ],
        outs      => [ "res", "flags" ],
-       emit      => '. rol%M %SB1, %S0',
+       emit      => 'rol%M %<S1, %D0',
        units     => [ "GP" ],
        latency   => 1,
        mode      => $mode_gp,
@@ -897,24 +697,22 @@ 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" ],
-       emit      => '. rol%M %SB3, %AM',
+       emit      => 'rol%M %<S3, %AM',
        units     => [ "GP" ],
        latency   => 1,
        mode      => "mode_M",
        modified_flags => $status_flags
 },
 
-# unary operations
-
 Neg => {
-       irn_flags => "R",
+       irn_flags => [ "rematerializable" ],
        reg_req   => { in => [ "gp" ],
                       out => [ "in_r1", "flags" ] },
-       emit      => 'neg%M %S0',
+       emit      => 'neg%M %S0',
        ins       => [ "val" ],
        outs      => [ "res", "flags" ],
        units     => [ "GP" ],
@@ -924,11 +722,11 @@ Neg => {
 },
 
 NegMem => {
-       irn_flags => "R",
+       irn_flags => [ "rematerializable" ],
        state     => "exc_pinned",
        reg_req   => { in => [ "gp", "gp", "none" ], out => [ "none" ] },
        ins       => [ "base", "index", "mem" ],
-       emit      => 'neg%M %AM',
+       emit      => 'neg%M %AM',
        units     => [ "GP" ],
        latency   => 1,
        mode      => "mode_M",
@@ -936,7 +734,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" ],
@@ -946,12 +744,12 @@ Minus64Bit => {
 
 
 Inc => {
-       irn_flags => "R",
+       irn_flags => [ "rematerializable" ],
        reg_req   => { in => [ "gp" ],
                       out => [ "in_r1", "flags" ] },
        ins       => [ "val" ],
        outs      => [ "res", "flags" ],
-       emit      => 'inc%M %S0',
+       emit      => 'inc%M %S0',
        units     => [ "GP" ],
        mode      => $mode_gp,
        latency   => 1,
@@ -959,11 +757,11 @@ Inc => {
 },
 
 IncMem => {
-       irn_flags => "R",
+       irn_flags => [ "rematerializable" ],
        state     => "exc_pinned",
        reg_req   => { in => [ "gp", "gp", "none" ], out => [ "none" ] },
        ins       => [ "base", "index", "mem" ],
-       emit      => 'inc%M %AM',
+       emit      => 'inc%M %AM',
        units     => [ "GP" ],
        mode      => "mode_M",
        latency   => 1,
@@ -971,12 +769,12 @@ IncMem => {
 },
 
 Dec => {
-       irn_flags => "R",
+       irn_flags => [ "rematerializable" ],
        reg_req   => { in => [ "gp" ],
                       out => [ "in_r1", "flags" ] },
        ins       => [ "val" ],
        outs      => [ "res", "flags" ],
-       emit      => 'dec%M %S0',
+       emit      => 'dec%M %S0',
        units     => [ "GP" ],
        mode      => $mode_gp,
        latency   => 1,
@@ -984,11 +782,11 @@ Dec => {
 },
 
 DecMem => {
-       irn_flags => "R",
+       irn_flags => [ "rematerializable" ],
        state     => "exc_pinned",
        reg_req   => { in => [ "gp", "gp", "none" ], out => [ "none" ] },
        ins       => [ "base", "index", "mem" ],
-       emit      => 'dec%M %AM',
+       emit      => 'dec%M %AM',
        units     => [ "GP" ],
        mode      => "mode_M",
        latency   => 1,
@@ -996,12 +794,12 @@ DecMem => {
 },
 
 Not => {
-       irn_flags => "R",
+       irn_flags => [ "rematerializable" ],
        reg_req   => { in => [ "gp" ],
-                      out => [ "in_r1", "flags" ] },
+                      out => [ "in_r1" ] },
        ins       => [ "val" ],
-       outs      => [ "res", "flags" ],
-       emit      => 'not%M %S0',
+       outs      => [ "res" ],
+       emit      => 'not%M %S0',
        units     => [ "GP" ],
        latency   => 1,
        mode      => $mode_gp,
@@ -1009,11 +807,11 @@ Not => {
 },
 
 NotMem => {
-       irn_flags => "R",
+       irn_flags => [ "rematerializable" ],
        state     => "exc_pinned",
        reg_req   => { in => [ "gp", "gp", "none" ], out => [ "none" ] },
        ins       => [ "base", "index", "mem" ],
-       emit      => 'not%M %AM',
+       emit      => 'not%M %AM',
        units     => [ "GP" ],
        latency   => 1,
        mode      => "mode_M",
@@ -1021,8 +819,8 @@ NotMem => {
 },
 
 Cmc => {
-       reg_req => { in => [ "flags" ], out => [ "flags" ] },
-       emit    => '.cmc',
+       reg_req   => { in => [ "flags" ], out => [ "flags" ] },
+       emit      => 'cmc',
        units     => [ "GP" ],
        latency   => 1,
        mode      => $mode_flags,
@@ -1030,28 +828,25 @@ Cmc => {
 },
 
 Stc => {
-       reg_req => { out => [ "flags" ] },
-       emit    => '.stc',
+       reg_req   => { out => [ "flags" ] },
+       emit      => 'stc',
        units     => [ "GP" ],
        latency   => 1,
        mode      => $mode_flags,
        modified_flags => $status_flags
 },
 
-# other operations
-
 Cmp => {
-       irn_flags => "R",
+       irn_flags => [ "rematerializable" ],
        state     => "exc_pinned",
        reg_req   => { in  => [ "gp", "gp", "none", "gp", "gp" ],
                       out => [ "flags", "none", "none" ] },
        ins       => [ "base", "index", "mem", "left", "right" ],
        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",
+       emit      => 'cmp%M %B',
+       attr      => "bool ins_permuted",
+       init_attr => "attr->data.ins_permuted   = ins_permuted;",
        latency   => 1,
        units     => [ "GP" ],
        mode      => $mode_flags,
@@ -1059,33 +854,47 @@ 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" ] },
+       reg_req   => { in => [ "gp", "gp", "none", "eax ebx ecx edx", "eax ebx ecx edx" ] ,
+                      out => [ "flags", "none", "none" ] },
        ins       => [ "base", "index", "mem", "left", "right" ],
-       outs      => [ "eflags" ],
+       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",
+       emit      => 'cmpb %B',
+       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 %>S0, %<S0',
+       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" ] },
+       reg_req   => { in => [ "gp", "gp", "none", "gp", "gp" ] ,
+                      out => [ "flags", "none", "none" ] },
        ins       => [ "base", "index", "mem", "left", "right" ],
-       outs      => [ "eflags" ],
+       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",
+       emit      => 'test%M %B',
+       attr      => "bool ins_permuted",
+       init_attr => "attr->data.ins_permuted = ins_permuted;",
        latency   => 1,
        units     => [ "GP" ],
        mode      => $mode_flags,
@@ -1093,62 +902,67 @@ 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" ] },
+       reg_req   => { in => [ "gp", "gp", "none", "eax ebx ecx edx", "eax ebx ecx edx" ] ,
+                      out => [ "flags", "none", "none" ] },
        ins       => [ "base", "index", "mem", "left", "right" ],
-       outs      => [ "eflags" ],
+       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",
+       emit      => 'testb %B',
+       attr      => "bool ins_permuted",
+       init_attr => "attr->data.ins_permuted = ins_permuted;",
        latency   => 1,
        units     => [ "GP" ],
        mode      => $mode_flags,
        modified_flags => $status_flags
 },
 
-Set => {
-       #irn_flags => "R",
+Setcc => {
+       #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, int ins_permuted",
-       init_attr => "attr->attr.data.ins_permuted = ins_permuted;\n".
-                     "\tset_ia32_ls_mode(res, mode_Bu);\n",
-       emit      => '. set%CMP0 %DB0',
+       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 (condition_code & ia32_cc_additional_float_cases) {\n"
+               . "\t\tarch_add_irn_flags(res, arch_irn_flags_modify_flags);\n"
+               . "\t\t/* attr->latency = 3; */\n"
+               . "\t}\n",
        latency   => 1,
        units     => [ "GP" ],
        mode      => $mode_gp,
 },
 
-SetMem => {
-       #irn_flags => "R",
+SetccMem => {
+       #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, int ins_permuted",
-       init_attr => "attr->attr.data.ins_permuted = ins_permuted;\n".
-                     "\tset_ia32_ls_mode(res, mode_Bu);\n",
-       emit      => '. set%CMP3 %AM',
+       attr      => "ia32_condition_code_t condition_code",
+       init_attr => "set_ia32_ls_mode(res, mode_Bu);\n",
+       emit      => 'set%P3 %AM',
        latency   => 1,
        units     => [ "GP" ],
        mode      => 'mode_M',
 },
 
-CMov => {
-       #irn_flags => "R",
+CMovcc => {
+       #irn_flags => [ "rematerializable" ],
+       state     => "exc_pinned",
        # (note: leave the false,true order intact to make it compatible with other
        #  ia32_binary ops)
-       state     => "exc_pinned",
-       reg_req   => { in => [ "gp", "gp", "none", "gp", "gp", "eflags" ], out => [ "in_r4 in_r5" ] },
+       reg_req   => { in => [ "gp", "gp", "none", "gp", "gp", "eflags" ],
+                      out => [ "in_r4 in_r5", "flags", "none" ] },
        ins       => [ "base", "index", "mem", "val_false", "val_true", "eflags" ],
+       outs      => [ "res", "flags", "M" ],
        am        => "source,binary",
        attr_type => "ia32_condcode_attr_t",
-       attr      => "int ins_permuted, pn_Cmp pnc",
-       init_attr => "attr->attr.data.ins_permuted = ins_permuted;",
+       attr      => "ia32_condition_code_t condition_code",
        latency   => 1,
        units     => [ "GP" ],
        mode      => $mode_gp,
@@ -1156,53 +970,75 @@ CMov => {
 
 Jcc => {
        state     => "pinned",
-       op_flags  => "L|X|Y",
+       op_flags  => [ "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" ], out => [ "none" ] },
-       mode      => "mode_T",
-       attr_type => "ia32_condcode_attr_t",
-       attr      => "long pnc",
-       latency   => 3,
+       op_flags  => [ "cfopcode", "forking" ],
+       reg_req   => { in => [ "gp", "gp" ] },
+       ins       => [ "base", "index" ],
+       out_arity => "variable",
+       attr_type => "ia32_switch_attr_t",
+       attr      => "const ir_switch_table *switch_table",
+       latency   => 2,
        units     => [ "BRANCH" ],
-       modified_flags => $status_flags,
+},
+
+Jmp => {
+       state     => "pinned",
+       irn_flags => [ "simple_jump" ],
+       op_flags  => [ "cfopcode" ],
+       reg_req   => { out => [ "none" ] },
+       latency   => 1,
+       units     => [ "BRANCH" ],
+       mode      => "mode_X",
 },
 
 IJmp => {
        state     => "pinned",
-       op_flags  => "X",
-       reg_req   => { in => [ "gp", "gp", "none", "gp" ] },
+       op_flags  => [ "cfopcode", "unknown_jump" ],
+       reg_req   => { in => [ "gp", "gp", "none", "gp" ],
+                      out => [ "none", "flags", "none" ] },
        ins       => [ "base", "index", "mem", "target" ],
+       outs      => [ "jmp", "flags", "M" ],
        am        => "source,unary",
-       emit      => '. jmp *%unop3',
+       emit      => 'jmp %*AS3',
        latency   => 1,
        units     => [ "BRANCH" ],
        mode      => "mode_X",
 },
 
 Const => {
-       op_flags  => "c",
-       irn_flags => "R",
+       op_flags  => [ "constlike" ],
+       irn_flags => [ "rematerializable" ],
        reg_req   => { out => [ "gp" ] },
+       emit      => "movl %I, %D0",
        units     => [ "GP" ],
-       attr      => "ir_entity *symconst, int symconst_sign, long offset",
+       attr      => "ir_entity *symconst, int symconst_sign, int no_pic_adjust, long offset",
        attr_type => "ia32_immediate_attr_t",
        latency   => 1,
        mode      => $mode_gp,
 },
 
+Unknown => {
+       op_flags  => [ "constlike" ],
+       irn_flags => [ "rematerializable" ],
+       reg_req   => { out => [ "gp" ] },
+       latency   => 0,
+       emit      => '',
+       mode      => $mode_gp,
+},
+
 GetEIP => {
-       op_flags => "c",
+       op_flags => [ "constlike" ],
        reg_req  => { out => [ "gp" ] },
        units    => [ "GP" ],
        latency  => 5,
@@ -1210,40 +1046,10 @@ GetEIP => {
        modified_flags => $status_flags,
 },
 
-Unknown_GP => {
-       state     => "pinned",
-       op_flags  => "c|NB",
-       reg_req   => { out => [ "gp_UKNWN:I" ] },
-       units     => [],
-       emit      => "",
-       latency   => 0,
-       mode      => $mode_gp
-},
-
-Unknown_VFP => {
-       state     => "pinned",
-       op_flags  => "c|NB",
-       reg_req   => { out => [ "vfp_UKNWN:I" ] },
-       units     => [],
-       emit      => "",
-       mode      => "mode_E",
-       latency   => 0,
-       attr_type => "ia32_x87_attr_t",
-},
-
-Unknown_XMM => {
-       state     => "pinned",
-       op_flags  => "c|NB",
-       reg_req   => { out => [ "xmm_UKNWN:I" ] },
-       units     => [],
-       emit      => "",
-       latency   => 0,
-       mode      => $mode_xmm
-},
-
 NoReg_GP => {
        state     => "pinned",
-       op_flags  => "c|NB|NI",
+       op_flags  => [ "constlike", "dump_noblock" ],
+       irn_flags => [ "not_scheduled" ],
        reg_req   => { out => [ "gp_NOREG:I" ] },
        units     => [],
        emit      => "",
@@ -1251,30 +1057,33 @@ NoReg_GP => {
        mode      => $mode_gp
 },
 
-NoReg_VFP => {
+NoReg_FP => {
        state     => "pinned",
-       op_flags  => "c|NB|NI",
-       reg_req   => { out => [ "vfp_NOREG:I" ] },
+       op_flags  => [ "constlike", "dump_noblock" ],
+       irn_flags => [ "not_scheduled" ],
+       reg_req   => { out => [ "fp_NOREG:I" ] },
        units     => [],
        emit      => "",
-       mode      => "mode_E",
+       mode      => $mode_fp87,
        latency   => 0,
        attr_type => "ia32_x87_attr_t",
 },
 
 NoReg_XMM => {
        state     => "pinned",
-       op_flags  => "c|NB|NI",
+       op_flags  => [ "constlike", "dump_noblock" ],
+       irn_flags => [ "not_scheduled" ],
        reg_req   => { out => [ "xmm_NOREG:I" ] },
        units     => [],
        emit      => "",
        latency   => 0,
-       mode      => "mode_E"
+       mode      => $mode_xmm,
 },
 
 ChangeCW => {
        state     => "pinned",
-       op_flags  => "c",
+       op_flags  => [ "constlike" ],
+       irn_flags => [ "not_scheduled" ],
        reg_req   => { out => [ "fpcw:I" ] },
        mode      => $mode_fpcw,
        latency   => 3,
@@ -1283,30 +1092,30 @@ ChangeCW => {
 },
 
 FldCW => {
-       op_flags  => "L|F",
+       op_flags  => [ "uses_memory" ],
        state     => "pinned",
        reg_req   => { in => [ "gp", "gp", "none" ], out => [ "fpcw:I" ] },
        ins       => [ "base", "index", "mem" ],
        latency   => 5,
-       emit      => "fldcw %AM",
+       emit      => "fldcw %AM",
        mode      => $mode_fpcw,
        units     => [ "GP" ],
        modified_flags => $fpcw_flags
 },
 
 FnstCW => {
-       op_flags  => "L|F",
+       op_flags  => [ "uses_memory" ],
        state     => "pinned",
        reg_req   => { in => [ "gp", "gp", "none", "fp_cw" ], out => [ "none" ] },
        ins       => [ "base", "index", "mem", "fpcw" ],
        latency   => 5,
-       emit      => "fnstcw %AM",
+       emit      => "fnstcw %AM",
        mode      => "mode_M",
        units     => [ "GP" ],
 },
 
 FnstCWNOP => {
-       op_flags  => "L|F",
+       op_flags  => [ "uses_memory" ],
        state     => "pinned",
        reg_req   => { in => [ "fp_cw" ], out => [ "none" ] },
        ins       => [ "fpcw" ],
@@ -1319,7 +1128,7 @@ Cltd => {
        # we should not rematrialize this node. It has very strict constraints.
        reg_req   => { in => [ "eax", "edx" ], out => [ "edx" ] },
        ins       => [ "val", "clobbered" ],
-       emit      => 'cltd',
+       emit      => 'cltd',
        latency   => 1,
        mode      => $mode_gp,
        units     => [ "GP" ],
@@ -1331,45 +1140,46 @@ Cltd => {
 # lateny of 0 for load is correct
 
 Load => {
-       op_flags  => "L|F",
+       op_flags  => [ "uses_memory", "fragile" ],
        state     => "exc_pinned",
-       reg_req   => { in => [ "gp", "gp", "none" ], out => [ "gp", "none", "none" ] },
+       reg_req   => { in => [ "gp", "gp", "none" ],
+                      out => [ "gp", "none", "none", "none", "none" ] },
        ins       => [ "base", "index", "mem" ],
-       outs      => [ "res", "M", "X_exc" ],
+       outs      => [ "res", "unused", "M", "X_regular", "X_except" ],
        latency   => 0,
-       emit      => ". mov%EX%.l %AM, %D0",
+       emit      => "mov%#Ml %AM, %D0",
        units     => [ "GP" ],
 },
 
 Store => {
-       op_flags  => "L|F",
+       op_flags  => [ "uses_memory", "fragile" ],
        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" ],
-       emit      => '. mov%M %SI3, %AM',
+       outs      => [ "M", "X_regular", "X_except" ],
+       emit      => 'mov%M %#S3, %AM',
        latency   => 2,
        units     => [ "GP" ],
-       mode      => "mode_M",
 },
 
 Store8Bit => {
-       op_flags  => "L|F",
+       op_flags  => [ "uses_memory", "fragile" ],
        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" ],
-       emit      => '. mov%M %SB3, %AM',
+       outs      => [ "M", "X_regular", "X_except" ],
+       emit      => 'mov%M %#S3, %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',
+       emit      => 'leal %AM, %D0',
        latency   => 2,
        units     => [ "GP" ],
        mode      => $mode_gp,
@@ -1382,19 +1192,30 @@ Push => {
        state     => "exc_pinned",
        reg_req   => { in => [ "gp", "gp", "none", "gp", "esp" ], out => [ "esp:I|S", "none" ] },
        ins       => [ "base", "index", "mem", "val", "stack" ],
-       emit      => '. push%M %unop3',
+       emit      => 'push%M %AS3',
        outs      => [ "stack", "M" ],
        am        => "source,unary",
        latency   => 2,
        units     => [ "GP" ],
 },
 
+PushEax => {
+       state   => "exc_pinned",
+       reg_req => { in => [ "esp" ], out => [ "esp:I|S" ] },
+       ins     => [ "stack" ],
+       outs    => [ "stack" ],
+       emit    => 'pushl %%eax',
+       latency => 2,
+       units   => [ "GP" ],
+       mode    => $mode_gp,
+},
+
 Pop => {
        state     => "exc_pinned",
        reg_req   => { in => [ "none", "esp" ], out => [ "gp", "none", "none", "esp:I|S" ] },
        ins       => [ "mem", "stack" ],
        outs      => [ "res", "M", "unused", "stack" ],
-       emit      => 'pop%M %D0',
+       emit      => 'pop%M %D0',
        latency   => 3, # Pop is more expensive than Push on Athlon
        units     => [ "GP" ],
 },
@@ -1404,24 +1225,35 @@ PopEbp => {
        reg_req   => { in => [ "none", "esp" ], out => [ "ebp:I", "none", "none", "esp:I|S" ] },
        ins       => [ "mem", "stack" ],
        outs      => [ "res", "M", "unused", "stack" ],
-       emit      => 'pop%M %D0',
+       emit      => 'pop%M %D0',
        latency   => 3, # Pop is more expensive than Push on Athlon
        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" ] },
        ins       => [ "base", "index", "mem", "stack" ],
        outs      => [ "unused0", "M", "unused1", "stack" ],
-       emit      => 'pop%M %AM',
+       emit      => 'pop%M %AM',
        latency   => 3, # Pop is more expensive than Push on Athlon
        units     => [ "GP" ],
 },
 
 Enter => {
        reg_req   => { in => [ "esp" ], out => [ "ebp", "esp:I|S", "none" ] },
-       emit      => 'enter',
+       emit      => 'enter',
        outs      => [ "frame", "stack", "M" ],
        latency   => 15,
        units     => [ "GP" ],
@@ -1429,10 +1261,11 @@ Enter => {
 
 Leave => {
        reg_req   => { in => [ "ebp" ], out => [ "ebp:I", "esp:I|S" ] },
-       emit      => 'leave',
+       emit      => 'leave',
        outs      => [ "frame", "stack" ],
        latency   => 3,
        units     => [ "GP" ],
+       state     => "exc_pinned",
 },
 
 AddSP => {
@@ -1440,7 +1273,7 @@ AddSP => {
        reg_req   => { in => [ "gp", "gp", "none", "esp", "gp" ], out => [ "esp:I|S", "none" ] },
        ins       => [ "base", "index", "mem", "stack", "size" ],
        am        => "source,binary",
-       emit      => '. addl %binop',
+       emit      => 'addl %B',
        latency   => 1,
        outs      => [ "stack", "M" ],
        units     => [ "GP" ],
@@ -1452,8 +1285,8 @@ SubSP => {
        reg_req   => { in => [ "gp", "gp", "none", "esp", "gp" ], out => [ "esp:I|S", "gp", "none" ] },
        ins       => [ "base", "index", "mem", "stack", "size" ],
        am        => "source,binary",
-       emit      => ". subl %binop\n".
-                    "movl %%esp, %D1",
+       emit      => "subl %B\n".
+                    "movl %%esp, %D1",
        latency   => 2,
        outs      => [ "stack", "addr", "M" ],
        units     => [ "GP" ],
@@ -1461,17 +1294,19 @@ SubSP => {
 },
 
 RepPrefix => {
-       op_flags  => "K",
+       op_flags  => [ "keep" ],
        state     => "pinned",
        mode      => "mode_M",
-       emit      => "rep",
+       emit      => "rep",
        latency   => 0,
 },
 
 LdTls => {
-       irn_flags => "R",
+       irn_flags => [ "rematerializable" ],
        reg_req   => { out => [ "gp" ] },
        units     => [ "GP" ],
+       emit      => "movl %%gs:0, %D0",
+       mode      => $mode_gp,
        latency   => 1,
 },
 
@@ -1479,11 +1314,11 @@ 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" ],
-       emit      => 'bt%M %S1, %S0',
+       emit      => 'bt%M %S1, %S0',
        units     => [ "GP" ],
        latency   => 1,
        mode      => $mode_flags,
@@ -1491,14 +1326,14 @@ Bt => {
 },
 
 Bsf => {
-       irn_flags => "R",
+       irn_flags => [ "rematerializable" ],
        state     => "exc_pinned",
        reg_req   => { in => [ "gp", "gp", "none", "gp" ],
                       out => [ "gp", "flags", "none" ] },
        ins       => [ "base", "index", "mem", "operand" ],
        outs      => [ "res", "flags", "M" ],
        am        => "source,binary",
-       emit      => '. bsf%M %unop3, %D0',
+       emit      => 'bsf%M %AS3, %D0',
        units     => [ "GP" ],
        latency   => 1,
        mode      => $mode_gp,
@@ -1506,14 +1341,14 @@ Bsf => {
 },
 
 Bsr => {
-       irn_flags => "R",
+       irn_flags => [ "rematerializable" ],
        state     => "exc_pinned",
        reg_req   => { in => [ "gp", "gp", "none", "gp" ],
                       out => [ "gp", "flags", "none" ] },
        ins       => [ "base", "index", "mem", "operand" ],
        outs      => [ "res", "flags", "M" ],
        am        => "source,binary",
-       emit      => '. bsr%M %unop3, %D0',
+       emit      => 'bsr%M %AS3, %D0',
        units     => [ "GP" ],
        latency   => 1,
        mode      => $mode_gp,
@@ -1524,14 +1359,14 @@ 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" ] },
        ins       => [ "base", "index", "mem", "operand" ],
        outs      => [ "res", "flags", "M" ],
        am        => "source,binary",
-       emit      => '. popcnt%M %unop3, %D0',
+       emit      => 'popcnt%M %AS3, %D0',
        units     => [ "GP" ],
        latency   => 1,
        mode      => $mode_gp,
@@ -1539,13 +1374,15 @@ Popcnt => {
 },
 
 Call => {
+       op_flags  => [ "uses_memory", "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", "st0", "st1", "st2", "st3", "st4", "st5", "st6", "st7", "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", "st0", "st1", "st2", "st3", "st4", "st5", "st6", "st7", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7", "X_regular", "X_except" ],
+       emit      => "call %*AS3",
        attr_type => "ia32_call_attr_t",
        attr      => "unsigned pop, ir_type *call_tp",
        am        => "source,unary",
@@ -1574,10 +1411,11 @@ ClimbFrame => {
 # bswap
 #
 Bswap => {
-       irn_flags => "R",
+       irn_flags => [ "rematerializable" ],
        reg_req   => { in => [ "gp" ],
                       out => [ "in_r1" ] },
-       emit      => '. bswap%M %S0',
+       outs      => [ "res" ],
+       emit      => 'bswap%M %S0',
        ins       => [ "val" ],
        units     => [ "GP" ],
        latency   => 1,
@@ -1588,10 +1426,10 @@ 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',
+       emit      => 'xchg %<S0, %>S0',
        ins       => [ "val" ],
        units     => [ "GP" ],
        latency   => 1,
@@ -1606,55 +1444,99 @@ Breakpoint => {
        reg_req   => { in => [ "none" ], out => [ "none" ] },
        ins       => [ "mem" ],
        latency   => 0,
-       emit      => "int3",
+       emit      => "int3",
        units     => [ "GP" ],
        mode      => mode_M,
 },
 
+#
+# Undefined Instruction on ALL x86 CPU's
+#
+UD2 => {
+       state     => "pinned",
+       reg_req   => { in => [ "none" ], out => [ "none" ] },
+       ins       => [ "mem" ],
+       latency   => 0,
+       emit      => "ud2",
+       units     => [ "GP" ],
+       mode      => mode_M,
+},
+
+#
+# outport
+#
+Outport => {
+       irn_flags => [ "rematerializable" ],
+       state     => "pinned",
+       reg_req   => { in => [ "edx", "eax", "none" ], out => [ "none" ] },
+       ins       => [ "port", "value", "mem" ],
+       emit      => 'out%M %^S0, %#S1',
+       units     => [ "GP" ],
+       latency   => 1,
+       mode      => mode_M,
+       modified_flags => $status_flags
+},
+
+#
+# inport
+#
+Inport => {
+       irn_flags => [ "rematerializable" ],
+       state     => "pinned",
+       reg_req   => { in => [ "edx", "none" ], out => [ "eax", "none" ] },
+       ins       => [ "port", "mem" ],
+       outs      => [ "res", "M" ],
+       emit      => 'in%M %#D0, %^S0',
+       units     => [ "GP" ],
+       latency   => 1,
+       mode      => mode_T,
+       modified_flags => $status_flags
+},
+
 #
 # Intel style prefetching
 #
 Prefetch0 => {
-       op_flags  => "L|F",
+       op_flags  => [ "uses_memory" ],
        state     => "exc_pinned",
        reg_req   => { in => [ "gp", "gp", "none" ], out => [ "none" ] },
        ins       => [ "base", "index", "mem" ],
        outs      => [ "M" ],
        latency   => 0,
-       emit      => "prefetcht0 %AM",
+       emit      => "prefetcht0 %AM",
        units     => [ "GP" ],
 },
 
 Prefetch1 => {
-       op_flags  => "L|F",
+       op_flags  => [ "uses_memory" ],
        state     => "exc_pinned",
        reg_req   => { in => [ "gp", "gp", "none" ], out => [ "none" ] },
        ins       => [ "base", "index", "mem" ],
        outs      => [ "M" ],
        latency   => 0,
-       emit      => "prefetcht1 %AM",
+       emit      => "prefetcht1 %AM",
        units     => [ "GP" ],
 },
 
 Prefetch2 => {
-       op_flags  => "L|F",
+       op_flags  => [ "uses_memory" ],
        state     => "exc_pinned",
        reg_req   => { in => [ "gp", "gp", "none" ], out => [ "none" ] },
        ins       => [ "base", "index", "mem" ],
        outs      => [ "M" ],
        latency   => 0,
-       emit      => "prefetcht2 %AM",
+       emit      => "prefetcht2 %AM",
        units     => [ "GP" ],
 },
 
 PrefetchNTA => {
-       op_flags  => "L|F",
+       op_flags  => [ "uses_memory" ],
        state     => "exc_pinned",
        reg_req   => { in => [ "gp", "gp", "none" ], out => [ "none" ] },
        ins       => [ "base", "index", "mem" ],
        outs      => [ "M" ],
        latency   => 0,
-       emit      => "prefetchnta %AM",
+       emit      => "prefetchnta %AM",
        units     => [ "GP" ],
 },
 
@@ -1662,50 +1544,50 @@ PrefetchNTA => {
 # 3DNow! prefetch instructions
 #
 Prefetch => {
-       op_flags  => "L|F",
+       op_flags  => [ "uses_memory" ],
        state     => "exc_pinned",
        reg_req   => { in => [ "gp", "gp", "none" ], out => [ "none" ] },
        ins       => [ "base", "index", "mem" ],
        outs      => [ "M" ],
        latency   => 0,
-       emit      => "prefetch %AM",
+       emit      => "prefetch %AM",
        units     => [ "GP" ],
 },
 
 PrefetchW => {
-       op_flags  => "L|F",
+       op_flags  => [ "uses_memory" ],
        state     => "exc_pinned",
        reg_req   => { in => [ "gp", "gp", "none" ], out => [ "none" ] },
        ins       => [ "base", "index", "mem" ],
        outs      => [ "M" ],
        latency   => 0,
-       emit      => "prefetchw %AM",
+       emit      => "prefetchw %AM",
        units     => [ "GP" ],
 },
 
-#-----------------------------------------------------------------------------#
-#   _____ _____ ______    __ _             _                     _            #
-#  / ____/ ____|  ____|  / _| |           | |                   | |           #
-# | (___| (___ | |__    | |_| | ___   __ _| |_   _ __   ___   __| | ___  ___  #
-#  \___ \\___ \|  __|   |  _| |/ _ \ / _` | __| | '_ \ / _ \ / _` |/ _ \/ __| #
-#  ____) |___) | |____  | | | | (_) | (_| | |_  | | | | (_) | (_| |  __/\__ \ #
-# |_____/_____/|______| |_| |_|\___/ \__,_|\__| |_| |_|\___/ \__,_|\___||___/ #
-#-----------------------------------------------------------------------------#
-
 # produces a 0/+0.0
 xZero => {
-       irn_flags => "R",
+       irn_flags => [ "rematerializable" ],
        reg_req   => { out => [ "xmm" ] },
-       emit      => '. xorp%XSD %D0, %D0',
+       emit      => 'xorp%FX %D0, %D0',
        latency   => 3,
        units     => [ "SSE" ],
        mode      => $mode_xmm
 },
 
+xUnknown => {
+       op_flags  => [ "constlike" ],
+       irn_flags => [ "rematerializable" ],
+       reg_req   => { out => [ "xmm" ] },
+       emit      => '',
+       latency   => 0,
+       mode      => $mode_xmm
+},
+
 xPzero => {
-       irn_flags => "R",
+       irn_flags => [ "rematerializable" ],
        reg_req   => { out => [ "xmm" ] },
-       emit      => 'pxor %D0, %D0',
+       emit      => 'pxor %D0, %D0',
        latency   => 3,
        units     => [ "SSE" ],
        mode      => $mode_xmm
@@ -1713,9 +1595,9 @@ xPzero => {
 
 # produces all 1 bits
 xAllOnes => {
-       irn_flags => "R",
+       irn_flags => [ "rematerializable" ],
        reg_req   => { out => [ "xmm" ] },
-       emit      => 'pcmpeqb %D0, %D0',
+       emit      => 'pcmpeqb %D0, %D0',
        latency   => 3,
        units     => [ "SSE" ],
        mode      => $mode_xmm
@@ -1723,9 +1605,9 @@ 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',
+       emit      => 'pslld %#S1, %D0',
        latency   => 3,
        units     => [ "SSE" ],
        mode      => $mode_xmm
@@ -1733,9 +1615,9 @@ 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',
+       emit      => 'psllq %#S1, %D0',
        latency   => 3,
        units     => [ "SSE" ],
        mode      => $mode_xmm
@@ -1743,9 +1625,9 @@ 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',
+       emit      => 'psrld %#S1, %D0',
        latency   => 1,
        units     => [ "SSE" ],
        mode      => $mode_xmm
@@ -1753,165 +1635,178 @@ xPsrld => {
 
 # mov from integer to SSE register
 xMovd  => {
-       irn_flags => "R",
+       irn_flags => [ "rematerializable" ],
        reg_req   => { in => [ "gp" ], out => [ "xmm" ] },
-       emit      => 'movd %S0, %D0',
+       emit      => 'movd %S0, %D0',
        latency   => 1,
        units     => [ "SSE" ],
        mode      => $mode_xmm
 },
 
-# commutative operations
-
 xAdd => {
-       irn_flags => "R",
+       irn_flags => [ "rematerializable" ],
        state     => "exc_pinned",
-       reg_req   => { in => [ "gp", "gp", "none", "xmm", "xmm" ], out => [ "in_r4 in_r5" ] },
+       reg_req   => { in => [ "gp", "gp", "none", "xmm", "xmm" ],
+                      out => [ "in_r4 in_r5", "flags", "none" ] },
        ins       => [ "base", "index", "mem", "left", "right" ],
+       outs      => [ "res", "flags", "M" ],
        am        => "source,binary",
-       emit      => '. add%XXM %binop',
+       emit      => 'adds%FX %B',
        latency   => 4,
        units     => [ "SSE" ],
        mode      => $mode_xmm
 },
 
 xMul => {
-       irn_flags => "R",
+       irn_flags => [ "rematerializable" ],
        state     => "exc_pinned",
-       reg_req   => { in => [ "gp", "gp", "none", "xmm", "xmm" ], out => [ "in_r4 in_r5" ] },
+       reg_req   => { in => [ "gp", "gp", "none", "xmm", "xmm" ],
+                      out => [ "in_r4 in_r5", "flags", "none" ] },
        ins       => [ "base", "index", "mem", "left", "right" ],
+       outs      => [ "res", "flags", "M" ],
        am        => "source,binary",
-       emit      => '. mul%XXM %binop',
+       emit      => 'muls%FX %B',
        latency   => 4,
        units     => [ "SSE" ],
        mode      => $mode_xmm
 },
 
 xMax => {
-       irn_flags => "R",
+       irn_flags => [ "rematerializable" ],
        state     => "exc_pinned",
-       reg_req   => { in => [ "gp", "gp", "none", "xmm", "xmm" ], out => [ "in_r4 in_r5" ] },
+       reg_req   => { in => [ "gp", "gp", "none", "xmm", "xmm" ],
+                      out => [ "in_r4 in_r5", "flags", "none" ] },
        ins       => [ "base", "index", "mem", "left", "right" ],
+       outs      => [ "res", "flags", "M" ],
        am        => "source,binary",
-       emit      => '. max%XXM %binop',
+       emit      => 'maxs%FX %B',
        latency   => 2,
        units     => [ "SSE" ],
        mode      => $mode_xmm
 },
 
 xMin => {
-       irn_flags => "R",
+       irn_flags => [ "rematerializable" ],
        state     => "exc_pinned",
-       reg_req   => { in => [ "gp", "gp", "none", "xmm", "xmm" ], out => [ "in_r4 in_r5" ] },
+       reg_req   => { in => [ "gp", "gp", "none", "xmm", "xmm" ],
+                      out => [ "in_r4 in_r5", "flags", "none" ] },
        ins       => [ "base", "index", "mem", "left", "right" ],
+       outs      => [ "res", "flags", "M" ],
        am        => "source,binary",
-       emit      => '. min%XXM %binop',
+       emit      => 'mins%FX %B',
        latency   => 2,
        units     => [ "SSE" ],
        mode      => $mode_xmm
 },
 
 xAnd => {
-       irn_flags => "R",
+       irn_flags => [ "rematerializable" ],
        state     => "exc_pinned",
-       reg_req   => { in => [ "gp", "gp", "none", "xmm", "xmm" ], out => [ "in_r4 in_r5" ] },
+       reg_req   => { in => [ "gp", "gp", "none", "xmm", "xmm" ],
+                      out => [ "in_r4 in_r5", "flags", "none" ] },
        ins       => [ "base", "index", "mem", "left", "right" ],
+       outs      => [ "res", "flags", "M" ],
        am        => "source,binary",
-       emit      => '. andp%XSD %binop',
+       emit      => 'andp%FX %B',
        latency   => 3,
        units     => [ "SSE" ],
        mode      => $mode_xmm
 },
 
 xOr => {
-       irn_flags => "R",
+       irn_flags => [ "rematerializable" ],
        state     => "exc_pinned",
-       reg_req   => { in => [ "gp", "gp", "none", "xmm", "xmm" ], out => [ "in_r4 in_r5" ] },
+       reg_req   => { in => [ "gp", "gp", "none", "xmm", "xmm" ],
+                      out => [ "in_r4 in_r5", "flags", "none" ] },
        ins       => [ "base", "index", "mem", "left", "right" ],
+       outs      => [ "res", "flags", "M" ],
        am        => "source,binary",
-       emit      => '. orp%XSD %binop',
+       emit      => 'orp%FX %B',
        latency   => 3,
        units     => [ "SSE" ],
        mode      => $mode_xmm
 },
 
 xXor => {
-       irn_flags => "R",
+       irn_flags => [ "rematerializable" ],
        state     => "exc_pinned",
-       reg_req   => { in => [ "gp", "gp", "none", "xmm", "xmm" ], out => [ "in_r4 in_r5" ] },
+       reg_req   => { in => [ "gp", "gp", "none", "xmm", "xmm" ],
+                      out => [ "in_r4 in_r5", "flags", "none" ] },
        ins       => [ "base", "index", "mem", "left", "right" ],
+       outs      => [ "res", "flags", "M" ],
        am        => "source,binary",
-       emit      => '. xorp%XSD %binop',
+       emit      => 'xorp%FX %B',
        latency   => 3,
        units     => [ "SSE" ],
        mode      => $mode_xmm
 },
 
-# not commutative operations
-
 xAndNot => {
-       irn_flags => "R",
+       irn_flags => [ "rematerializable" ],
        state     => "exc_pinned",
-       reg_req   => { in => [ "gp", "gp", "none", "xmm", "xmm" ], out => [ "in_r4 !in_r5" ] },
+       reg_req   => { in => [ "gp", "gp", "none", "xmm", "xmm" ],
+                      out => [ "in_r4 !in_r5", "flags", "none" ] },
        ins       => [ "base", "index", "mem", "left", "right" ],
+       outs      => [ "res", "flags", "M" ],
        am        => "source,binary",
-       emit      => '. andnp%XSD %binop',
+       emit      => 'andnp%FX %B',
        latency   => 3,
        units     => [ "SSE" ],
        mode      => $mode_xmm
 },
 
 xSub => {
-       irn_flags => "R",
+       irn_flags => [ "rematerializable" ],
        state     => "exc_pinned",
-       reg_req   => { in => [ "gp", "gp", "none", "xmm", "xmm" ], out => [ "in_r4" ] },
+       reg_req   => { in => [ "gp", "gp", "none", "xmm", "xmm" ],
+                      out => [ "in_r4", "flags", "none" ] },
        ins       => [ "base", "index", "mem", "minuend", "subtrahend" ],
+       outs      => [ "res", "flags", "M" ],
        am        => "source,binary",
-       emit      => '. sub%XXM %binop',
+       emit      => 'subs%FX %B',
        latency   => 4,
        units     => [ "SSE" ],
        mode      => $mode_xmm
 },
 
 xDiv => {
-       irn_flags => "R",
+       irn_flags => [ "rematerializable" ],
        state     => "exc_pinned",
-       reg_req   => { in => [ "gp", "gp", "none", "xmm", "xmm" ], out => [ "in_r4 !in_r5", "none" ] },
+       reg_req   => { in => [ "gp", "gp", "none", "xmm", "xmm" ],
+                      out => [ "in_r4 !in_r5", "flags", "none" ] },
        ins       => [ "base", "index", "mem", "dividend", "divisor" ],
+       outs      => [ "res", "flags", "M" ],
        am        => "source,binary",
-       outs      => [ "res", "M" ],
-       emit      => '. div%XXM %binop',
+       emit      => 'divs%FX %B',
        latency   => 16,
        units     => [ "SSE" ],
 },
 
-# other operations
-
 Ucomi => {
-       irn_flags => "R",
+       irn_flags => [ "rematerializable" ],
        state     => "exc_pinned",
-       reg_req   => { in => [ "gp", "gp", "none", "xmm", "xmm" ], out => [ "eflags" ] },
+       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',
+       emit      => 'ucomis%FX %B',
        latency   => 3,
        units     => [ "SSE" ],
        mode      => $mode_flags,
        modified_flags => 1,
 },
 
-# Load / Store
-
 xLoad => {
-       op_flags  => "L|F",
+       op_flags  => [ "uses_memory", "fragile" ],
        state     => "exc_pinned",
-       reg_req   => { in => [ "gp", "gp", "none" ], out => [ "xmm", "none", "none" ] },
+       reg_req   => { in => [ "gp", "gp", "none" ],
+                      out => [ "xmm", "none", "none", "none", "none" ] },
        ins       => [ "base", "index", "mem" ],
-       outs      => [ "res", "M", "X_exc" ],
-       emit      => '. mov%XXM %AM, %D0',
+       outs      => [ "res", "unused", "M", "X_regular", "X_except" ],
+       emit      => 'movs%FX %AM, %D0',
        attr      => "ir_mode *load_mode",
        init_attr => "attr->ls_mode = load_mode;",
        latency   => 0,
@@ -1919,47 +1814,46 @@ xLoad => {
 },
 
 xStore => {
-       op_flags => "L|F",
+       op_flags => [ "uses_memory", "fragile" ],
        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" ],
-       emit     => '. mov%XXM %S3, %AM',
+       outs      => [ "M", "X_regular", "X_except" ],
+       emit     => 'movs%FX %S3, %AM',
        latency  => 0,
        units    => [ "SSE" ],
-       mode     => "mode_M",
 },
 
 xStoreSimple => {
-       op_flags => "L|F",
+       op_flags => [ "uses_memory", "fragile" ],
        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" ],
-       emit     => '. mov%XXM %S3, %AM',
+       outs     => [ "M", "X_regular", "X_except" ],
+       emit     => 'movs%FX %S3, %AM',
        latency  => 0,
        units    => [ "SSE" ],
-       mode     => "mode_M",
 },
 
 CvtSI2SS => {
-       op_flags => "L|F",
        state     => "exc_pinned",
        reg_req  => { in => [ "gp", "gp", "none", "gp" ], out => [ "xmm" ] },
        ins      => [ "base", "index", "mem", "val" ],
        am       => "source,unary",
-       emit     => '. cvtsi2ss %unop3, %D0',
+       emit     => 'cvtsi2ss %AS3, %D0',
        latency  => 2,
        units    => [ "SSE" ],
        mode     => $mode_xmm
 },
 
 CvtSI2SD => {
-       op_flags => "L|F",
        state     => "exc_pinned",
        reg_req  => { in => [ "gp", "gp", "none", "gp" ], out => [ "xmm" ] },
        ins      => [ "base", "index", "mem", "val" ],
        am       => "source,unary",
-       emit     => '. cvtsi2sd %unop3, %D0',
+       emit     => 'cvtsi2sd %AS3, %D0',
        latency  => 2,
        units    => [ "SSE" ],
        mode     => $mode_xmm
@@ -1967,64 +1861,67 @@ CvtSI2SD => {
 
 
 l_LLtoFloat => {
-       op_flags => "L|F",
-       cmp_attr => "return 1;",
        ins      => [ "val_high", "val_low" ],
+       attr_type => "",
+       dump_func => "NULL",
 },
 
 l_FloattoLL => {
-       op_flags => "L|F",
-       cmp_attr => "return 1;",
        ins      => [ "val" ],
        outs     => [ "res_high", "res_low" ],
+       attr_type => "",
+       dump_func => "NULL",
 },
 
-# CopyB
-
 CopyB => {
-       op_flags  => "F|H",
+       op_flags  => [ "uses_memory", "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  => [ "uses_memory", "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" ]
 },
 
-# Conversions
-
 Cwtl => {
        state     => "exc_pinned",
        reg_req   => { in => [ "eax" ], out => [ "eax" ] },
        ins       => [ "val" ],
        outs      => [ "res" ],
-       emit      => 'cwtl',
+       emit      => 'cwtl',
        units     => [ "GP" ],
        latency   => 1,
        mode      => $mode_gp,
 },
 
 Conv_I2I => {
+       op_flags  => [ "uses_memory", "fragile" ],
        state     => "exc_pinned",
-       reg_req   => { in => [ "gp", "gp", "none", "gp" ], out => [ "gp", "none" ] },
+       reg_req   => { in => [ "gp", "gp", "none", "gp" ],
+                      out => [ "gp", "none", "none", "none", "none" ] },
        ins       => [ "base", "index", "mem", "val" ],
-       outs      => [ "res", "M" ],
+       outs      => [ "res", "flags", "M", "X_regular", "X_except" ],
+       emit      => "mov%#Ml %#AS3, %D0",
        am        => "source,unary",
        units     => [ "GP" ],
        latency   => 1,
@@ -2034,9 +1931,13 @@ Conv_I2I => {
 },
 
 Conv_I2I8Bit => {
+       op_flags  => [ "uses_memory", "fragile" ],
        state     => "exc_pinned",
-       reg_req   => { in => [ "gp", "gp", "none", "eax ebx ecx edx" ], out => [ "gp", "none" ] },
+       reg_req   => { in => [ "gp", "gp", "none", "eax ebx ecx edx" ],
+                      out => [ "gp", "none", "none", "none", "none" ] },
        ins       => [ "base", "index", "mem", "val" ],
+       outs      => [ "res", "flags", "M", "X_regular", "X_except" ],
+       emit      => "mov%#Ml %#AS3, %D0",
        am        => "source,unary",
        units     => [ "GP" ],
        latency   => 1,
@@ -2075,108 +1976,108 @@ Conv_FP2FP => {
        mode      => $mode_xmm,
 },
 
-#----------------------------------------------------------#
-#        _      _               _    __ _             _    #
-#       (_)    | |             | |  / _| |           | |   #
-# __   ___ _ __| |_ _   _  __ _| | | |_| | ___   __ _| |_  #
-# \ \ / / | '__| __| | | |/ _` | | |  _| |/ _ \ / _` | __| #
-#  \ V /| | |  | |_| |_| | (_| | | | | | | (_) | (_| | |_  #
-#   \_/ |_|_|   \__|\__,_|\__,_|_| |_| |_|\___/ \__,_|\__| #
-#                 | |                                      #
-#  _ __   ___   __| | ___  ___                             #
-# | '_ \ / _ \ / _` |/ _ \/ __|                            #
-# | | | | (_) | (_| |  __/\__ \                            #
-# |_| |_|\___/ \__,_|\___||___/                            #
-#----------------------------------------------------------#
-
 # rematerialisation disabled for all float nodes for now, because the fpcw
 # handler runs before spilling and we might end up with wrong fpcw then
 
-vfadd => {
-#      irn_flags => "R",
+fadd => {
+#      irn_flags => [ "rematerializable" ],
        state     => "exc_pinned",
-       reg_req   => { in => [ "gp", "gp", "none", "vfp", "vfp", "fpcw" ], out => [ "vfp" ] },
+       reg_req   => { in => [ "gp", "gp", "none", "fp", "fp", "fpcw" ],
+                      out => [ "fp", "none", "none" ] },
        ins       => [ "base", "index", "mem", "left", "right", "fpcw" ],
+       outs      => [ "res", "dummy", "M" ],
+       emit      => 'fadd%FP%FM %AF',
        am        => "source,binary",
        latency   => 4,
        units     => [ "VFP" ],
-       mode      => "mode_E",
+       mode      => $mode_fp87,
        attr_type => "ia32_x87_attr_t",
 },
 
-vfmul => {
-#      irn_flags => "R",
+fmul => {
+#      irn_flags => [ "rematerializable" ],
        state     => "exc_pinned",
-       reg_req   => { in => [ "gp", "gp", "none", "vfp", "vfp", "fpcw" ], out => [ "vfp" ] },
+       reg_req   => { in => [ "gp", "gp", "none", "fp", "fp", "fpcw" ],
+                      out => [ "fp", "none", "none" ] },
        ins       => [ "base", "index", "mem", "left", "right", "fpcw" ],
+       outs      => [ "res", "dummy", "M" ],
+       emit      => 'fmul%FP%FM %AF',
        am        => "source,binary",
        latency   => 4,
        units     => [ "VFP" ],
-       mode      => "mode_E",
+       mode      => $mode_fp87,
        attr_type => "ia32_x87_attr_t",
 },
 
-vfsub => {
-#      irn_flags => "R",
+fsub => {
+#      irn_flags => [ "rematerializable" ],
        state     => "exc_pinned",
-       reg_req   => { in => [ "gp", "gp", "none", "vfp", "vfp", "fpcw" ], out => [ "vfp" ] },
+       reg_req   => { in => [ "gp", "gp", "none", "fp", "fp", "fpcw" ],
+                      out => [ "fp", "none", "none" ] },
        ins       => [ "base", "index", "mem", "minuend", "subtrahend", "fpcw" ],
+       outs      => [ "res", "dummy", "M" ],
+       emit      => 'fsub%FR%FP%FM %AF',
        am        => "source,binary",
        latency   => 4,
        units     => [ "VFP" ],
-       mode      => "mode_E",
+       mode      => $mode_fp87,
        attr_type => "ia32_x87_attr_t",
 },
 
-vfdiv => {
+fdiv => {
        state     => "exc_pinned",
-       reg_req   => { in => [ "gp", "gp", "none", "vfp", "vfp", "fpcw" ], out => [ "vfp", "none" ] },
+       reg_req   => { in => [ "gp", "gp", "none", "fp", "fp", "fpcw" ],
+                      out => [ "fp", "none", "none" ] },
        ins       => [ "base", "index", "mem", "dividend", "divisor", "fpcw" ],
+       outs      => [ "res", "dummy", "M" ],
+       emit      => 'fdiv%FR%FP%FM %AF',
        am        => "source,binary",
-       outs      => [ "res", "M" ],
        latency   => 20,
        units     => [ "VFP" ],
        attr_type => "ia32_x87_attr_t",
 },
 
-vfprem => {
-       reg_req   => { in => [ "vfp", "vfp", "fpcw" ], out => [ "vfp" ] },
+fprem => {
+       reg_req   => { in => [ "fp", "fp", "fpcw" ], out => [ "fp" ] },
        ins       => [ "left", "right", "fpcw" ],
+       emit      => 'fprem1',
        latency   => 20,
        units     => [ "VFP" ],
-       mode      => "mode_E",
+       mode      => $mode_fp87,
        attr_type => "ia32_x87_attr_t",
 },
 
-vfabs => {
-       irn_flags => "R",
-       reg_req   => { in => [ "vfp"], out => [ "vfp" ] },
+fabs => {
+       irn_flags => [ "rematerializable" ],
+       reg_req   => { in => [ "fp"], out => [ "fp" ] },
        ins       => [ "value" ],
+       emit      => 'fabs',
        latency   => 2,
        units     => [ "VFP" ],
-       mode      => "mode_E",
+       mode      => $mode_fp87,
        attr_type => "ia32_x87_attr_t",
 },
 
-vfchs => {
-       irn_flags => "R",
-       reg_req   => { in => [ "vfp"], out => [ "vfp" ] },
+fchs => {
+       irn_flags => [ "rematerializable" ],
+       reg_req   => { in => [ "fp"], out => [ "fp" ] },
+       emit      => 'fchs',
        ins       => [ "value" ],
        latency   => 2,
        units     => [ "VFP" ],
-       mode      => "mode_E",
+       mode      => $mode_fp87,
        attr_type => "ia32_x87_attr_t",
 },
 
-# virtual Load and Store
-
-vfld => {
-       irn_flags => "R",
-       op_flags  => "L|F",
+fld => {
+       irn_flags => [ "rematerializable" ],
+       op_flags  => [ "uses_memory", "fragile" ],
        state     => "exc_pinned",
-       reg_req   => { in => [ "gp", "gp", "none" ], out => [ "vfp", "none", "none" ] },
+       reg_req   => { in => [ "gp", "gp", "none" ],
+                      out => [ "fp", "none", "none", "none", "none" ] },
        ins       => [ "base", "index", "mem" ],
-       outs      => [ "res", "M", "X_exc" ],
+       outs      => [ "res", "unused", "M", "X_regular", "X_except" ],
+       emit      => 'fld%FM %AM',
        attr      => "ir_mode *load_mode",
        init_attr => "attr->attr.ls_mode = load_mode;",
        latency   => 2,
@@ -2184,137 +2085,165 @@ vfld => {
        attr_type => "ia32_x87_attr_t",
 },
 
-vfst => {
-       irn_flags => "R",
-       op_flags  => "L|F",
+fst => {
+       irn_flags => [ "rematerializable" ],
+       op_flags  => [ "uses_memory", "fragile" ],
        state     => "exc_pinned",
-       reg_req   => { in => [ "gp", "gp", "none", "vfp" ], out => [ "none", "none" ] },
+       reg_req   => { in => [ "gp", "gp", "none", "fp" ],
+                      out => [ "none", "none", "none" ] },
        ins       => [ "base", "index", "mem", "val" ],
-       outs      => [ "M", "X_exc" ],
+       outs      => [ "M", "X_regular", "X_except" ],
+       emit      => 'fst%FP%FM %AM',
        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",
 },
 
-# Conversions
-
-vfild => {
+fild => {
        state     => "exc_pinned",
-       reg_req   => { in => [ "gp", "gp", "none" ], out => [ "vfp", "none" ] },
-       outs      => [ "res", "M" ],
+       reg_req   => { in => [ "gp", "gp", "none" ],
+                      out => [ "fp", "none", "none" ] },
+       outs      => [ "res", "unused", "M" ],
        ins       => [ "base", "index", "mem" ],
+       emit      => 'fild%FM %AM',
        latency   => 4,
        units     => [ "VFP" ],
        attr_type => "ia32_x87_attr_t",
 },
 
-vfist => {
+fist => {
+       op_flags  => [ "uses_memory", "fragile" ],
        state     => "exc_pinned",
-       reg_req   => { in => [ "gp", "gp", "none", "vfp", "fpcw" ] },
+       reg_req   => { in => [ "gp", "gp", "none", "fp", "fpcw" ],
+                      out => [ "none", "none", "none", "none" ] },
        ins       => [ "base", "index", "mem", "val", "fpcw" ],
+       outs      => [ "dummy", "M", "X_regular", "X_except" ],
+       emit      => 'fist%FP%FM %AM',
        latency   => 4,
        units     => [ "VFP" ],
-       mode      => "mode_M",
        attr_type => "ia32_x87_attr_t",
 },
 
 # SSE3 fisttp instruction
-vfisttp => {
+fisttp => {
+       op_flags  => [ "uses_memory", "fragile" ],
        state     => "exc_pinned",
-       reg_req   => { in => [ "gp", "gp", "none", "vfp" ], out => [ "in_r4", "none" ]},
+       reg_req   => { in => [ "gp", "gp", "none", "fp" ],
+                      out => [ "in_r4", "none", "none", "none" ]},
        ins       => [ "base", "index", "mem", "val" ],
-       outs      => [ "res", "M" ],
+       outs      => [ "res", "M", "X_regular", "X_except" ],
+       emit      => 'fisttp%FM %AM',
        latency   => 4,
        units     => [ "VFP" ],
        attr_type => "ia32_x87_attr_t",
 },
 
-
-# constants
-
-vfldz => {
-       irn_flags => "R",
-       reg_req   => { out => [ "vfp" ] },
+fldz => {
+       irn_flags => [ "rematerializable" ],
+       reg_req   => { out => [ "fp" ] },
        outs      => [ "res" ],
+       emit      => 'fldz',
        latency   => 4,
        units     => [ "VFP" ],
-       mode      => "mode_E",
+       mode      => $mode_fp87,
        attr_type => "ia32_x87_attr_t",
 },
 
-vfld1 => {
-       irn_flags => "R",
-       reg_req   => { out => [ "vfp" ] },
+fld1 => {
+       irn_flags => [ "rematerializable" ],
+       reg_req   => { out => [ "fp" ] },
        outs      => [ "res" ],
+       emit      => 'fld1',
        latency   => 4,
        units     => [ "VFP" ],
-       mode      => "mode_E",
+       mode      => $mode_fp87,
        attr_type => "ia32_x87_attr_t",
 },
 
-vfldpi => {
-       irn_flags => "R",
-       reg_req   => { out => [ "vfp" ] },
+fldpi => {
+       irn_flags => [ "rematerializable" ],
+       reg_req   => { out => [ "fp" ] },
        outs      => [ "res" ],
+       emit      => 'fldpi',
        latency   => 4,
        units     => [ "VFP" ],
-       mode      => "mode_E",
+       mode      => $mode_fp87,
        attr_type => "ia32_x87_attr_t",
 },
 
-vfldln2 => {
-       irn_flags => "R",
-       reg_req   => { out => [ "vfp" ] },
+fldln2 => {
+       irn_flags => [ "rematerializable" ],
+       reg_req   => { out => [ "fp" ] },
        outs      => [ "res" ],
+       emit      => 'fldln2',
        latency   => 4,
        units     => [ "VFP" ],
-       mode      => "mode_E",
+       mode      => $mode_fp87,
        attr_type => "ia32_x87_attr_t",
 },
 
-vfldlg2 => {
-       irn_flags => "R",
-       reg_req   => { out => [ "vfp" ] },
+fldlg2 => {
+       irn_flags => [ "rematerializable" ],
+       reg_req   => { out => [ "fp" ] },
+       emit      => 'fldlg2',
        outs      => [ "res" ],
        latency   => 4,
        units     => [ "VFP" ],
-       mode      => "mode_E",
+       mode      => $mode_fp87,
        attr_type => "ia32_x87_attr_t",
 },
 
-vfldl2t => {
-       irn_flags => "R",
-       reg_req   => { out => [ "vfp" ] },
+fldl2t => {
+       irn_flags => [ "rematerializable" ],
+       reg_req   => { out => [ "fp" ] },
+       emit      => 'fldll2t',
        outs      => [ "res" ],
        latency   => 4,
        units     => [ "VFP" ],
-       mode      => "mode_E",
+       mode      => $mode_fp87,
        attr_type => "ia32_x87_attr_t",
 },
 
-vfldl2e => {
-       irn_flags => "R",
-       reg_req   => { out => [ "vfp" ] },
+fldl2e => {
+       irn_flags => [ "rematerializable" ],
+       reg_req   => { out => [ "fp" ] },
+       emit      => 'fldl2e',
        outs      => [ "res" ],
        latency   => 4,
        units     => [ "VFP" ],
-       mode      => "mode_E",
+       mode      => $mode_fp87,
        attr_type => "ia32_x87_attr_t",
 },
 
-# other
+FucomFnstsw => {
+# we can't allow to rematerialize this node so we don't
+#  accidently produce Phi(Fucom, Fucom(ins_permuted))
+#      irn_flags => [ "rematerializable" ],
+       reg_req   => { in => [ "fp", "fp" ], out => [ "eax" ] },
+       ins       => [ "left", "right" ],
+       outs      => [ "flags" ],
+       emit      => "fucom%FP %F0\n".
+                    "fnstsw %%ax",
+       attr      => "bool ins_permuted",
+       init_attr => "attr->attr.data.ins_permuted = ins_permuted;",
+       latency   => 3,
+       units     => [ "VFP" ],
+       attr_type => "ia32_x87_attr_t",
+       mode      => $mode_gp
+},
 
-vFucomFnstsw => {
-# we can't allow to rematerialize this node so we don't have
+FucomppFnstsw => {
+# we can't allow to rematerialize this node so we don't
 #  accidently produce Phi(Fucom, Fucom(ins_permuted))
-#      irn_flags => "R",
-       reg_req   => { in => [ "vfp", "vfp" ], out => [ "eax" ] },
+#      irn_flags => [ "rematerializable" ],
+       reg_req   => { in => [ "fp", "fp" ], out => [ "eax" ] },
        ins       => [ "left", "right" ],
        outs      => [ "flags" ],
-       attr      => "int ins_permuted",
+       emit      => "fucompp\n".
+                    "fnstsw %%ax",
+       attr      => "bool ins_permuted",
        init_attr => "attr->attr.data.ins_permuted = ins_permuted;",
        latency   => 3,
        units     => [ "VFP" ],
@@ -2322,12 +2251,13 @@ vFucomFnstsw => {
        mode      => $mode_gp
 },
 
-vFucomi => {
-       irn_flags => "R",
-       reg_req   => { in => [ "vfp", "vfp" ], out => [ "eflags" ] },
+Fucomi => {
+       irn_flags => [ "rematerializable" ],
+       reg_req   => { in => [ "fp", "fp" ], out => [ "eflags" ] },
        ins       => [ "left", "right" ],
        outs      => [ "flags" ],
-       attr      => "int ins_permuted",
+       emit      => 'fucom%FPi %F0',
+       attr      => "bool ins_permuted",
        init_attr => "attr->attr.data.ins_permuted = ins_permuted;",
        latency   => 3,
        units     => [ "VFP" ],
@@ -2335,12 +2265,14 @@ vFucomi => {
        mode      => $mode_gp
 },
 
-vFtstFnstsw => {
-#      irn_flags => "R",
-       reg_req   => { in => [ "vfp" ], out => [ "eax" ] },
+FtstFnstsw => {
+#      irn_flags => [ "rematerializable" ],
+       reg_req   => { in => [ "fp" ], out => [ "eax" ] },
        ins       => [ "left" ],
        outs      => [ "flags" ],
-       attr      => "int ins_permuted",
+       emit      => "ftst\n".
+                    "fnstsw %%ax",
+       attr      => "bool ins_permuted",
        init_attr => "attr->attr.data.ins_permuted = ins_permuted;",
        latency   => 3,
        units     => [ "VFP" ],
@@ -2349,482 +2281,116 @@ vFtstFnstsw => {
 },
 
 Sahf => {
-       irn_flags => "R",
+       irn_flags => [ "rematerializable" ],
        reg_req   => { in => [ "eax" ], out => [ "eflags" ] },
        ins       => [ "val" ],
        outs      => [ "flags" ],
-       emit      => 'sahf',
+       emit      => 'sahf',
        latency   => 1,
        units     => [ "GP" ],
        mode      => $mode_flags,
 },
 
-#------------------------------------------------------------------------#
-#       ___ _____    __ _             _                     _            #
-# __  _( _ )___  |  / _| | ___   __ _| |_   _ __   ___   __| | ___  ___  #
-# \ \/ / _ \  / /  | |_| |/ _ \ / _` | __| | '_ \ / _ \ / _` |/ _ \/ __| #
-#  >  < (_) |/ /   |  _| | (_) | (_| | |_  | | | | (_) | (_| |  __/\__ \ #
-# /_/\_\___//_/    |_| |_|\___/ \__,_|\__| |_| |_|\___/ \__,_|\___||___/ #
-#------------------------------------------------------------------------#
-
-# Note: gas is strangely buggy: fdivrp and fdivp as well as fsubrp and fsubp
-#       are swapped, we work this around in the emitter...
-
-fadd => {
-       state     => "exc_pinned",
-       rd_constructor => "NONE",
-       reg_req   => { },
-       emit      => '. fadd%XM %x87_binop',
-       latency   => 4,
-       attr_type => "ia32_x87_attr_t",
-},
-
-faddp => {
-       state     => "exc_pinned",
-       rd_constructor => "NONE",
-       reg_req   => { },
-       emit      => '. faddp%XM %x87_binop',
-       latency   => 4,
-       attr_type => "ia32_x87_attr_t",
-},
-
-fmul => {
-       state     => "exc_pinned",
-       rd_constructor => "NONE",
-       reg_req   => { },
-       emit      => '. fmul%XM %x87_binop',
-       latency   => 4,
-       attr_type => "ia32_x87_attr_t",
-},
-
-fmulp => {
-       state     => "exc_pinned",
-       rd_constructor => "NONE",
-       reg_req   => { },
-       emit      => '. fmulp%XM %x87_binop',,
-       latency   => 4,
-       attr_type => "ia32_x87_attr_t",
-},
-
-fsub => {
-       state     => "exc_pinned",
-       rd_constructor => "NONE",
-       reg_req   => { },
-       emit      => '. fsub%XM %x87_binop',
-       latency   => 4,
-       attr_type => "ia32_x87_attr_t",
-},
-
-fsubp => {
-       state     => "exc_pinned",
-       rd_constructor => "NONE",
-       reg_req   => { },
-# see note about gas bugs
-       emit      => '. fsubrp%XM %x87_binop',
-       latency   => 4,
-       attr_type => "ia32_x87_attr_t",
-},
-
-fsubr => {
-       state     => "exc_pinned",
-       rd_constructor => "NONE",
-       irn_flags => "R",
-       reg_req   => { },
-       emit      => '. fsubr%XM %x87_binop',
-       latency   => 4,
-       attr_type => "ia32_x87_attr_t",
-},
-
-fsubrp => {
-       state     => "exc_pinned",
-       rd_constructor => "NONE",
-       irn_flags => "R",
-       reg_req   => { },
-# see note about gas bugs
-       emit      => '. fsubp%XM %x87_binop',
-       latency   => 4,
-       attr_type => "ia32_x87_attr_t",
-},
-
-fprem => {
-       rd_constructor => "NONE",
-       reg_req   => { },
-       emit      => '. fprem1',
-       latency   => 20,
-       attr_type => "ia32_x87_attr_t",
-},
-
-# this node is just here, to keep the simulator running
-# we can omit this when a fprem simulation function exists
-fpremp => {
-       rd_constructor => "NONE",
-       reg_req   => { },
-       emit      => '. fprem1\n'.
-                    '. fstp %X0',
-       latency   => 20,
-       attr_type => "ia32_x87_attr_t",
-},
-
-fdiv => {
-       state     => "exc_pinned",
-       rd_constructor => "NONE",
-       reg_req   => { },
-       emit      => '. fdiv%XM %x87_binop',
-       latency   => 20,
-       attr_type => "ia32_x87_attr_t",
-},
-
-fdivp => {
-       state     => "exc_pinned",
-       rd_constructor => "NONE",
-       reg_req   => { },
-# see note about gas bugs
-       emit      => '. fdivrp%XM %x87_binop',
-       latency   => 20,
-       attr_type => "ia32_x87_attr_t",
-},
-
-fdivr => {
-       state     => "exc_pinned",
-       rd_constructor => "NONE",
-       reg_req   => { },
-       emit      => '. fdivr%XM %x87_binop',
-       latency   => 20,
-       attr_type => "ia32_x87_attr_t",
-},
-
-fdivrp => {
-       state     => "exc_pinned",
-       rd_constructor => "NONE",
-       reg_req   => { },
-# see note about gas bugs
-       emit      => '. fdivp%XM %x87_binop',
-       latency   => 20,
-       attr_type => "ia32_x87_attr_t",
-},
-
-fabs => {
-       rd_constructor => "NONE",
-       reg_req   => { },
-       emit      => '. fabs',
-       latency   => 4,
-       attr_type => "ia32_x87_attr_t",
-},
-
-fchs => {
-       op_flags  => "R|K",
-       rd_constructor => "NONE",
-       reg_req   => { },
-       emit      => '. fchs',
-       latency   => 4,
-       attr_type => "ia32_x87_attr_t",
-},
-
-# x87 Load and Store
-
-fld => {
-       rd_constructor => "NONE",
-       op_flags  => "R|L|F",
-       state     => "exc_pinned",
-       reg_req   => { },
-       emit      => '. fld%XM %AM',
-       attr_type => "ia32_x87_attr_t",
-       latency   => 2,
-},
-
-fst => {
-       rd_constructor => "NONE",
-       op_flags  => "R|L|F",
-       state     => "exc_pinned",
-       reg_req   => { },
-       emit      => '. fst%XM %AM',
-       mode      => "mode_M",
-       attr_type => "ia32_x87_attr_t",
-       latency   => 2,
-},
-
-fstp => {
-       rd_constructor => "NONE",
-       op_flags  => "R|L|F",
-       state     => "exc_pinned",
-       reg_req   => { },
-       emit      => '. fstp%XM %AM',
-       mode      => "mode_M",
-       attr_type => "ia32_x87_attr_t",
-       latency   => 2,
-},
-
-# Conversions
-
-fild => {
-       state     => "exc_pinned",
-       rd_constructor => "NONE",
-       reg_req   => { },
-       emit      => '. fild%XM %AM',
-       attr_type => "ia32_x87_attr_t",
-       latency   => 2,
-},
-
-fist => {
-       state     => "exc_pinned",
-       rd_constructor => "NONE",
-       reg_req   => { },
-       emit      => '. fist%XM %AM',
-       mode      => "mode_M",
-       attr_type => "ia32_x87_attr_t",
-       latency   => 2,
-},
-
-fistp => {
-       state     => "exc_pinned",
-       rd_constructor => "NONE",
-       reg_req   => { },
-       emit      => '. fistp%XM %AM',
-       mode      => "mode_M",
-       attr_type => "ia32_x87_attr_t",
-       latency   => 2,
-},
-
-# SSE3 firsttp instruction
-fisttp => {
-       state     => "exc_pinned",
-       rd_constructor => "NONE",
-       reg_req   => { },
-       emit      => '. fisttp%XM %AM',
-       mode      => "mode_M",
-       attr_type => "ia32_x87_attr_t",
-       latency   => 2,
-},
-
-# constants
-
-fldz => {
-       op_flags  => "R|c|K",
-       irn_flags => "R",
-       reg_req   => { out => [ "vfp" ] },
-       emit      => '. fldz',
-       attr_type => "ia32_x87_attr_t",
-       latency   => 2,
-},
-
-fld1 => {
-       op_flags  => "R|c|K",
-       irn_flags => "R",
-       reg_req   => { out => [ "vfp" ] },
-       emit      => '. fld1',
-       attr_type => "ia32_x87_attr_t",
-       latency   => 2,
-},
-
-fldpi => {
-       op_flags  => "R|c|K",
-       irn_flags => "R",
-       reg_req   => { out => [ "vfp" ] },
-       emit      => '. fldpi',
-       attr_type => "ia32_x87_attr_t",
-       latency   => 2,
-},
-
-fldln2 => {
-       op_flags  => "R|c|K",
-       irn_flags => "R",
-       reg_req   => { out => [ "vfp" ] },
-       emit      => '. fldln2',
-       attr_type => "ia32_x87_attr_t",
-       latency   => 2,
-},
-
-fldlg2 => {
-       op_flags  => "R|c|K",
-       irn_flags => "R",
-       reg_req   => { out => [ "vfp" ] },
-       emit      => '. fldlg2',
-       attr_type => "ia32_x87_attr_t",
-       latency   => 2,
-},
-
-fldl2t => {
-       op_flags  => "R|c|K",
-       irn_flags => "R",
-       reg_req   => { out => [ "vfp" ] },
-       emit      => '. fldll2t',
-       attr_type => "ia32_x87_attr_t",
-       latency   => 2,
-},
-
-fldl2e => {
-       op_flags  => "R|c|K",
-       irn_flags => "R",
-       reg_req   => { out => [ "vfp" ] },
-       emit      => '. fldl2e',
-       attr_type => "ia32_x87_attr_t",
-       latency   => 2,
-},
-
 # fxch, fpush, fpop
 # Note that it is NEVER allowed to do CSE on these nodes
 # Moreover, note the virtual register requierements!
 
 fxch => {
-       op_flags  => "R|K",
-       reg_req   => { },
+       op_flags  => [ "keep" ],
+       reg_req   => { out => [ "none" ] },
        cmp_attr  => "return 1;",
-       emit      => '. fxch %X0',
+       emit      => 'fxch %F0',
        attr_type => "ia32_x87_attr_t",
        mode      => "mode_ANY",
        latency   => 1,
 },
 
 fpush => {
-       op_flags  => "R|K",
-       reg_req   => {},
+       op_flags  => [ "keep" ],
+       reg_req   => { out => [ "none" ] },
        cmp_attr  => "return 1;",
-       emit      => '. fld %X0',
+       emit      => 'fld %F0',
        attr_type => "ia32_x87_attr_t",
        mode      => "mode_ANY",
        latency   => 1,
 },
 
 fpushCopy => {
-       reg_req   => { in => [ "vfp"], out => [ "vfp" ] },
+       reg_req   => { in => [ "fp"], out => [ "fp" ] },
        cmp_attr  => "return 1;",
-       emit      => '. fld %X0',
+       emit      => 'fld %F0',
        attr_type => "ia32_x87_attr_t",
        latency   => 1,
 },
 
 fpop => {
-       op_flags  => "K",
-       reg_req   => { },
+       op_flags  => [ "keep" ],
+       reg_req   => { out => [ "none" ] },
        cmp_attr  => "return 1;",
-       emit      => '. fstp %X0',
+       emit      => 'fstp %F0',
        attr_type => "ia32_x87_attr_t",
        mode      => "mode_ANY",
        latency   => 1,
 },
 
 ffreep => {
-       op_flags  => "K",
-       reg_req   => { },
+       op_flags  => [ "keep" ],
+       reg_req   => { out => [ "none" ] },
        cmp_attr  => "return 1;",
-       emit      => '. ffreep %X0',
+       emit      => 'ffreep %F0',
        attr_type => "ia32_x87_attr_t",
        mode      => "mode_ANY",
        latency   => 1,
 },
 
 emms => {
-       op_flags  => "K",
-       reg_req   => { },
+       op_flags  => [ "keep" ],
+       reg_req   => { out => [ "none" ] },
        cmp_attr  => "return 1;",
-       emit      => 'emms',
+       emit      => 'emms',
        attr_type => "ia32_x87_attr_t",
        mode      => "mode_ANY",
        latency   => 3,
 },
 
 femms => {
-       op_flags  => "K",
-       reg_req   => { },
+       op_flags  => [ "keep" ],
+       reg_req   => { out => [ "none" ] },
        cmp_attr  => "return 1;",
-       emit      => 'femms',
+       emit      => 'femms',
        attr_type => "ia32_x87_attr_t",
        mode      => "mode_ANY",
        latency   => 3,
 },
 
-# compare
-
-FucomFnstsw => {
-       reg_req   => { },
-       emit      => ". fucom %X1\n".
-                    ". fnstsw %%ax",
-       attr_type => "ia32_x87_attr_t",
-       latency   => 2,
-},
-
-FucompFnstsw => {
-       reg_req   => { },
-       emit      => ". fucomp %X1\n".
-                    ". fnstsw %%ax",
-       attr_type => "ia32_x87_attr_t",
-       latency   => 2,
-},
-
-FucomppFnstsw => {
-       reg_req   => { },
-       emit      => ". fucompp\n".
-                    ". fnstsw %%ax",
-       attr_type => "ia32_x87_attr_t",
-       latency   => 2,
-},
-
-Fucomi => {
-       reg_req   => { },
-       emit      => '. fucomi %X1',
-       attr_type => "ia32_x87_attr_t",
-       latency   => 1,
-},
-
-Fucompi => {
-       reg_req   => { },
-       emit      => '. fucompi %X1',
-       attr_type => "ia32_x87_attr_t",
-       latency   => 1,
-},
-
-FtstFnstsw => {
-       reg_req   => { },
-       emit      => ". ftst\n".
-                    ". fnstsw %%ax",
-       attr_type => "ia32_x87_attr_t",
-       latency   => 2,
-},
-
-
-# -------------------------------------------------------------------------------- #
-#  ____ ____  _____                  _                               _             #
-# / ___/ ___|| ____| __   _____  ___| |_ ___  _ __   _ __   ___   __| | ___  ___   #
-# \___ \___ \|  _|   \ \ / / _ \/ __| __/ _ \| '__| | '_ \ / _ \ / _` |/ _ \/ __|  #
-#  ___) |__) | |___   \ V /  __/ (__| || (_) | |    | | | | (_) | (_| |  __/\__ \  #
-# |____/____/|_____|   \_/ \___|\___|\__\___/|_|    |_| |_|\___/ \__,_|\___||___/  #
-#                                                                                  #
-# -------------------------------------------------------------------------------- #
-
-
 # Spilling and reloading of SSE registers, hardcoded, not generated #
 
 xxLoad => {
-       op_flags  => "L|F",
+       op_flags  => [ "uses_memory", "fragile" ],
        state     => "exc_pinned",
-       reg_req   => { in => [ "gp", "gp", "none" ], out => [ "xmm", "none" ] },
-       emit      => '. movdqu %D0, %AM',
-       outs      => [ "res", "M" ],
+       reg_req   => { in => [ "gp", "gp", "none" ],
+                      out => [ "xmm", "none", "none", "none" ] },
+       emit      => 'movdqu %D0, %AM',
+       ins       => [ "base", "index", "mem" ],
+       outs      => [ "res", "M", "X_regular", "X_except" ],
        units     => [ "SSE" ],
        latency   => 1,
 },
 
 xxStore => {
-       op_flags => "L|F",
+       op_flags => [ "uses_memory", "fragile" ],
        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" ],
-       emit     => '. movdqu %binop',
+       outs     => [ "M", "X_regular", "X_except" ],
+       emit     => 'movdqu %B',
        units    => [ "SSE" ],
-       latency   => 1,
-       mode     => "mode_M",
+       latency  => 1,
 },
 
 ); # end of %nodes
 
-# Include the generated SIMD node specification written by the SIMD optimization
-$my_script_name = dirname($myname) . "/../ia32/ia32_simd_spec.pl";
-unless ($return = do $my_script_name) {
-       warn "couldn't parse $my_script_name: $@" if $@;
-       warn "couldn't do $my_script_name: $!"    unless defined $return;
-       warn "couldn't run $my_script_name"       unless $return;
-}
-
 # Transform some attributes
 foreach my $op (keys(%nodes)) {
        my $node         = $nodes{$op};
@@ -2843,7 +2409,7 @@ foreach my $op (keys(%nodes)) {
                        die("Latency missing for op $op");
                }
        }
-       $op_attr_init .= "attr->latency = ".$node->{latency} . ";";
+       $op_attr_init .= "ia32_init_op(op, ".$node->{latency} . ");";
 
        $node->{op_attr_init} = $op_attr_init;
 }