diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index d1abcce666bd5994502e52583a3fe160dd5947a5..c7b1bbb4332de044fee6a9804f911fb6b89f12bd 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,13 @@
+2017-06-16  Richard Earnshaw  <rearnsha@arm.com>
+
+	* config/arm/arm.h (TARGET_HARD_FLOAT): Also check that we
+	have some floating-point instructions.
+	(TARGET_SOFT_FLOAT): Define as inverse of TARGET_HARD_FLOAT.
+	(TARGET_MAYBE_HARD_FLOAT): New macro.
+	* config/arm/arm-builtins.c (arm_init_builtins): Use
+	TARGET_MAYBE_HARD_FLOAT.
+	* config/arm/arm.c (arm_option_override): Use TARGET_HARD_FLOAT_ABI.
+
 2017-06-16  Richard Earnshaw  <rearnsha@arm.com>
 
 	* common/config/arm/arm-common.c: Define INCLUDE_LIST.
diff --git a/gcc/config/arm/arm-builtins.c b/gcc/config/arm/arm-builtins.c
index 8ecf58171c13c1f02994c1a67acec8a0475de709..8d14e58d916620108f822cbe88a5c377e3535296 100644
--- a/gcc/config/arm/arm-builtins.c
+++ b/gcc/config/arm/arm-builtins.c
@@ -1876,7 +1876,7 @@ arm_init_builtins (void)
      arm_init_neon_builtins which uses it.  */
   arm_init_fp16_builtins ();
 
-  if (TARGET_HARD_FLOAT)
+  if (TARGET_MAYBE_HARD_FLOAT)
     {
       arm_init_neon_builtins ();
       arm_init_vfp_builtins ();
@@ -1885,7 +1885,7 @@ arm_init_builtins (void)
 
   arm_init_acle_builtins ();
 
-  if (TARGET_HARD_FLOAT)
+  if (TARGET_MAYBE_HARD_FLOAT)
     {
       tree ftype_set_fpscr
 	= build_function_type_list (void_type_node, unsigned_type_node, NULL);
diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c
index 9e857a2b011d89b21c98bda7a3cfefd0d7664d7b..385792ddc4db9689d375d9a24f53f915ec6d8c7f 100644
--- a/gcc/config/arm/arm.c
+++ b/gcc/config/arm/arm.c
@@ -3449,8 +3449,7 @@ arm_option_override (void)
     {
       if (arm_abi == ARM_ABI_IWMMXT)
 	arm_pcs_default = ARM_PCS_AAPCS_IWMMXT;
-      else if (arm_float_abi == ARM_FLOAT_ABI_HARD
-	       && TARGET_HARD_FLOAT)
+      else if (TARGET_HARD_FLOAT_ABI)
 	{
 	  arm_pcs_default = ARM_PCS_AAPCS_VFP;
 	  if (!bitmap_bit_p (arm_active_target.isa, isa_bit_VFPv2))
diff --git a/gcc/config/arm/arm.h b/gcc/config/arm/arm.h
index 57f4958e2b5dae0d06ff9e8e307b345a91a70549..92361fc9c30ed358a03fb42c332bd8293431aae1 100644
--- a/gcc/config/arm/arm.h
+++ b/gcc/config/arm/arm.h
@@ -119,9 +119,14 @@ extern tree arm_fp16_type_node;
 #define TARGET_32BIT_P(flags)  (TARGET_ARM_P (flags) || TARGET_THUMB2_P (flags))
 
 /* Run-time Target Specification.  */
-#define TARGET_SOFT_FLOAT		(arm_float_abi == ARM_FLOAT_ABI_SOFT)
 /* Use hardware floating point instructions. */
-#define TARGET_HARD_FLOAT		(arm_float_abi != ARM_FLOAT_ABI_SOFT)
+#define TARGET_HARD_FLOAT	(arm_float_abi != ARM_FLOAT_ABI_SOFT	\
+				 && bitmap_bit_p (arm_active_target.isa, \
+						  isa_bit_VFPv2))
+#define TARGET_SOFT_FLOAT	(!TARGET_HARD_FLOAT)
+/* User has permitted use of FP instructions, if they exist for this
+   target.  */
+#define TARGET_MAYBE_HARD_FLOAT (arm_float_abi != ARM_FLOAT_ABI_SOFT)
 /* Use hardware floating point calling convention.  */
 #define TARGET_HARD_FLOAT_ABI		(arm_float_abi == ARM_FLOAT_ABI_HARD)
 #define TARGET_IWMMXT			(arm_arch_iwmmxt)