From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:43177) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bLM20-0006Gz-Ed for qemu-devel@nongnu.org; Thu, 07 Jul 2016 23:00:45 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1bLM1w-0006xE-9M for qemu-devel@nongnu.org; Thu, 07 Jul 2016 23:00:43 -0400 Received: from out3-smtp.messagingengine.com ([66.111.4.27]:50683) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bLM1t-0006s4-Qm for qemu-devel@nongnu.org; Thu, 07 Jul 2016 23:00:40 -0400 Date: Thu, 7 Jul 2016 23:00:28 -0400 From: "Emilio G. Cota" Message-ID: <20160708030028.GB28765@flamenco> References: <1467392693-22715-1-git-send-email-rth@twiddle.net> <1467392693-22715-11-git-send-email-rth@twiddle.net> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1467392693-22715-11-git-send-email-rth@twiddle.net> Subject: Re: [Qemu-devel] [PATCH v2 10/27] tcg: Add atomic128 helpers List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Richard Henderson Cc: qemu-devel@nongnu.org, alex.bennee@linaro.org, pbonzini@redhat.com, peter.maydell@linaro.org, serge.fdrv@gmail.com On Fri, Jul 01, 2016 at 10:04:36 -0700, Richard Henderson wrote: > Force the use of cmpxchg16b on x86_64. > > Wikipedia suggests that only very old AMD64 (circa 2004) did not have > this instruction. Further, it's required by Windows 8 so no new cpus > will ever omit it. > > If we truely care about these, then we could check this at startup time > and then avoid executing paths that use it. > > Signed-off-by: Richard Henderson > --- > configure | 29 ++++++++++++- > cputlb.c | 6 +++ > include/qemu/int128.h | 6 +++ > softmmu_template.h | 110 +++++++++++++++++++++++++++++++++++++------------- > tcg/tcg.h | 22 ++++++++++ > 5 files changed, 144 insertions(+), 29 deletions(-) > > diff --git a/configure b/configure > index 59ea124..586abd6 100755 > --- a/configure > +++ b/configure > @@ -1201,7 +1201,10 @@ case "$cpu" in > cc_i386='$(CC) -m32' > ;; > x86_64) > - CPU_CFLAGS="-m64" > + # ??? Only extremely old AMD cpus do not have cmpxchg16b. > + # If we truly care, we should simply detect this case at > + # runtime and generate the fallback to serial emulation. > + CPU_CFLAGS="-m64 -mcx16" > LDFLAGS="-m64 $LDFLAGS" > cc_i386='$(CC) -m32' > ;; > @@ -4434,6 +4437,26 @@ if compile_prog "" "" ; then > int128=yes > fi > > +######################################### > +# See if 128-bit atomic operations are supported. > + > +atomic128=no > +if test "$int128" = "yes"; then > + cat > $TMPC << EOF > +int main(void) > +{ > + unsigned __int128 x = 0, y = 0; > + y = __atomic_load_16(&x, 0); > + __atomic_store_16(&x, y, 0); > + __atomic_compare_exchange_16(&x, &y, x, 0, 0, 0); > + return 0; > +} > +EOF > + if compile_prog "" "" ; then > + atomic128=yes > + fi > +fi Would it be correct to just trust that gcc is doing the right thing? As in this delta over the patch: --- a/configure +++ b/configure @@ -1201,10 +1201,7 @@ case "$cpu" in cc_i386='$(CC) -m32' ;; x86_64) - # ??? Only extremely old AMD cpus do not have cmpxchg16b. - # If we truly care, we should simply detect this case at - # runtime and generate the fallback to serial emulation. - CPU_CFLAGS="-m64 -mcx16" + CPU_CFLAGS="-m64" LDFLAGS="-m64 $LDFLAGS" cc_i386='$(CC) -m32' ;; @@ -4454,6 +4451,10 @@ int main(void) EOF if compile_prog "" "" ; then atomic128=yes + elif compile_prog "-mcx16" "" ; then + QEMU_CFLAGS="$QEMU_CFLAGS -mcx16" + EXTRA_CFLAGS="$EXTRA_CFLAGS -mcx16" + atomic128=yes fi fi I might be missing other CFLAGS to be set, but the idea is that if a program with __atomic[..]_16 links, then we should be OK. This way we would handle correctly even those old AMD cpus, and would also handle non-x86 architectures that implement cmpxchg16. Emilio