On Mar 25, 2013, at 11:46 AM, John Plevyak <jplev...@acm.org> wrote:

> 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.

Yeh, __sync_val_compare_and_swap seems to work ...

> 
> 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