On Mon, 2017-11-20 at 18:27 +0000, James Greenhalgh wrote:
> 
> If you have the time, would you mind giving me a quick run-down of what
> design decisions went in to this patch, and why they are the right thing
> to do? Sorry to offload that, but it will be the most efficient route
> to a review.

The main design decision was to use the existing IFUNC infrastructure
that is used on ARM32 to enable atomic instructions that were added
with armv7-a, on i386 to enable instructions added with i586, and on
x86_64 to enable instructions added with cx16.

The basic idea for all these is to allow users who create programs that
use the atomic_* functions to use new instructions on machines that
support them while also working on older machines that do not support
them and to not have to create two separate executables.

Some atomic_* functions get inlined into programs, and those will
either use or not use LSE instructions based on the compiler arguments
used during compilations.  If you want your program to work on all
machines you have to not compile for LSE intructions.  But other
functions (or all functions if -fno-inline-atomics is used) will call
the libatomic library.  Currently those functions do not use LSE
instructions but with this patch we can use the IFUNC infrastructure to
check for LSE support and use LSE in libatomic on machines where it is
supported or not use it on machines where it is not supported.

As an example of what this change does, __atomic_compare_exchange_8 will
turn into a call to libat_compare_exchange_8_i1 on a machine that supports
LSE:

0000000000000000 <libat_compare_exchange_8_i1>:
   0:   f9400023        ldr     x3, [x1]
   4:   aa0303e4        mov     x4, x3
   8:   c8e4fc02        casal   x4, x2, [x0]
   c:   eb03009f        cmp     x4, x3
  10:   1a9f17e0        cset    w0, eq
  14:   35000040        cbnz    w0, 1c <libat_compare_exchange_8_i1+0x1c>
  18:   f9000024        str     x4, [x1]
  1c:   d65f03c0        ret

But call libat_compare_exchange_8 on a machine without LSE:

0000000000000000 <libat_compare_exchange_8>:
   0:   f9400023        ldr     x3, [x1]
   4:   c85ffc04        ldaxr   x4, [x0]
   8:   eb03009f        cmp     x4, x3
   c:   54000061        b.ne    18 <libat_compare_exchange_8+0x18>
  10:   c805fc02        stlxr   w5, x2, [x0]
  14:   35ffff85        cbnz    w5, 4 <libat_compare_exchange_8+0x4>
  18:   1a9f17e0        cset    w0, eq
  1c:   34000040        cbz     w0, 24 <libat_compare_exchange_8+0x24>
  20:   d65f03c0        ret
  24:   f9000024        str     x4, [x1]
  28:   d65f03c0        ret
  2c:   d503201f        nop

Steve Ellcey
sell...@cavium.com

Reply via email to