diff options
author | Yonghong Song <yhs@fb.com> | 2020-01-03 12:06:08 -0800 |
---|---|---|
committer | Yonghong Song <yhs@fb.com> | 2020-12-03 07:38:00 -0800 |
commit | 286daafd65129228e08a1d07aa4ca74488615744 (patch) | |
tree | a4c3ad35f03d448a4517e0eecad3251e04d83cac /llvm/lib/Object/MachOObjectFile.cpp | |
parent | 517828a31b0d1b7cfd1fd261046746bd8778420a (diff) | |
download | llvm-286daafd65129228e08a1d07aa4ca74488615744.zip llvm-286daafd65129228e08a1d07aa4ca74488615744.tar.gz llvm-286daafd65129228e08a1d07aa4ca74488615744.tar.bz2 |
[BPF] support atomic instructions
Implement fetch_<op>/fetch_and_<op>/exchange/compare-and-exchange
instructions for BPF. Specially, the following gcc intrinsics
are implemented.
__sync_fetch_and_add (32, 64)
__sync_fetch_and_sub (32, 64)
__sync_fetch_and_and (32, 64)
__sync_fetch_and_or (32, 64)
__sync_fetch_and_xor (32, 64)
__sync_lock_test_and_set (32, 64)
__sync_val_compare_and_swap (32, 64)
For __sync_fetch_and_sub, internally, it is implemented as
a negation followed by __sync_fetch_and_add.
For __sync_lock_test_and_set, despite its name, it actually
does an atomic exchange and return the old content.
https://gcc.gnu.org/onlinedocs/gcc-4.1.1/gcc/Atomic-Builtins.html
For intrinsics like __sync_{add,sub}_and_fetch and
__sync_bool_compare_and_swap, the compiler is able to generate
codes using __sync_fetch_and_{add,sub} and __sync_val_compare_and_swap.
Similar to xadd, atomic xadd, xor and xxor (atomic_<op>)
instructions are added for atomic operations which do not
have return values. LLVM will check the return value for
__sync_fetch_and_{add,and,or,xor}.
If the return value is used, instructions atomic_fetch_<op>
will be used. Otherwise, atomic_<op> instructions will be used.
All new instructions only support 64bit and 32bit with alu32 mode.
old xadd instruction still supports 32bit without alu32 mode.
For encoding, please take a look at test atomics_2.ll.
Differential Revision: https://reviews.llvm.org/D72184
Diffstat (limited to 'llvm/lib/Object/MachOObjectFile.cpp')
0 files changed, 0 insertions, 0 deletions