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