Re: building i386 world on amd64 host: failed _at_svn

From: Konstantin Belousov <kostikbel_at_gmail.com>
Date: Fri, 16 Aug 2013 18:02:01 +0300
On Fri, Aug 16, 2013 at 02:33:29PM +0200, Dimitry Andric wrote:
> On Aug 15, 2013, at 21:38, Jung-uk Kim <jkim_at_FreeBSD.org> wrote:
> > On 2013-08-15 15:30:49 -0400, Konstantin Belousov wrote:
> >> On Thu, Aug 15, 2013 at 09:12:52PM +0200, Dimitry Andric wrote:
> >>> On Aug 15, 2013, at 20:36, Konstantin Belousov
> >>> <kostikbel_at_gmail.com> wrote:
> >>>> Does the linux box defaults to pentium or higher for -march ? 
> >>>> 64 bit atomics cannot be implemented in usermode on i386 on 
> >>>> processors which do not have cmpxchg8b instruction.
> >>> 
> >>> Ah yes, you are totally right, with -v it gives:
> >>> 
> >>> COLLECT_GCC_OPTIONS='-O2' '-S' '-v' '-mtune=generic'
> >>> '-march=i586'
> >>> 
> >>> So we should really disable atomics for i486 and lower?  Though I
> >>> have understood that there also some pentiums without
> >>> cmpxchg8b...
> >> 
> >> I do not think that there was any Pentium-branded CPU which did
> >> not implemented cmpxchg8b.  Some late 486 did provided cpuid, but I
> >> am almost certain that they did not have cmpxchg8b (cannot check
> >> anyway).
> > 
> > It is actually little complicated.
> > 
> > http://www.geoffchappell.com/studies/windows/km/cpu/cx8.htm
> 
> 
> In contrast, gcc's rules (in contrib/gcc/config/i386/i386.c) are pretty
> straightforward:
> 
>   /* Compare and exchange was added for 80486.  */
>   const int x86_cmpxchg = ~m_386;
>   /* Compare and exchange 8 bytes was added for pentium.  */
>   const int x86_cmpxchg8b = ~(m_386 | m_486);
> 
> So maybe the following is a safe enough solution for now:
> 
> Index: usr.bin/svn/svn_private_config.h
> ===================================================================
> --- usr.bin/svn/svn_private_config.h    (revision 254300)
> +++ usr.bin/svn/svn_private_config.h    (working copy)
> _at__at_ -153,7 +153,9 _at__at_
>  #define SVN_FS_WANT_DB_PATCH 14
> 
>  /* Define if compiler provides atomic builtins */
> +#if !defined(__i386__) || !defined(__i486__)
>  #define SVN_HAS_ATOMIC_BUILTINS 1
> +#endif
I do not understand this.  Isn't __i386__ defined always when compiling
for 32bit x86 ?  

The !defined(__i486__) part assumes that any other cpu variation supported
by compiler has cmpxchg8b.

Received on Fri Aug 16 2013 - 13:02:13 UTC

This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:40:40 UTC