Hi,
Currently gcc generates code violating ARM EABI when passing arguments to
some floating point
helper functions, which are __aeabi_d2iz/__aeabi_d2uiz. As reported in bug
PR51835.

This patch fixes the issue, with test cases.

It is for trunk and 4.6 branch, and I have checked the output codes
manually.
Is it OK?

Thanks

gcc/ChangeLog:
2012-01-17  Bin Cheng  <bin.ch...@arm.com>

        PR target/51835
        * config/arm/arm.c (arm_libcall_uses_aapcs_base): Use correct ABI
for
        __aeabi_d2iz/__aeabi_d2uiz in hard-float abi if only
single-precision
        arithmetic is supported in hardware.

gcc/testsuite/ChangeLog:
2012-01-17  Bin Cheng  <bin.ch...@arm.com>

        PR target/51835
        * testsuite/gcc.target/arm/pr51835.c: New testcase.
Index: gcc/testsuite/gcc.target/arm/pr51835.c
===================================================================
--- gcc/testsuite/gcc.target/arm/pr51835.c      (revision 0)
+++ gcc/testsuite/gcc.target/arm/pr51835.c      (revision 0)
@@ -0,0 +1,14 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -mfloat-abi=hard -mfpu=fpv4-sp-d16" }  */
+/* { dg-require-effective-target arm_thumb2_ok } */
+
+int func1 (double d)
+{
+  return (int)d;
+}
+unsigned int func2 (double d)
+{
+  return (unsigned int)d;
+}
+
+/* { dg-final { scan-assembler-times "fmrrd\[\\t \]+r0,\[\\t \]*r1,\[\\t 
\]*d0" 2 } } */
Index: gcc/config/arm/arm.c
===================================================================
--- gcc/config/arm/arm.c        (revision 183205)
+++ gcc/config/arm/arm.c        (working copy)
@@ -3680,6 +3680,10 @@
       add_libcall (libcall_htab,
                   convert_optab_libfunc (trunc_optab, HFmode, SFmode));
       add_libcall (libcall_htab,
+                  convert_optab_libfunc (sfix_optab, SImode, DFmode));
+      add_libcall (libcall_htab,
+                  convert_optab_libfunc (ufix_optab, SImode, DFmode));
+      add_libcall (libcall_htab,
                   convert_optab_libfunc (sfix_optab, DImode, DFmode));
       add_libcall (libcall_htab,
                   convert_optab_libfunc (ufix_optab, DImode, DFmode));

Reply via email to