fix out flags for mode_T nodes
authorMatthias Braun <matze@braunis.de>
Tue, 11 Mar 2008 17:13:58 +0000 (17:13 +0000)
committerMatthias Braun <matze@braunis.de>
Tue, 11 Mar 2008 17:13:58 +0000 (17:13 +0000)
[r18072]

ir/be/arm/arm_spec.pl
ir/be/arm/bearch_arm.c

index 10bae4d..a9170a5 100644 (file)
@@ -1028,8 +1028,8 @@ SubSP => {
        comment   => "construct Sub from stack pointer",
        reg_req   => { in => [ "sp", "gp", "none" ], out => [ "in_r1", "gp", "none" ] },
        ins       => [ "stack", "size", "mem" ],
-       emit      => '. sub %D0, %S0, %S1'.
-                    '. mov %%sp, %D1',
+       emit      => ". sub %D0, %S0, %S1\n".
+                    ". mov sp, %D1",
        outs      => [ "stack:I|S", "addr", "M" ],
 },
 
index 762908c..a5c05b8 100644 (file)
@@ -204,17 +204,26 @@ static arch_irn_class_t arm_classify(const void *self, const ir_node *irn)
 
 static arch_irn_flags_t arm_get_flags(const void *self, const ir_node *irn)
 {
+       arch_irn_flags_t flags = arch_irn_flags_none;
        (void) self;
-       irn = skip_Proj_const(irn);
 
-       if (is_arm_irn(irn)) {
-               return get_arm_flags(irn);
-       }
-       else if (is_Unknown(irn)) {
+       if(is_Unknown(irn)) {
                return arch_irn_flags_ignore;
        }
 
-       return 0;
+       if (is_Proj(irn) && mode_is_datab(get_irn_mode(irn))) {
+               ir_node *pred = get_Proj_pred(irn);
+               if (is_arm_irn(pred)) {
+                       flags = get_arm_out_flags(pred, get_Proj_proj(irn));
+               }
+               irn = pred;
+       }
+
+       if (is_arm_irn(irn)) {
+               flags |= get_arm_flags(irn);
+       }
+
+       return flags;
 }
 
 static ir_entity *arm_get_frame_entity(const void *self, const ir_node *irn)