OpenCores
URL https://opencores.org/ocsvn/mips32r1/mips32r1/trunk

Subversion Repositories mips32r1

[/] [mips32r1/] [trunk/] [Software/] [demos/] [XD5_Threads/] [src/] [os/] [lock.c] - Rev 2

Compare with Previous | Blame | View Log

#include <stdlib.h> /* only for NULL */
#include "lock.h"
 
void Lock(volatile int *lock, int *load_count, int *store_count)
{
	int l_tries = 0;
	int s_tries = 0;
 
	asm volatile(
		".set noreorder\n\t"
		"addiu	$8, $0, 1\n\t"
		"addu	%[l_tries], $0, $0\n\t"
		"addu	%[s_tries], $0, $0\n\t"
		"1:\n\t"
		"ll	$9, %[lock]\n\t"
		"bne	$9, $0, 1b\n\t"
		"addiu	%[l_tries], %[l_tries], 1\n\t"
		"sc	$8, %[lock]\n\t"
		"beq	$8, $0, 1b\n\t"
		"addiu	%[s_tries], %[s_tries], 1\n\t"
		".set reorder\n\t"
		: [l_tries] "=&r"(l_tries), [s_tries] "=&r"(s_tries), 
		[lock] "+m"(*lock)
		: 
		: "$8", "$9", "memory"
	);
 
	if (load_count != NULL) {
		*load_count = l_tries;
	}
	if (store_count != NULL) {
		*store_count = s_tries;
	}
}
 
void LockAlmost(volatile int *lock, int *load_count, int *store_count)
{
	int l_tries = 0;
	int s_tries = 0;
 
	asm volatile(
		".set noreorder\n\t"
		"addiu	$8, $0, 1\n\t"
		"addu	%[l_tries], $0, $0\n\t"
		"addu	%[s_tries], $0, $0\n\t"
		"1:\n\t"
		"ll	$9, %[lock]\n\t"
		"bne	$9, $0, 1b\n\t"
		"addiu	%[l_tries], %[l_tries], 1\n\t"
 
		"nop\n\t"
		"nop\n\t"
 
		"sc	$8, %[lock]\n\t"
		"addiu	%[s_tries], %[s_tries], 1\n\t"
		".set reorder\n\t"
		: [l_tries] "=&r"(l_tries), [s_tries] "=&r"(s_tries),
		[lock] "+m"(*lock)
		:
		: "$8", "$9", "memory"
	);
 
	if (load_count != NULL) {
		*load_count = l_tries;
	}
	if (store_count != NULL) {
		*store_count = s_tries;
	}
}
 
 
void LockNull(volatile int *lock, int *load_count, int *store_count)
{
	if (load_count != NULL) {
		*load_count = 1;
	}
	if (store_count != NULL) {
		*store_count = 1;
	}
}
 
void Unlock(volatile int *lock)
{
	*lock = 0;
}
 
 

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.