This V program generates an architecture-independent assembly file (atomic.S) implementing atomic operations by extracting disassembled code from pre-compiled libatomic.a libraries for multiple CPU architectures.
- Supports 5 CPU architectures:
i386,x86_64,arm,aarch64,riscv - Implements 16 size-suffixed atomic operations (
__atomic_*_1/2/4/8) - Includes 6 non-size-suffixed atomic operations (
atomic_*) - Generates both raw machine code (for TinyCC) and assembly mnemonics
- Handles symbol name translation and label formatting
__atomic_load
__atomic_store
__atomic_compare_exchange
__atomic_exchange
__atomic_fetch_add
__atomic_add_fetch
__atomic_fetch_sub
__atomic_sub_fetch
__atomic_fetch_and
__atomic_and_fetch
__atomic_fetch_or
__atomic_or_fetch
__atomic_fetch_nand
__atomic_nand_fetch
__atomic_fetch_xor
__atomic_xor_fetch
__atomic_test_and_set
atomic_thread_fence
atomic_signal_fence
atomic_flag_test_and_set
atomic_flag_test_and_set_explicit
atomic_flag_clear
atomic_flag_clear_explicit
- V compiler
objdumpsupporting all target architectures
tar -zxf binutils-2.44.tar.gz
cd binutils-2.44
mkdir build
cd build
../configure --enable-targets=all
make
sudo make install- Pre-compiled
libatomic.afiles for each architecture:libatomic.a.i386libatomic.a.x86_64libatomic.a.armlibatomic.a.aarch64libatomic.a.riscv
- Place pre-compiled
libatomic.a.[arch]files in the working directory - Compile and run the generator:
v run gen_atomic.v- Output file
atomic.Swill be generated containing atomic implementations
output_global_header(): Global header with metadataoutput_arch_header()/footer(): Architecture-specific sectionsgen_objdump_file(): Extracts disassembly via objdumpfix_objdump_asm(): Formats assembly labelsoutput_f_*(): Generates function headers/bodies/footersprocess_arch(): Processes all functions for an architecture
Enable the verify() step in main() to:
- Assemble
atomic.Sto object files - Compare disassembly with original libatomic
- Requires architecture-specific GCC toolchains
- ARM architectures require symbol name fixes (
libat_→__atomic_) - TinyCC compatibility mode uses raw machine code (
.int/.short) - Label format conversion:
44 <.L1^B2>→.L___atomic_fetch_add_8_44