// locks.h - Thread synchronization primitives. SuperH implementation.

/* Copyright (C) 2002  Free Software Foundation

   This file is part of libgcj.

This software is copyrighted work licensed under the terms of the
Libgcj License.  Please consult the file "LIBGCJ_LICENSE" for
details.  */

#ifndef __SYSDEP_LOCKS_H__
#define __SYSDEP_LOCKS_H__

typedef size_t obj_addr_t;	/* Integer type big enough for object	*/
				/* address.				*/

static unsigned char __cas_lock = 0;

inline static void
__cas_start_atomic (void)
{
  unsigned int val;

  do
    __asm__ __volatile__ ("tas.b @%1; movt %0"
			  : "=r" (val)
			  : "r" (&__cas_lock)
			  : "memory");
  while (val == 0);
}

inline static void
__cas_end_atomic (void)
{
  __asm__ __volatile__ (" " : : : "memory");
  __cas_lock = 0;
}

inline static bool
compare_and_swap (volatile obj_addr_t *addr, obj_addr_t old,
		  obj_addr_t new_val)
{
  bool ret;

  __cas_start_atomic ();
  if (*addr != old)
    ret = false;
  else
    {
      *addr = new_val;
      ret = true;
    }
  __cas_end_atomic ();

  return ret;
}

inline static void
release_set (volatile obj_addr_t *addr, obj_addr_t new_val)
{
  __asm__ __volatile__ (" " : : : "memory");
  *(addr) = new_val;
}

inline static bool
compare_and_swap_release (volatile obj_addr_t *addr, obj_addr_t old,
			  obj_addr_t new_val)
{
  return compare_and_swap (addr, old, new_val);
}

#endif /* ! __SYSDEP_LOCKS_H__ */
