--- Begin Message ---
Subject: |
[PATCH] factor: disable longlong.h logic for x32 builds |
Date: |
Fri, 7 Dec 2012 15:44:18 -0500 |
The current x86_64 asm code does not work for x32 ABIs, so disable it
until someone can fix it. Simply deleting the q suffix is not enough.
* src/longlong.h: Check for __ILP32__ for x86_64 targets.
---
src/longlong.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/longlong.h b/src/longlong.h
index f2b2c49..baf001c 100644
--- a/src/longlong.h
+++ b/src/longlong.h
@@ -1006,7 +1006,7 @@ extern UWtype __MPN(udiv_qrnnd) (UWtype *, UWtype,
UWtype, UWtype);
#endif
#endif /* 80x86 */
-#if defined (__amd64__) && W_TYPE_SIZE == 64
+#if defined (__amd64__) && W_TYPE_SIZE == 64 && !defined (__ILP32__)
#define add_ssaaaa(sh, sl, ah, al, bh, bl) \
__asm__ ("addq %5,%q1\n\tadcq %3,%q0"
\
: "=r" (sh), "=&r" (sl) \
--
1.7.12.4
--- End Message ---
--- Begin Message ---
Subject: |
Re: bug#13118: [PATCH] factor: disable longlong.h logic for x32 builds |
Date: |
Thu, 20 Dec 2012 02:29:50 +0000 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:13.0) Gecko/20120615 Thunderbird/13.0.1 |
On 12/07/2012 08:55 PM, Pádraig Brady wrote:
On 12/07/2012 08:44 PM, Mike Frysinger wrote:
The current x86_64 asm code does not work for x32 ABIs, so disable it
until someone can fix it. Simply deleting the q suffix is not enough.
* src/longlong.h: Check for __ILP32__ for x86_64 targets.
---
src/longlong.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/longlong.h b/src/longlong.h
index f2b2c49..baf001c 100644
--- a/src/longlong.h
+++ b/src/longlong.h
@@ -1006,7 +1006,7 @@ extern UWtype __MPN(udiv_qrnnd) (UWtype *, UWtype,
UWtype, UWtype);
#endif
#endif /* 80x86 */
-#if defined (__amd64__) && W_TYPE_SIZE == 64
+#if defined (__amd64__) && W_TYPE_SIZE == 64 && !defined (__ILP32__)
#define add_ssaaaa(sh, sl, ah, al, bh, bl) \
__asm__ ("addq %5,%q1\n\tadcq %3,%q0" \
: "=r" (sh), "=&r" (sl) \
I think we may go for something more general here,
as we're having all sorts of problems in this area.
http://git.sv.gnu.org/gitweb/?p=coreutils.git;a=history;f=src/longlong.h
It seems that we need _LP64 defined,
to enable W_TYPE_SIZE == 64 code safely.
I've not come up with anything more generic for the moment,
so will go with this slightly adjusted patch for now.
Was this a runtime or build time issue BTW?
What was the failure mode if runtime?
thanks,
Pádraig.
commit 2178e2ad8dce68862ea9545328aae999700c54cc
Author: Mike Frysinger <address@hidden>
Date: Fri Dec 7 15:44:18 2012 -0500
factor: disable x86_64 assembly code for x32 builds
The current x86_64 asm code does not work for x32 (__ILP32__) ABIs,
so disable it. Note simply deleting the q suffix is not enough.
* src/longlong.h: Restrict x86_64 assembly to _LP64 targets,
which is consistent with other checks in longlong.h and
avoids this code on x32.
diff --git a/src/longlong.h b/src/longlong.h
index f2b2c49..1792045 100644
--- a/src/longlong.h
+++ b/src/longlong.h
@@ -683,7 +683,7 @@ extern UWtype __MPN(udiv_qrnnd) (UWtype *, UWtype, UWtype,
UWtype);
&& defined (_PA_RISC2_0) && defined (_LP64)
/* Note the _PA_RISC2_0 above is to exclude this code from GCC with
default -march options which doesn't support these instructions.
- Also the width check for 'long' is to avoid ilp32 runtimes where
+ Also the width check for 'long' is to avoid ILP32 runtimes where
GNU/Linux and narrow HP-UX kernels are known to have issues with
clobbering of context between the add and add,dc instructions. */
#define add_ssaaaa(sh, sl, ah, al, bh, bl) \
@@ -1006,7 +1006,9 @@ extern UWtype __MPN(udiv_qrnnd) (UWtype *, UWtype,
UWtype, UWtype);
#endif
#endif /* 80x86 */
-#if defined (__amd64__) && W_TYPE_SIZE == 64
+#if defined (__amd64__) && W_TYPE_SIZE == 64 && defined (_LP64)
+/* Note the width check for 'long' is to avoid ILP32 runtimes (x32)
+ where the ABI is known to be incompatible with the following. */
#define add_ssaaaa(sh, sl, ah, al, bh, bl) \
__asm__ ("addq %5,%q1\n\tadcq %3,%q0"
\
: "=r" (sh), "=&r" (sl) \
--- End Message ---