Sure, whatever works.  I did a little looking around, but I couldn't find
any other way to do an atomic read of 128 bits on x86_64.

john

On Mon, Mar 25, 2013 at 11:44 AM, Brian Geffon <bri...@apache.org> wrote:

> It turns out that __sync_fetch_and_add(__int128_t*, int) just uses
> cmpxchg16b under the covers anyway...
>
> int main ( void ) {
> __int128_t src=10, dest=20;
> *(__int128_t*)&(dest) = __sync_fetch_and_add((__int128_t*)&src, 0);
>
> return 0;
> }
>
> When building using gcc -mcx16 -S -o test.S test.c, we get the following
> assembly:
>
> main:
> .LFB0:
>         .cfi_startproc
>         pushq   %rbp
>         .cfi_def_cfa_offset 16
>         .cfi_offset 6, -16
>         movq    %rsp, %rbp
>         .cfi_def_cfa_register 6
>         pushq   %rbx
>         movq    $10, -32(%rbp)
>         movq    $0, -24(%rbp)
>         movq    $20, -48(%rbp)
>         movq    $0, -40(%rbp)
>         leaq    -32(%rbp), %r8
>         movq    (%r8), %rax
>         movq    8(%r8), %rdx
> .L2:
>         movq    %rax, %rsi
>         movq    %rdx, %rdi
>         movq    %rax, %rcx
>         movq    %rdx, %rbx
>         .cfi_offset 3, -24
>         addq    $0, %rcx
>         adcq    $0, %rbx
>         movq    %rcx, %r9
>         movq    %rbx, %rcx
>         movq    %r9, %rbx
>         lock cmpxchg16b (%r8)
>         jne     .L2
>         movq    %rsi, %rax
>         movq    %rdi, %rdx
>         movq    %rax, -48(%rbp)
>         movq    %rdx, -40(%rbp)
>         movl    $0, %eax
>         popq    %rbx
>         leave
>         .cfi_def_cfa 7, 8
>         ret
>         .cfi_endproc
>
> So instead of __sync_fetch_and_add() it appears we can use
> __sync_val_compare_and_swap() which should have no problems with clang...?
>
> Brian
>
>
> On Mon, Mar 25, 2013 at 8:43 AM, James Peach <jpe...@apache.org> wrote:
>
> > On Mar 24, 2013, at 2:11 PM, Brian Geffon <bri...@apache.org> wrote:
> >
> > > I'm confused, I reenabled 128bit cas in configure.ac and verified that
> > it
> > > is building with cmpxchg16b and it's running perfectly. The
> test_freelist
> > > regression tests pass with no problems. So what were the issues
> remaining
> > > that required the revert? How can I possibly reproduce them so I can
> get
> > > this back on track?
> >
> > From my testing, the changes from John and Weijin fixed all the tests.
> The
> > last remaining issue that I have is that John's fix doesn't build with
> > clang. I guess that we can disable this code path with clang though ...
> >
> > >
> > > Brian
> > >
> > >
> > > On Fri, Mar 22, 2013 at 10:06 AM, James Peach <jamespe...@me.com>
> wrote:
> > >
> > >> On Mar 21, 2013, at 1:54 PM, jplev...@apache.org wrote:
> > >>
> > >>> Updated Branches:
> > >>> refs/heads/master 1a2ebccb1 -> f41323e01
> > >>>
> > >>>
> > >>> Fix bug with 128 bit compare and swap.
> > >>
> > >> Hmm, this doesn't build with clang ... it makes clang generate a call
> > to a
> > >> ___sync_fetch_and_add_1 stub that doesn't exist:
> > >>
> > >> Undefined symbols for architecture x86_64:
> > >>  "___sync_fetch_and_add_1", referenced from:
> > >>      _ink_freelist_new in ink_queue.o
> > >>      _ink_freelist_free in ink_queue.o
> > >>      _ink_atomiclist_pop in ink_queue.o
> > >>      _ink_atomiclist_popall in ink_queue.o
> > >>      _ink_atomiclist_push in ink_queue.o
> > >>      _ink_atomiclist_remove in ink_queue.o
> > >>
> > >> I have an email out to the clang devs, but no response yet.
> > >>
> > >>>
> > >>>
> > >>> Project: http://git-wip-us.apache.org/repos/asf/trafficserver/repo
> > >>> Commit:
> > >> http://git-wip-us.apache.org/repos/asf/trafficserver/commit/4a090831
> > >>> Tree:
> > http://git-wip-us.apache.org/repos/asf/trafficserver/tree/4a090831
> > >>> Diff:
> > http://git-wip-us.apache.org/repos/asf/trafficserver/diff/4a090831
> > >>>
> > >>> Branch: refs/heads/master
> > >>> Commit: 4a0908314acb301f1e9eb691bbcd8d956e86c321
> > >>> Parents: 57ffdf5
> > >>> Author: jplev...@apache.org <jplev...@apache.org>
> > >>> Authored: Thu Mar 21 10:10:16 2013 -0700
> > >>> Committer: John Plevyak <jplev...@acm.org>
> > >>> Committed: Thu Mar 21 10:10:16 2013 -0700
> > >>>
> > >>>
> ----------------------------------------------------------------------
> > >>> lib/ts/ink_queue.h |    2 +-
> > >>> 1 files changed, 1 insertions(+), 1 deletions(-)
> > >>>
> ----------------------------------------------------------------------
> > >>>
> > >>>
> > >>>
> > >>
> >
> http://git-wip-us.apache.org/repos/asf/trafficserver/blob/4a090831/lib/ts/ink_queue.h
> > >>>
> ----------------------------------------------------------------------
> > >>> diff --git a/lib/ts/ink_queue.h b/lib/ts/ink_queue.h
> > >>> index 6ac9945..20fbf9a 100644
> > >>> --- a/lib/ts/ink_queue.h
> > >>> +++ b/lib/ts/ink_queue.h
> > >>> @@ -72,7 +72,7 @@ extern "C"
> > >>> #endif
> > >>>
> > >>> #if TS_HAS_128BIT_CAS
> > >>> -#define INK_QUEUE_LD(dst,src) *((__int128_t*)&(dst)) =
> > >> *((__int128_t*)&(src))
> > >>> +#define INK_QUEUE_LD(dst,src) *(__int128_t*)&(dst) =
> > >> __sync_fetch_and_add((__int128_t*)&(src), 0)
> > >>> #else
> > >>> #define INK_QUEUE_LD(dst,src) INK_QUEUE_LD64(dst,src)
> > >>> #endif
> > >>>
> > >>
> > >>
> >
> >
>

Reply via email to