diff --git a/libgcc/ChangeLog b/libgcc/ChangeLog
index 1685c9fa7c3b6ea8736948fe46a41d6e6e68354f..322b93ec861f3db688e7818b6d2119c775e87111 100644
--- a/libgcc/ChangeLog
+++ b/libgcc/ChangeLog
@@ -1,3 +1,9 @@
+2011-08-02  H.J. Lu  <hongjiu.lu@intel.com>
+
+	* config/i386/linux-unwind.h (RT_SIGRETURN_SYSCALL): New.
+	(x86_64_fallback_frame_state): Use RT_SIGRETURN_SYSCALL and
+	long long to check rt_sigreturn syscall.
+
 2011-08-02  Alan Modra  <amodra@gmail.com>
 
 	* config/rs6000/linux-unwind.h (frob_update_context <__powerpc64__>):
diff --git a/libgcc/config/i386/linux-unwind.h b/libgcc/config/i386/linux-unwind.h
index de44823e053f343c3cb774a904e5d53e44b0dfd9..f17a46cc8e7101a0c11d63c2c54f7fc630ec23b4 100644
--- a/libgcc/config/i386/linux-unwind.h
+++ b/libgcc/config/i386/linux-unwind.h
@@ -44,9 +44,14 @@ x86_64_fallback_frame_state (struct _Unwind_Context *context,
   struct sigcontext *sc;
   long new_cfa;
 
-  /* movq __NR_rt_sigreturn, %rax ; syscall  */
+  /* movq $__NR_rt_sigreturn, %rax ; syscall.  */
+#ifdef __LP64__
+#define RT_SIGRETURN_SYSCALL	0x050f0000000fc0c7ULL
+#else
+#define RT_SIGRETURN_SYSCALL	0x050f40002006c0c7ULL
+#endif
   if (*(unsigned char *)(pc+0) == 0x48
-      && *(unsigned long *)(pc+1) == 0x050f0000000fc0c7)
+      && *(unsigned long long *)(pc+1) == RT_SIGRETURN_SYSCALL)
     {
       struct ucontext *uc_ = context->cfa;
       /* The void * cast is necessary to avoid an aliasing warning.