Update of /cvsroot/pure-data/pd/src In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv8096
Modified Files: Tag: devel_0_38 m_fifo.c Log Message: lockfree fifos for amd64 architecture (not working for all revisions)
Index: m_fifo.c =================================================================== RCS file: /cvsroot/pure-data/pd/src/Attic/m_fifo.c,v retrieving revision 1.1.2.12 retrieving revision 1.1.2.13 diff -C2 -d -r1.1.2.12 -r1.1.2.13 *** m_fifo.c 6 May 2005 09:33:52 -0000 1.1.2.12 --- m_fifo.c 9 May 2005 13:26:47 -0000 1.1.2.13 *************** *** 327,330 **** --- 327,382 ---- }
+ #elif defined(__GNUC__) && defined(__x86_64__) + + /* this will not work for all revisions of the amd64 architecture ... */ + + static void* lifo_pop(t_lifo* lifo) + { + void * data = 0; + __asm__ __volatile__ ( + "# LFPOP \n\t" + "push %%rbx \n\t" + "push %%rcx \n\t" + "mov 8(%%rdi), %%rdx \n\t" + "mov (%%rdi), %%rax \n\t" + "test %%rax, %%rax \n\t" + "jz 20f \n" + "10:\t" + "mov (%%rax), %%rbx \n\t" + "mov %%rdx, %%rcx \n\t" + "inc %%rcx \n\t" + LOCK "cmpxchg16b (%%rdi) \n\t" + "jz 20f \n\t" + "test %%rax, %%rax \n\t" + "jnz 10b \n" + "20:\t" + "pop %%rcx \n\t" + "pop %%rbx \n\t" + :"=a" (data) + :"S" (&lifo->top) + :"memory", "rdx"); + return data; + } + + static void lifo_push(t_lifo * lifo, void * data) + { + __asm__ __volatile__ ( + "# LFPUSH \n\t" + "push %%rbx \n\t" + "push %%rcx \n\t" + "mov 0(%%rdi), %%rax \n\t" + "mov 8(%%rdi), %%rdx \n" + "1:\t" + "mov %%rax, %%rbx \n\t" + "inc %%rbx \n\t" + "mov %%rdx, (%%rcx) \n\t" + LOCK "cmpxchg16b (%%rdi) \n\t" + "jnz 1b \n\t" + "pop %%rcx \n\t" + "pop %%rbx \n\t" + :/* no output */ + :"S" (lifo), "c" (data) + :"memory", "rax", "rdx"); + }
#elif defined(__Windows__)