Hello, ARMv8.1 adds atomic swap and atomic load-operate instructions with optional memory ordering specifiers. This patch series adds the instructions to GCC, making them available with -march=armv8.1-a or -march=armv8+lse, and uses them to implement the __sync and __atomic builtins. The ARMv8.1 swap instruction swaps the value in a register with a value in memory. The load-operate instructions load a value from memory, update it with the result of an operation and store the result in memory. This series uses the swap instruction to implement the atomic_exchange patterns and the load-operate instructions to implement the atomic_fetch_ and atomic__fetch patterns. For the atomic__fetch patterns, the value returned as the result of the operation has to be recalculated from the loaded data. The ARMv8 BIC instruction is added so that it can be used for this recalculation. The patches in this series - add and use the atomic swap instruction. - add the Aarch64 BIC instruction, - add the ARMv8.1 load-operate instructions, - use the load-operate instructions to implement the atomic_fetch_ patterns, - use the load-operate instructions to implement the patterns atomic__fetch patterns, The code-generation changes in this series are based around a new function, aarch64_gen_atomic_ldop, which takes the operation to be implemented and emits the appropriate code, making use of the atomic instruction. This follows the existing uses aarch64_split_atomic_op for the same purpose when atomic instructions aren't available. This patch adds the ARMv8.1 SWAP instruction and function aarch64_gen_atomic_ldop and changes the implementation of the atomic_exchange pattern to the atomic instruction when it is available. The general form of the code generated for an atomic_exchange, with destination D, source S, memory address A and memory order MO is: swp S, D, [A] where is one of {'', 'a', 'l', 'al'} depending on memory order MO. is one of {'', 'b', 'h'} depending on the data size. This patch also adds tests for the changes. These reuse the support code introduced for the atomic CAS tests, adding macros to test functions taking one memory ordering argument. These are used to iteratively define functions using the __atomic_exchange builtins, which should be implemented using the atomic swap. Tested the series for aarch64-none-linux-gnu with native bootstrap and make check. Also tested for aarch64-none-elf with cross-compiled check-gcc on an ARMv8.1 emulator with +lse enabled by default. Ok for trunk? Matthew gcc/ 2015-09-17 Matthew Wahab * config/aarch64/aarch64-protos.h (aarch64_gen_atomic_ldop): Declare. * config/aarch64/aarch64.c (aarch64_emit_atomic_swp): New. (aarch64_gen_atomic_ldop): New. (aarch64_split_atomic_op): Fix whitespace and add a comment. * config/aarch64/atomics.md (UNSPECV_ATOMIC_SWP): New. (atomic_compare_and_swap_lse): Remove comments and fix whitespace. (atomic_exchange): Replace with an expander. (aarch64_atomic_exchange): New. (aarch64_atomic_exchange_lse): New. (aarch64_atomic_): Fix some whitespace. (aarch64_atomic_swp): New. gcc/testsuite/ 2015-09-17 Matthew Wahab * gcc.target/aarch64/atomic-inst-ops.inc: (TEST_MODEL): New. (TEST_ONE): New. * gcc.target/aarch64/atomic-inst-swap.c: New.