sparc: initial support for Alloc/Free nodes
[libfirm] / ir / be / sparc / sparc_spec.pl
index a2d4d1b..592c65a 100644 (file)
@@ -123,14 +123,14 @@ $default_copy_attr = "sparc_copy_attr";
 
 
 %init_attr = (
-       sparc_attr_t             => "\tinit_sparc_attributes(res, flags, in_reqs, exec_units, n_res);",
-       sparc_load_store_attr_t  => "\tinit_sparc_attributes(res, flags, in_reqs, exec_units, n_res);",
-       sparc_jmp_cond_attr_t    => "\tinit_sparc_attributes(res, flags, in_reqs, exec_units, n_res);",
-       sparc_switch_jmp_attr_t  => "\tinit_sparc_attributes(res, flags, in_reqs, exec_units, n_res);\n".
+       sparc_attr_t             => "\tinit_sparc_attributes(res, irn_flags_, in_reqs, exec_units, n_res);",
+       sparc_load_store_attr_t  => "\tinit_sparc_attributes(res, irn_flags_, in_reqs, exec_units, n_res);",
+       sparc_jmp_cond_attr_t    => "\tinit_sparc_attributes(res, irn_flags_, in_reqs, exec_units, n_res);",
+       sparc_switch_jmp_attr_t  => "\tinit_sparc_attributes(res, irn_flags_, in_reqs, exec_units, n_res);\n".
                                    "\tinit_sparc_switch_jmp_attributes(res, default_pn, jump_table);\n",
-       sparc_fp_attr_t          => "\tinit_sparc_attributes(res, flags, in_reqs, exec_units, n_res);\n".
+       sparc_fp_attr_t          => "\tinit_sparc_attributes(res, irn_flags_, in_reqs, exec_units, n_res);\n".
                                    "\tinit_sparc_fp_attributes(res, fp_mode);\n",
-       sparc_fp_conv_attr_t     => "\tinit_sparc_attributes(res, flags, in_reqs, exec_units, n_res);".
+       sparc_fp_conv_attr_t     => "\tinit_sparc_attributes(res, irn_flags_, in_reqs, exec_units, n_res);".
                                    "\tinit_sparc_fp_conv_attributes(res, src_mode, dest_mode);\n",
 );
 
