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"