[ARM] Fix costing of vmul+vcvt combine pattern
authorktkachov <ktkachov@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 10 Nov 2015 17:29:46 +0000 (17:29 +0000)
committerktkachov <ktkachov@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 10 Nov 2015 17:29:46 +0000 (17:29 +0000)
* config/arm/arm.c (arm_new_rtx_costs, FIX case): Handle
combine_vcvtf2i pattern.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@230116 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/config/arm/arm.c

index 07f574f..5eca05d 100644 (file)
@@ -1,5 +1,10 @@
 2015-11-10  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
 
+       * config/arm/arm.c (arm_new_rtx_costs, FIX case): Handle
+       combine_vcvtf2i pattern.
+
+2015-11-10  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
+
        * config/arm/arm.c (neon_valid_immediate): Remove integer
        CONST_DOUBLE handling.  It should never occur.
 
index f5c8825..736e6c8 100644 (file)
@@ -11049,6 +11049,23 @@ arm_new_rtx_costs (rtx x, enum rtx_code code, enum rtx_code outer_code,
     case UNSIGNED_FIX:
       if (TARGET_HARD_FLOAT)
        {
+         /* The *combine_vcvtf2i reduces a vmul+vcvt into
+            a vcvt fixed-point conversion.  */
+         if (code == FIX && mode == SImode
+             && GET_CODE (XEXP (x, 0)) == FIX
+             && GET_MODE (XEXP (x, 0)) == SFmode
+             && GET_CODE (XEXP (XEXP (x, 0), 0)) == MULT
+             && vfp3_const_double_for_bits (XEXP (XEXP (XEXP (x, 0), 0), 1))
+                > 0)
+           {
+             if (speed_p)
+               *cost += extra_cost->fp[0].toint;
+
+             *cost += rtx_cost (XEXP (XEXP (XEXP (x, 0), 0), 0), mode,
+                                code, 0, speed_p);
+             return true;
+           }
+
          if (GET_MODE_CLASS (mode) == MODE_INT)
            {
              mode = GET_MODE (XEXP (x, 0));