aboutsummaryrefslogtreecommitdiffstats
path: root/toolchain-layer/recipes-devtools/gcc/gcc-4.6/linaro/fix_linaro_106872.patch
blob: ef33afff7054057e4d91e1238ef5c988d2d3afc2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
Index: gcc-4_6-branch/gcc/config/arm/arm.c
===================================================================
--- gcc-4_6-branch.orig/gcc/config/arm/arm.c	2012-03-05 17:14:09.901129286 -0800
+++ gcc-4_6-branch/gcc/config/arm/arm.c	2012-03-05 17:18:23.061141606 -0800
@@ -17525,6 +17525,13 @@
       }
       return;
 
+    case 'v':
+      {
+        gcc_assert (GET_CODE (x) == CONST_DOUBLE);
+        fprintf (stream, "#%d", vfp3_const_double_for_fract_bits (x));
+        return;
+      }
+
     /* Register specifier for vld1.16/vst1.16.  Translate the S register
        number into a D register number and element index.  */
     case 'z':
@@ -24925,4 +24932,26 @@
   return 4;
 }
 
+int
+vfp3_const_double_for_fract_bits (rtx operand)
+{
+  REAL_VALUE_TYPE r0;
+  
+  if (GET_CODE (operand) != CONST_DOUBLE)
+    return 0;
+  
+  REAL_VALUE_FROM_CONST_DOUBLE (r0, operand);
+  if (exact_real_inverse (DFmode, &r0))
+    {
+      if (exact_real_truncate (DFmode, &r0))
+       {
+	 HOST_WIDE_INT value = real_to_integer (&r0);
+	 value = value & 0xffffffff;
+	 if ((value != 0) && ( (value & (value - 1)) == 0))
+	   return int_log2 (value);
+       }
+    }
+  return 0;
+}
+
 #include "gt-arm.h"