arm.c (arm_libcall_uses_aapcs_base): Use correct ABI for double-precision helper...
authorJulian Brown <julian@codesourcery.com>
Wed, 8 Jun 2011 11:19:08 +0000 (11:19 +0000)
committerJulian Brown <jules@gcc.gnu.org>
Wed, 8 Jun 2011 11:19:08 +0000 (11:19 +0000)
* config/arm/arm.c (arm_libcall_uses_aapcs_base): Use correct ABI
for double-precision helper functions in hard-float mode if only
single-precision arithmetic is supported in hardware.

From-SVN: r174803

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

index 294e5d7a5a9cb4ae842c1db8333bac2f2b12ebe0..7ee682176d35fb093a4a814c3277e4fc32fedb94 100644 (file)
@@ -1,3 +1,9 @@
+2011-06-08  Julian Brown  <julian@codesourcery.com>
+
+       * config/arm/arm.c (arm_libcall_uses_aapcs_base): Use correct ABI
+       for double-precision helper functions in hard-float mode if only
+       single-precision arithmetic is supported in hardware.
+
 2011-06-08  Alexander Monakov  <amonakov@ispras.ru>
 
        PR rtl-optimization/49303
index 1037d9db8b75b3122a43efe40211296d1bf3a1da..61a315eb21bc71b99a7a7c1a0845aa128ecab165 100644 (file)
@@ -3345,6 +3345,28 @@ arm_libcall_uses_aapcs_base (const_rtx libcall)
                   convert_optab_libfunc (sfix_optab, DImode, SFmode));
       add_libcall (libcall_htab,
                   convert_optab_libfunc (ufix_optab, DImode, SFmode));
+
+      /* Values from double-precision helper functions are returned in core
+        registers if the selected core only supports single-precision
+        arithmetic, even if we are using the hard-float ABI.  The same is
+        true for single-precision helpers, but we will never be using the
+        hard-float ABI on a CPU which doesn't support single-precision
+        operations in hardware.  */
+      add_libcall (libcall_htab, optab_libfunc (add_optab, DFmode));
+      add_libcall (libcall_htab, optab_libfunc (sdiv_optab, DFmode));
+      add_libcall (libcall_htab, optab_libfunc (smul_optab, DFmode));
+      add_libcall (libcall_htab, optab_libfunc (neg_optab, DFmode));
+      add_libcall (libcall_htab, optab_libfunc (sub_optab, DFmode));
+      add_libcall (libcall_htab, optab_libfunc (eq_optab, DFmode));
+      add_libcall (libcall_htab, optab_libfunc (lt_optab, DFmode));
+      add_libcall (libcall_htab, optab_libfunc (le_optab, DFmode));
+      add_libcall (libcall_htab, optab_libfunc (ge_optab, DFmode));
+      add_libcall (libcall_htab, optab_libfunc (gt_optab, DFmode));
+      add_libcall (libcall_htab, optab_libfunc (unord_optab, DFmode));
+      add_libcall (libcall_htab, convert_optab_libfunc (sext_optab, DFmode,
+                                                       SFmode));
+      add_libcall (libcall_htab, convert_optab_libfunc (trunc_optab, SFmode,
+                                                       DFmode));
     }
 
   return libcall && htab_find (libcall_htab, libcall) != NULL;