* src/vm/jit/i386/md-atomic.hpp: New file.
authorChristian Thalinger <twisti@complang.tuwien.ac.at>
Wed, 2 Jul 2008 14:23:27 +0000 (16:23 +0200)
committerChristian Thalinger <twisti@complang.tuwien.ac.at>
Wed, 2 Jul 2008 14:23:27 +0000 (16:23 +0200)
* src/vm/jit/i386/machine-instr.h: Removed.
* src/vm/jit/i386/Makefile.am (noinst_HEADERS): Removed
machine-instr.h, added md-atomic.hpp.

--HG--
branch : twisti

src/vm/jit/i386/Makefile.am
src/vm/jit/i386/machine-instr.h [deleted file]
src/vm/jit/i386/md-atomic.hpp [new file with mode: 0644]

index 0adf031286e8a9cf89c1a263b7b312ae905e2968..2cd6b4f4e95b01acad26520b2f46add6be49da82 100644 (file)
@@ -36,7 +36,7 @@ LIBS =
 
 noinst_HEADERS = \
        arch.h \
-       machine-instr.h
+       md-atomic.hpp
 
 noinst_LTLIBRARIES = \
        libarch.la
diff --git a/src/vm/jit/i386/machine-instr.h b/src/vm/jit/i386/machine-instr.h
deleted file mode 100644 (file)
index 1499e96..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-#ifndef _MACHINE_INSTR_H
-#define _MACHINE_INSTR_H
-
-static inline long
-__attribute__ ((unused))
-compare_and_swap (volatile long *p, long oldval, long newval)
-{
-  long ret;
-
-  __asm__ __volatile__ ("lock; cmpxchgl %2, %1"
-                        : "=a" (ret), "=m" (*p)
-                        : "r" (newval), "m" (*p), "0" (oldval));
-  return ret;
-}
-
-#define STORE_ORDER_BARRIER() __asm__ __volatile__ ("" : : : "memory");
-#define MEMORY_BARRIER_AFTER_ATOMIC() /* nothing */
-#define MEMORY_BARRIER() __asm__ __volatile__ ( \
-               "lock; add $0, 0(%%esp)" : : : "memory" );
-
-#endif
diff --git a/src/vm/jit/i386/md-atomic.hpp b/src/vm/jit/i386/md-atomic.hpp
new file mode 100644 (file)
index 0000000..acb4d6f
--- /dev/null
@@ -0,0 +1,115 @@
+/* src/vm/jit/i386/atomic.hpp - i386 atomic instructions
+
+   Copyright (C) 2008
+   CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO
+
+   This file is part of CACAO.
+
+   This program is free software; you can redistribute it and/or
+   modify it under the terms of the GNU General Public License as
+   published by the Free Software Foundation; either version 2, or (at
+   your option) any later version.
+
+   This program is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+   02110-1301, USA.
+
+*/
+
+
+#ifndef _MD_ATOMIC_HPP
+#define _MD_ATOMIC_HPP
+
+#include "config.h"
+
+#include <stdint.h>
+
+#include "threads/atomic.hpp"
+
+
+/**
+ * An atomic compare and swap for 32-bit integer values.
+ *
+ * @param p      Pointer to memory address.
+ * @param oldval Old value to be expected.
+ * @param newval New value to be stored.
+ *
+ * @return value of the memory location before the store
+ */
+inline static uint32_t Atomic_compare_and_swap_32(volatile uint32_t *p, uint32_t oldval, uint32_t newval)
+{
+       uint32_t result;
+
+       __asm__ __volatile__ ("lock; cmpxchgl %2, %1"
+                                                 : "=a" (result), "=m" (*p)
+                                                 : "r" (newval), "m" (*p), "0" (oldval));
+
+       return result;
+}
+
+
+/**
+ * An atomic compare and swap for 64-bit integer values.
+ *
+ * @param p      Pointer to memory address.
+ * @param oldval Old value to be expected.
+ * @param newval New value to be stored.
+ *
+ * @return value of the memory location before the store
+ */
+inline static uint64_t Atomic_compare_and_swap_64(volatile uint64_t *p, uint64_t oldval, uint64_t newval)
+{
+#warning Should we use cmpxchg8b or a generic version?
+       return 0;
+}
+
+
+/**
+ * An atomic compare and swap for pointer values.
+ *
+ * @param p      Pointer to memory address.
+ * @param oldval Old value to be expected.
+ * @param newval New value to be stored.
+ *
+ * @return value of the memory location before the store
+ */
+inline static void* Atomic_compare_and_swap_ptr(volatile void** p, void* oldval, void* newval)
+{
+       return (void*) Atomic_compare_and_swap_32((volatile uint32_t*) p, (uint32_t) oldval, (uint32_t) newval);
+}
+
+
+/**
+ * A memory barrier.
+ */
+inline static void Atomic_memory_barrier(void)
+{
+       __asm__ __volatile__ ("lock; add $0, 0(%%esp)" : : : "memory" );
+}
+
+
+#define STORE_ORDER_BARRIER() __asm__ __volatile__ ("" : : : "memory");
+#define MEMORY_BARRIER_AFTER_ATOMIC() /* nothing */
+
+#endif // _MD_ATOMIC_HPP
+
+
+/*
+ * These are local overrides for various environment variables in Emacs.
+ * Please do not remove this and leave it at the end of the file, where
+ * Emacs will automagically detect them.
+ * ---------------------------------------------------------------------
+ * Local variables:
+ * mode: c++
+ * indent-tabs-mode: t
+ * c-basic-offset: 4
+ * tab-width: 4
+ * End:
+ * vim:noexpandtab:sw=4:ts=4:
+ */