summaryrefslogtreecommitdiffstats
path: root/recipes-devtools/gcc/gcc-4.5/linaro/gcc-4.5-linaro-r99347.patch
diff options
context:
space:
mode:
Diffstat (limited to 'recipes-devtools/gcc/gcc-4.5/linaro/gcc-4.5-linaro-r99347.patch')
-rw-r--r--recipes-devtools/gcc/gcc-4.5/linaro/gcc-4.5-linaro-r99347.patch83
1 files changed, 83 insertions, 0 deletions
diff --git a/recipes-devtools/gcc/gcc-4.5/linaro/gcc-4.5-linaro-r99347.patch b/recipes-devtools/gcc/gcc-4.5/linaro/gcc-4.5-linaro-r99347.patch
new file mode 100644
index 0000000000..57b8605e55
--- /dev/null
+++ b/recipes-devtools/gcc/gcc-4.5/linaro/gcc-4.5-linaro-r99347.patch
@@ -0,0 +1,83 @@
1 Merge from Sourcery G++ 4.4:
2
3 2010-02-15 Julian Brown <julian@codesourcery.com>
4
5 Issue #7486
6
7 gcc/
8 * config/arm/arm.c (arm_libcall_uses_aapcs_base)
9 (arm_init_cumulative_args): Use correct ABI for double-precision
10 helper functions in hard-float mode if only single-precision
11 arithmetic is supported in hardware.
12
132010-07-26 Julian Brown <julian@codesourcery.com>
14
15 Backport from FSF mainline:
16
17 Julian Brown <julian@codesourcery.com>
18
19=== modified file 'gcc/config/arm/arm.c'
20--- old/gcc/config/arm/arm.c 2010-08-13 10:30:35 +0000
21+++ new/gcc/config/arm/arm.c 2010-08-13 10:43:42 +0000
22@@ -3453,6 +3453,28 @@
23 convert_optab_libfunc (sfix_optab, DImode, SFmode));
24 add_libcall (libcall_htab,
25 convert_optab_libfunc (ufix_optab, DImode, SFmode));
26+
27+ /* Values from double-precision helper functions are returned in core
28+ registers if the selected core only supports single-precision
29+ arithmetic, even if we are using the hard-float ABI. */
30+ if (TARGET_VFP)
31+ {
32+ add_libcall (libcall_htab, optab_libfunc (add_optab, DFmode));
33+ add_libcall (libcall_htab, optab_libfunc (sdiv_optab, DFmode));
34+ add_libcall (libcall_htab, optab_libfunc (smul_optab, DFmode));
35+ add_libcall (libcall_htab, optab_libfunc (neg_optab, DFmode));
36+ add_libcall (libcall_htab, optab_libfunc (sub_optab, DFmode));
37+ add_libcall (libcall_htab, optab_libfunc (eq_optab, DFmode));
38+ add_libcall (libcall_htab, optab_libfunc (lt_optab, DFmode));
39+ add_libcall (libcall_htab, optab_libfunc (le_optab, DFmode));
40+ add_libcall (libcall_htab, optab_libfunc (ge_optab, DFmode));
41+ add_libcall (libcall_htab, optab_libfunc (gt_optab, DFmode));
42+ add_libcall (libcall_htab, optab_libfunc (unord_optab, DFmode));
43+ add_libcall (libcall_htab,
44+ convert_optab_libfunc (sext_optab, DFmode, SFmode));
45+ add_libcall (libcall_htab,
46+ convert_optab_libfunc (trunc_optab, SFmode, DFmode));
47+ }
48 }
49
50 return libcall && htab_find (libcall_htab, libcall) != NULL;
51@@ -4406,6 +4428,31 @@
52 if (arm_libcall_uses_aapcs_base (libname))
53 pcum->pcs_variant = ARM_PCS_AAPCS;
54
55+ /* We must pass arguments to double-precision helper functions in core
56+ registers if we only have hardware support for single-precision
57+ arithmetic, even if we are using the hard-float ABI. */
58+ if (TARGET_VFP
59+ && (rtx_equal_p (libname, optab_libfunc (add_optab, DFmode))
60+ || rtx_equal_p (libname, optab_libfunc (sdiv_optab, DFmode))
61+ || rtx_equal_p (libname, optab_libfunc (smul_optab, DFmode))
62+ || rtx_equal_p (libname, optab_libfunc (neg_optab, DFmode))
63+ || rtx_equal_p (libname, optab_libfunc (sub_optab, DFmode))
64+ || rtx_equal_p (libname, optab_libfunc (eq_optab, DFmode))
65+ || rtx_equal_p (libname, optab_libfunc (lt_optab, DFmode))
66+ || rtx_equal_p (libname, optab_libfunc (le_optab, DFmode))
67+ || rtx_equal_p (libname, optab_libfunc (ge_optab, DFmode))
68+ || rtx_equal_p (libname, optab_libfunc (gt_optab, DFmode))
69+ || rtx_equal_p (libname, optab_libfunc (unord_optab, DFmode))
70+ || rtx_equal_p (libname, convert_optab_libfunc (sext_optab,
71+ DFmode, SFmode))
72+ || rtx_equal_p (libname, convert_optab_libfunc (trunc_optab,
73+ SFmode, DFmode))
74+ || rtx_equal_p (libname, convert_optab_libfunc (sfix_optab,
75+ SImode, DFmode))
76+ || rtx_equal_p (libname, convert_optab_libfunc (ufix_optab,
77+ SImode, DFmode))))
78+ pcum->pcs_variant = ARM_PCS_AAPCS;
79+
80 pcum->aapcs_ncrn = pcum->aapcs_next_ncrn = 0;
81 pcum->aapcs_reg = NULL_RTX;
82 pcum->aapcs_partial = 0;
83