"	 membar	#StoreLoad | #StoreStore\n" 
"	 nop\n" 
void __sched down(struct semaphore *sem){	might_sleep();	/* This atomically does:	 * 	old_val = sem->count;	 *	new_val = sem->count - 1;	 *	sem->count = new_val;	 *	if (old_val < 1)	 *		__down(sem);	 *	 * The (old_val < 1) test is equivalent to	 * the more straightforward (new_val < 0),	 * but it is easier to test the former because	 * of how the CAS instruction works.	 */	__asm__ __volatile__("\n""	! down sem(%0)\n""1:	lduw	[%0], %%g1\n""	sub	%%g1, 1, %%g7\n""	cas	[%0], %%g1, %%g7\n""	cmp	%%g1, %%g7\n""	bne,pn	%%icc, 1b\n""	 cmp	%%g7, 1\n""	bl,pn	%%icc, 3f\n""	 membar	#StoreLoad | #StoreStore\n""2:\n""	.subsection 2\n""3:	mov	%0, %%g1\n""	save	%%sp, -160, %%sp\n""	call	%1\n""	 mov	%%g1, %%o0\n""	ba,pt	%%xcc, 2b\n""	 restore\n""	.previous\n"	: : "r" (sem), "i" (__down)	: "g1", "g2", "g3", "g7", "memory", "cc");}
10457	/local/tlutelli/issta_data/temp/c/2005_temp/2005/10457/b445e26cbf784cdba10f2b6c3e2cd3ee7bab360a/semaphore.c/buggy/arch/sparc64/kernel/semaphore.c