@@ -325,7 +325,7 @@ SubX_t => {
 
 # Load / Store
 Ld => {
-       op_flags  => [ "labeled", "fragile" ],
+       op_flags  => [ "labeled" ],
        state     => "exc_pinned",
        constructors => {
                imm => {
@@ -358,7 +358,7 @@ SetHi => {
 },
 
 St => {
-       op_flags  => [ "labeled", "fragile" ],
+       op_flags  => [ "labeled" ],
        mode      => "mode_M",
        state     => "exc_pinned",
        constructors => {
@@ -420,25 +420,27 @@ Restore => {
 },
 
 RestoreZero => {
-       emit => '. restore',
        reg_req => { in => [ "frame_pointer" ], out => [ "sp:I|S" ] },
        ins     => [ "frame_pointer" ],
        outs    => [ "stack" ],
+       emit    => '. restore',
        mode    => $mode_gp,
 },
 
 SubSP => {
-       reg_req   => { in => [ "sp", "gp", "none" ], out => [ "sp:I|S", "gp", "none" ] },
-       ins       => [ "stack", "size", "mem" ],
-       outs      => [ "stack", "addr", "M" ],
-       emit      => ". sub %S0, %S1, %D0\n",
+       reg_req => { in => [ "sp", "gp" ], out => [ "sp:I|S" ] },
+       ins     => [ "stack", "size" ],
+       outs    => [ "stack" ],
+       emit    => ". sub %S0, %S1, %D0\n",
+       mode    => $mode_gp,
 },
 
 AddSP => {
-       reg_req   => { in => [ "sp", "gp", "none" ], out => [ "sp:I|S", "none" ] },
-       ins       => [ "stack", "size", "mem" ],
-       outs      => [ "stack", "M" ],
-       emit      => ". add %S0, %S1, %D0\n",
+       reg_req => { in => [ "sp", "gp" ], out => [ "sp:I|S" ] },
+       ins     => [ "stack", "size" ],
+       outs    => [ "stack" ],
+       emit    => ". add %S0, %S1, %D0\n",
+       mode    => $mode_gp,
 },
 
 FrameAddr => {
@@ -460,6 +462,8 @@ Bicc => {
        attr      => "ir_relation relation, bool is_unsigned",
        init_attr => "\tinit_sparc_jmp_cond_attr(res, relation, is_unsigned);",
        reg_req   => { in => [ "flags" ], out => [ "none", "none" ] },
+       ins       => [ "flags" ],
+       outs      => [ "false", "true" ],
 },
 
 fbfcc => {
@@ -470,6 +474,8 @@ fbfcc => {
        attr      => "ir_relation relation",
        init_attr => "\tinit_sparc_jmp_cond_attr(res, relation, false);",
        reg_req   => { in => [ "fpflags" ], out => [ "none", "none" ] },
+       ins       => [ "flags" ],
+       outs      => [ "false", "true" ],
 },
 
 Ba => {
@@ -480,21 +486,29 @@ Ba => {
        mode      => "mode_X",
 },
 
+Start => {
+       state     => "pinned",
+       out_arity => "variable",
+       ins       => [],
+},
+
 # This is a JumpLink instruction, but with the addition that you can add custom
 # register constraints to model your calling conventions
 Return => {
+       state     => "pinned",
+       op_flags  => [ "cfopcode" ],
        arity     => "variable",
-       out_arity => "variable",
+       mode      => "mode_X",
        constructors => {
                imm => {
                        attr       => "ir_entity *entity, int32_t offset",
                        custominit => "\tsparc_set_attr_imm(res, entity, offset);",
                        arity     => "variable",
-                       out_arity => "variable",
+                       reg_req   => { out => [ "none" ] },
                },
                reg => {
                        arity     => "variable",
-                       out_arity => "variable",
+                       reg_req   => { out => [ "none" ] },
                }
        },
 },
@@ -506,14 +520,17 @@ Call => {
        out_arity => "variable",
        constructors => {
                imm => {
-                       attr       => "ir_entity *entity, int32_t offset",
-                       custominit => "\tsparc_set_attr_imm(res, entity, offset);",
+                       attr       => "ir_entity *entity, int32_t offset, bool aggregate_return",
+                       custominit => "\tsparc_set_attr_imm(res, entity, offset);".
+                                     "\tif (aggregate_return) arch_add_irn_flags(res, sparc_arch_irn_flag_aggregate_return);",
                        arity     => "variable",
                        out_arity => "variable",
                },
                reg => {
-                       arity     => "variable",
-                       out_arity => "variable",
+                       attr       => "bool aggregate_return",
+                       arity      => "variable",
+                       out_arity  => "variable",
+                       custominit => "\tif (aggregate_return) arch_add_irn_flags(res, sparc_arch_irn_flag_aggregate_return);",
                }
        },
 },
@@ -741,7 +758,7 @@ fneg => {
        irn_flags => [ "rematerializable" ],
        reg_req   => { in => [ "fp" ], out => [ "fp" ] },
        # note that we only need the first register even for wide-values
-       emit      => '. fneg %S0, %D0',
+       emit      => '. fnegs %S0, %D0',
        attr_type => "sparc_fp_attr_t",
        attr      => "ir_mode *fp_mode",
        ins          => [ "val" ],
@@ -832,7 +849,7 @@ fftoi => {
 },
 
 Ldf => {
-       op_flags  => [ "labeled", "fragile" ],
+       op_flags  => [ "labeled" ],
        state     => "exc_pinned",
        constructors => {
                s => {
@@ -854,7 +871,7 @@ Ldf => {
 },
 
 Stf => {
-       op_flags  => [ "labeled", "fragile" ],
+       op_flags  => [ "labeled" ],
        state     => "exc_pinned",
        constructors => {
                s => {