Floating point promotion was broken since the IR float change. Fix.
authorDavid Given <dg@cowlark.com>
Sun, 9 Oct 2016 13:08:03 +0000 (15:08 +0200)
committerDavid Given <dg@cowlark.com>
Sun, 9 Oct 2016 13:08:03 +0000 (15:08 +0200)
mach/proto/mcg/pass_promotefloatops.c
mach/proto/mcg/table

index 7b1d769..1fdff6f 100644 (file)
@@ -41,14 +41,12 @@ static void promote(struct ir* ir)
             break;
 
         case IR_PHI:
-            if (!array_appendu(&promotable, ir))
-            {
-                if (ir->left)
-                    promote(ir->left);
-                if (ir->right)
-                    promote(ir->right);
-            }
+        {
+            int i;
+            for (i=0; i<ir->u.phivalue.count; i++)
+                array_appendu(&promotable, ir->u.phivalue.item[i].right);
             break;
+        }
     }
 }
 
index 953b4e7..4a853a6 100644 (file)
@@ -328,17 +328,21 @@ PATTERNS
                emit "la %out, $value"
                cost 8;
 
-       out:(int)reg = value:CONSTF4
-               emit "lfs %out, address-containing-$value"
-               cost 8;
-
-
 
 /* FPU operations */
 
+       out:(float)reg = value:CONSTF4
+               emit "lfs %out, address-containing-$value"
+               cost 8;
+
        out:(float)reg = ADDF4(left:(float)reg, right:(float)reg)
                emit "fadds %out, %left, %right"
                cost 4;
 
+       out:(float)reg = SUBF4(left:(float)reg, right:(float)reg)
+               emit "fsubs %out, %left, %right"
+               cost 4;
+
+
 /* vim: set sw=4 ts=4 expandtab : */