"SooperLooper is a live looping sampler capable of immediate loop recording, overdubbing, multiplying, reversing and more. It allows for multiple simultaneous multi-channel loops limited only by your computer's available memory."
I extracted the tar file and proceeded to find the inline assembler. I used the following command:
egrep -R "__asm__|asm\(*" *
This gave me all the usages of the terms __asm__ and asm(
The files where inline assembler was used were:
src/atomic.h
libs/pbd/pbd/atomic.h
Supported architecures
Time to take a closer look at the src/atomic.h file.
They support several kinds of architectures, I've listed them below as shown in the code.
__ASM_PPC_ATOMIC_H_ = PowerPC architecture
__i386__ || __x86_64__ / __ARCH_I386_ATOMIC__ = arch i386 architecture
__ARCH_SPARC_ATOMIC__ = arch sparc architecture
__ARCH_IA64_ATOMIC__ = arch ia64 architecture
__ALPHA_ATOMIC_H = alpha architecture
__ARCH_S390_ATOMIC__ = arch s390 architecture
__MIPS__ = mips architecture
__ARCH_M68K_ATOMIC__ = arch m68k architecture
They also have an option when it's none of the architectures listed above:
__NO_STRICT_ATOMIC
Assembler code
This code makes use of atomic operations to make looping more efficient than in normal C code.
The functions they made are:
- atomic_add
- atomic_sub
- atomic_sub_and_test
- atomic_inc
- atomic_dec
- atomic_dec_and_test
- atomic_inc_and_test
- atomic_add_negative
- atomic_clear_mask
- atomic_set_mask
To paste all the assembler code here would be a bit much, but I'll take the function atomic_add as an example.
They use __volatile__ here so the compiler is forced not to move the code around and keep the operations happening before this function before it, and whatever comes after this, stay after it./**
* atomic_add - add integer to atomic variable
* @i: integer value to add
* @v: pointer of type atomic_t
*
* Atomically adds @i to @v. Note that the guaranteed useful range
* of an atomic_t is only 24 bits.
*/
static __inline__ void atomic_add(int i, atomic_t *v)
{
__asm__ __volatile__(
SMP_LOCK "addl %1,%0"
:"=m" (v->counter)
:"ir" (i), "m" (v->counter));
}
So this atomic_add function basically just adds int i to the variable v.
No comments:
Post a Comment