Re: PR libjava/53973: Check and and skip 67h address size prefix for x32

"H.J. Lu" <[email protected]>
Newsgroups gmane.comp.gcc.patches,gmane.comp.gcc.java.patches
Message-ID <[email protected]>
On Mon, Jul 16, 2012 at 02:04:41PM -0700, H.J. Lu wrote:
> Hi,
> 
> Since x32 may generate 64-bit integer divide like
> 
> 67 48 f7 bd a0 fe ff ff         idivq  -0x160(%ebp)
> 
> we need to check and skip 67h address size for x32.  OK for trunk if
> there are no regressions on Linux/x86-64?
> 
> Thanks.
> 
> H.J.
> ----
> 2012-07-16  H.J. Lu  <[email protected]>
> 
> 	PR libjava/53973
> 	* include/x86_64-signal.h (CHECK_67H_PREFIX): New.
> 	(HANDLE_DIVIDE_OVERFLOW): Check and and skip 67h address size
> 	prefix if CHECK_67H_PREFIX is 1.
> 

Here is the patch with the updated ChangeLog entry.  OK for trunk?

Thanks.

H.J.
---
2012-07-16  H.J. Lu  <[email protected]>

	PR libjava/53973
	* include/x86_64-signal.h (CHECK_67H_PREFIX): New.
	(HANDLE_DIVIDE_OVERFLOW): Check and and skip 67h address size
	prefix if CHECK_67H_PREFIX is 1.  Use ULL suffix for 64-bit
	integer.

diff --git a/libjava/include/x86_64-signal.h b/libjava/include/x86_64-signal.h
index 4bd8a36..84907c3 100644
--- a/libjava/include/x86_64-signal.h
+++ b/libjava/include/x86_64-signal.h
@@ -21,6 +21,12 @@ details.  */
 #define HANDLE_SEGV 1
 #define HANDLE_FPE 1
 
+#ifdef __ILP32__
+# define CHECK_67H_PREFIX 1
+#else
+# define CHECK_67H_PREFIX 0
+#endif
+
 #define SIGNAL_HANDLER(_name)					\
 static void _Jv_##_name (int, siginfo_t *,			\
 			 void *_p __attribute__ ((__unused__)))
@@ -47,6 +53,10 @@ do									\
 									\
   bool _is_64_bit = false;						\
 									\
+  /* Check and skip 67h address size prefix if needed.  */		\
+  if (CHECK_67H_PREFIX && _rip[0] == 0x67)				\
+    _rip++;								\
+									\
   if ((_rip[0] & 0xf0) == 0x40)  /* REX byte present.  */		\
     {									\
       unsigned char _rex = _rip[0] & 0x0f;				\
@@ -64,10 +74,10 @@ do									\
 	{								\
 	  if (_is_64_bit)						\
 	    _min_value_dividend =					\
-	      _gregs[REG_RAX] == (greg_t)0x8000000000000000UL;		\
+	      _gregs[REG_RAX] == (greg_t)0x8000000000000000ULL;		\
 	  else								\
 	    _min_value_dividend =					\
-	      (_gregs[REG_RAX] & 0xffffffff) == (greg_t)0x80000000UL;	\
+	      (_gregs[REG_RAX] & 0xffffffff) == (greg_t)0x80000000ULL;	\
 	}								\
 									\
       if (_min_value_dividend)						\
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.