As a reminiscence to the famous MAC/65 assembler changed modifier + into > and -...
[libfirm] / ir / be / ia32 / ia32_spec.pl
index 4171b8e..a49559d 100644 (file)
@@ -4,7 +4,6 @@
 
 use File::Basename;
 
-$new_emit_syntax = 1;
 my $myname = $0;
 
 # the cpu architecture (ia32, ia64, mips, sparc, ppc, ...)
@@ -34,7 +33,6 @@ $arch = "ia32";
 #   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",
@@ -103,7 +101,7 @@ $arch = "ia32";
 #   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)
+#   4 - ignore (do not automatically assign this register)
 #   8 - emitter can choose an arbitrary register of this class
 #  16 - the register is a virtual one
 #  32 - register represents a state
@@ -226,25 +224,18 @@ $arch = "ia32";
        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";
@@ -273,28 +264,28 @@ $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, flags, in_reqs, exec_units, 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, flags, in_reqs, exec_units, n_res);",
        ia32_call_attr_t =>
-               "\tinit_ia32_attributes(res, flags, in_reqs, out_reqs, exec_units, n_res);\n".
+               "\tinit_ia32_attributes(res, flags, in_reqs, exec_units, 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_attributes(res, flags, in_reqs, exec_units, n_res);\n".
                "\tinit_ia32_condcode_attributes(res, pnc);",
        ia32_copyb_attr_t =>
-               "\tinit_ia32_attributes(res, flags, in_reqs, out_reqs, exec_units, n_res);\n".
+               "\tinit_ia32_attributes(res, flags, in_reqs, exec_units, 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_attributes(res, flags, in_reqs, exec_units, 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, flags, in_reqs, exec_units, 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, flags, in_reqs, exec_units, n_res);\n".
                "\tinit_ia32_climbframe_attributes(res, count);",
 );
 
@@ -358,19 +349,6 @@ ProduceVal => {
        cmp_attr  => "return 1;",
 },
 
