Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 2 Mar 2012 13:23:48 +1100 (EST)
From:      Bruce Evans <brde@optusnet.com.au>
To:        Tijl Coosemans <tijl@freebsd.org>
Cc:        svn-src-head@freebsd.org, svn-src-all@freebsd.org, src-committers@freebsd.org, Dimitry Andric <dim@freebsd.org>, Bruce Evans <brde@optusnet.com.au>
Subject:   Re: svn commit: r232266 - in head/sys: amd64/include i386/include pc98/include x86/include
Message-ID:  <20120302130435.J929@besplex.bde.org>
In-Reply-To: <201203012346.20648.tijl@freebsd.org>
References:  <201202281939.q1SJdtYr084858@svn.freebsd.org> <20120229160522.W2514@besplex.bde.org> <20120229181608.S2887@besplex.bde.org> <201203012346.20648.tijl@freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help
On Thu, 1 Mar 2012, Tijl Coosemans wrote:

> On Wednesday 29 February 2012 08:44:54 Bruce Evans wrote:
>> ...
>> So any macro version must use gcc features to be safe.  The following
>> seems to work:
>>
>> #define	__bswap16(x)	__extension__ ({ __uint16_t __x = x;
>>  	(__uint16_t)(__x << 8 | __x >> 8); })
>>
>> clang now produces "rolw $8,x" when x is volatile.  This seems to
>> violate volatile semantics.  gcc produces load-rolw-store then.  Both
>> produce "rolw $8,x" when x is not volatile.
>
> I'll have a closer look at the patch tomorrow, but the Intel
> documentation for the bswap instruction recommends to use xchg for
> bswap16.

That's what i386 used to do, using an asm (see for example the RELENG_4
version), but the asm was replaced by C code and the compiler apparently
knows better.  This might depend on -mtune.  I tested with the default,
which is poorly documented and hard to remember, but what I remember is
that it is for a really old Intel CPU.  Checking the documentation shows
that the default might be the same as -mtune=generic which is the same
as -mtune=i686, where i686 seems to be undocumented but seems to be
similar to pentiumpro.  I would have to run old tests to verify this.
There must also be magic to break i386 support, so that bswap gets used.
The current default is certainly not -march=i386 like it used to be,
but the details of what it now is seem to be undocumented.  It doesn't
include SSE support, since it is only for a really old Intel CPU; just
one that is not quite as old as plain i386.

Bruce



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20120302130435.J929>