-#-----------------------------------------------------------------#
-#  _       _                                         _            #
-# (_)     | |                                       | |           #
-#  _ _ __ | |_ ___  __ _  ___ _ __   _ __   ___   __| | ___  ___  #
-# | | '_ \| __/ _ \/ _` |/ _ \ '__| | '_ \ / _ \ / _` |/ _ \/ __| #
-# | | | | | ||  __/ (_| |  __/ |    | | | | (_) | (_| |  __/\__ \ #
-# |_|_| |_|\__\___|\__, |\___|_|    |_| |_|\___/ \__,_|\___||___/ #
-#                   __/ |                                         #
-#                  |___/                                          #
-#-----------------------------------------------------------------#
-
-# commutative operations
-
 Add => {
        irn_flags => "R",
        state     => "exc_pinned",
@@ -455,8 +433,10 @@ l_Mul => {
        # very strict constraints
        op_flags  => "C",
        cmp_attr  => "return 1;",
+       reg_req   => { in => [ "none", "none" ],
+                      out => [ "none", "none", "none", "none" ] },
+       ins       => [ "left", "right" ],
        outs      => [ "res_low", "flags", "M", "res_high" ],
-       arity     => 2
 },
 
 IMul => {
@@ -492,8 +472,10 @@ IMul1OP => {
 l_IMul => {
        op_flags  => "C",
        cmp_attr  => "return 1;",
+       reg_req   => { in => [ "none", "none" ],
+                      out => [ "none", "none", "none", "none" ] },
+       ins       => [ "left", "right" ],
        outs      => [ "res_low", "flags", "M", "res_high" ],
-       arity     => 2
 },
 
 And => {
@@ -503,7 +485,6 @@ And => {
                           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',
        units     => [ "GP" ],
@@ -626,8 +607,6 @@ XorMem8Bit => {
        modified_flags => $status_flags
 },
 
-# not commutative operations
-
 Sub => {
        irn_flags => "R",
        state     => "exc_pinned",
@@ -757,8 +736,8 @@ ShlMem => {
 
 l_ShlDep => {
        cmp_attr => "return 1;",
+       reg_req  => { in => [ "none", "none", "none" ], out => [ "none" ] },
        ins      => [ "val", "count", "dep" ],
-       arity    => 3
 },
 
 ShlD => {
@@ -776,8 +755,8 @@ ShlD => {
 
 l_ShlD => {
        cmp_attr  => "return 1;",
+       reg_req  => { in => [ "none", "none", "none" ], out => [ "none" ] },
        ins       => [ "val_high", "val_low", "count" ],
-       arity     => 3,
 },
 
 Shr => {
@@ -807,8 +786,8 @@ ShrMem => {
 
 l_ShrDep => {
        cmp_attr  => "return 1;",
+       reg_req   => { in => [ "none", "none", "none" ], out => [ "none" ] },
        ins       => [ "val", "count", "dep" ],
-       arity     => 3
 },
 
 ShrD => {
@@ -826,7 +805,7 @@ ShrD => {
 
 l_ShrD => {
        cmp_attr  => "return 1;",
-       arity     => 3,
+       reg_req   => { in => [ "none", "none", "none" ], out => [ "none" ] },
        ins       => [ "val_high", "val_low", "count" ],
 },
 
@@ -858,7 +837,7 @@ SarMem => {
 l_SarDep => {
        cmp_attr  => "return 1;",
        ins       => [ "val", "count", "dep" ],
-       arity     => 3
+       reg_req   => { in => [ "none", "none", "none" ], out => [ "none" ] },
 },
 
 Ror => {
@@ -911,8 +890,6 @@ RolMem => {
        modified_flags => $status_flags
 },
 
-# unary operations
-
 Neg => {
        irn_flags => "R",
        reg_req   => { in => [ "gp" ],
@@ -1024,8 +1001,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,
@@ -1033,16 +1010,14 @@ 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",
        state     => "exc_pinned",
@@ -1115,36 +1090,34 @@ Test8Bit => {
        modified_flags => $status_flags
 },
 
-Set => {
+Setcc => {
        #irn_flags => "R",
        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      => "pn_Cmp pnc",
+       init_attr => "set_ia32_ls_mode(res, mode_Bu);\n",
        latency   => 1,
        units     => [ "GP" ],
        mode      => $mode_gp,
 },
 
-SetMem => {
+SetccMem => {
        #irn_flags => "R",
        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",
+       attr      => "pn_Cmp pnc",
+       init_attr => "set_ia32_ls_mode(res, mode_Bu);\n",
        emit      => '. set%CMP3 %AM',
        latency   => 1,
        units     => [ "GP" ],
        mode      => 'mode_M',
 },
 
-CMov => {
+CMovcc => {
        #irn_flags => "R",
        # (note: leave the false,true order intact to make it compatible with other
        #  ia32_binary ops)
@@ -1177,13 +1150,24 @@ Jcc => {
 SwitchJmp => {
        state     => "pinned",
        op_flags  => "L|X|Y",
-       reg_req   => { in => [ "gp" ], out => [ "none" ] },
+       reg_req   => { in => [ "gp" ] },
        mode      => "mode_T",
        attr_type => "ia32_condcode_attr_t",
        attr      => "long pnc",
        latency   => 3,
        units     => [ "BRANCH" ],
        modified_flags => $status_flags,
+       init_attr => "info->out_infos = NULL;", # XXX ugly hack for out requirements
+},
+
+Jmp => {
+       state     => "pinned",
+       irn_flags => "J",
+       op_flags  => "X",
+       reg_req   => { out => [ "none" ] },
+       latency   => 1,
+       units     => [ "BRANCH" ],
+       mode      => "mode_X",
 },
 
 IJmp => {
@@ -1196,6 +1180,7 @@ IJmp => {
        latency   => 1,
        units     => [ "BRANCH" ],
        mode      => "mode_X",
+       init_attr => "info->out_infos = NULL;", # XXX ugly hack for out requirements
 },
 
 Const => {
@@ -1736,15 +1721,6 @@ PrefetchW => {
        units     => [ "GP" ],
 },
 
-#-----------------------------------------------------------------------------#
-#   _____ _____ ______    __ _             _                     _            #
-#  / ____/ ____|  ____|  / _| |           | |                   | |           #
-# | (___| (___ | |__    | |_| | ___   __ _| |_   _ __   ___   __| | ___  ___  #
-#  \___ \\___ \|  __|   |  _| |/ _ \ / _` | __| | '_ \ / _ \ / _` |/ _ \/ __| #
-#  ____) |___) | |____  | | | | (_) | (_| | |_  | | | | (_) | (_| |  __/\__ \ #
-# |_____/_____/|______| |_| |_|\___/ \__,_|\__| |_| |_|\___/ \__,_|\___||___/ #
-#-----------------------------------------------------------------------------#
-
 # produces a 0/+0.0
 xZero => {
        irn_flags => "R",
@@ -1814,8 +1790,6 @@ xMovd  => {
        mode      => $mode_xmm
 },
 
-# commutative operations
-
 xAdd => {
        irn_flags => "R",
        state     => "exc_pinned",
@@ -1914,8 +1888,6 @@ xXor => {
        mode      => $mode_xmm
 },
 
-# not commutative operations
-
 xAndNot => {
        irn_flags => "R",
        state     => "exc_pinned",
@@ -1957,8 +1929,6 @@ xDiv => {
        units     => [ "SSE" ],
 },
 
-# other operations
-
 Ucomi => {
        irn_flags => "R",
        state     => "exc_pinned",
@@ -1976,8 +1946,6 @@ Ucomi => {
        modified_flags => 1,
 },
 
-# Load / Store
-
 xLoad => {
        op_flags  => "L|F",
        state     => "exc_pinned",
@@ -2007,8 +1975,9 @@ xStore => {
 xStoreSimple => {
        op_flags => "L|F",
        state    => "exc_pinned",
-       reg_req  => { in => [ "gp", "gp", "none", "xmm" ] },
+       reg_req  => { in => [ "gp", "gp", "none", "xmm" ], out => [ "none" ] },
        ins      => [ "base", "index", "mem", "val" ],
+       outs     => [ "M" ],
        emit     => '. mov%XXM %S3, %AM',
        latency  => 0,
        units    => [ "SSE" ],
@@ -2044,6 +2013,7 @@ l_LLtoFloat => {
        op_flags => "L|F",
        cmp_attr => "return 1;",
        ins      => [ "val_high", "val_low" ],
+       reg_req  => { in => [ "none", "none" ], out => [ "none" ] }
 },
 
 l_FloattoLL => {
@@ -2051,10 +2021,9 @@ l_FloattoLL => {
        cmp_attr => "return 1;",
        ins      => [ "val" ],
        outs     => [ "res_high", "res_low" ],
+       reg_req  => { in => [ "none" ], out => [ "none", "none" ] }
 },
 
-# CopyB
-
 CopyB => {
        op_flags  => "F|H",
        state     => "pinned",
@@ -2081,8 +2050,6 @@ CopyB_i => {
 #      modified_flags => [ "DF" ]
 },
 
-# Conversions
-
 Cwtl => {
        state     => "exc_pinned",
        reg_req   => { in => [ "eax" ], out => [ "eax" ] },
@@ -2152,28 +2119,16 @@ 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",
        state     => "exc_pinned",
-       reg_req   => { in => [ "gp", "gp", "none", "vfp", "vfp", "fpcw" ], out => [ "vfp" ] },
+       reg_req   => { in => [ "gp", "gp", "none", "vfp", "vfp", "fpcw" ],
+                      out => [ "vfp", "none", "none" ] },
        ins       => [ "base", "index", "mem", "left", "right", "fpcw" ],
+       outs      => [ "res", "dummy", "M" ],
        am        => "source,binary",
        latency   => 4,
        units     => [ "VFP" ],
@@ -2184,8 +2139,10 @@ vfadd => {
 vfmul => {
 #      irn_flags => "R",
        state     => "exc_pinned",
-       reg_req   => { in => [ "gp", "gp", "none", "vfp", "vfp", "fpcw" ], out => [ "vfp" ] },
+       reg_req   => { in => [ "gp", "gp", "none", "vfp", "vfp", "fpcw" ],
+                      out => [ "vfp", "none", "none" ] },
        ins       => [ "base", "index", "mem", "left", "right", "fpcw" ],
+       outs      => [ "res", "dummy", "M" ],
        am        => "source,binary",
        latency   => 4,
        units     => [ "VFP" ],
@@ -2196,8 +2153,10 @@ vfmul => {
 vfsub => {
 #      irn_flags => "R",
        state     => "exc_pinned",
-       reg_req   => { in => [ "gp", "gp", "none", "vfp", "vfp", "fpcw" ], out => [ "vfp" ] },
+       reg_req   => { in => [ "gp", "gp", "none", "vfp", "vfp", "fpcw" ],
+                      out => [ "vfp", "none", "none" ] },
        ins       => [ "base", "index", "mem", "minuend", "subtrahend", "fpcw" ],
+       outs      => [ "res", "dummy", "M" ],
        am        => "source,binary",
        latency   => 4,
        units     => [ "VFP" ],
@@ -2207,10 +2166,11 @@ vfsub => {
 
 vfdiv => {
        state     => "exc_pinned",
-       reg_req   => { in => [ "gp", "gp", "none", "vfp", "vfp", "fpcw" ], out => [ "vfp", "none" ] },
+       reg_req   => { in => [ "gp", "gp", "none", "vfp", "vfp", "fpcw" ],
+                      out => [ "vfp", "none", "none" ] },
        ins       => [ "base", "index", "mem", "dividend", "divisor", "fpcw" ],
+       outs      => [ "res", "dummy", "M" ],
        am        => "source,binary",
-       outs      => [ "res", "M" ],
        latency   => 20,
        units     => [ "VFP" ],
        attr_type => "ia32_x87_attr_t",
@@ -2245,8 +2205,6 @@ vfchs => {
        attr_type => "ia32_x87_attr_t",
 },
 
-# virtual Load and Store
-
 vfld => {
        irn_flags => "R",
        op_flags  => "L|F",
@@ -2278,8 +2236,6 @@ vfst => {
        attr_type => "ia32_x87_attr_t",
 },
 
-# Conversions
-
 vfild => {
        state     => "exc_pinned",
        reg_req   => { in => [ "gp", "gp", "none" ],
@@ -2293,8 +2249,9 @@ vfild => {
 
 vfist => {
        state     => "exc_pinned",
-       reg_req   => { in => [ "gp", "gp", "none", "vfp", "fpcw" ] },
+       reg_req   => { in => [ "gp", "gp", "none", "vfp", "fpcw" ], out => [ "none" ] },
        ins       => [ "base", "index", "mem", "val", "fpcw" ],
+       outs      => [ "M" ],
        latency   => 4,
        units     => [ "VFP" ],
        mode      => "mode_M",
@@ -2312,9 +2269,6 @@ vfisttp => {
        attr_type => "ia32_x87_attr_t",
 },
 
-
-# constants
-
 vfldz => {
        irn_flags => "R",
        reg_req   => { out => [ "vfp" ] },
@@ -2385,10 +2339,8 @@ vfldl2e => {
        attr_type => "ia32_x87_attr_t",
 },
 
-# other
-
 vFucomFnstsw => {
-# we can't allow to rematerialize this node so we don't have
+# 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" ] },
@@ -2439,245 +2391,208 @@ Sahf => {
        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",
+       constructors => {},
 },
 
 faddp => {
        state     => "exc_pinned",
-       rd_constructor => "NONE",
-       reg_req   => { },
        emit      => '. faddp%XM %x87_binop',
        latency   => 4,
        attr_type => "ia32_x87_attr_t",
+       constructors => {},
 },
 
 fmul => {
        state     => "exc_pinned",
-       rd_constructor => "NONE",
-       reg_req   => { },
        emit      => '. fmul%XM %x87_binop',
        latency   => 4,
        attr_type => "ia32_x87_attr_t",
+       constructors => {},
 },
 
 fmulp => {
        state     => "exc_pinned",
-       rd_constructor => "NONE",
-       reg_req   => { },
        emit      => '. fmulp%XM %x87_binop',,
        latency   => 4,
        attr_type => "ia32_x87_attr_t",
+       constructors => {},
 },
 
 fsub => {
        state     => "exc_pinned",
-       rd_constructor => "NONE",
-       reg_req   => { },
        emit      => '. fsub%XM %x87_binop',
        latency   => 4,
        attr_type => "ia32_x87_attr_t",
+       constructors => {},
 },
 
+# Note: gas is strangely buggy: fdivrp and fdivp as well as fsubrp and fsubp
+#       are swapped, we work this around in the emitter...
+
 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",
+       constructors => {},
 },
 
 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",
+       constructors => {},
 },
 
 fsubrp => {
        state     => "exc_pinned",
-       rd_constructor => "NONE",
        irn_flags => "R",
-       reg_req   => { },
-# see note about gas bugs
+# see note about gas bugs before fsubp
        emit      => '. fsubp%XM %x87_binop',
        latency   => 4,
        attr_type => "ia32_x87_attr_t",
+       constructors => {},
 },
 
 fprem => {
-       rd_constructor => "NONE",
-       reg_req   => { },
        emit      => '. fprem1',
        latency   => 20,
        attr_type => "ia32_x87_attr_t",
+       constructors => {},
 },
 
 # 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",
+       constructors => {},
 },
 
 fdiv => {
        state     => "exc_pinned",
-       rd_constructor => "NONE",
-       reg_req   => { },
        emit      => '. fdiv%XM %x87_binop',
        latency   => 20,
        attr_type => "ia32_x87_attr_t",
+       constructors => {},
 },
 
 fdivp => {
        state     => "exc_pinned",
-       rd_constructor => "NONE",
-       reg_req   => { },
-# see note about gas bugs
+# see note about gas bugs before fsubp
        emit      => '. fdivrp%XM %x87_binop',
        latency   => 20,
        attr_type => "ia32_x87_attr_t",
+       constructors => {},
 },
 
 fdivr => {
        state     => "exc_pinned",
-       rd_constructor => "NONE",
-       reg_req   => { },
        emit      => '. fdivr%XM %x87_binop',
        latency   => 20,
        attr_type => "ia32_x87_attr_t",
+       constructors => {},
 },
 
 fdivrp => {
        state     => "exc_pinned",
-       rd_constructor => "NONE",
-       reg_req   => { },
-# see note about gas bugs
+# see note about gas bugs before fsubp
        emit      => '. fdivp%XM %x87_binop',
        latency   => 20,
        attr_type => "ia32_x87_attr_t",
+       constructors => {},
 },
 
 fabs => {
-       rd_constructor => "NONE",
-       reg_req   => { },
        emit      => '. fabs',
        latency   => 4,
        attr_type => "ia32_x87_attr_t",
+       constructors => {},
 },
 
 fchs => {
        op_flags  => "R|K",
-       rd_constructor => "NONE",
-       reg_req   => { },
        emit      => '. fchs',
        latency   => 4,
        attr_type => "ia32_x87_attr_t",
+       constructors => {},
 },
 
-# 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,
+       constructors => {},
 },
 
 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,
+       constructors => {},
 },
 
 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,
+       constructors => {},
 },
 
-# Conversions
-
 fild => {
        state     => "exc_pinned",
-       rd_constructor => "NONE",
-       reg_req   => { },
        emit      => '. fild%XM %AM',
        attr_type => "ia32_x87_attr_t",
        latency   => 2,
+       constructors => {},
 },
 
 fist => {
        state     => "exc_pinned",
-       rd_constructor => "NONE",
-       reg_req   => { },
        emit      => '. fist%XM %AM',
        mode      => "mode_M",
        attr_type => "ia32_x87_attr_t",
        latency   => 2,
+       constructors => {},
 },
 
 fistp => {
        state     => "exc_pinned",
-       rd_constructor => "NONE",
-       reg_req   => { },
        emit      => '. fistp%XM %AM',
        mode      => "mode_M",
        attr_type => "ia32_x87_attr_t",
        latency   => 2,
+       constructors => {},
 },
 
 # SSE3 fisttp 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,
+       constructors => {},
 },
 
-# constants
-
 fldz => {
        op_flags  => "R|c|K",
        irn_flags => "R",
@@ -2747,7 +2662,7 @@ fldl2e => {
 
 fxch => {
        op_flags  => "R|K",
-       reg_req   => { },
+       reg_req   => { out => [ "none" ] },
        cmp_attr  => "return 1;",
        emit      => '. fxch %X0',
        attr_type => "ia32_x87_attr_t",
@@ -2757,7 +2672,7 @@ fxch => {
 
 fpush => {
        op_flags  => "R|K",
-       reg_req   => {},
+       reg_req   => { out => [ "none" ] },
        cmp_attr  => "return 1;",
        emit      => '. fld %X0',
        attr_type => "ia32_x87_attr_t",
@@ -2775,7 +2690,7 @@ fpushCopy => {
 
 fpop => {
        op_flags  => "K",
-       reg_req   => { },
+       reg_req   => { out => [ "none" ] },
        cmp_attr  => "return 1;",
        emit      => '. fstp %X0',
        attr_type => "ia32_x87_attr_t",
@@ -2785,7 +2700,7 @@ fpop => {
 
 ffreep => {
        op_flags  => "K",
-       reg_req   => { },
+       reg_req   => { out => [ "none" ] },
        cmp_attr  => "return 1;",
        emit      => '. ffreep %X0',
        attr_type => "ia32_x87_attr_t",
@@ -2795,7 +2710,7 @@ ffreep => {
 
 emms => {
        op_flags  => "K",
-       reg_req   => { },
+       reg_req   => { out => [ "none" ] },
        cmp_attr  => "return 1;",
        emit      => '. emms',
        attr_type => "ia32_x87_attr_t",
@@ -2805,7 +2720,7 @@ emms => {
 
 femms => {
        op_flags  => "K",
-       reg_req   => { },
+       reg_req   => { out => [ "none" ] },
        cmp_attr  => "return 1;",
        emit      => '. femms',
        attr_type => "ia32_x87_attr_t",
@@ -2813,8 +2728,6 @@ femms => {
        latency   => 3,
 },
 
-# compare
-
 FucomFnstsw => {
        reg_req   => { },
        emit      => ". fucom %X1\n".
@@ -2861,17 +2774,6 @@ FtstFnstsw => {
        latency   => 2,
 },
 
-
-# -------------------------------------------------------------------------------- #
-#  ____ ____  _____                  _                               _             #
-# / ___/ ___|| ____| __   _____  ___| |_ ___  _ __   _ __   ___   __| | ___  ___   #
-# \___ \___ \|  _|   \ \ / / _ \/ __| __/ _ \| '__| | '_ \ / _ \ / _` |/ _ \/ __|  #
-#  ___) |__) | |___   \ V /  __/ (__| || (_) | |    | | | | (_) | (_| |  __/\__ \  #
-# |____/____/|_____|   \_/ \___|\___|\__\___/|_|    |_| |_|\___/ \__,_|\___||___/  #
-#                                                                                  #
-# -------------------------------------------------------------------------------- #
-
-
 # Spilling and reloading of SSE registers, hardcoded, not generated #
 
 xxLoad => {
@@ -2897,14 +2799,6 @@ xxStore => {
 
 ); # 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};